mirror of
https://github.com/revanced/smali.git
synced 2025-05-04 08:34: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?
|
||||
(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_EMIT
|
||||
WS
|
||||
@ -983,6 +990,11 @@ fragment INSTRUCTION_FORMAT31i
|
||||
| 'const-wide/32'
|
||||
;
|
||||
|
||||
fragment INSTRUCTION_FORMAT31c_EMIT
|
||||
: INSTRUCTION_FORMAT31c {emit($INSTRUCTION_FORMAT31c, INSTRUCTION_FORMAT31c);};
|
||||
fragment INSTRUCTION_FORMAT31c
|
||||
: 'const-string/jumbo';
|
||||
|
||||
fragment INSTRUCTION_FORMAT32x_EMIT
|
||||
: INSTRUCTION_FORMAT32x {emit($INSTRUCTION_FORMAT32x, INSTRUCTION_FORMAT32x);};
|
||||
fragment INSTRUCTION_FORMAT32x
|
||||
|
@ -72,6 +72,7 @@ tokens {
|
||||
I_STATEMENT_FORMAT23x;
|
||||
I_STATEMENT_FORMAT30t;
|
||||
I_STATEMENT_FORMAT31i;
|
||||
I_STATEMENT_FORMAT31c;
|
||||
I_STATEMENT_FORMAT32x;
|
||||
I_STATEMENT_FORMAT35c_METHOD;
|
||||
I_STATEMENT_FORMAT3rc_METHOD;
|
||||
@ -204,8 +205,11 @@ instruction returns [int size]
|
||||
INSTRUCTION_FORMAT30t (LABEL | OFFSET) {$size = Format30t.Format.getByteCount();}
|
||||
-> ^(I_STATEMENT_FORMAT30t[$start, "I_STATEMENT_FORMAT30t"] INSTRUCTION_FORMAT30t LABEL? OFFSET?)
|
||||
| //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?)
|
||||
| //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
|
||||
INSTRUCTION_FORMAT32x REGISTER REGISTER {$size = Format32x.Format.getByteCount();}
|
||||
-> ^(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);
|
||||
}
|
||||
| //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
|
||||
^(I_STATEMENT_FORMAT32x INSTRUCTION_FORMAT32x registerA=REGISTER registerB=REGISTER)
|
||||
{
|
||||
|
@ -114,11 +114,12 @@ public final class Instruction implements Field<Instruction> {
|
||||
in.skipBytes(1);
|
||||
int referenceIndex = in.readShort();
|
||||
|
||||
//handle const string/jumbo as a special case
|
||||
//handle const-string/jumbo as a special case
|
||||
if (opByte == 0x1b) {
|
||||
int hiWord = in.readShort();
|
||||
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);
|
||||
} else {
|
||||
out.write(bytes,0,2);
|
||||
//handle const-string/jumbo as a special case
|
||||
if (bytes[0] == 0x1b) {
|
||||
out.writeInt(reference.getIndex());
|
||||
} else {
|
||||
|
@ -32,6 +32,7 @@
|
||||
;Testing Format22t
|
||||
;20025
|
||||
;286331153
|
||||
;Testing Format31c
|
||||
|
||||
|
||||
|
||||
@ -204,6 +205,13 @@ skip:
|
||||
return-object v0
|
||||
.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
|
||||
.registers 6
|
||||
@ -494,6 +502,16 @@ skip:
|
||||
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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user