diff options
author | Ben Gruver <bgruv@google.com> | 2011-11-17 17:45:16 -0800 |
---|---|---|
committer | = <bgruv@google.com> | 2011-11-20 15:46:39 -0800 |
commit | 1efc2c038842f85728b0ae4311a0e550b826390b (patch) | |
tree | 7d5eaafeb5ba2bfacb8b024f16a32158a913d4b6 /smali | |
parent | a70eb74985e093e5b40dc3e3282ef5b05264bfef (diff) | |
download | smali-1efc2c038842f85728b0ae4311a0e550b826390b.tar.gz |
Add support for Format52c (type references)
Diffstat (limited to 'smali')
6 files changed, 29 insertions, 2 deletions
diff --git a/smali/src/main/antlr3/org/jf/smali/smaliLexer.g b/smali/src/main/antlr3/org/jf/smali/smaliLexer.g index d4484621..ce1a6237 100644 --- a/smali/src/main/antlr3/org/jf/smali/smaliLexer.g +++ b/smali/src/main/antlr3/org/jf/smali/smaliLexer.g @@ -714,6 +714,10 @@ INSTRUCTION_FORMAT41c_FIELD INSTRUCTION_FORMAT51l : 'const-wide'; +INSTRUCTION_FORMAT52c_TYPE + : 'instance-of/jumbo' + | 'new-array/jumbo'; + /********************************************************** * Types diff --git a/smali/src/main/antlr3/org/jf/smali/smaliParser.g b/smali/src/main/antlr3/org/jf/smali/smaliParser.g index 318ac14f..8b22556f 100644 --- a/smali/src/main/antlr3/org/jf/smali/smaliParser.g +++ b/smali/src/main/antlr3/org/jf/smali/smaliParser.g @@ -120,6 +120,7 @@ tokens { I_STATEMENT_FORMAT41c_TYPE; I_STATEMENT_FORMAT41c_FIELD; I_STATEMENT_FORMAT51l; + I_STATEMENT_FORMAT52c_TYPE; I_STATEMENT_ARRAY_DATA; I_STATEMENT_PACKED_SWITCH; I_STATEMENT_SPARSE_SWITCH; @@ -845,6 +846,9 @@ instruction returns [int size] | //e.g. const-wide v0, 5000000000L INSTRUCTION_FORMAT51l REGISTER COMMA fixed_literal {$size = Format.Format51l.size;} -> ^(I_STATEMENT_FORMAT51l[$start, "I_STATEMENT_FORMAT51l"] INSTRUCTION_FORMAT51l REGISTER fixed_literal) + | //e.g. instance-of/jumbo v0, v1, Ljava/lang/String; + INSTRUCTION_FORMAT52c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor {$size = Format.Format52c.size;} + -> ^(I_STATEMENT_FORMAT52c_TYPE[$start, "I_STATEMENT_FORMAT52c_TYPE"] INSTRUCTION_FORMAT52c_TYPE REGISTER REGISTER nonvoid_type_descriptor) | ARRAY_DATA_DIRECTIVE { diff --git a/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g b/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g index 8055c499..f4ffefa0 100644 --- a/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g +++ b/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g @@ -1279,6 +1279,17 @@ instruction[int totalMethodRegisters, int methodParameterRegisters, List<Instruc $instructions.add(new Instruction51l(opcode, regA, litB)); } + | //e.g. instance-of/jumbo v0, v1, Ljava/lang/String; + ^(I_STATEMENT_FORMAT52c_TYPE INSTRUCTION_FORMAT52c_TYPE registerA=REGISTER registerB=REGISTER nonvoid_type_descriptor) + { + Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT52c_TYPE.text); + int regA = parseRegister_short($registerA.text, $totalMethodRegisters, $methodParameterRegisters); + int regB = parseRegister_short($registerB.text, $totalMethodRegisters, $methodParameterRegisters); + + TypeIdItem typeIdItem = $nonvoid_type_descriptor.type; + + $instructions.add(new Instruction52c(opcode, regA, regB, typeIdItem)); + } | //e.g. .array-data 4 1000000 .end array-data ^(I_STATEMENT_ARRAY_DATA ^(I_ARRAY_ELEMENT_SIZE short_integral_literal) array_elements) { diff --git a/smali/src/main/jflex/smaliLexer.flex b/smali/src/main/jflex/smaliLexer.flex index 97da209e..5bd13d35 100644 --- a/smali/src/main/jflex/smaliLexer.flex +++ b/smali/src/main/jflex/smaliLexer.flex @@ -575,6 +575,10 @@ Type = {PrimitiveType} | {ClassDescriptor} | {ArrayDescriptor} "const-wide" { return newToken(INSTRUCTION_FORMAT51l); } + + "instance-of/jumbo" | "new-array/jumbo" { + return newToken(INSTRUCTION_FORMAT52c_TYPE); + } } /*Types*/ diff --git a/smali/src/test/resources/LexerTest/InstructionTest.smali b/smali/src/test/resources/LexerTest/InstructionTest.smali index c80dc8eb..c747c601 100644 --- a/smali/src/test/resources/LexerTest/InstructionTest.smali +++ b/smali/src/test/resources/LexerTest/InstructionTest.smali @@ -239,4 +239,6 @@ sput-boolean/jumbo sput-byte/jumbo sput-char/jumbo sput-short/jumbo -const-wide
\ No newline at end of file +const-wide +instance-of/jumbo +new-array/jumbo
\ No newline at end of file diff --git a/smali/src/test/resources/LexerTest/InstructionTest.tokens b/smali/src/test/resources/LexerTest/InstructionTest.tokens index 871c5a01..86d2981e 100644 --- a/smali/src/test/resources/LexerTest/InstructionTest.tokens +++ b/smali/src/test/resources/LexerTest/InstructionTest.tokens @@ -239,4 +239,6 @@ INSTRUCTION_FORMAT41c_FIELD("sput-boolean/jumbo") INSTRUCTION_FORMAT41c_FIELD("sput-byte/jumbo") INSTRUCTION_FORMAT41c_FIELD("sput-char/jumbo") INSTRUCTION_FORMAT41c_FIELD("sput-short/jumbo") -INSTRUCTION_FORMAT51l("const-wide")
\ No newline at end of file +INSTRUCTION_FORMAT51l("const-wide") +INSTRUCTION_FORMAT52c_TYPE("instance-of/jumbo") +INSTRUCTION_FORMAT52c_TYPE("new-array/jumbo")
\ No newline at end of file |