From a999b912307f233b4db72aded7690b23ef3ab8ab Mon Sep 17 00:00:00 2001 From: "JesusFreke@JesusFreke.com" Date: Sat, 2 May 2009 22:19:45 +0000 Subject: [PATCH] Added support for Format22t git-svn-id: https://smali.googlecode.com/svn/trunk@27 55b6fa8a-2a1e-11de-a435-ffa8d773f76a --- .../antlr3/org/JesusFreke/smali/smaliLexer.g | 22 ++++++++++++++- .../antlr3/org/JesusFreke/smali/smaliParser.g | 4 +++ .../org/JesusFreke/smali/smaliTreeWalker.g | 16 +++++++++++ src/test/resources/examples/HelloWorld2.smali | 27 +++++++++++++++++++ 4 files changed, 68 insertions(+), 1 deletion(-) diff --git a/src/main/antlr3/org/JesusFreke/smali/smaliLexer.g b/src/main/antlr3/org/JesusFreke/smali/smaliLexer.g index 6b42b206..d8b5e894 100644 --- a/src/main/antlr3/org/JesusFreke/smali/smaliLexer.g +++ b/src/main/antlr3/org/JesusFreke/smali/smaliLexer.g @@ -332,7 +332,16 @@ INSTRUCTION_FORMAT22c_TYPE_PHRASE WS? ',' WS? REGISTER_EMIT WS? ',' WS? - FIELD_TYPE_DESCRIPTOR_EMITCHILD; + FIELD_TYPE_DESCRIPTOR_EMITCHILD; + +INSTRUCTION_FORMAT22t_PHRASE + : INSTRUCTION_FORMAT22t_EMIT + WS + REGISTER_EMIT + WS? ',' WS? + REGISTER_EMIT + WS? ',' WS? + (LABEL_EMIT | OFFSET_EMIT); INSTRUCTION_FORMAT22x_PHRASE : INSTRUCTION_FORMAT22x_EMIT @@ -858,6 +867,17 @@ fragment INSTRUCTION_FORMAT22c_TYPE : 'instance-of' | 'new-array'; +fragment INSTRUCTION_FORMAT22t_EMIT + : INSTRUCTION_FORMAT22t {emit($INSTRUCTION_FORMAT22t, INSTRUCTION_FORMAT22t);}; +fragment INSTRUCTION_FORMAT22t + : 'if-eq' + | 'if-ne' + | 'if-lt' + | 'if-ge' + | 'if-gt' + | 'if-le' + ; + fragment INSTRUCTION_FORMAT22x_EMIT : INSTRUCTION_FORMAT22x {emit($INSTRUCTION_FORMAT22x, INSTRUCTION_FORMAT22x);}; fragment INSTRUCTION_FORMAT22x diff --git a/src/main/antlr3/org/JesusFreke/smali/smaliParser.g b/src/main/antlr3/org/JesusFreke/smali/smaliParser.g index e5813890..8f9e4a27 100644 --- a/src/main/antlr3/org/JesusFreke/smali/smaliParser.g +++ b/src/main/antlr3/org/JesusFreke/smali/smaliParser.g @@ -66,6 +66,7 @@ tokens { I_STATEMENT_FORMAT22b; I_STATEMENT_FORMAT22c_FIELD; I_STATEMENT_FORMAT22c_TYPE; + I_STATEMENT_FORMAT22t; I_STATEMENT_FORMAT22x; I_STATEMENT_FORMAT23x; I_STATEMENT_FORMAT30t; @@ -185,6 +186,9 @@ instruction returns [int size] | //e.g. instance-of v0, v1, Ljava/lang/String; INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER field_type_descriptor {$size = Format22c.Format.getByteCount();} -> ^(I_STATEMENT_FORMAT22c_TYPE[$start, "I_STATEMENT_FORMAT22c_TYPE"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER field_type_descriptor) + | //e.g. if-eq v0, v1, endloop: + INSTRUCTION_FORMAT22t REGISTER REGISTER (LABEL | OFFSET) {$size = Format22t.Format.getByteCount();} + -> ^(I_STATEMENT_FORMAT22t[$start, "I_STATEMENT_FFORMAT22t"] INSTRUCTION_FORMAT22t REGISTER REGISTER LABEL? OFFSET?) | //e.g. move/from16 v1, v1234 INSTRUCTION_FORMAT22x REGISTER REGISTER {$size = Format22x.Format.getByteCount();} -> ^(I_STATEMENT_FORMAT22x[$start, "I_STATEMENT_FORMAT22x"] INSTRUCTION_FORMAT22x REGISTER REGISTER) diff --git a/src/main/antlr3/org/JesusFreke/smali/smaliTreeWalker.g b/src/main/antlr3/org/JesusFreke/smali/smaliTreeWalker.g index a8e2a2cc..3d42a196 100644 --- a/src/main/antlr3/org/JesusFreke/smali/smaliTreeWalker.g +++ b/src/main/antlr3/org/JesusFreke/smali/smaliTreeWalker.g @@ -493,6 +493,22 @@ instruction returns[Instruction instruction] $instruction = Format22c.Format.make(dexFile, opcode.value, regA, regB, typeIdItem); } + | //e.g. if-eq v0, v1, endloop: + ^(I_STATEMENT_FORMAT22t INSTRUCTION_FORMAT22t registerA=REGISTER registerB=REGISTER offset_or_label) + { + Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT22t.text); + byte regA = parseRegister_nibble($registerA.text); + byte regB = parseRegister_nibble($registerB.text); + + int addressOffset = $offset_or_label.offsetValue; + + if (addressOffset < Short.MIN_VALUE || addressOffset > Short.MAX_VALUE) { + //TODO: throw correct exception type + throw new RuntimeException("The offset/label is out of range. The offset is " + Integer.toString(addressOffset) + " and the range for this opcode is [-32768, 32767]."); + } + + $instruction = Format22t.Format.make(dexFile, opcode.value, regA, regB, (short)addressOffset); + } | //e.g. move/from16 v1, v1234 ^(I_STATEMENT_FORMAT22x INSTRUCTION_FORMAT22x registerA=REGISTER registerB=REGISTER) { diff --git a/src/test/resources/examples/HelloWorld2.smali b/src/test/resources/examples/HelloWorld2.smali index f12a859e..354eeaef 100644 --- a/src/test/resources/examples/HelloWorld2.smali +++ b/src/test/resources/examples/HelloWorld2.smali @@ -29,6 +29,7 @@ ;-1 ;20 ;1 +;Testing Format22t @@ -155,6 +156,23 @@ HERE: return-object v0 .end method +.method public testFormat22t()Ljava/lang/String; + .registers 3 + + const/16 v1, 1 + const/16 v2, 1 + + if-eq v1, v2, skip: + + const-string v0, "This shouldn't be displayed!" + return-object v0 + +skip: + + const-string v0, "Testing Format22t" + return-object v0 +.end method + .method public onCreate(Landroid/os/Bundle;)V .registers 6 @@ -411,6 +429,15 @@ HERE: move-result-object v2 + ;test format22t + invoke-virtual {v4}, org/JesusFreke/HelloWorld2/HelloWorld2/testFormat22t()Ljava/lang/String; + move-result-object v1 + + invoke-virtual {v2, v1}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 + + invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v2 check-cast v4, Landroid/app/Activity;