Skip to content

Commit d09c422

Browse files
committed
handler .param reg and translate reg to parameter index when parse smali
--HG-- branch : 2.x
1 parent 1d663bb commit d09c422

File tree

5 files changed

+55
-45
lines changed

5 files changed

+55
-45
lines changed

d2j-smali/src/main/antlr3/com/googlecode/d2j/smali/Smali.g

+3-3
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ package com.googlecode.d2j.smali;
2525
String source;
2626
int ins_in;
2727
String clzName;
28+
boolean isStatic;
2829
List<String> interfaceNames = new ArrayList(5);
2930
Map<String,DexLabel> labelsMap=new HashMap();
3031
String superName;
@@ -65,7 +66,6 @@ package com.googlecode.d2j.smali;
6566

6667
}
6768
}
68-
6969
}
7070

7171
fragment
@@ -184,7 +184,7 @@ sSource : '.source' a=STRING {this.source=unEscape($a.text);};
184184
sSuper : '.super' a=OBJECT_TYPE {this.superName=unEscapeId($a.text);};
185185
sInterface
186186
: '.implements' a=OBJECT_TYPE {this.interfaceNames.add(unEscapeId($a.text));};
187-
sMethod @init{ boolean isStatic=false; SmaliCodeVisitor dcv=null; DexMethodVisitor dexMethodVisitor=null; DexDebugVisitor debugVisitor=null; int paramIndex=0; }
187+
sMethod @init{ isStatic=false; SmaliCodeVisitor dcv=null; DexMethodVisitor dexMethodVisitor=null; DexDebugVisitor debugVisitor=null; int paramIndex=0; }
188188
: '.method' acc=sAccList {isStatic=0!=(acc&ACC_STATIC);}
189189
( m1=sMethodF { dexMethodVisitor=dexClassVisitor.visitMethod(acc,$m1.m); this.currentMethod=m1; this.ins_in=methodIns($m1.m,isStatic); }
190190
| m2=sMethodP { dexMethodVisitor=dexClassVisitor.visitMethod(acc,$m2.m);this.currentMethod=$m2.m; this.ins_in=methodIns($m2.m,isStatic);}
@@ -233,7 +233,7 @@ sFieldValue returns[Object s]
233233
: a=sBaseValue {$s=$a.v;};
234234
sParameter[DexMethodVisitor dmv, int paramIndex, DexDebugVisitor debugVisitor]
235235
: ('.parameter' (a=STRING { debugVisitor.visitParameterName(paramIndex,unescapeStr($a.text)); } )? ( ( {dexAnnotationAble=dmv.visitParameterAnnotation(paramIndex);} sAnnotation {dexAnnotationAble=null;})* '.end parameter')?)
236-
| ('.param' r1=REGISTER (',' a=STRING { debugVisitor.visitParameterName(getReg($r1.text), unescapeStr($a.text)); } )? (({dexAnnotationAble=dmv.visitParameterAnnotation(getReg($r1.text));} sAnnotation {dexAnnotationAble=null;})* '.end param')?)
236+
| ('.param' r1=REGISTER (',' a=STRING { debugVisitor.visitParameterName(reg2ParamIdx(currentMethod,getReg($r1.text),locals,isStatic), unescapeStr($a.text)); } )? (({dexAnnotationAble=dmv.visitParameterAnnotation(getReg($r1.text));} sAnnotation {dexAnnotationAble=null;})* '.end param')?)
237237
;
238238
sAnnotationKeyName
239239
: sBaseMemberName|ACC;

d2j-smali/src/main/java/com/googlecode/d2j/smali/BaksmaliCodeDumper.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -286,9 +286,9 @@ public void visitJumpStmt(Op op, int a, int b, DexLabel label) {
286286
public void visitStartLocal(int reg, DexLabel label, String name, String type, String signature) {
287287
super.visitStartLocal(reg, label, name, type, signature);
288288
if (signature == null) {
289-
out.s(".local %s, %s:%s", reg(reg), name, type);
289+
out.s(".local %s, %s:%s", reg(reg), BaksmaliDumper.escapeValue(name), type);
290290
} else {
291-
out.s(".local %s, %s:%s, %s", reg(reg), name, type, BaksmaliDumper.escapeValue(signature));
291+
out.s(".local %s, %s:%s, %s", reg(reg), BaksmaliDumper.escapeValue(name), type, BaksmaliDumper.escapeValue(signature));
292292
}
293293
}
294294

d2j-smali/src/main/java/com/googlecode/d2j/smali/Utils.java

+34-6
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
package com.googlecode.d2j.smali;
22

3-
import java.math.BigInteger;
4-
import java.util.ArrayList;
5-
import java.util.HashMap;
6-
import java.util.List;
7-
import java.util.Map;
8-
93
import com.googlecode.d2j.DexConstants;
104
import com.googlecode.d2j.Field;
115
import com.googlecode.d2j.Method;
126
import com.googlecode.d2j.Visibility;
137
import com.googlecode.d2j.reader.Op;
148
import com.googlecode.d2j.visitors.DexAnnotationVisitor;
159

10+
import java.math.BigInteger;
11+
import java.util.ArrayList;
12+
import java.util.HashMap;
13+
import java.util.List;
14+
import java.util.Map;
15+
1616
public class Utils implements DexConstants {
1717

1818
public static void doAccept(DexAnnotationVisitor dexAnnotationVisitor, String k, Object value) {
@@ -401,4 +401,32 @@ public static int methodIns(Method m, boolean isStatic) {
401401
}
402402
return a;
403403
}
404+
405+
public static int reg2ParamIdx(Method m, int reg, int locals, boolean isStatic) {
406+
int x = reg - locals;
407+
if (x < 0) {
408+
return -1;
409+
}
410+
int a = isStatic ? 0 : 1;
411+
String[] parameterTypes = m.getParameterTypes();
412+
for (int i = 0, parameterTypesLength = parameterTypes.length; i < parameterTypesLength; i++) {
413+
414+
if (x == a) {
415+
return i;
416+
}
417+
418+
String t = parameterTypes[i];
419+
switch (t.charAt(0)) {
420+
case 'J':
421+
case 'D':
422+
a += 2;
423+
break;
424+
default:
425+
a += 1;
426+
break;
427+
}
428+
}
429+
return -1;
430+
}
431+
404432
}

dex-writer/src/main/java/com/googlecode/d2j/dex/writer/CodeWriter.java

+13-31
Original file line numberDiff line numberDiff line change
@@ -16,40 +16,22 @@
1616
*/
1717
package com.googlecode.d2j.dex.writer;
1818

19-
import static com.googlecode.d2j.reader.InstructionFormat.kFmt10x;
20-
import static com.googlecode.d2j.reader.InstructionFormat.kFmt11x;
21-
import static com.googlecode.d2j.reader.InstructionFormat.kFmt22b;
22-
import static com.googlecode.d2j.reader.InstructionFormat.kFmt22s;
23-
import static com.googlecode.d2j.reader.InstructionFormat.kFmt23x;
24-
import static com.googlecode.d2j.reader.InstructionFormat.kFmt35c;
25-
import static com.googlecode.d2j.reader.InstructionFormat.kFmt3rc;
26-
import static com.googlecode.d2j.reader.Op.BAD_OP;
27-
import static com.googlecode.d2j.reader.Op.CONST;
28-
import static com.googlecode.d2j.reader.Op.CONST_16;
29-
import static com.googlecode.d2j.reader.Op.CONST_HIGH16;
30-
import static com.googlecode.d2j.reader.Op.CONST_WIDE_32;
31-
32-
import java.nio.ByteBuffer;
33-
import java.nio.ByteOrder;
34-
import java.util.*;
35-
3619
import com.googlecode.d2j.DexLabel;
3720
import com.googlecode.d2j.Field;
3821
import com.googlecode.d2j.Method;
39-
import com.googlecode.d2j.dex.writer.insn.Insn;
40-
import com.googlecode.d2j.dex.writer.insn.JumpOp;
41-
import com.googlecode.d2j.dex.writer.insn.Label;
42-
import com.googlecode.d2j.dex.writer.insn.OpInsn;
43-
import com.googlecode.d2j.dex.writer.insn.PreBuildInsn;
44-
import com.googlecode.d2j.dex.writer.item.BaseItem;
45-
import com.googlecode.d2j.dex.writer.item.CodeItem;
46-
import com.googlecode.d2j.dex.writer.item.ConstPool;
47-
import com.googlecode.d2j.dex.writer.item.DebugInfoItem;
48-
import com.googlecode.d2j.node.DexDebugNode;
22+
import com.googlecode.d2j.dex.writer.insn.*;
23+
import com.googlecode.d2j.dex.writer.item.*;
4924
import com.googlecode.d2j.reader.Op;
5025
import com.googlecode.d2j.visitors.DexCodeVisitor;
5126
import com.googlecode.d2j.visitors.DexDebugVisitor;
5227

28+
import java.nio.ByteBuffer;
29+
import java.nio.ByteOrder;
30+
import java.util.*;
31+
32+
import static com.googlecode.d2j.reader.InstructionFormat.*;
33+
import static com.googlecode.d2j.reader.Op.*;
34+
5335
@SuppressWarnings("incomplete-switch")
5436
public class CodeWriter extends DexCodeVisitor {
5537
final CodeItem codeItem;
@@ -793,6 +775,7 @@ public DexDebugVisitor visitDebug() {
793775

794776
if (codeItem.debugInfo == null) {
795777
codeItem.debugInfo = new DebugInfoItem();
778+
codeItem.debugInfo.parameterNames=new StringIdItem[owner.getParameterTypes().length];
796779
}
797780
final DebugInfoItem debugInfoItem = codeItem.debugInfo;
798781
cp.addDebugInfoItem(debugInfoItem);
@@ -803,11 +786,10 @@ public void visitParameterName(int parameterIndex, String name) {
803786
if (name == null) {
804787
return;
805788
}
806-
while (debugInfoItem.parameterNames.size() <= parameterIndex) {
807-
debugInfoItem.parameterNames.add(null);
789+
if (parameterIndex >= debugInfoItem.parameterNames.length) {
790+
return;
808791
}
809-
810-
debugInfoItem.parameterNames.set(parameterIndex, cp.uniqString(name));
792+
debugInfoItem.parameterNames[parameterIndex] = cp.uniqString(name);
811793
}
812794

813795
@Override

dex-writer/src/main/java/com/googlecode/d2j/dex/writer/item/DebugInfoItem.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
public class DebugInfoItem extends BaseItem {
2626
public List<DNode> debugNodes = new ArrayList<>();
27-
public List<StringIdItem> parameterNames = new ArrayList<>();
27+
public StringIdItem parameterNames[];
2828
public int firstLine;
2929
public StringIdItem fileName;
3030

@@ -117,7 +117,7 @@ public int place(int offset) {
117117
if (parameterNames == null) {
118118
offset += lengthOfUleb128(0);
119119
} else {
120-
offset += lengthOfUleb128(parameterNames.size());
120+
offset += lengthOfUleb128(parameterNames.length);
121121
for (StringIdItem s : parameterNames) {
122122
offset += lengthOfUleb128(1 + (s == null ? -1 : s.index));
123123
}
@@ -214,7 +214,7 @@ public void write(DataOut out) {
214214
if (parameterNames == null) {
215215
out.uleb128("szParams", 0);
216216
} else {
217-
out.uleb128("szParams", parameterNames.size());
217+
out.uleb128("szParams", parameterNames.length);
218218
for (StringIdItem s : parameterNames) {
219219
out.uleb128p1("param_name_index", s == null ? -1 : s.index);
220220
}

0 commit comments

Comments
 (0)