diff options
author | Ben Gruver <bgruv@google.com> | 2011-11-14 11:51:48 -0800 |
---|---|---|
committer | = <bgruv@google.com> | 2011-11-20 15:46:38 -0800 |
commit | d12c76927616b9f5193864c2d834e84a57c08787 (patch) | |
tree | 01f14d4589c3d16f0def45bd5a5d900204eb3af9 /smali/src | |
parent | d064d6999245b2d1a56efd5db41658306bd66a51 (diff) | |
download | smali-d12c76927616b9f5193864c2d834e84a57c08787.tar.gz |
Add support for Format41c (type references)
Diffstat (limited to 'smali/src')
6 files changed, 38 insertions, 8 deletions
diff --git a/smali/src/main/antlr3/org/jf/smali/smaliLexer.g b/smali/src/main/antlr3/org/jf/smali/smaliLexer.g index c07970ea..07c03167 100644 --- a/smali/src/main/antlr3/org/jf/smali/smaliLexer.g +++ b/smali/src/main/antlr3/org/jf/smali/smaliLexer.g @@ -690,6 +690,11 @@ INSTRUCTION_FORMAT3rms_METHOD : 'invoke-virtual-quick/range' | 'invoke-super-quick/range'; +INSTRUCTION_FORMAT41c_TYPE + : 'check-cast/jumbo' + | 'new-instance/jumbo' + | 'const-class/jumbo'; + INSTRUCTION_FORMAT51l : 'const-wide'; diff --git a/smali/src/main/antlr3/org/jf/smali/smaliParser.g b/smali/src/main/antlr3/org/jf/smali/smaliParser.g index e69e4111..a4fe4598 100644 --- a/smali/src/main/antlr3/org/jf/smali/smaliParser.g +++ b/smali/src/main/antlr3/org/jf/smali/smaliParser.g @@ -117,6 +117,7 @@ tokens { I_STATEMENT_FORMAT35c_TYPE; I_STATEMENT_FORMAT3rc_METHOD; I_STATEMENT_FORMAT3rc_TYPE; + I_STATEMENT_FORMAT41c_TYPE; I_STATEMENT_FORMAT51l; I_STATEMENT_ARRAY_DATA; I_STATEMENT_PACKED_SWITCH; @@ -703,13 +704,14 @@ instruction returns [int size] } } -> ^(I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference) + //TODO: check if dalvik has a jumbo version of throw-verification-error | //e.g. goto/16 endloop: INSTRUCTION_FORMAT20t label_ref_or_offset {$size = Format.Format20t.size;} -> ^(I_STATEMENT_FORMAT20t[$start, "I_STATEMENT_FORMAT20t"] INSTRUCTION_FORMAT20t label_ref_or_offset) - | //e.g. sget-object v0 java/lang/System/out LJava/io/PrintStream; + | //e.g. sget-object v0, java/lang/System/out LJava/io/PrintStream; INSTRUCTION_FORMAT21c_FIELD REGISTER COMMA fully_qualified_field {$size = Format.Format21c.size;} -> ^(I_STATEMENT_FORMAT21c_FIELD[$start, "I_STATEMENT_FORMAT21c_FIELD"] INSTRUCTION_FORMAT21c_FIELD REGISTER fully_qualified_field) - | //e.g. sget-object-volatile v0 java/lang/System/out LJava/io/PrintStream; + | //e.g. sget-object-volatile v0, java/lang/System/out LJava/io/PrintStream; INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER COMMA fully_qualified_field {$size = Format.Format21c.size;} { if (!allowOdex) { @@ -717,10 +719,10 @@ instruction returns [int size] } } -> ^(I_STATEMENT_FORMAT21c_FIELD[$start, "I_STATEMENT_FORMAT21c_FIELD"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER fully_qualified_field) - | //e.g. const-string v1 "Hello World!" + | //e.g. const-string v1, "Hello World!" INSTRUCTION_FORMAT21c_STRING REGISTER COMMA STRING_LITERAL {$size = Format.Format21c.size;} -> ^(I_STATEMENT_FORMAT21c_STRING[$start, "I_STATEMENT_FORMAT21c_STRING"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL) - | //e.g. const-class v2 Lorg/jf/HelloWorld2/HelloWorld2; + | //e.g. const-class v2, Lorg/jf/HelloWorld2/HelloWorld2; INSTRUCTION_FORMAT21c_TYPE REGISTER COMMA reference_type_descriptor {$size = Format.Format21c.size;} -> ^(I_STATEMENT_FORMAT21c_TYPE[$start, "I_STATEMENT_FORMAT21c"] INSTRUCTION_FORMAT21c_TYPE REGISTER reference_type_descriptor) | //e.g. const/high16 v1, 1234 @@ -833,6 +835,9 @@ instruction returns [int size] { throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rms_METHOD.text); } + | //e.g. const-class/jumbo v2, Lorg/jf/HelloWorld2/HelloWorld2; + INSTRUCTION_FORMAT41c_TYPE REGISTER COMMA reference_type_descriptor {$size = Format.Format41c.size;} + -> ^(I_STATEMENT_FORMAT41c_TYPE[$start, "I_STATEMENT_FORMAT41c"] INSTRUCTION_FORMAT41c_TYPE REGISTER reference_type_descriptor) | //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) diff --git a/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g b/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g index b6542ca3..30a714dc 100644 --- a/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g +++ b/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g @@ -998,7 +998,7 @@ instruction[int totalMethodRegisters, int methodParameterRegisters, List<Instruc $instructions.add(new Instruction20t(opcode, addressOffset)); } - | //e.g. sget_object v0 java/lang/System/out LJava/io/PrintStream; + | //e.g. sget_object v0, java/lang/System/out LJava/io/PrintStream; ^(I_STATEMENT_FORMAT21c_FIELD inst=(INSTRUCTION_FORMAT21c_FIELD | INSTRUCTION_FORMAT21c_FIELD_ODEX) REGISTER fully_qualified_field) { Opcode opcode = Opcode.getOpcodeByName($inst.text); @@ -1008,7 +1008,7 @@ instruction[int totalMethodRegisters, int methodParameterRegisters, List<Instruc $instructions.add(new Instruction21c(opcode, regA, fieldIdItem)); } - | //e.g. const-string v1 "Hello World!" + | //e.g. const-string v1, "Hello World!" ^(I_STATEMENT_FORMAT21c_STRING INSTRUCTION_FORMAT21c_STRING REGISTER string_literal) { Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT21c_STRING.text); @@ -1018,7 +1018,7 @@ instruction[int totalMethodRegisters, int methodParameterRegisters, List<Instruc instructions.add(new Instruction21c(opcode, regA, stringIdItem)); } - | //e.g. const-class v2 org/jf/HelloWorld2/HelloWorld2 + | //e.g. const-class v2, org/jf/HelloWorld2/HelloWorld2 ^(I_STATEMENT_FORMAT21c_TYPE INSTRUCTION_FORMAT21c_TYPE REGISTER reference_type_descriptor) { Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT21c_TYPE.text); @@ -1074,7 +1074,7 @@ instruction[int totalMethodRegisters, int methodParameterRegisters, List<Instruc $instructions.add(new Instruction22b(opcode, regA, regB, (byte)litC)); } - | //e.g. iput-object v1 v0 org/jf/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String; + | //e.g. iput-object v1, v0, org/jf/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String; ^(I_STATEMENT_FORMAT22c_FIELD inst=(INSTRUCTION_FORMAT22c_FIELD | INSTRUCTION_FORMAT22c_FIELD_ODEX) registerA=REGISTER registerB=REGISTER fully_qualified_field) { Opcode opcode = Opcode.getOpcodeByName($inst.text); @@ -1249,6 +1249,16 @@ instruction[int totalMethodRegisters, int methodParameterRegisters, List<Instruc $instructions.add(new Instruction3rc(opcode, (short)registerCount, startRegister, typeIdItem)); } + | //e.g. const-class/jumbo v2, org/jf/HelloWorld2/HelloWorld2 + ^(I_STATEMENT_FORMAT41c_TYPE INSTRUCTION_FORMAT41c_TYPE REGISTER reference_type_descriptor) + { + Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT41c_TYPE.text); + int regA = parseRegister_short($REGISTER.text, $totalMethodRegisters, $methodParameterRegisters); + + TypeIdItem typeIdItem = $reference_type_descriptor.type; + + $instructions.add(new Instruction41c(opcode, regA, typeIdItem)); + } | //e.g. const-wide v0, 5000000000L ^(I_STATEMENT_FORMAT51l INSTRUCTION_FORMAT51l REGISTER fixed_64bit_literal) { diff --git a/smali/src/main/jflex/smaliLexer.flex b/smali/src/main/jflex/smaliLexer.flex index 8697b8d7..2cc83e1a 100644 --- a/smali/src/main/jflex/smaliLexer.flex +++ b/smali/src/main/jflex/smaliLexer.flex @@ -562,6 +562,10 @@ Type = {PrimitiveType} | {ClassDescriptor} | {ArrayDescriptor} return newToken(INSTRUCTION_FORMAT3rms_METHOD); } + "check-cast/jumbo" | "new-instance/jumbo" | "const-class/jumbo" { + return newToken(INSTRUCTION_FORMAT41c_TYPE); + } + "const-wide" { return newToken(INSTRUCTION_FORMAT51l); } diff --git a/smali/src/test/resources/LexerTest/InstructionTest.smali b/smali/src/test/resources/LexerTest/InstructionTest.smali index 7a7c3352..433b0017 100644 --- a/smali/src/test/resources/LexerTest/InstructionTest.smali +++ b/smali/src/test/resources/LexerTest/InstructionTest.smali @@ -222,4 +222,7 @@ filled-new-array/range execute-inline/range invoke-virtual-quick/range invoke-super-quick/range +check-cast/jumbo +new-instance/jumbo +const-class/jumbo const-wide
\ 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 23e48956..435e7cfa 100644 --- a/smali/src/test/resources/LexerTest/InstructionTest.tokens +++ b/smali/src/test/resources/LexerTest/InstructionTest.tokens @@ -222,4 +222,7 @@ INSTRUCTION_FORMAT3rc_TYPE("filled-new-array/range") INSTRUCTION_FORMAT3rmi_METHOD("execute-inline/range") INSTRUCTION_FORMAT3rms_METHOD("invoke-virtual-quick/range") INSTRUCTION_FORMAT3rms_METHOD("invoke-super-quick/range") +INSTRUCTION_FORMAT41c_TYPE("check-cast/jumbo") +INSTRUCTION_FORMAT41c_TYPE("new-instance/jumbo") +INSTRUCTION_FORMAT41c_TYPE("const-class/jumbo") INSTRUCTION_FORMAT51l("const-wide")
\ No newline at end of file |