aboutsummaryrefslogtreecommitdiff
path: root/smali/src
diff options
context:
space:
mode:
authorBen Gruver <bgruv@google.com>2011-11-17 15:40:35 -0800
committer= <bgruv@google.com>2011-11-20 15:46:39 -0800
commitd863324ffb94f70dbb59f1dab4dabd2ce1b39cfd (patch)
treec25a914ae0f083ff4c0b695731cd3b31f213b64d /smali/src
parent8b3b577f00fb3ee76954267e33195ad8312129cd (diff)
downloadsmali-d863324ffb94f70dbb59f1dab4dabd2ce1b39cfd.tar.gz
Add support for Format41c (field references)
Diffstat (limited to 'smali/src')
-rw-r--r--smali/src/main/antlr3/org/jf/smali/smaliLexer.g16
-rw-r--r--smali/src/main/antlr3/org/jf/smali/smaliParser.g4
-rw-r--r--smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g10
-rw-r--r--smali/src/main/jflex/smaliLexer.flex6
-rw-r--r--smali/src/test/resources/LexerTest/InstructionTest.smali14
-rw-r--r--smali/src/test/resources/LexerTest/InstructionTest.tokens14
6 files changed, 64 insertions, 0 deletions
diff --git a/smali/src/main/antlr3/org/jf/smali/smaliLexer.g b/smali/src/main/antlr3/org/jf/smali/smaliLexer.g
index 07c03167..d4484621 100644
--- a/smali/src/main/antlr3/org/jf/smali/smaliLexer.g
+++ b/smali/src/main/antlr3/org/jf/smali/smaliLexer.g
@@ -695,6 +695,22 @@ INSTRUCTION_FORMAT41c_TYPE
| 'new-instance/jumbo'
| 'const-class/jumbo';
+INSTRUCTION_FORMAT41c_FIELD
+ : 'sget/jumbo'
+ | 'sget-wide/jumbo'
+ | 'sget-object/jumbo'
+ | 'sget-boolean/jumbo'
+ | 'sget-byte/jumbo'
+ | 'sget-char/jumbo'
+ | 'sget-short/jumbo'
+ | 'sput/jumbo'
+ | 'sput-wide/jumbo'
+ | 'sput-object/jumbo'
+ | 'sput-boolean/jumbo'
+ | 'sput-byte/jumbo'
+ | 'sput-char/jumbo'
+ | 'sput-short/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 a4fe4598..318ac14f 100644
--- a/smali/src/main/antlr3/org/jf/smali/smaliParser.g
+++ b/smali/src/main/antlr3/org/jf/smali/smaliParser.g
@@ -118,6 +118,7 @@ tokens {
I_STATEMENT_FORMAT3rc_METHOD;
I_STATEMENT_FORMAT3rc_TYPE;
I_STATEMENT_FORMAT41c_TYPE;
+ I_STATEMENT_FORMAT41c_FIELD;
I_STATEMENT_FORMAT51l;
I_STATEMENT_ARRAY_DATA;
I_STATEMENT_PACKED_SWITCH;
@@ -838,6 +839,9 @@ instruction returns [int size]
| //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. 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. 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 30a714dc..90f36bfa 100644
--- a/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g
+++ b/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g
@@ -1259,6 +1259,16 @@ instruction[int totalMethodRegisters, int methodParameterRegisters, List<Instruc
$instructions.add(new Instruction41c(opcode, regA, typeIdItem));
}
+ | //e.g. sget-object/jumbo v0, Ljava/lang/System;->out:LJava/io/PrintStream;
+ ^(I_STATEMENT_FORMAT41c_FIELD INSTRUCTION_FORMAT41c_FIELD REGISTER fully_qualified_field)
+ {
+ Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT41c_FIELD.text);
+ int regA = parseRegister_short($REGISTER.text, $totalMethodRegisters, $methodParameterRegisters);
+
+ FieldIdItem fieldIdItem = $fully_qualified_field.fieldIdItem;
+
+ $instructions.add(new Instruction41c(opcode, regA, fieldIdItem));
+ }
| //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 2cc83e1a..97da209e 100644
--- a/smali/src/main/jflex/smaliLexer.flex
+++ b/smali/src/main/jflex/smaliLexer.flex
@@ -566,6 +566,12 @@ Type = {PrimitiveType} | {ClassDescriptor} | {ArrayDescriptor}
return newToken(INSTRUCTION_FORMAT41c_TYPE);
}
+ "sget/jumbo" | "sget-wide/jumbo" | "sget-object/jumbo" | "sget-boolean/jumbo" | "sget-byte/jumbo" |
+ "sget-char/jumbo" | "sget-short/jumbo" | "sput/jumbo" | "sput-wide/jumbo" | "sput-object/jumbo" |
+ "sput-boolean/jumbo" | "sput-byte/jumbo" | "sput-char/jumbo" | "sput-short/jumbo" {
+ return newToken(INSTRUCTION_FORMAT41c_FIELD);
+ }
+
"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 433b0017..c80dc8eb 100644
--- a/smali/src/test/resources/LexerTest/InstructionTest.smali
+++ b/smali/src/test/resources/LexerTest/InstructionTest.smali
@@ -225,4 +225,18 @@ invoke-super-quick/range
check-cast/jumbo
new-instance/jumbo
const-class/jumbo
+sget/jumbo
+sget-wide/jumbo
+sget-object/jumbo
+sget-boolean/jumbo
+sget-byte/jumbo
+sget-char/jumbo
+sget-short/jumbo
+sput/jumbo
+sput-wide/jumbo
+sput-object/jumbo
+sput-boolean/jumbo
+sput-byte/jumbo
+sput-char/jumbo
+sput-short/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 435e7cfa..871c5a01 100644
--- a/smali/src/test/resources/LexerTest/InstructionTest.tokens
+++ b/smali/src/test/resources/LexerTest/InstructionTest.tokens
@@ -225,4 +225,18 @@ 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_FORMAT41c_FIELD("sget/jumbo")
+INSTRUCTION_FORMAT41c_FIELD("sget-wide/jumbo")
+INSTRUCTION_FORMAT41c_FIELD("sget-object/jumbo")
+INSTRUCTION_FORMAT41c_FIELD("sget-boolean/jumbo")
+INSTRUCTION_FORMAT41c_FIELD("sget-byte/jumbo")
+INSTRUCTION_FORMAT41c_FIELD("sget-char/jumbo")
+INSTRUCTION_FORMAT41c_FIELD("sget-short/jumbo")
+INSTRUCTION_FORMAT41c_FIELD("sput/jumbo")
+INSTRUCTION_FORMAT41c_FIELD("sput-wide/jumbo")
+INSTRUCTION_FORMAT41c_FIELD("sput-object/jumbo")
+INSTRUCTION_FORMAT41c_FIELD("sput-boolean/jumbo")
+INSTRUCTION_FORMAT41c_FIELD("sput-byte/jumbo")
+INSTRUCTION_FORMAT41c_FIELD("sput-char/jumbo")
+INSTRUCTION_FORMAT41c_FIELD("sput-short/jumbo")
INSTRUCTION_FORMAT51l("const-wide") \ No newline at end of file