Added support for Format31c

git-svn-id: https://smali.googlecode.com/svn/trunk@30 55b6fa8a-2a1e-11de-a435-ffa8d773f76a
This commit is contained in:
JesusFreke@JesusFreke.com 2009-05-05 05:22:42 +00:00
parent 92a6a2e140
commit e3dab8894f
5 changed files with 49 additions and 3 deletions

View File

@ -379,6 +379,13 @@ INSTRUCTION_FORMAT31i_PHRASE
REGISTER_EMIT REGISTER_EMIT
WS? ',' WS? WS? ',' WS?
(INTEGER_LITERAL_EMIT | FLOAT_LITERAL_EMIT); (INTEGER_LITERAL_EMIT | FLOAT_LITERAL_EMIT);
INSTRUCTION_FORMAT31c_PHRASE
: INSTRUCTION_FORMAT31c_EMIT
WS
REGISTER_EMIT
WS? ',' WS?
STRING_LITERAL_EMIT;
INSTRUCTION_FORMAT32x_PHRASE INSTRUCTION_FORMAT32x_PHRASE
: INSTRUCTION_FORMAT32x_EMIT : INSTRUCTION_FORMAT32x_EMIT
@ -983,6 +990,11 @@ fragment INSTRUCTION_FORMAT31i
| 'const-wide/32' | 'const-wide/32'
; ;
fragment INSTRUCTION_FORMAT31c_EMIT
: INSTRUCTION_FORMAT31c {emit($INSTRUCTION_FORMAT31c, INSTRUCTION_FORMAT31c);};
fragment INSTRUCTION_FORMAT31c
: 'const-string/jumbo';
fragment INSTRUCTION_FORMAT32x_EMIT fragment INSTRUCTION_FORMAT32x_EMIT
: INSTRUCTION_FORMAT32x {emit($INSTRUCTION_FORMAT32x, INSTRUCTION_FORMAT32x);}; : INSTRUCTION_FORMAT32x {emit($INSTRUCTION_FORMAT32x, INSTRUCTION_FORMAT32x);};
fragment INSTRUCTION_FORMAT32x fragment INSTRUCTION_FORMAT32x

View File

