From e3dab8894f63b81c3ca367e7060ec5163fd6768d Mon Sep 17 00:00:00 2001 From: "JesusFreke@JesusFreke.com" Date: Tue, 5 May 2009 05:22:42 +0000 Subject: [PATCH] Added support for Format31c git-svn-id: https://smali.googlecode.com/svn/trunk@30 55b6fa8a-2a1e-11de-a435-ffa8d773f76a --- .../antlr3/org/JesusFreke/smali/smaliLexer.g | 12 ++++++++++++ .../antlr3/org/JesusFreke/smali/smaliParser.g | 6 +++++- .../org/JesusFreke/smali/smaliTreeWalker.g | 10 ++++++++++ .../JesusFreke/dexlib/code/Instruction.java | 6 ++++-- src/test/resources/examples/HelloWorld2.smali | 18 ++++++++++++++++++ 5 files changed, 49 insertions(+), 3 deletions(-) diff --git a/src/main/antlr3/org/JesusFreke/smali/smaliLexer.g b/src/main/antlr3/org/JesusFreke/smali/smaliLexer.g index 57c63c65..d16ce120 100644 --- a/src/main/antlr3/org/JesusFreke/smali/smaliLexer.g +++ b/src/main/antlr3/org/JesusFreke/smali/smaliLexer.g @@ -379,6 +379,13 @@ INSTRUCTION_FORMAT31i_PHRASE REGISTER_EMIT WS? ',' WS? (INTEGER_LITERAL_EMIT | FLOAT_LITERAL_EMIT); + +INSTRUCTION_FORMAT31c_PHRASE + : INSTRUCTION_FORMAT31c_EMIT + WS + REGISTER_EMIT + WS? ',' WS? + STRING_LITERAL_EMIT; INSTRUCTION_FORMAT32x_PHRASE : INSTRUCTION_FORMAT32x_EMIT @@ -983,6 +990,11 @@ fragment INSTRUCTION_FORMAT31i | 'const-wide/32' ; +fragment INSTRUCTION_FORMAT31c_EMIT + : INSTRUCTION_FORMAT31c {emit($INSTRUCTION_FORMAT31c, INSTRUCTION_FORMAT31c);}; +fragment INSTRUCTION_FORMAT31c + : 'const-string/jumbo'; + fragment INSTRUCTION_FORMAT32x_EMIT : INSTRUCTION_FORMAT32x {emit($INSTRUCTION_FORMAT32x, INSTRUCTION_FORMAT32x);}; fragment INSTRUCTION_FORMAT32x diff --git a/src/main/antlr3/org/JesusFreke/smali/smaliParser.g b/src/main/antlr3/org/JesusFreke/smali/smaliParser.g index 868de86e..f03670ff 100644 --- a/src/main/antlr3/org/JesusFreke/smali/smaliParser.g +++ b/src/main/antlr3/org/JesusFreke/smali/smaliParser.g @@ -72,6 +72,7 @@ tokens { I_STATEMENT_FORMAT23x; I_STATEMENT_FORMAT30t; I_STATEMENT_FORMAT31i; + I_STATEMENT_FORMAT31c; I_STATEMENT_FORMAT32x; I_STATEMENT_FORMAT35c_METHOD; I_STATEMENT_FORMAT3rc_METHOD; @@ -204,8 +205,11 @@ instruction returns [int size] INSTRUCTION_FORMAT30t (LABEL | OFFSET) {$size = Format30t.Format.getByteCount();} -> ^(I_STATEMENT_FORMAT30t[$start, "I_STATEMENT_FORMAT30t"] INSTRUCTION_FORMAT30t LABEL? OFFSET?) | //e.g. const v0, 123456 - INSTRUCTION_FORMAT31i REGISTER (INTEGER_LITERAL | FLOAT_LITERAL) {$size = Format30t.Format.getByteCount();} + INSTRUCTION_FORMAT31i REGISTER (INTEGER_LITERAL | FLOAT_LITERAL) {$size = Format31i.Format.getByteCount();} -> ^(I_STATEMENT_FORMAT31i[$start, "I_STATEMENT_FORMAT31i"] INSTRUCTION_FORMAT31i REGISTER INTEGER_LITERAL? FLOAT_LITERAL?) + | //e.g. const-string/jumbo v1 "Hello World!" + INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL {$size = Format31c.Format.getByteCount();} + ->^(I_STATEMENT_FORMAT31c[$start, "I_STATEMENT_FORMAT31c"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL) | //e.g. move/16 v4567, v1234 INSTRUCTION_FORMAT32x REGISTER REGISTER {$size = Format32x.Format.getByteCount();} -> ^(I_STATEMENT_FORMAT32x[$start, "I_STATEMENT_FORMAT32x"] INSTRUCTION_FORMAT32x REGISTER REGISTER) diff --git a/src/main/antlr3/org/JesusFreke/smali/smaliTreeWalker.g b/src/main/antlr3/org/JesusFreke/smali/smaliTreeWalker.g index 160db5c9..fd04891a 100644 --- a/src/main/antlr3/org/JesusFreke/smali/smaliTreeWalker.g +++ b/src/main/antlr3/org/JesusFreke/smali/smaliTreeWalker.g @@ -558,6 +558,16 @@ instruction returns[Instruction instruction] $instruction = Format31i.Format.make(dexFile, opcode.value, regA, litB); } + | //e.g. const-string/jumbo v1 "Hello World!" + ^(I_STATEMENT_FORMAT31c INSTRUCTION_FORMAT31c REGISTER string_literal) + { + Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT31c.text); + short regA = parseRegister_byte($REGISTER.text); + + StringIdItem stringIdItem = new StringIdItem(dexFile, $string_literal.value); + + $instruction = Format31c.Format.make(dexFile, opcode.value, regA, stringIdItem); + } | //e.g. move/16 v5678, v1234 ^(I_STATEMENT_FORMAT32x INSTRUCTION_FORMAT32x registerA=REGISTER registerB=REGISTER) { diff --git a/src/main/java/org/JesusFreke/dexlib/code/Instruction.java b/src/main/java/org/JesusFreke/dexlib/code/Instruction.java index 18d9de4e..d355714c 100644 --- a/src/main/java/org/JesusFreke/dexlib/code/Instruction.java +++ b/src/main/java/org/JesusFreke/dexlib/code/Instruction.java @@ -114,11 +114,12 @@ public final class Instruction implements Field { in.skipBytes(1); int referenceIndex = in.readShort(); - //handle const string/jumbo as a special case + //handle const-string/jumbo as a special case if (opByte == 0x1b) { int hiWord = in.readShort(); if (hiWord != 0) { - throw new RuntimeException("32bit string indexes are not supported yet."); + //TODO: test this.. + referenceIndex += (hiWord<<16); } } @@ -153,6 +154,7 @@ public final class Instruction implements Field { out.write(bytes); } else { out.write(bytes,0,2); + //handle const-string/jumbo as a special case if (bytes[0] == 0x1b) { out.writeInt(reference.getIndex()); } else { diff --git a/src/test/resources/examples/HelloWorld2.smali b/src/test/resources/examples/HelloWorld2.smali index f22f459e..9facefaa 100644 --- a/src/test/resources/examples/HelloWorld2.smali +++ b/src/test/resources/examples/HelloWorld2.smali @@ -32,6 +32,7 @@ ;Testing Format22t ;20025 ;286331153 +;Testing Format31c @@ -204,6 +205,13 @@ skip: return-object v0 .end method +.method public testFormat31c()Ljava/lang/String; + .registers 1 + + const-string/jumbo v0, "Testing Format31c" + + return-object v0 +.end method .method public onCreate(Landroid/os/Bundle;)V .registers 6 @@ -494,6 +502,16 @@ skip: move-result-object v2 + ;test format31c + invoke-virtual {v4}, org/JesusFreke/HelloWorld2/HelloWorld2/testFormat31c()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;