aboutsummaryrefslogtreecommitdiff
path: root/smali/src
diff options
context:
space:
mode:
authorBen Gruver <bgruv@google.com>2011-11-17 17:45:16 -0800
committer= <bgruv@google.com>2011-11-20 15:46:39 -0800
commit1efc2c038842f85728b0ae4311a0e550b826390b (patch)
tree7d5eaafeb5ba2bfacb8b024f16a32158a913d4b6 /smali/src
parenta70eb74985e093e5b40dc3e3282ef5b05264bfef (diff)
downloadsmali-1efc2c038842f85728b0ae4311a0e550b826390b.tar.gz
Add support for Format52c (type references)
Diffstat (limited to 'smali/src')
-rw-r--r--smali/src/main/antlr3/org/jf/smali/smaliLexer.g4
-rw-r--r--smali/src/main/antlr3/org/jf/smali/smaliParser.g4
-rw-r--r--smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g11
-rw-r--r--smali/src/main/jflex/smaliLexer.flex4
-rw-r--r--smali/src/test/resources/LexerTest/InstructionTest.smali4
-rw-r--r--smali/src/test/resources/LexerTest/InstructionTest.tokens4
6 files changed, 29 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 d4484621..ce1a6237 100644
--- a/smali/src/main/antlr3/org/jf/smali/smaliLexer.g
+++ b/smali/src/main/antlr3/org/jf/smali/smaliLexer.g
@@ -714,6 +714,10 @@ INSTRUCTION_FORMAT41c_FIELD
INSTRUCTION_FORMAT51l
: 'const-wide';
+INSTRUCTION_FORMAT52c_TYPE
+ : 'instance-of/jumbo'
+ | 'new-array/jumbo';
+
/**********************************************************
* Types
diff --git a/smali/src/main/antlr3/org/jf/smali/smaliParser.g b/smali/src/main/antlr3/org/jf/smali/smaliParser.g
index 318ac14f..8b22556f 100644
--- a/smali/src/main/antlr3/org/jf/smali/smaliParser.g
+++ b/smali/src/main/antlr3/org/jf/smali/smaliParser.g
@@ -120,6 +120,7 @@ tokens {
I_STATEMENT_FORMAT41c_TYPE;
I_STATEMENT_FORMAT41c_FIELD;
I_STATEMENT_FORMAT51l;
+ I_STATEMENT_FORMAT52c_TYPE;
I_STATEMENT_ARRAY_DATA;
I_STATEMENT_PACKED_SWITCH;
I_STATEMENT_SPARSE_SWITCH;
@@ -845,6 +846,9 @@ instruction returns [int size]
| //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)
+ | //e.g. instance-of/jumbo v0, v1, Ljava/lang/String;
+ INSTRUCTION_FORMAT52c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor {$size = Format.Format52c.size;}
+ -> ^(I_STATEMENT_FORMAT52c_TYPE[$start, "I_STATEMENT_FORMAT52c_TYPE"] INSTRUCTION_FORMAT52c_TYPE REGISTER REGISTER nonvoid_type_descriptor)
|
ARRAY_DATA_DIRECTIVE
{
diff --git a/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g b/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g
index 8055c499..f4ffefa0 100644
--- a/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g
+++ b/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g
@@ -1279,6 +1279,17 @@ instruction[int totalMethodRegisters, int methodParameterRegisters, List<Instruc
$instructions.add(new Instruction51l(opcode, regA, litB));
}
+ | //e.g. instance-of/jumbo v0, v1, Ljava/lang/String;
+ ^(I_STATEMENT_FORMAT52c_TYPE INSTRUCTION_FORMAT52c_TYPE registerA=REGISTER registerB=REGISTER nonvoid_type_descriptor)
+ {
+ Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT52c_TYPE.text);
+ int regA = parseRegister_short($registerA.text, $totalMethodRegisters, $methodParameterRegisters);
+ int regB = parseRegister_short($registerB.text, $totalMethodRegisters, $methodParameterRegisters);
+
+ TypeIdItem typeIdItem = $nonvoid_type_descriptor.type;
+
+ $instructions.add(new Instruction52c(opcode, regA, regB, typeIdItem));
+ }
| //e.g. .array-data 4 1000000 .end array-data
^(I_STATEMENT_ARRAY_DATA ^(I_ARRAY_ELEMENT_SIZE short_integral_literal) array_elements)
{
diff --git a/smali/src/main/jflex/smaliLexer.flex b/smali/src/main/jflex/smaliLexer.flex
index 97da209e..5bd13d35 100644
--- a/smali/src/main/jflex/smaliLexer.flex
+++ b/smali/src/main/jflex/smaliLexer.flex
@@ -575,6 +575,10 @@ Type = {PrimitiveType} | {ClassDescriptor} | {ArrayDescriptor}
"const-wide" {
return newToken(INSTRUCTION_FORMAT51l);
}
+
+ "instance-of/jumbo" | "new-array/jumbo" {
+ return newToken(INSTRUCTION_FORMAT52c_TYPE);
+ }
}
/*Types*/
diff --git a/smali/src/test/resources/LexerTest/InstructionTest.smali b/smali/src/test/resources/LexerTest/InstructionTest.smali
index c80dc8eb..c747c601 100644
--- a/smali/src/test/resources/LexerTest/InstructionTest.smali
+++ b/smali/src/test/resources/LexerTest/InstructionTest.smali
@@ -239,4 +239,6 @@ sput-boolean/jumbo
sput-byte/jumbo
sput-char/jumbo
sput-short/jumbo
-const-wide \ No newline at end of file
+const-wide
+instance-of/jumbo
+new-array/jumbo \ 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 871c5a01..86d2981e 100644
--- a/smali/src/test/resources/LexerTest/InstructionTest.tokens
+++ b/smali/src/test/resources/LexerTest/InstructionTest.tokens
@@ -239,4 +239,6 @@ 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
+INSTRUCTION_FORMAT51l("const-wide")
+INSTRUCTION_FORMAT52c_TYPE("instance-of/jumbo")
+INSTRUCTION_FORMAT52c_TYPE("new-array/jumbo") \ No newline at end of file