From 27dd1a5d976a96ff5f533becf526b76c1c0dbf67 Mon Sep 17 00:00:00 2001 From: "JesusFreke@JesusFreke.com" Date: Thu, 23 Dec 2010 19:58:17 +0000 Subject: Add support in smali for the new odex instructions git-svn-id: https://smali.googlecode.com/svn/trunk@802 55b6fa8a-2a1e-11de-a435-ffa8d773f76a --- smali/src/main/antlr3/org/jf/smali/smaliLexer.g | 18 +++++++++++++++++- smali/src/main/antlr3/org/jf/smali/smaliParser.g | 12 ++++++++++++ smali/src/main/jflex/smaliLexer.flex | 10 ++++++++++ .../src/test/resources/LexerTest/InstructionTest.smali | 12 ++++++++++++ .../test/resources/LexerTest/InstructionTest.tokens | 12 ++++++++++++ 5 files changed, 63 insertions(+), 1 deletion(-) (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 cbdf1ca8..5dc2dbe1 100644 --- a/smali/src/main/antlr3/org/jf/smali/smaliLexer.g +++ b/smali/src/main/antlr3/org/jf/smali/smaliLexer.g @@ -80,7 +80,7 @@ options { @lexer::header { package org.jf.smali; - + import static org.jf.smali.LexerErrorInterface.ANTLRLexerWithErrorInterface; } @@ -453,6 +453,14 @@ INSTRUCTION_FORMAT21c_FIELD | 'sput-char' | 'sput-short'; +INSTRUCTION_FORMAT21c_FIELD_ODEX + : 'sget-volatile' + | 'sget-wide-volatile' + | 'sget-object-volatile' + | 'sput-volatile' + | 'sput-wide-volatile' + | 'sput-object-volatile'; + INSTRUCTION_FORMAT21c_STRING : 'const-string'; @@ -506,6 +514,14 @@ INSTRUCTION_FORMAT22c_FIELD | 'iput-char' | 'iput-short'; +INSTRUCTION_FORMAT22c_FIELD_ODEX + : 'iget-volatile' + | 'iget-wide-volatile' + | 'iget-object-volatile' + | 'iput-volatile' + | 'iput-wide-volatile' + | 'iput-object-volatile'; + INSTRUCTION_FORMAT22c_TYPE : 'instance-of' | 'new-array'; diff --git a/smali/src/main/antlr3/org/jf/smali/smaliParser.g b/smali/src/main/antlr3/org/jf/smali/smaliParser.g index e63c6f7e..b318d496 100644 --- a/smali/src/main/antlr3/org/jf/smali/smaliParser.g +++ b/smali/src/main/antlr3/org/jf/smali/smaliParser.g @@ -436,10 +436,12 @@ simple_name | INSTRUCTION_FORMAT11x -> SIMPLE_NAME[$INSTRUCTION_FORMAT11x] | INSTRUCTION_FORMAT12x_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT12x_OR_ID] | INSTRUCTION_FORMAT21c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD] + | INSTRUCTION_FORMAT21c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD_ODEX] | INSTRUCTION_FORMAT21c_STRING -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_STRING] | INSTRUCTION_FORMAT21c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_TYPE] | INSTRUCTION_FORMAT21t -> SIMPLE_NAME[$INSTRUCTION_FORMAT21t] | INSTRUCTION_FORMAT22c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD] + | INSTRUCTION_FORMAT22c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD_ODEX] | INSTRUCTION_FORMAT22c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_TYPE] | INSTRUCTION_FORMAT22cs_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22cs_FIELD] | INSTRUCTION_FORMAT22s_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT22s_OR_ID] @@ -688,6 +690,11 @@ instruction returns [int size] | //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; + INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER COMMA fully_qualified_field + { + throwOdexedInstructionException(input, $INSTRUCTION_FORMAT21c_FIELD_ODEX.text); + } | //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) @@ -709,6 +716,11 @@ instruction returns [int size] | //e.g. iput-object v1, v0 org/jf/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String; INSTRUCTION_FORMAT22c_FIELD REGISTER COMMA REGISTER COMMA fully_qualified_field {$size = Format.Format22c.size;} -> ^(I_STATEMENT_FORMAT22c_FIELD[$start, "I_STATEMENT_FORMAT22c_FIELD"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER fully_qualified_field) + | //e.g. iput-object-volatile v1, v0 org/jf/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String; + INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER COMMA REGISTER COMMA fully_qualified_field + { + throwOdexedInstructionException(input, $INSTRUCTION_FORMAT22c_FIELD_ODEX.text); + } | //e.g. instance-of v0, v1, Ljava/lang/String; INSTRUCTION_FORMAT22c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor {$size = Format.Format22c.size;} -> ^(I_STATEMENT_FORMAT22c_TYPE[$start, "I_STATEMENT_FORMAT22c_TYPE"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor) diff --git a/smali/src/main/jflex/smaliLexer.flex b/smali/src/main/jflex/smaliLexer.flex index d8ca0b39..9d534363 100644 --- a/smali/src/main/jflex/smaliLexer.flex +++ b/smali/src/main/jflex/smaliLexer.flex @@ -416,6 +416,11 @@ Type = {PrimitiveType} | {ClassDescriptor} | {ArrayDescriptor} return newToken(INSTRUCTION_FORMAT21c_FIELD); } + "sget-volatile" | "sget-wide-volatile" | "sget-object-volatile" | "sput-volatile" | "sput-wide-volatile" | + "sput-object-volatile" { + return newToken(INSTRUCTION_FORMAT21c_FIELD_ODEX); + } + "const-string" { return newToken(INSTRUCTION_FORMAT21c_STRING); } @@ -446,6 +451,11 @@ Type = {PrimitiveType} | {ClassDescriptor} | {ArrayDescriptor} return newToken(INSTRUCTION_FORMAT22c_FIELD); } + "iget-volatile" | "iget-wide-volatile" | "iget-object-volatile" | "iput-volatile" | "iput-wide-volatile" | + "iput-object-volatile" { + return newToken(INSTRUCTION_FORMAT22c_FIELD_ODEX); + } + "instance-of" | "new-array" { return newToken(INSTRUCTION_FORMAT22c_TYPE); } diff --git a/smali/src/test/resources/LexerTest/InstructionTest.smali b/smali/src/test/resources/LexerTest/InstructionTest.smali index 4c3a0a4c..30a1e975 100644 --- a/smali/src/test/resources/LexerTest/InstructionTest.smali +++ b/smali/src/test/resources/LexerTest/InstructionTest.smali @@ -72,6 +72,12 @@ sput-boolean sput-byte sput-char sput-short +sget-volatile +sget-wide-volatile +sget-object-volatile +sput-volatile +sput-wide-volatile +sput-object-volatile const-string check-cast new-instance @@ -106,6 +112,12 @@ iput-boolean iput-byte iput-char iput-short +iget-volatile +iget-wide-volatile +iget-object-volatile +iput-volatile +iput-wide-volatile +iput-object-volatile instance-of new-array iget-quick diff --git a/smali/src/test/resources/LexerTest/InstructionTest.tokens b/smali/src/test/resources/LexerTest/InstructionTest.tokens index b195df01..772bdc0b 100644 --- a/smali/src/test/resources/LexerTest/InstructionTest.tokens +++ b/smali/src/test/resources/LexerTest/InstructionTest.tokens @@ -72,6 +72,12 @@ INSTRUCTION_FORMAT21c_FIELD("sput-boolean") INSTRUCTION_FORMAT21c_FIELD("sput-byte") INSTRUCTION_FORMAT21c_FIELD("sput-char") INSTRUCTION_FORMAT21c_FIELD("sput-short") +INSTRUCTION_FORMAT21c_FIELD_ODEX("sget-volatile") +INSTRUCTION_FORMAT21c_FIELD_ODEX("sget-wide-volatile") +INSTRUCTION_FORMAT21c_FIELD_ODEX("sget-object-volatile") +INSTRUCTION_FORMAT21c_FIELD_ODEX("sput-volatile") +INSTRUCTION_FORMAT21c_FIELD_ODEX("sput-wide-volatile") +INSTRUCTION_FORMAT21c_FIELD_ODEX("sput-object-volatile") INSTRUCTION_FORMAT21c_STRING("const-string") INSTRUCTION_FORMAT21c_TYPE("check-cast") INSTRUCTION_FORMAT21c_TYPE("new-instance") @@ -106,6 +112,12 @@ INSTRUCTION_FORMAT22c_FIELD("iput-boolean") INSTRUCTION_FORMAT22c_FIELD("iput-byte") INSTRUCTION_FORMAT22c_FIELD("iput-char") INSTRUCTION_FORMAT22c_FIELD("iput-short") +INSTRUCTION_FORMAT22c_FIELD_ODEX("iget-volatile") +INSTRUCTION_FORMAT22c_FIELD_ODEX("iget-wide-volatile") +INSTRUCTION_FORMAT22c_FIELD_ODEX("iget-object-volatile") +INSTRUCTION_FORMAT22c_FIELD_ODEX("iput-volatile") +INSTRUCTION_FORMAT22c_FIELD_ODEX("iput-wide-volatile") +INSTRUCTION_FORMAT22c_FIELD_ODEX("iput-object-volatile") INSTRUCTION_FORMAT22c_TYPE("instance-of") INSTRUCTION_FORMAT22c_TYPE("new-array") INSTRUCTION_FORMAT22cs_FIELD("iget-quick") -- cgit v1.2.3