mirror of
https://github.com/revanced/smali.git
synced 2025-05-04 16:44:25 +02:00
Added support for Format31c
git-svn-id: https://smali.googlecode.com/svn/trunk@30 55b6fa8a-2a1e-11de-a435-ffa8d773f76a
This commit is contained in:
parent
92a6a2e140
commit
e3dab8894f
@ -380,6 +380,13 @@ INSTRUCTION_FORMAT31i_PHRASE
|
|||||||
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
|
||||||
WS
|
WS
|
||||||
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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 {
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user