mirror of
https://github.com/revanced/smali.git
synced 2025-05-21 16:37:04 +02:00
Added support for opcodes using Format22c, that reference a type
git-svn-id: https://smali.googlecode.com/svn/trunk@26 55b6fa8a-2a1e-11de-a435-ffa8d773f76a
This commit is contained in:
parent
f61f3789dc
commit
eb4521d6c7
@ -324,6 +324,15 @@ INSTRUCTION_FORMAT22c_FIELD_PHRASE
|
|||||||
FULLY_QUALIFIED_MEMBER_NAME_EMITCHILDREN
|
FULLY_QUALIFIED_MEMBER_NAME_EMITCHILDREN
|
||||||
WS
|
WS
|
||||||
FIELD_TYPE_DESCRIPTOR_EMITCHILD;
|
FIELD_TYPE_DESCRIPTOR_EMITCHILD;
|
||||||
|
|
||||||
|
INSTRUCTION_FORMAT22c_TYPE_PHRASE
|
||||||
|
: INSTRUCTION_FORMAT22c_TYPE_EMIT
|
||||||
|
WS
|
||||||
|
REGISTER_EMIT
|
||||||
|
WS? ',' WS?
|
||||||
|
REGISTER_EMIT
|
||||||
|
WS? ',' WS?
|
||||||
|
FIELD_TYPE_DESCRIPTOR_EMITCHILD;
|
||||||
|
|
||||||
INSTRUCTION_FORMAT22x_PHRASE
|
INSTRUCTION_FORMAT22x_PHRASE
|
||||||
: INSTRUCTION_FORMAT22x_EMIT
|
: INSTRUCTION_FORMAT22x_EMIT
|
||||||
@ -843,6 +852,12 @@ fragment INSTRUCTION_FORMAT22c_FIELD
|
|||||||
| 'iput-short'
|
| 'iput-short'
|
||||||
;
|
;
|
||||||
|
|
||||||
|
fragment INSTRUCTION_FORMAT22c_TYPE_EMIT
|
||||||
|
: INSTRUCTION_FORMAT22c_TYPE {emit($INSTRUCTION_FORMAT22c_TYPE, INSTRUCTION_FORMAT22c_TYPE);};
|
||||||
|
fragment INSTRUCTION_FORMAT22c_TYPE
|
||||||
|
: 'instance-of'
|
||||||
|
| 'new-array';
|
||||||
|
|
||||||
fragment INSTRUCTION_FORMAT22x_EMIT
|
fragment INSTRUCTION_FORMAT22x_EMIT
|
||||||
: INSTRUCTION_FORMAT22x {emit($INSTRUCTION_FORMAT22x, INSTRUCTION_FORMAT22x);};
|
: INSTRUCTION_FORMAT22x {emit($INSTRUCTION_FORMAT22x, INSTRUCTION_FORMAT22x);};
|
||||||
fragment INSTRUCTION_FORMAT22x
|
fragment INSTRUCTION_FORMAT22x
|
||||||
|
@ -65,6 +65,7 @@ tokens {
|
|||||||
I_STATEMENT_FORMAT21t;
|
I_STATEMENT_FORMAT21t;
|
||||||
I_STATEMENT_FORMAT22b;
|
I_STATEMENT_FORMAT22b;
|
||||||
I_STATEMENT_FORMAT22c_FIELD;
|
I_STATEMENT_FORMAT22c_FIELD;
|
||||||
|
I_STATEMENT_FORMAT22c_TYPE;
|
||||||
I_STATEMENT_FORMAT22x;
|
I_STATEMENT_FORMAT22x;
|
||||||
I_STATEMENT_FORMAT23x;
|
I_STATEMENT_FORMAT23x;
|
||||||
I_STATEMENT_FORMAT30t;
|
I_STATEMENT_FORMAT30t;
|
||||||
@ -180,7 +181,10 @@ instruction returns [int size]
|
|||||||
-> ^(I_STATEMENT_FORMAT22b[$start, "I_STATEMENT_FORMAT22b"] INSTRUCTION_FORMAT22b REGISTER REGISTER INTEGER_LITERAL)
|
-> ^(I_STATEMENT_FORMAT22b[$start, "I_STATEMENT_FORMAT22b"] INSTRUCTION_FORMAT22b REGISTER REGISTER INTEGER_LITERAL)
|
||||||
| //e.g. iput-object v1, v0 org/JesusFreke/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String;
|
| //e.g. iput-object v1, v0 org/JesusFreke/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String;
|
||||||
INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER fully_qualified_field {$size = Format22c.Format.getByteCount();}
|
INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER fully_qualified_field {$size = Format22c.Format.getByteCount();}
|
||||||
-> ^(I_STATEMENT_FORMAT22c_FIELD[$start, "I_INSTANCE_FIELD_STATEMENT"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER fully_qualified_field)
|
-> ^(I_STATEMENT_FORMAT22c_FIELD[$start, "I_STATEMENT_FORMAT22c_FIELD"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER fully_qualified_field)
|
||||||
|
| //e.g. instance-of v0, v1, Ljava/lang/String;
|
||||||
|
INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER field_type_descriptor {$size = Format22c.Format.getByteCount();}
|
||||||
|
-> ^(I_STATEMENT_FORMAT22c_TYPE[$start, "I_STATEMENT_FORMAT22c_TYPE"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER field_type_descriptor)
|
||||||
| //e.g. move/from16 v1, v1234
|
| //e.g. move/from16 v1, v1234
|
||||||
INSTRUCTION_FORMAT22x REGISTER REGISTER {$size = Format22x.Format.getByteCount();}
|
INSTRUCTION_FORMAT22x REGISTER REGISTER {$size = Format22x.Format.getByteCount();}
|
||||||
-> ^(I_STATEMENT_FORMAT22x[$start, "I_STATEMENT_FORMAT22x"] INSTRUCTION_FORMAT22x REGISTER REGISTER)
|
-> ^(I_STATEMENT_FORMAT22x[$start, "I_STATEMENT_FORMAT22x"] INSTRUCTION_FORMAT22x REGISTER REGISTER)
|
||||||
|
@ -481,7 +481,18 @@ instruction returns[Instruction instruction]
|
|||||||
FieldIdItem fieldIdItem = $fully_qualified_field.fieldIdItem;
|
FieldIdItem fieldIdItem = $fully_qualified_field.fieldIdItem;
|
||||||
|
|
||||||
$instruction = Format22c.Format.make(dexFile, opcode.value, regA, regB, fieldIdItem);
|
$instruction = Format22c.Format.make(dexFile, opcode.value, regA, regB, fieldIdItem);
|
||||||
}
|
}
|
||||||
|
| //e.g. instance-of v0, v1, Ljava/lang/String;
|
||||||
|
^(I_STATEMENT_FORMAT22c_TYPE INSTRUCTION_FORMAT22c_TYPE registerA=REGISTER registerB=REGISTER field_type_descriptor)
|
||||||
|
{
|
||||||
|
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT22c_TYPE.text);
|
||||||
|
byte regA = parseRegister_nibble($registerA.text);
|
||||||
|
byte regB = parseRegister_nibble($registerB.text);
|
||||||
|
|
||||||
|
TypeIdItem typeIdItem = $field_type_descriptor.type;
|
||||||
|
|
||||||
|
$instruction = Format22c.Format.make(dexFile, opcode.value, regA, regB, typeIdItem);
|
||||||
|
}
|
||||||
| //e.g. move/from16 v1, v1234
|
| //e.g. move/from16 v1, v1234
|
||||||
^(I_STATEMENT_FORMAT22x INSTRUCTION_FORMAT22x registerA=REGISTER registerB=REGISTER)
|
^(I_STATEMENT_FORMAT22x INSTRUCTION_FORMAT22x registerA=REGISTER registerB=REGISTER)
|
||||||
{
|
{
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
;-9223372036854775808
|
;-9223372036854775808
|
||||||
;-1
|
;-1
|
||||||
;20
|
;20
|
||||||
|
;1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -141,6 +142,19 @@ HERE:
|
|||||||
return-object v0
|
return-object v0
|
||||||
.end method
|
.end method
|
||||||
|
|
||||||
|
.method public testFormat22cType()Ljava/lang/String;
|
||||||
|
.registers 2
|
||||||
|
|
||||||
|
const-string v0, "test"
|
||||||
|
|
||||||
|
instance-of v1, v0, Ljava/lang/String;
|
||||||
|
|
||||||
|
invoke-static {v1}, java/lang/Integer/toString(I)Ljava/lang/String;
|
||||||
|
move-result-object v0
|
||||||
|
|
||||||
|
return-object v0
|
||||||
|
.end method
|
||||||
|
|
||||||
.method public onCreate(Landroid/os/Bundle;)V
|
.method public onCreate(Landroid/os/Bundle;)V
|
||||||
.registers 6
|
.registers 6
|
||||||
|
|
||||||
@ -386,7 +400,18 @@ HERE:
|
|||||||
move-result-object v2
|
move-result-object v2
|
||||||
|
|
||||||
|
|
||||||
|
;test format22c-type
|
||||||
|
invoke-virtual {v4}, org/JesusFreke/HelloWorld2/HelloWorld2/testFormat22cType()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;
|
check-cast v4, Landroid/app/Activity;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user