mirror of
https://github.com/revanced/smali.git
synced 2025-05-29 12:20:11 +02:00
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:
parent
f10d1a3598
commit
d367a0d0bc
@ -99,6 +99,7 @@ tokens {
|
|||||||
I_STATIC_FIELD_STATEMENT;
|
I_STATIC_FIELD_STATEMENT;
|
||||||
I_INSTANCE_FIELD_STATEMENT;
|
I_INSTANCE_FIELD_STATEMENT;
|
||||||
I_CONST_STRING_STATEMENT;
|
I_CONST_STRING_STATEMENT;
|
||||||
|
I_CONST_CLASS_STATEMENT;
|
||||||
I_NEW_INSTANCE_STATEMENT;
|
I_NEW_INSTANCE_STATEMENT;
|
||||||
I_SINGLE_REGISTER_STATEMENT;
|
I_SINGLE_REGISTER_STATEMENT;
|
||||||
I_REGISTER_RANGE;
|
I_REGISTER_RANGE;
|
||||||
@ -243,9 +244,12 @@ instruction
|
|||||||
| //e.g. const-string v1 "Hello World!"
|
| //e.g. const-string v1 "Hello World!"
|
||||||
CONST_STRING_INSTRUCTION_NAME REGISTER STRING_LITERAL
|
CONST_STRING_INSTRUCTION_NAME REGISTER STRING_LITERAL
|
||||||
-> ^(I_CONST_STRING_STATEMENT[$start, "I_CONST_STRING_STATMENT"] 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
|
| //e.g. new-instance v1 android/widget/TextView
|
||||||
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_name)
|
-> ^(I_NEW_INSTANCE_STATEMENT[$start, "I_NEW_INSTANCE_STATEMENT"] NEW_INSTANCE_INSTRUCTION_NAME REGISTER CLASS_DESCRIPTOR)
|
||||||
| //e.g. move-result-object v1
|
| //e.g. move-result-object v1
|
||||||
SINGLE_REGISTER_INSTRUCTION_NAME REGISTER
|
SINGLE_REGISTER_INSTRUCTION_NAME REGISTER
|
||||||
-> ^(I_SINGLE_REGISTER_STATEMENT[$start, "I_SINGLE_REGISTER_STATEMENT"] 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
|
| INSTANCE_FIELD_INSTRUCTION_NAME
|
||||||
| BARE_INSTRUCTION_NAME
|
| BARE_INSTRUCTION_NAME
|
||||||
| CONST_STRING_INSTRUCTION_NAME
|
| CONST_STRING_INSTRUCTION_NAME
|
||||||
|
| CONST_CLASS_INSTRUCTION_NAME
|
||||||
|
/* | CHECK_CAST_INSTRUCTION_NAME*/
|
||||||
| NEW_INSTANCE_INSTRUCTION_NAME
|
| NEW_INSTANCE_INSTRUCTION_NAME
|
||||||
| SINGLE_REGISTER_INSTRUCTION_NAME
|
| SINGLE_REGISTER_INSTRUCTION_NAME
|
||||||
;
|
;
|
||||||
@ -301,6 +307,10 @@ field_type_descriptor
|
|||||||
| CLASS_DESCRIPTOR
|
| CLASS_DESCRIPTOR
|
||||||
| ARRAY_TYPE
|
| ARRAY_TYPE
|
||||||
;
|
;
|
||||||
|
|
||||||
|
class_or_array_type_descriptor
|
||||||
|
: CLASS_DESCRIPTOR
|
||||||
|
| ARRAY_TYPE;
|
||||||
|
|
||||||
type_descriptor
|
type_descriptor
|
||||||
: VOID_TYPE
|
: VOID_TYPE
|
||||||
@ -383,6 +393,12 @@ BARE_INSTRUCTION_NAME
|
|||||||
|
|
||||||
CONST_STRING_INSTRUCTION_NAME
|
CONST_STRING_INSTRUCTION_NAME
|
||||||
: 'const-string';
|
: 'const-string';
|
||||||
|
|
||||||
|
CONST_CLASS_INSTRUCTION_NAME
|
||||||
|
: 'const-class';
|
||||||
|
|
||||||
|
/*CHECK_CAST_INSTRUCTION_NAME
|
||||||
|
: 'check-cast';*/
|
||||||
|
|
||||||
NEW_INSTANCE_INSTRUCTION_NAME
|
NEW_INSTANCE_INSTRUCTION_NAME
|
||||||
: 'new-instance';
|
: 'new-instance';
|
||||||
|
@ -320,13 +320,23 @@ instruction returns[Instruction instruction]
|
|||||||
|
|
||||||
$instruction = Format21c.Format.make(dexFile, opcode.value, regA, stringIdItem);
|
$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
|
| //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);
|
Opcode opcode = Opcode.getOpcodeByName($NEW_INSTANCE_INSTRUCTION_NAME.text);
|
||||||
short regA = parseRegister_byte($REGISTER.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);
|
$instruction = Format21c.Format.make(dexFile, opcode.value, regA, typeIdItem);
|
||||||
}
|
}
|
||||||
@ -388,6 +398,7 @@ instruction_name returns[String value]
|
|||||||
| INSTANCE_FIELD_INSTRUCTION_NAME
|
| INSTANCE_FIELD_INSTRUCTION_NAME
|
||||||
| BARE_INSTRUCTION_NAME
|
| BARE_INSTRUCTION_NAME
|
||||||
| CONST_STRING_INSTRUCTION_NAME
|
| CONST_STRING_INSTRUCTION_NAME
|
||||||
|
| CONST_CLASS_INSTRUCTION_NAME
|
||||||
| NEW_INSTANCE_INSTRUCTION_NAME
|
| NEW_INSTANCE_INSTRUCTION_NAME
|
||||||
;
|
;
|
||||||
|
|
||||||
@ -409,6 +420,19 @@ field_type_descriptor returns [TypeIdItem type]
|
|||||||
{
|
{
|
||||||
$type = new TypeIdItem(dexFile, $token.text);
|
$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]
|
type_descriptor returns [TypeIdItem type]
|
||||||
: VOID_TYPE {$type = new TypeIdItem(dexFile, "V");}
|
: VOID_TYPE {$type = new TypeIdItem(dexFile, "V");}
|
||||||
|
@ -26,27 +26,72 @@
|
|||||||
.end method
|
.end method
|
||||||
|
|
||||||
.method public onCreate(Landroid/os/Bundle;)V
|
.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
|
const-string v3 "\n"
|
||||||
invoke-direct {v0,v3} android/widget/TextView.<init>(Landroid/content/Context;)V
|
|
||||||
|
|
||||||
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;
|
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;
|
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
|
move-result-object v1
|
||||||
|
|
||||||
sget-object v2 org/JesusFreke/HelloWorld2/HelloWorld2.helloWorldStatic2 Ljava/lang/String;
|
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;
|
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
|
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 {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
|
return-void
|
||||||
.end method
|
.end method
|
||||||
|
Loading…
x
Reference in New Issue
Block a user