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
This commit is contained in:
JesusFreke@JesusFreke.com 2009-04-17 04:51:40 +00:00
parent f10d1a3598
commit d367a0d0bc
3 changed files with 95 additions and 10 deletions

View File

@ -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';

View File

@ -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");}

View File

@ -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.<init>(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.<init>(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