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:
JesusFreke@JesusFreke.com 2009-04-27 04:58:31 +00:00
parent f61f3789dc
commit eb4521d6c7
4 changed files with 57 additions and 2 deletions

View File

@ -324,6 +324,15 @@ INSTRUCTION_FORMAT22c_FIELD_PHRASE
FULLY_QUALIFIED_MEMBER_NAME_EMITCHILDREN
WS
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_EMIT
@ -843,6 +852,12 @@ fragment INSTRUCTION_FORMAT22c_FIELD
| '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
: INSTRUCTION_FORMAT22x {emit($INSTRUCTION_FORMAT22x, INSTRUCTION_FORMAT22x);};
fragment INSTRUCTION_FORMAT22x

View File

@ -65,6 +65,7 @@ tokens {
I_STATEMENT_FORMAT21t;
I_STATEMENT_FORMAT22b;
I_STATEMENT_FORMAT22c_FIELD;
I_STATEMENT_FORMAT22c_TYPE;
I_STATEMENT_FORMAT22x;
I_STATEMENT_FORMAT23x;
I_STATEMENT_FORMAT30t;
@ -180,7 +181,10 @@ instruction returns [int size]
-> ^(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;
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
INSTRUCTION_FORMAT22x REGISTER REGISTER {$size = Format22x.Format.getByteCount();}
-> ^(I_STATEMENT_FORMAT22x[$start, "I_STATEMENT_FORMAT22x"] INSTRUCTION_FORMAT22x REGISTER REGISTER)

View File

@ -481,7 +481,18 @@ instruction returns[Instruction instruction]
FieldIdItem fieldIdItem = $fully_qualified_field.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
^(I_STATEMENT_FORMAT22x INSTRUCTION_FORMAT22x registerA=REGISTER registerB=REGISTER)
{

View File

@ -28,6 +28,7 @@
;-9223372036854775808
;-1
;20
;1
@ -141,6 +142,19 @@ HERE:
return-object v0
.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
.registers 6
@ -386,7 +400,18 @@ HERE:
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;