From d863324ffb94f70dbb59f1dab4dabd2ce1b39cfd Mon Sep 17 00:00:00 2001 From: Ben Gruver Date: Thu, 17 Nov 2011 15:40:35 -0800 Subject: Add support for Format41c (field references) --- smali/src/main/antlr3/org/jf/smali/smaliLexer.g | 16 ++++++++++++++++ smali/src/main/antlr3/org/jf/smali/smaliParser.g | 4 ++++ smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g | 10 ++++++++++ smali/src/main/jflex/smaliLexer.flex | 6 ++++++ smali/src/test/resources/LexerTest/InstructionTest.smali | 14 ++++++++++++++ .../src/test/resources/LexerTest/InstructionTest.tokens | 14 ++++++++++++++ 6 files changed, 64 insertions(+) (limited to 'smali/src') 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, Listout: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 -- cgit v1.2.3