From d367a0d0bc841168afc0aed58a5950c17273301f Mon Sep 17 00:00:00 2001 From: "JesusFreke@JesusFreke.com" Date: Fri, 17 Apr 2009 04:51:40 +0000 Subject: [PATCH] Added const-class instruction changed new-instance instruction to use a class_type_descriptor, instead of a class_name git-svn-id: https://smali.googlecode.com/svn/trunk@3 55b6fa8a-2a1e-11de-a435-ffa8d773f76a --- src/main/antlr3/org/JesusFreke/smali/smali.g | 20 ++++++- .../org/JesusFreke/smali/smaliTreeWalker.g | 28 ++++++++- src/test/resources/examples/HelloWorld2.smali | 57 +++++++++++++++++-- 3 files changed, 95 insertions(+), 10 deletions(-) diff --git a/src/main/antlr3/org/JesusFreke/smali/smali.g b/src/main/antlr3/org/JesusFreke/smali/smali.g index 3f3937a2..1938124a 100644 --- a/src/main/antlr3/org/JesusFreke/smali/smali.g +++ b/src/main/antlr3/org/JesusFreke/smali/smali.g @@ -99,6 +99,7 @@ tokens { I_STATIC_FIELD_STATEMENT; I_INSTANCE_FIELD_STATEMENT; I_CONST_STRING_STATEMENT; + I_CONST_CLASS_STATEMENT; I_NEW_INSTANCE_STATEMENT; I_SINGLE_REGISTER_STATEMENT; I_REGISTER_RANGE; @@ -243,9 +244,12 @@ instruction | //e.g. const-string v1 "Hello World!" CONST_STRING_INSTRUCTION_NAME REGISTER STRING_LITERAL -> ^(I_CONST_STRING_STATEMENT[$start, "I_CONST_STRING_STATMENT"] CONST_STRING_INSTRUCTION_NAME REGISTER STRING_LITERAL) + | //e.g. const-class v2 org/JesusFreke/HelloWorld2/HelloWorld2 + CONST_CLASS_INSTRUCTION_NAME REGISTER class_or_array_type_descriptor + -> ^(I_CONST_CLASS_STATEMENT[$start, "I_CONST_CLASS_STATEMENT"] CONST_CLASS_INSTRUCTION_NAME REGISTER class_or_array_type_descriptor) | //e.g. new-instance v1 android/widget/TextView - NEW_INSTANCE_INSTRUCTION_NAME REGISTER class_name - -> ^(I_NEW_INSTANCE_STATEMENT[$start, "I_NEW_INSTANCE_STATEMENT"] NEW_INSTANCE_INSTRUCTION_NAME REGISTER class_name) + NEW_INSTANCE_INSTRUCTION_NAME REGISTER CLASS_DESCRIPTOR + -> ^(I_NEW_INSTANCE_STATEMENT[$start, "I_NEW_INSTANCE_STATEMENT"] NEW_INSTANCE_INSTRUCTION_NAME REGISTER CLASS_DESCRIPTOR) | //e.g. move-result-object v1 SINGLE_REGISTER_INSTRUCTION_NAME REGISTER -> ^(I_SINGLE_REGISTER_STATEMENT[$start, "I_SINGLE_REGISTER_STATEMENT"] SINGLE_REGISTER_INSTRUCTION_NAME REGISTER) @@ -284,6 +288,8 @@ instruction_name | INSTANCE_FIELD_INSTRUCTION_NAME | BARE_INSTRUCTION_NAME | CONST_STRING_INSTRUCTION_NAME + | CONST_CLASS_INSTRUCTION_NAME +/* | CHECK_CAST_INSTRUCTION_NAME*/ | NEW_INSTANCE_INSTRUCTION_NAME | SINGLE_REGISTER_INSTRUCTION_NAME ; @@ -301,6 +307,10 @@ field_type_descriptor | CLASS_DESCRIPTOR | ARRAY_TYPE ; + +class_or_array_type_descriptor + : CLASS_DESCRIPTOR + | ARRAY_TYPE; type_descriptor : VOID_TYPE @@ -383,6 +393,12 @@ BARE_INSTRUCTION_NAME CONST_STRING_INSTRUCTION_NAME : 'const-string'; + +CONST_CLASS_INSTRUCTION_NAME + : 'const-class'; + +/*CHECK_CAST_INSTRUCTION_NAME + : 'check-cast';*/ NEW_INSTANCE_INSTRUCTION_NAME : 'new-instance'; diff --git a/src/main/antlr3/org/JesusFreke/smali/smaliTreeWalker.g b/src/main/antlr3/org/JesusFreke/smali/smaliTreeWalker.g index c4806298..85a4e5b2 100644 --- a/src/main/antlr3/org/JesusFreke/smali/smaliTreeWalker.g +++ b/src/main/antlr3/org/JesusFreke/smali/smaliTreeWalker.g @@ -320,13 +320,23 @@ instruction returns[Instruction instruction] $instruction = Format21c.Format.make(dexFile, opcode.value, regA, stringIdItem); } + | //e.g. const-class v2 org/JesusFreke/HelloWorld2/HelloWorld2 + ^(I_CONST_CLASS_STATEMENT CONST_CLASS_INSTRUCTION_NAME REGISTER class_or_array_type_descriptor) + { + Opcode opcode = Opcode.getOpcodeByName($CONST_CLASS_INSTRUCTION_NAME.text); + short regA = parseRegister_byte($REGISTER.text); + + TypeIdItem typeIdItem = $class_or_array_type_descriptor.type; + + $instruction = Format21c.Format.make(dexFile, opcode.value, regA, typeIdItem); + } | //e.g. new-instance v1 android/widget/TextView - ^(I_NEW_INSTANCE_STATEMENT NEW_INSTANCE_INSTRUCTION_NAME REGISTER class_name) + ^(I_NEW_INSTANCE_STATEMENT NEW_INSTANCE_INSTRUCTION_NAME REGISTER class_type_descriptor) { Opcode opcode = Opcode.getOpcodeByName($NEW_INSTANCE_INSTRUCTION_NAME.text); short regA = parseRegister_byte($REGISTER.text); - TypeIdItem typeIdItem = $class_name.type; + TypeIdItem typeIdItem = $class_type_descriptor.type; $instruction = Format21c.Format.make(dexFile, opcode.value, regA, typeIdItem); } @@ -388,6 +398,7 @@ instruction_name returns[String value] | INSTANCE_FIELD_INSTRUCTION_NAME | BARE_INSTRUCTION_NAME | CONST_STRING_INSTRUCTION_NAME + | CONST_CLASS_INSTRUCTION_NAME | NEW_INSTANCE_INSTRUCTION_NAME ; @@ -409,6 +420,19 @@ field_type_descriptor returns [TypeIdItem type] { $type = new TypeIdItem(dexFile, $token.text); }; + +class_or_array_type_descriptor returns [TypeIdItem type] + : token=(CLASS_DESCRIPTOR + | ARRAY_TYPE) + { + $type = new TypeIdItem(dexFile, $token.text); + }; + +class_type_descriptor returns [TypeIdItem type] + : CLASS_DESCRIPTOR + { + $type = new TypeIdItem(dexFile, $CLASS_DESCRIPTOR.text); + }; type_descriptor returns [TypeIdItem type] : VOID_TYPE {$type = new TypeIdItem(dexFile, "V");} diff --git a/src/test/resources/examples/HelloWorld2.smali b/src/test/resources/examples/HelloWorld2.smali index 85f6c11e..d758f2f7 100644 --- a/src/test/resources/examples/HelloWorld2.smali +++ b/src/test/resources/examples/HelloWorld2.smali @@ -26,27 +26,72 @@ .end method .method public onCreate(Landroid/os/Bundle;)V - .registers 5 + .registers 6 - invoke-super {v3,v4} android/app/Activity.onCreate(Landroid/os/Bundle;)V + invoke-super {v4,v5} android/app/Activity.onCreate(Landroid/os/Bundle;)V - new-instance v0 android/widget/TextView - invoke-direct {v0,v3} android/widget/TextView.(Landroid/content/Context;)V + const-string v3 "\n" - iget-object v1 v3 org/JesusFreke/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String; + new-instance v0 Landroid/widget/TextView; + invoke-direct {v0,v4} android/widget/TextView.(Landroid/content/Context;)V + + iget-object v1 v4 org/JesusFreke/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String; + + invoke-virtual {v1, v3} java/lang/String.concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v1 sget-object v2 org/JesusFreke/HelloWorld2/HelloWorld2.helloWorldStatic Ljava/lang/String; invoke-virtual {v1, v2} java/lang/String.concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v1 + invoke-virtual {v1, v3} java/lang/String.concat(Ljava/lang/String;)Ljava/lang/String; move-result-object v1 sget-object v2 org/JesusFreke/HelloWorld2/HelloWorld2.helloWorldStatic2 Ljava/lang/String; invoke-virtual/range {v1 .. v2} java/lang/String.concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v1 + + invoke-virtual {v1, v3} java/lang/String.concat(Ljava/lang/String;)Ljava/lang/String; move-result-object v1 + const-class v2 Lorg/JesusFreke/HelloWorld2/HelloWorld2; + invoke-virtual {v2} java/lang/Class.getName()Ljava/lang/String; + move-result-object v2 + + invoke-virtual/range {v1 .. v2} java/lang/String.concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v1 + + + + invoke-virtual {v1, v3} java/lang/String.concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v1 + + const-class v2 [Lorg/JesusFreke/HelloWorld2/HelloWorld2; + invoke-virtual {v2} java/lang/Class.getName()Ljava/lang/String; + move-result-object v2 + + invoke-virtual/range {v1 .. v2} java/lang/String.concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v1 + + + + invoke-virtual {v1, v3} java/lang/String.concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v1 + + const-class v2 [I + invoke-virtual {v2} java/lang/Class.getName()Ljava/lang/String; + move-result-object v2 + + invoke-virtual/range {v1 .. v2} java/lang/String.concat(Ljava/lang/String;)Ljava/lang/String; + move-result-object v1 + + + + + invoke-virtual {v0,v1} android/widget/TextView.setText(Ljava/lang/CharSequence;)V - invoke-virtual {v3,v0} org/JesusFreke/HelloWorld2/HelloWorld2.setContentView(Landroid/view/View;)V + invoke-virtual {v4,v0} org/JesusFreke/HelloWorld2/HelloWorld2.setContentView(Landroid/view/View;)V return-void .end method