From b0c62b9781751e4d04d2ddb4458940d545cc8bb2 Mon Sep 17 00:00:00 2001 From: Ben Gruver Date: Wed, 9 Nov 2011 16:28:26 -0800 Subject: Seperate out execute-inline and execute-inline/range into seperate 35mi and 3rmi formats --- smali/src/main/antlr3/org/jf/smali/smaliLexer.g | 17 ++++++++++++----- smali/src/main/antlr3/org/jf/smali/smaliParser.g | 17 ++++++++++++++--- smali/src/main/jflex/smaliLexer.flex | 15 ++++++++++++--- .../src/test/resources/LexerTest/InstructionTest.smali | 1 + .../src/test/resources/LexerTest/InstructionTest.tokens | 3 ++- smali/src/test/resources/LexerTest/MiscTest.smali | 7 +++++++ smali/src/test/resources/LexerTest/MiscTest.tokens | 13 ++++++++++--- 7 files changed, 58 insertions(+), 15 deletions(-) (limited to 'smali/src') diff --git a/smali/src/main/antlr3/org/jf/smali/smaliLexer.g b/smali/src/main/antlr3/org/jf/smali/smaliLexer.g index ceac9545..c07970ea 100644 --- a/smali/src/main/antlr3/org/jf/smali/smaliLexer.g +++ b/smali/src/main/antlr3/org/jf/smali/smaliLexer.g @@ -343,7 +343,10 @@ VERIFICATION_ERROR_TYPE | 'class-change-error' | 'instantiation-error'; -VTABLE_OFFSET +INLINE_INDEX + : 'inline@0x' HEX_DIGIT+; + +VTABLE_INDEX : 'vtable@0x' HEX_DIGIT+; FIELD_OFFSET @@ -663,9 +666,11 @@ INSTRUCTION_FORMAT35c_TYPE INSTRUCTION_FORMAT35s_METHOD : 'invoke-direct-empty'; +INSTRUCTION_FORMAT35mi_METHOD + : 'execute-inline'; + INSTRUCTION_FORMAT35ms_METHOD - : 'execute-inline' - | 'invoke-virtual-quick' + : 'invoke-virtual-quick' | 'invoke-super-quick'; INSTRUCTION_FORMAT3rc_METHOD @@ -678,9 +683,11 @@ INSTRUCTION_FORMAT3rc_METHOD INSTRUCTION_FORMAT3rc_TYPE : 'filled-new-array/range'; +INSTRUCTION_FORMAT3rmi_METHOD + : 'execute-inline/range'; + INSTRUCTION_FORMAT3rms_METHOD - : 'execute-inline/range' - | 'invoke-virtual-quick/range' + : 'invoke-virtual-quick/range' | 'invoke-super-quick/range'; INSTRUCTION_FORMAT51l diff --git a/smali/src/main/antlr3/org/jf/smali/smaliParser.g b/smali/src/main/antlr3/org/jf/smali/smaliParser.g index 942b6ca6..e69e4111 100644 --- a/smali/src/main/antlr3/org/jf/smali/smaliParser.g +++ b/smali/src/main/antlr3/org/jf/smali/smaliParser.g @@ -459,6 +459,7 @@ simple_name | INSTRUCTION_FORMAT35c_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD] | INSTRUCTION_FORMAT35c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_TYPE] | INSTRUCTION_FORMAT35s_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35s_METHOD] + | INSTRUCTION_FORMAT35mi_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35mi_METHOD] | INSTRUCTION_FORMAT35ms_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35ms_METHOD] | INSTRUCTION_FORMAT51l -> SIMPLE_NAME[$INSTRUCTION_FORMAT51l]; @@ -806,8 +807,13 @@ instruction returns [int size] { throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35s_METHOD.text); } - | //e.g. invoke-virtual-range {v0, v1}, vtable@0x4 - INSTRUCTION_FORMAT35ms_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA VTABLE_OFFSET + | //e.g. execute-inline {v0, v1}, inline@0x4 + INSTRUCTION_FORMAT35mi_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA INLINE_INDEX + { + throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35mi_METHOD.text); + } + | //e.g. invoke-virtual-quick {v0, v1}, vtable@0x4 + INSTRUCTION_FORMAT35ms_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA VTABLE_INDEX { throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35ms_METHOD.text); } @@ -817,8 +823,13 @@ instruction returns [int size] | //e.g. filled-new-array/range {v0..v6}, I INSTRUCTION_FORMAT3rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor {$size = Format.Format3rc.size;} -> ^(I_STATEMENT_FORMAT3rc_TYPE[$start, "I_STATEMENT_FORMAT3rc_TYPE"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor) + | //e.g. execute-inline/range {v0 .. v10}, inline@0x14 + INSTRUCTION_FORMAT3rmi_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA INLINE_INDEX + { + throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rmi_METHOD.text); + } | //e.g. invoke-virtual-quick/range {v0 .. v10}, vtable@0x14 - INSTRUCTION_FORMAT3rms_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA VTABLE_OFFSET + INSTRUCTION_FORMAT3rms_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA VTABLE_INDEX { throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rms_METHOD.text); } diff --git a/smali/src/main/jflex/smaliLexer.flex b/smali/src/main/jflex/smaliLexer.flex index ab1dca9b..8697b8d7 100644 --- a/smali/src/main/jflex/smaliLexer.flex +++ b/smali/src/main/jflex/smaliLexer.flex @@ -369,7 +369,8 @@ Type = {PrimitiveType} | {ClassDescriptor} | {ArrayDescriptor} return newToken(VERIFICATION_ERROR_TYPE); } - "vtable@0x" {HexDigit}+ { return newToken(VTABLE_OFFSET); } + "inline@0x" {HexDigit}+ { return newToken(INLINE_INDEX); } + "vtable@0x" {HexDigit}+ { return newToken(VTABLE_INDEX); } "field@0x" {HexDigit}+ { return newToken(FIELD_OFFSET); } "+" {Integer} { return newToken(OFFSET); } @@ -536,7 +537,11 @@ Type = {PrimitiveType} | {ClassDescriptor} | {ArrayDescriptor} return newToken(INSTRUCTION_FORMAT35s_METHOD); } - "execute-inline" | "invoke-virtual-quick" | "invoke-super-quick" { + "execute-inline" { + return newToken(INSTRUCTION_FORMAT35mi_METHOD); + } + + "invoke-virtual-quick" | "invoke-super-quick" { return newToken(INSTRUCTION_FORMAT35ms_METHOD); } @@ -549,7 +554,11 @@ Type = {PrimitiveType} | {ClassDescriptor} | {ArrayDescriptor} return newToken(INSTRUCTION_FORMAT3rc_TYPE); } - "execute-inline/range" | "invoke-virtual-quick/range" | "invoke-super-quick/range" { + "execute-inline/range" { + return newToken(INSTRUCTION_FORMAT3rmi_METHOD); + } + + "invoke-virtual-quick/range" | "invoke-super-quick/range" { return newToken(INSTRUCTION_FORMAT3rms_METHOD); } diff --git a/smali/src/test/resources/LexerTest/InstructionTest.smali b/smali/src/test/resources/LexerTest/InstructionTest.smali index e5fa785f..7a7c3352 100644 --- a/smali/src/test/resources/LexerTest/InstructionTest.smali +++ b/smali/src/test/resources/LexerTest/InstructionTest.smali @@ -219,6 +219,7 @@ invoke-super/range invoke-direct/range invoke-static/range filled-new-array/range +execute-inline/range invoke-virtual-quick/range invoke-super-quick/range 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 a4b1b74b..23e48956 100644 --- a/smali/src/test/resources/LexerTest/InstructionTest.tokens +++ b/smali/src/test/resources/LexerTest/InstructionTest.tokens @@ -211,7 +211,7 @@ INSTRUCTION_FORMAT35c_METHOD("invoke-interface") INSTRUCTION_FORMAT35c_TYPE("filled-new-array") INSTRUCTION_FORMAT35s_METHOD("invoke-direct-empty") INSTRUCTION_FORMAT20bc("throw-verification-error") -INSTRUCTION_FORMAT35ms_METHOD("execute-inline") +INSTRUCTION_FORMAT35mi_METHOD("execute-inline") INSTRUCTION_FORMAT35ms_METHOD("invoke-virtual-quick") INSTRUCTION_FORMAT35ms_METHOD("invoke-super-quick") INSTRUCTION_FORMAT3rc_METHOD("invoke-virtual/range") @@ -219,6 +219,7 @@ INSTRUCTION_FORMAT3rc_METHOD("invoke-super/range") INSTRUCTION_FORMAT3rc_METHOD("invoke-direct/range") INSTRUCTION_FORMAT3rc_METHOD("invoke-static/range") 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_FORMAT51l("const-wide") \ No newline at end of file diff --git a/smali/src/test/resources/LexerTest/MiscTest.smali b/smali/src/test/resources/LexerTest/MiscTest.smali index 3c280e8f..32bbd272 100644 --- a/smali/src/test/resources/LexerTest/MiscTest.smali +++ b/smali/src/test/resources/LexerTest/MiscTest.smali @@ -45,6 +45,10 @@ illegal-method-access class-change-error instantiation-error +inline@0xABCD +inline@0x0123 +inline@0x0123ABCD + vtable@0xABCD vtable@0x0123 vtable@0x0123ABCD @@ -53,6 +57,9 @@ field@0xABCD field@0x0123 field@0x0123ABCD +inline@ +inline@zzz +inline@abcd vtable@ vtable@zzz vtable@abcd diff --git a/smali/src/test/resources/LexerTest/MiscTest.tokens b/smali/src/test/resources/LexerTest/MiscTest.tokens index fda05c45..841c9935 100644 --- a/smali/src/test/resources/LexerTest/MiscTest.tokens +++ b/smali/src/test/resources/LexerTest/MiscTest.tokens @@ -45,14 +45,21 @@ VERIFICATION_ERROR_TYPE("illegal-method-access") VERIFICATION_ERROR_TYPE("class-change-error") VERIFICATION_ERROR_TYPE("instantiation-error") -VTABLE_OFFSET("vtable@0xABCD") -VTABLE_OFFSET("vtable@0x0123") -VTABLE_OFFSET("vtable@0x0123ABCD") +INLINE_INDEX("inline@0xABCD") +INLINE_INDEX("inline@0x0123") +INLINE_INDEX("inline@0x0123ABCD") + +VTABLE_INDEX("vtable@0xABCD") +VTABLE_INDEX("vtable@0x0123") +VTABLE_INDEX("vtable@0x0123ABCD") FIELD_OFFSET("field@0xABCD") FIELD_OFFSET("field@0x0123") FIELD_OFFSET("field@0x0123ABCD") +SIMPLE_NAME("inline") INVALID_TOKEN("@") +SIMPLE_NAME("inline") INVALID_TOKEN("@") SIMPLE_NAME("zzz") +SIMPLE_NAME("inline") INVALID_TOKEN("@") SIMPLE_NAME("abcd") SIMPLE_NAME("vtable") INVALID_TOKEN("@") SIMPLE_NAME("vtable") INVALID_TOKEN("@") SIMPLE_NAME("zzz") SIMPLE_NAME("vtable") INVALID_TOKEN("@") SIMPLE_NAME("abcd") -- cgit v1.2.3