|
1 | 1 | package com.googlecode.d2j.dex;
|
2 | 2 |
|
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; |
5 | 11 | import com.googlecode.d2j.converter.Dex2IRConverter;
|
6 |
| -import org.objectweb.asm.*; |
7 |
| -import org.objectweb.asm.tree.InnerClassNode; |
8 |
| - |
9 |
| -import com.googlecode.d2j.*; |
10 | 12 | 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; |
12 | 19 | 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; |
14 | 35 | import com.googlecode.dex2jar.ir.ts.array.FillArrayTransformer;
|
15 | 36 |
|
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; |
17 | 58 |
|
18 | 59 | public class Dex2Asm {
|
19 | 60 |
|
@@ -597,30 +638,39 @@ public void convertMethod(DexClassNode classNode, DexMethodNode methodNode, Clas
|
597 | 638 | boolean isStatic = (methodNode.access & Opcodes.ACC_STATIC) != 0;
|
598 | 639 | String[] paramTypes = methodNode.method.getParameterTypes();
|
599 | 640 |
|
| 641 | + int localsOffset = 0; |
600 | 642 | Map<Integer, LocalVar> localVars = new TreeMap<>();
|
601 | 643 | if (!isStatic) {
|
602 |
| - LocalVar local = new LocalVar(0, "this", methodNode.method.getOwner(), null); |
| 644 | + LocalVar local = new LocalVar(localsOffset, "this", methodNode.method.getOwner(), null); |
603 | 645 | localVars.put(local.reg, local);
|
| 646 | + localsOffset++; |
604 | 647 | }
|
605 | 648 |
|
606 | 649 | // Handle debugNode.parameterNames
|
607 | 650 | 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]; |
610 | 654 |
|
611 | 655 | // Put parameter name in MethodParameters attribute
|
612 | 656 | mv.visitParameter(paramName, 0);
|
613 | 657 |
|
614 | 658 | // Also put it into the LocalVariableTable
|
615 | 659 | 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); |
617 | 661 | localVars.put(local.reg, local);
|
618 | 662 | }
|
| 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 | + } |
619 | 670 | }
|
620 | 671 | }
|
621 | 672 |
|
622 | 673 | // Handle debugNodes to create a LocalVariableTable
|
623 |
| - int localsOffset = paramTypes.length + (isStatic ? 0 : 1); |
624 | 674 | if (debugNode.debugNodes != null) {
|
625 | 675 | for (DexDebugNode.DexDebugOpNode opDebugNode : debugNode.debugNodes) {
|
626 | 676 | if (opDebugNode instanceof DexDebugNode.DexDebugOpNode.StartLocalNode) {
|
|
0 commit comments