aboutsummaryrefslogtreecommitdiff
path: root/smali
diff options
context:
space:
mode:
authorBen Gruver <bgruv@google.com>2011-11-20 11:39:21 -0800
committer= <bgruv@google.com>2011-11-20 15:47:53 -0800
commit0d785ac31557f35f084204d2f7de1af900f8a7a3 (patch)
treeaf6e7784baf3abf814f810e45e095c9b8362a5d2 /smali
parent4dda65fdb3a96ac6cecff9d0da30526cf0a0d344 (diff)
downloadsmali-0d785ac31557f35f084204d2f7de1af900f8a7a3.tar.gz
Add support for jumbo volatile field access opcodes
Diffstat (limited to 'smali')
-rw-r--r--smali/src/main/antlr3/org/jf/smali/smaliLexer.g16
-rw-r--r--smali/src/main/antlr3/org/jf/smali/smaliParser.g10
-rw-r--r--smali/src/main/jflex/smaliLexer.flex10
-rw-r--r--smali/src/test/resources/LexerTest/InstructionTest.smali14
-rw-r--r--smali/src/test/resources/LexerTest/InstructionTest.tokens14
5 files changed, 62 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 882744b5..3d7949ee 100644
--- a/smali/src/main/antlr3/org/jf/smali/smaliLexer.g
+++ b/smali/src/main/antlr3/org/jf/smali/smaliLexer.g
@@ -717,6 +717,14 @@ INSTRUCTION_FORMAT41c_FIELD
| 'sput-char/jumbo'
| 'sput-short/jumbo';
+INSTRUCTION_FORMAT41c_FIELD_ODEX
+ : 'sget-volatile/jumbo'
+ | 'sget-wide-volatile/jumbo'
+ | 'sget-object-volatile/jumbo'
+ | 'sput-volatile/jumbo'
+ | 'sput-wide-volatile/jumbo'
+ | 'sput-object-volatile/jumbo';
+
INSTRUCTION_FORMAT51l
: 'const-wide';
@@ -740,6 +748,14 @@ INSTRUCTION_FORMAT52c_FIELD
| 'iput-char/jumbo'
| 'iput-short/jumbo';
+INSTRUCTION_FORMAT52c_FIELD_ODEX
+ : 'iget-volatile/jumbo'
+ | 'iget-wide-volatile/jumbo'
+ | 'iget-object-volatile/jumbo'
+ | 'iput-volatile/jumbo'
+ | 'iput-wide-volatile/jumbo'
+ | 'iput-object-volatile/jumbo';
+
INSTRUCTION_FORMAT5rc_METHOD
: 'invoke-virtual/jumbo'
| 'invoke-super/jumbo'
diff --git a/smali/src/main/antlr3/org/jf/smali/smaliParser.g b/smali/src/main/antlr3/org/jf/smali/smaliParser.g
index acf6064c..1d957c59 100644
--- a/smali/src/main/antlr3/org/jf/smali/smaliParser.g
+++ b/smali/src/main/antlr3/org/jf/smali/smaliParser.g
@@ -857,6 +857,11 @@ instruction returns [int size]
| //e.g. sget-object/jumbo v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
INSTRUCTION_FORMAT41c_FIELD REGISTER COMMA fully_qualified_field {$size = Format.Format41c.size;}
-> ^(I_STATEMENT_FORMAT41c_FIELD[$start, "I_STATEMENT_FORMAT41c_FIELD"] INSTRUCTION_FORMAT41c_FIELD REGISTER fully_qualified_field)
+ | //e.g. sget-object-volatile/jumbo v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
+ INSTRUCTION_FORMAT41c_FIELD_ODEX REGISTER COMMA fully_qualified_field {$size = Format.Format41c.size;}
+ {
+ throwOdexedInstructionException(input, $INSTRUCTION_FORMAT41c_FIELD_ODEX.text);
+ }
| //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)
@@ -866,6 +871,11 @@ instruction returns [int size]
| //e.g. iput-object/jumbo v1, v0 Lorg/jf/HelloWorld2/HelloWorld2;->helloWorld:Ljava/lang/String;
INSTRUCTION_FORMAT52c_FIELD REGISTER COMMA REGISTER COMMA fully_qualified_field {$size = Format.Format52c.size;}
-> ^(I_STATEMENT_FORMAT52c_FIELD[$start, "I_STATEMENT_FORMAT52c_FIELD"] INSTRUCTION_FORMAT52c_FIELD REGISTER REGISTER fully_qualified_field)
+ | //e.g. iput-object-volatile/jumbo v1, v0 Lorg/jf/HelloWorld2/HelloWorld2;->helloWorld:Ljava/lang/String;
+ INSTRUCTION_FORMAT52c_FIELD_ODEX REGISTER COMMA REGISTER COMMA fully_qualified_field {$size = Format.Format52c.size;}
+ {
+ throwOdexedInstructionException(input, $INSTRUCTION_FORMAT52c_FIELD_ODEX.text);
+ }
| //e.g. invoke-virtual/jumbo {v25..v26}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
INSTRUCTION_FORMAT5rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA fully_qualified_method {$size = Format.Format5rc.size;}
-> ^(I_STATEMENT_FORMAT5rc_METHOD[$start, "I_STATEMENT_FORMAT5rc_METHOD"] INSTRUCTION_FORMAT5rc_METHOD register_range fully_qualified_method)
diff --git a/smali/src/main/jflex/smaliLexer.flex b/smali/src/main/jflex/smaliLexer.flex
index 9713916b..5fba1395 100644
--- a/smali/src/main/jflex/smaliLexer.flex
+++ b/smali/src/main/jflex/smaliLexer.flex
@@ -580,6 +580,11 @@ Type = {PrimitiveType} | {ClassDescriptor} | {ArrayDescriptor}
return newToken(INSTRUCTION_FORMAT41c_FIELD);
}
+ "sget-volatile/jumbo" | "sget-wide-volatile/jumbo" | "sget-object-volatile/jumbo" | "sput-volatile/jumbo" |
+ "sput-wide-volatile/jumbo" | "sput-object-volatile/jumbo" {
+ return newToken(INSTRUCTION_FORMAT41c_FIELD_ODEX);
+ }
+
"const-wide" {
return newToken(INSTRUCTION_FORMAT51l);
}
@@ -594,6 +599,11 @@ Type = {PrimitiveType} | {ClassDescriptor} | {ArrayDescriptor}
return newToken(INSTRUCTION_FORMAT52c_FIELD);
}
+ "iget-volatile/jumbo" | "iget-wide-volatile/jumbo" | "iget-object-volatile/jumbo" | "iput-volatile/jumbo" |
+ "iput-wide-volatile/jumbo" | "iput-object-volatile/jumbo" {
+ return newToken(INSTRUCTION_FORMAT52c_FIELD_ODEX);
+ }
+
"invoke-virtual/jumbo" | "invoke-super/jumbo" | "invoke-direct/jumbo" | "invoke-static/jumbo" |
"invoke-interface/jumbo" {
return newToken(INSTRUCTION_FORMAT5rc_METHOD);
diff --git a/smali/src/test/resources/LexerTest/InstructionTest.smali b/smali/src/test/resources/LexerTest/InstructionTest.smali
index 47cc6d65..8b458342 100644
--- a/smali/src/test/resources/LexerTest/InstructionTest.smali
+++ b/smali/src/test/resources/LexerTest/InstructionTest.smali
@@ -265,4 +265,16 @@ invoke-direct/jumbo
invoke-static/jumbo
invoke-interface/jumbo
filled-new-array/jumbo
-invoke-object-init/jumbo \ No newline at end of file
+invoke-object-init/jumbo
+iget-volatile/jumbo
+iget-wide-volatile/jumbo
+iget-object-volatile/jumbo
+iput-volatile/jumbo
+iput-wide-volatile/jumbo
+iput-object-volatile/jumbo
+sget-volatile/jumbo
+sget-wide-volatile/jumbo
+sget-object-volatile/jumbo
+sput-volatile/jumbo
+sput-wide-volatile/jumbo
+sput-object-volatile/jumbo
diff --git a/smali/src/test/resources/LexerTest/InstructionTest.tokens b/smali/src/test/resources/LexerTest/InstructionTest.tokens
index 1de5aadc..457ceebd 100644
--- a/smali/src/test/resources/LexerTest/InstructionTest.tokens
+++ b/smali/src/test/resources/LexerTest/InstructionTest.tokens
@@ -265,4 +265,16 @@ INSTRUCTION_FORMAT5rc_METHOD("invoke-direct/jumbo")
INSTRUCTION_FORMAT5rc_METHOD("invoke-static/jumbo")
INSTRUCTION_FORMAT5rc_METHOD("invoke-interface/jumbo")
INSTRUCTION_FORMAT5rc_TYPE("filled-new-array/jumbo")
-INSTRUCTION_FORMAT5rc_METHOD_ODEX("invoke-object-init/jumbo") \ No newline at end of file
+INSTRUCTION_FORMAT5rc_METHOD_ODEX("invoke-object-init/jumbo")
+INSTRUCTION_FORMAT52c_FIELD_ODEX("iget-volatile/jumbo")
+INSTRUCTION_FORMAT52c_FIELD_ODEX("iget-wide-volatile/jumbo")
+INSTRUCTION_FORMAT52c_FIELD_ODEX("iget-object-volatile/jumbo")
+INSTRUCTION_FORMAT52c_FIELD_ODEX("iput-volatile/jumbo")
+INSTRUCTION_FORMAT52c_FIELD_ODEX("iput-wide-volatile/jumbo")
+INSTRUCTION_FORMAT52c_FIELD_ODEX("iput-object-volatile/jumbo")
+INSTRUCTION_FORMAT41c_FIELD_ODEX("sget-volatile/jumbo")
+INSTRUCTION_FORMAT41c_FIELD_ODEX("sget-wide-volatile/jumbo")
+INSTRUCTION_FORMAT41c_FIELD_ODEX("sget-object-volatile/jumbo")
+INSTRUCTION_FORMAT41c_FIELD_ODEX("sput-volatile/jumbo")
+INSTRUCTION_FORMAT41c_FIELD_ODEX("sput-wide-volatile/jumbo")
+INSTRUCTION_FORMAT41c_FIELD_ODEX("sput-object-volatile/jumbo")