mirror of
https://github.com/revanced/smali.git
synced 2025-05-28 03:40:12 +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_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';
|
||||
|
@ -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");}
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user