aboutsummaryrefslogtreecommitdiff
path: root/smali/src
diff options
context:
space:
mode:
authorJesusFreke@JesusFreke.com <JesusFreke@JesusFreke.com@55b6fa8a-2a1e-11de-a435-ffa8d773f76a>2010-12-23 19:58:17 +0000
committerJesusFreke@JesusFreke.com <JesusFreke@JesusFreke.com@55b6fa8a-2a1e-11de-a435-ffa8d773f76a>2010-12-23 19:58:17 +0000
commit27dd1a5d976a96ff5f533becf526b76c1c0dbf67 (patch)
treea4a2012931387d94e5bc965e55c6bec0f3727b5b /smali/src
parent66c6e9051295ad54a1b01157044671751e77512f (diff)
downloadsmali-27dd1a5d976a96ff5f533becf526b76c1c0dbf67.tar.gz
Add support in smali for the new odex instructions
git-svn-id: https://smali.googlecode.com/svn/trunk@802 55b6fa8a-2a1e-11de-a435-ffa8d773f76a
Diffstat (limited to 'smali/src')
-rw-r--r--smali/src/main/antlr3/org/jf/smali/smaliLexer.g18
-rw-r--r--smali/src/main/antlr3/org/jf/smali/smaliParser.g12
-rw-r--r--smali/src/main/jflex/smaliLexer.flex10
-rw-r--r--smali/src/test/resources/LexerTest/InstructionTest.smali12
-rw-r--r--smali/src/test/resources/LexerTest/InstructionTest.tokens12
5 files changed, 63 insertions, 1 deletions
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")