Skip to content

Commit ecf9ce3

Browse files
committed
Properly handle offsets for Long and Double
1 parent c7d6f51 commit ecf9ce3

File tree

1 file changed

+64
-14
lines changed
  • dex-translator/src/main/java/com/googlecode/d2j/dex

1 file changed

+64
-14
lines changed

dex-translator/src/main/java/com/googlecode/d2j/dex/Dex2Asm.java

Lines changed: 64 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,60 @@
11
package com.googlecode.d2j.dex;
22

3-
import java.util.*;
4-
3+
import com.googlecode.d2j.DexConstants;
4+
import com.googlecode.d2j.DexLabel;
5+
import com.googlecode.d2j.DexType;
6+
import com.googlecode.d2j.Field;
7+
import com.googlecode.d2j.Method;
8+
import com.googlecode.d2j.MethodHandle;
9+
import com.googlecode.d2j.Proto;
10+
import com.googlecode.d2j.Visibility;
511
import com.googlecode.d2j.converter.Dex2IRConverter;
6-
import org.objectweb.asm.*;
7-
import org.objectweb.asm.tree.InnerClassNode;
8-
9-
import com.googlecode.d2j.*;
1012
import com.googlecode.d2j.converter.IR2JConverter;
11-
import com.googlecode.d2j.node.*;
13+
import com.googlecode.d2j.node.DexAnnotationNode;
14+
import com.googlecode.d2j.node.DexClassNode;
15+
import com.googlecode.d2j.node.DexDebugNode;
16+
import com.googlecode.d2j.node.DexFieldNode;
17+
import com.googlecode.d2j.node.DexFileNode;
18+
import com.googlecode.d2j.node.DexMethodNode;
1219
import com.googlecode.dex2jar.ir.IrMethod;
13-
import com.googlecode.dex2jar.ir.ts.*;
20+
import com.googlecode.dex2jar.ir.ts.AggTransformer;
21+
import com.googlecode.dex2jar.ir.ts.CleanLabel;
22+
import com.googlecode.dex2jar.ir.ts.DeadCodeTransformer;
23+
import com.googlecode.dex2jar.ir.ts.EndRemover;
24+
import com.googlecode.dex2jar.ir.ts.ExceptionHandlerTrim;
25+
import com.googlecode.dex2jar.ir.ts.Ir2JRegAssignTransformer;
26+
import com.googlecode.dex2jar.ir.ts.MultiArrayTransformer;
27+
import com.googlecode.dex2jar.ir.ts.NewTransformer;
28+
import com.googlecode.dex2jar.ir.ts.NpeTransformer;
29+
import com.googlecode.dex2jar.ir.ts.RemoveConstantFromSSA;
30+
import com.googlecode.dex2jar.ir.ts.RemoveLocalFromSSA;
31+
import com.googlecode.dex2jar.ir.ts.TypeTransformer;
32+
import com.googlecode.dex2jar.ir.ts.UnSSATransformer;
33+
import com.googlecode.dex2jar.ir.ts.VoidInvokeTransformer;
34+
import com.googlecode.dex2jar.ir.ts.ZeroTransformer;
1435
import com.googlecode.dex2jar.ir.ts.array.FillArrayTransformer;
1536

16-
import sun.reflect.generics.tree.Tree;
37+
import org.objectweb.asm.AnnotationVisitor;
38+
import org.objectweb.asm.ClassVisitor;
39+
import org.objectweb.asm.FieldVisitor;
40+
import org.objectweb.asm.Handle;
41+
import org.objectweb.asm.Label;
42+
import org.objectweb.asm.MethodVisitor;
43+
import org.objectweb.asm.Opcodes;
44+
import org.objectweb.asm.Type;
45+
import org.objectweb.asm.tree.InnerClassNode;
46+
47+
import java.util.ArrayList;
48+
import java.util.Arrays;
49+
import java.util.Collections;
50+
import java.util.Comparator;
51+
import java.util.HashMap;
52+
import java.util.HashSet;
53+
import java.util.List;
54+
import java.util.Map;
55+
import java.util.Set;
56+
import java.util.Stack;
57+
import java.util.TreeMap;
1758

1859
public class Dex2Asm {
1960

@@ -597,30 +638,39 @@ public void convertMethod(DexClassNode classNode, DexMethodNode methodNode, Clas
597638
boolean isStatic = (methodNode.access & Opcodes.ACC_STATIC) != 0;
598639
String[] paramTypes = methodNode.method.getParameterTypes();
599640

641+
int localsOffset = 0;
600642
Map<Integer, LocalVar> localVars = new TreeMap<>();
601643
if (!isStatic) {
602-
LocalVar local = new LocalVar(0, "this", methodNode.method.getOwner(), null);
644+
LocalVar local = new LocalVar(localsOffset, "this", methodNode.method.getOwner(), null);
603645
localVars.put(local.reg, local);
646+
localsOffset++;
604647
}
605648

606649
// Handle debugNode.parameterNames
607650
if (debugNode.parameterNames != null) {
608-
for (int i = 0; i < debugNode.parameterNames.size(); i++) {
609-
String paramName = debugNode.parameterNames.get(i);
651+
for (int i = 0; i < paramTypes.length; i++) {
652+
String paramName = i < debugNode.parameterNames.size() ? debugNode.parameterNames.get(i) : null;
653+
String paramType = paramTypes[i];
610654

611655
// Put parameter name in MethodParameters attribute
612656
mv.visitParameter(paramName, 0);
613657

614658
// Also put it into the LocalVariableTable
615659
if (paramName != null) {
616-
LocalVar local = new LocalVar(isStatic ? i : i + 1, paramName, paramTypes[i], null);
660+
LocalVar local = new LocalVar(localsOffset, paramName, paramType, null);
617661
localVars.put(local.reg, local);
618662
}
663+
664+
// If the local variable at index is of type double or long, it occupies both index and index + 1.
665+
if ("J".equals(paramType) || "D".equals(paramType)) {
666+
localsOffset += 2;
667+
} else {
668+
localsOffset++;
669+
}
619670
}
620671
}
621672

622673
// Handle debugNodes to create a LocalVariableTable
623-
int localsOffset = paramTypes.length + (isStatic ? 0 : 1);
624674
if (debugNode.debugNodes != null) {
625675
for (DexDebugNode.DexDebugOpNode opDebugNode : debugNode.debugNodes) {
626676
if (opDebugNode instanceof DexDebugNode.DexDebugOpNode.StartLocalNode) {

0 commit comments

Comments
 (0)