@ -72,6 +72,7 @@ tokens {
I_STATEMENT_FORMAT23x; I_STATEMENT_FORMAT23x;
I_STATEMENT_FORMAT30t; I_STATEMENT_FORMAT30t;
I_STATEMENT_FORMAT31i; I_STATEMENT_FORMAT31i;
I_STATEMENT_FORMAT31c;
I_STATEMENT_FORMAT32x; I_STATEMENT_FORMAT32x;
I_STATEMENT_FORMAT35c_METHOD; I_STATEMENT_FORMAT35c_METHOD;
I_STATEMENT_FORMAT3rc_METHOD; I_STATEMENT_FORMAT3rc_METHOD;
@ -204,8 +205,11 @@ instruction returns [int size]
INSTRUCTION_FORMAT30t (LABEL | OFFSET) {$size = Format30t.Format.getByteCount();} INSTRUCTION_FORMAT30t (LABEL | OFFSET) {$size = Format30t.Format.getByteCount();}
-> ^(I_STATEMENT_FORMAT30t[$start, "I_STATEMENT_FORMAT30t"] INSTRUCTION_FORMAT30t LABEL? OFFSET?) -> ^(I_STATEMENT_FORMAT30t[$start, "I_STATEMENT_FORMAT30t"] INSTRUCTION_FORMAT30t LABEL? OFFSET?)
| //e.g. const v0, 123456 | //e.g. const v0, 123456
INSTRUCTION_FORMAT31i REGISTER (INTEGER_LITERAL | FLOAT_LITERAL) {$size = Format30t.Format.getByteCount();} INSTRUCTION_FORMAT31i REGISTER (INTEGER_LITERAL | FLOAT_LITERAL) {$size = Format31i.Format.getByteCount();}
-> ^(I_STATEMENT_FORMAT31i[$start, "I_STATEMENT_FORMAT31i"] INSTRUCTION_FORMAT31i REGISTER INTEGER_LITERAL? FLOAT_LITERAL?) -> ^(I_STATEMENT_FORMAT31i[$start, "I_STATEMENT_FORMAT31i"] INSTRUCTION_FORMAT31i REGISTER INTEGER_LITERAL? FLOAT_LITERAL?)
| //e.g. const-string/jumbo v1 "Hello World!"
INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL {$size = Format31c.Format.getByteCount();}
->^(I_STATEMENT_FORMAT31c[$start, "I_STATEMENT_FORMAT31c"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL)
| //e.g. move/16 v4567, v1234 | //e.g. move/16 v4567, v1234
INSTRUCTION_FORMAT32x REGISTER REGISTER {$size = Format32x.Format.getByteCount();} INSTRUCTION_FORMAT32x REGISTER REGISTER {$size = Format32x.Format.getByteCount();}
-> ^(I_STATEMENT_FORMAT32x[$start, "I_STATEMENT_FORMAT32x"] INSTRUCTION_FORMAT32x REGISTER REGISTER) -> ^(I_STATEMENT_FORMAT32x[$start, "I_STATEMENT_FORMAT32x"] INSTRUCTION_FORMAT32x REGISTER REGISTER)

View File

@ -558,6 +558,16 @@ instruction returns[Instruction instruction]
$instruction = Format31i.Format.make(dexFile, opcode.value, regA, litB); $instruction = Format31i.Format.make(dexFile, opcode.value, regA, litB);
} }
| //e.g. const-string/jumbo v1 "Hello World!"
^(I_STATEMENT_FORMAT31c INSTRUCTION_FORMAT31c REGISTER string_literal)
{
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT31c.text);
short regA = parseRegister_byte($REGISTER.text);
StringIdItem stringIdItem = new StringIdItem(dexFile, $string_literal.value);
$instruction = Format31c.Format.make(dexFile, opcode.value, regA, stringIdItem);
}
| //e.g. move/16 v5678, v1234 | //e.g. move/16 v5678, v1234
^(I_STATEMENT_FORMAT32x INSTRUCTION_FORMAT32x registerA=REGISTER registerB=REGISTER) ^(I_STATEMENT_FORMAT32x INSTRUCTION_FORMAT32x registerA=REGISTER registerB=REGISTER)
{ {

View File

@ -114,11 +114,12 @@ public final class Instruction implements Field<Instruction> {
in.skipBytes(1); in.skipBytes(1);
int referenceIndex = in.readShort(); int referenceIndex = in.readShort();
//handle const string/jumbo as a special case //handle const-string/jumbo as a special case
if (opByte == 0x1b) { if (opByte == 0x1b) {
int hiWord = in.readShort(); int hiWord = in.readShort();
if (hiWord != 0) { if (hiWord != 0) {
throw new RuntimeException("32bit string indexes are not supported yet."); //TODO: test this..
referenceIndex += (hiWord<<16);
} }
} }
@ -153,6 +154,7 @@ public final class Instruction implements Field<Instruction> {
out.write(bytes); out.write(bytes);
} else { } else {
out.write(bytes,0,2); out.write(bytes,0,2);
//handle const-string/jumbo as a special case
if (bytes[0] == 0x1b) { if (bytes[0] == 0x1b) {
out.writeInt(reference.getIndex()); out.writeInt(reference.getIndex());
} else { } else {

View File

@ -32,6 +32,7 @@
;Testing Format22t ;Testing Format22t
;20025 ;20025
;286331153 ;286331153
;Testing Format31c
@ -204,6 +205,13 @@ skip:
return-object v0 return-object v0
.end method .end method
.method public testFormat31c()Ljava/lang/String;
.registers 1
const-string/jumbo v0, "Testing Format31c"
return-object v0
.end method
.method public onCreate(Landroid/os/Bundle;)V .method public onCreate(Landroid/os/Bundle;)V
.registers 6 .registers 6
@ -494,6 +502,16 @@ skip:
move-result-object v2 move-result-object v2
;test format31c
invoke-virtual {v4}, org/JesusFreke/HelloWorld2/HelloWorld2/testFormat31c()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;