All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.googlecode.dex2jar.ir.ts.MultiArrayTransformer Maven / Gradle / Ivy

The newest version!
package com.googlecode.dex2jar.ir.ts;

import com.googlecode.d2j.DexType;
import com.googlecode.dex2jar.ir.IrMethod;
import com.googlecode.dex2jar.ir.StmtTraveler;
import com.googlecode.dex2jar.ir.expr.*;

/**
 * dex does have the instruction to create a multi-array. the implement is to
 * using the Array.newInstance().
 * transform
 * 
 * ((String[][][])Array.newInstance(String.class,new int[]{4, 5, 6}))
 * 
* to *
 * new String[4][5][6]
 * 
*/ public class MultiArrayTransformer extends StatedTransformer { @Override public boolean transformReportChanged(IrMethod method) { final boolean changed[] = {false}; new StmtTraveler() { @Override public Value travel(Value op) { if (op.vt == Value.VT.CHECK_CAST) { TypeExpr te = (TypeExpr) op; if (te.op.vt == Value.VT.CHECK_CAST) { TypeExpr te2 = (TypeExpr) te.op; if (te.type.equals(te2.type)) { op = te2; } } } op = super.travel(op); if (op.vt == Value.VT.CHECK_CAST) { TypeExpr te = (TypeExpr) op; if (te.type.charAt(0) == '[') { Value from = te.getOp(); if (from.vt == Value.VT.INVOKE_STATIC) { InvokeExpr invokeExpr = (InvokeExpr) from; if (invokeExpr.getName().equals("newInstance") && invokeExpr.getOwner().equals("Ljava/lang/reflect/Array;") && invokeExpr.getArgs().length == 2 && invokeExpr.getArgs()[0].equals("Ljava/lang/Class;")) { Value arg0 = invokeExpr.getOps()[0]; String elementType = null; if (arg0.vt == Value.VT.CONSTANT) { elementType = ((DexType) ((Constant) invokeExpr.getOps()[0]).value).desc; } else { if (arg0.vt == Value.VT.STATIC_FIELD) { StaticFieldExpr sfe = (StaticFieldExpr) arg0; if (sfe.owner.startsWith("Ljava/lang/") && sfe.name.equals("TYPE")) { switch (sfe.owner) { case "Ljava/lang/Boolean;": elementType = "Z"; break; case "Ljava/lang/Byte;": elementType = "B"; break; case "Ljava/lang/Short;": elementType = "S"; break; case "Ljava/lang/Character;": elementType = "C"; break; case "Ljava/lang/Integer;": elementType = "I"; break; case "Ljava/lang/Long;": elementType = "J"; break; case "Ljava/lang/Float;": elementType = "F"; break; case "Ljava/lang/Double;": elementType = "D"; break; case "Ljava/lang/Void;": elementType = "V"; break; default: } } } } if (elementType != null) { Value dt = invokeExpr.getOps()[1]; if (invokeExpr.getArgs()[1].equals("I")) { if (te.type.equals("[" + elementType)) { int d = 0; while (elementType.charAt(d) == '[') { d++; } changed[0] = true; if (d > 0) { return Exprs.nNewMutiArray(elementType.substring(d), d + 1, new Value[]{dt}); } else { return Exprs.nNewArray(elementType, dt); } } } else {// [I if (dt.vt == Value.VT.FILLED_ARRAY) { FilledArrayExpr filledArrayExpr = (FilledArrayExpr) dt; int d = filledArrayExpr.getOps().length; if (te.type.length() > d && te.type.substring(d).equals(elementType)) { int d1 = 0; while (elementType.charAt(d1) == '[') { d1++; } changed[0] = true; return Exprs.nNewMutiArray(elementType.substring(d1), d1 + d, filledArrayExpr.getOps()); } } } } } } } } return op; } }.travel(method); return changed[0]; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy