aboutsummaryrefslogtreecommitdiff
path: root/smali/src
diff options
context:
space:
mode:
authorBen Gruver <bgruv@google.com>2011-11-14 11:51:48 -0800
committer= <bgruv@google.com>2011-11-20 15:46:38 -0800
commitd12c76927616b9f5193864c2d834e84a57c08787 (patch)
tree01f14d4589c3d16f0def45bd5a5d900204eb3af9 /smali/src
parentd064d6999245b2d1a56efd5db41658306bd66a51 (diff)
downloadsmali-d12c76927616b9f5193864c2d834e84a57c08787.tar.gz
Add support for Format41c (type references)
Diffstat (limited to 'smali/src')
-rw-r--r--smali/src/main/antlr3/org/jf/smali/smaliLexer.g5
-rw-r--r--smali/src/main/antlr3/org/jf/smali/smaliParser.g13
-rw-r--r--smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g18
-rw-r--r--smali/src/main/jflex/smaliLexer.flex4
-rw-r--r--smali/src/test/resources/LexerTest/InstructionTest.smali3
-rw-r--r--smali/src/test/resources/LexerTest/InstructionTest.tokens3
6 files changed, 38 insertions, 8 deletions
diff --git a/smali/src/main/antlr3/org/jf/smali/smaliLexer.g b/smali/src/main/antlr3/org/jf/smali/smaliLexer.g
index c07970ea..07c03167 100644
--- a/smali/src/main/antlr3/org/jf/smali/smaliLexer.g
+++ b/smali/src/main/antlr3/org/jf/smali/smaliLexer.g
@@ -690,6 +690,11 @@ INSTRUCTION_FORMAT3rms_METHOD
: 'invoke-virtual-quick/range'
| 'invoke-super-quick/range';
+INSTRUCTION_FORMAT41c_TYPE
+ : 'check-cast/jumbo'
+ | 'new-instance/jumbo'
+ | 'const-class/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 e69e4111..a4fe4598 100644
--- a/smali/src/main/antlr3/org/jf/smali/smaliParser.g
+++ b/smali/src/main/antlr3/org/jf/smali/smaliParser.g
@@ -117,6 +117,7 @@ tokens {
I_STATEMENT_FORMAT35c_TYPE;
I_STATEMENT_FORMAT3rc_METHOD;
I_STATEMENT_FORMAT3rc_TYPE;
+ I_STATEMENT_FORMAT41c_TYPE;
I_STATEMENT_FORMAT51l;
I_STATEMENT_ARRAY_DATA;
I_STATEMENT_PACKED_SWITCH;
@@ -703,13 +704,14 @@ instruction returns [int size]
}
}
-> ^(I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference)
+ //TODO: check if dalvik has a jumbo version of throw-verification-error
| //e.g. goto/16 endloop:
INSTRUCTION_FORMAT20t label_ref_or_offset {$size = Format.Format20t.size;}
-> ^(I_STATEMENT_FORMAT20t[$start, "I_STATEMENT_FORMAT20t"] INSTRUCTION_FORMAT20t label_ref_or_offset)
- | //e.g. sget-object v0 java/lang/System/out LJava/io/PrintStream;
+ | //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;
+ | //e.g. sget-object-volatile v0, java/lang/System/out LJava/io/PrintStream;
INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER COMMA fully_qualified_field {$size = Format.Format21c.size;}
{
if (!allowOdex) {
@@ -717,10 +719,10 @@ instruction returns [int size]
}
}
-> ^(I_STATEMENT_FORMAT21c_FIELD[$start, "I_STATEMENT_FORMAT21c_FIELD"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER fully_qualified_field)
- | //e.g. const-string v1 "Hello World!"
+ | //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)
- | //e.g. const-class v2 Lorg/jf/HelloWorld2/HelloWorld2;
+ | //e.g. const-class v2, Lorg/jf/HelloWorld2/HelloWorld2;
INSTRUCTION_FORMAT21c_TYPE REGISTER COMMA reference_type_descriptor {$size = Format.Format21c.size;}
-> ^(I_STATEMENT_FORMAT21c_TYPE[$start, "I_STATEMENT_FORMAT21c"] INSTRUCTION_FORMAT21c_TYPE REGISTER reference_type_descriptor)
| //e.g. const/high16 v1, 1234
@@ -833,6 +835,9 @@ instruction returns [int size]
{
throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rms_METHOD.text);
}
+ | //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. 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 b6542ca3..30a714dc 100644
--- a/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g
+++ b/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g
@@ -998,7 +998,7 @@ instruction[int totalMethodRegisters, int methodParameterRegisters, List<Instruc
$instructions.add(new Instruction20t(opcode, addressOffset));
}
- | //e.g. sget_object v0 java/lang/System/out LJava/io/PrintStream;
+ | //e.g. sget_object v0, java/lang/System/out LJava/io/PrintStream;
^(I_STATEMENT_FORMAT21c_FIELD inst=(INSTRUCTION_FORMAT21c_FIELD | INSTRUCTION_FORMAT21c_FIELD_ODEX) REGISTER fully_qualified_field)
{
Opcode opcode = Opcode.getOpcodeByName($inst.text);
@@ -1008,7 +1008,7 @@ instruction[int totalMethodRegisters, int methodParameterRegisters, List<Instruc
$instructions.add(new Instruction21c(opcode, regA, fieldIdItem));
}
- | //e.g. const-string v1 "Hello World!"
+ | //e.g. const-string v1, "Hello World!"
^(I_STATEMENT_FORMAT21c_STRING INSTRUCTION_FORMAT21c_STRING REGISTER string_literal)
{
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT21c_STRING.text);
@@ -1018,7 +1018,7 @@ instruction[int totalMethodRegisters, int methodParameterRegisters, List<Instruc
instructions.add(new Instruction21c(opcode, regA, stringIdItem));
}
- | //e.g. const-class v2 org/jf/HelloWorld2/HelloWorld2
+ | //e.g. const-class v2, org/jf/HelloWorld2/HelloWorld2
^(I_STATEMENT_FORMAT21c_TYPE INSTRUCTION_FORMAT21c_TYPE REGISTER reference_type_descriptor)
{
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT21c_TYPE.text);
@@ -1074,7 +1074,7 @@ instruction[int totalMethodRegisters, int methodParameterRegisters, List<Instruc
$instructions.add(new Instruction22b(opcode, regA, regB, (byte)litC));
}
- | //e.g. iput-object v1 v0 org/jf/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String;
+ | //e.g. iput-object v1, v0, org/jf/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String;
^(I_STATEMENT_FORMAT22c_FIELD inst=(INSTRUCTION_FORMAT22c_FIELD | INSTRUCTION_FORMAT22c_FIELD_ODEX) registerA=REGISTER registerB=REGISTER fully_qualified_field)
{
Opcode opcode = Opcode.getOpcodeByName($inst.text);
@@ -1249,6 +1249,16 @@ instruction[int totalMethodRegisters, int methodParameterRegisters, List<Instruc
$instructions.add(new Instruction3rc(opcode, (short)registerCount, startRegister, typeIdItem));
}
+ | //e.g. const-class/jumbo v2, org/jf/HelloWorld2/HelloWorld2
+ ^(I_STATEMENT_FORMAT41c_TYPE INSTRUCTION_FORMAT41c_TYPE REGISTER reference_type_descriptor)
+ {
+ Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT41c_TYPE.text);
+ int regA = parseRegister_short($REGISTER.text, $totalMethodRegisters, $methodParameterRegisters);
+
+ TypeIdItem typeIdItem = $reference_type_descriptor.type;
+
+ $instructions.add(new Instruction41c(opcode, regA, typeIdItem));
+ }
| //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 8697b8d7..2cc83e1a 100644
--- a/smali/src/main/jflex/smaliLexer.flex
+++ b/smali/src/main/jflex/smaliLexer.flex
@@ -562,6 +562,10 @@ Type = {PrimitiveType} | {ClassDescriptor} | {ArrayDescriptor}
return newToken(INSTRUCTION_FORMAT3rms_METHOD);
}
+ "check-cast/jumbo" | "new-instance/jumbo" | "const-class/jumbo" {
+ return newToken(INSTRUCTION_FORMAT41c_TYPE);
+ }
+
"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 7a7c3352..433b0017 100644
--- a/smali/src/test/resources/LexerTest/InstructionTest.smali
+++ b/smali/src/test/resources/LexerTest/InstructionTest.smali
@@ -222,4 +222,7 @@ filled-new-array/range
execute-inline/range
invoke-virtual-quick/range
invoke-super-quick/range
+check-cast/jumbo
+new-instance/jumbo
+const-class/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 23e48956..435e7cfa 100644
--- a/smali/src/test/resources/LexerTest/InstructionTest.tokens
+++ b/smali/src/test/resources/LexerTest/InstructionTest.tokens
@@ -222,4 +222,7 @@ INSTRUCTION_FORMAT3rc_TYPE("filled-new-array/range")
INSTRUCTION_FORMAT3rmi_METHOD("execute-inline/range")
INSTRUCTION_FORMAT3rms_METHOD("invoke-virtual-quick/range")
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_FORMAT51l("const-wide") \ No newline at end of file