mirror of
https://github.com/revanced/smali.git
synced 2025-05-13 20:57:07 +02:00
Add support for Format11n (const/4)
git-svn-id: https://smali.googlecode.com/svn/trunk@11 55b6fa8a-2a1e-11de-a435-ffa8d773f76a
This commit is contained in:
parent
bf29ac12eb
commit
e933da3572
@ -232,6 +232,13 @@ REGISTERS_PHRASE
|
|||||||
INSTRUCTION_FORMAT10x_PHRASE
|
INSTRUCTION_FORMAT10x_PHRASE
|
||||||
: INSTRUCTION_FORMAT10x_EMIT;
|
: INSTRUCTION_FORMAT10x_EMIT;
|
||||||
|
|
||||||
|
INSTRUCTION_FORMAT11n_PHRASE
|
||||||
|
: INSTRUCTION_FORMAT11n_EMIT
|
||||||
|
WS
|
||||||
|
REGISTER_EMIT
|
||||||
|
WS? ',' WS?
|
||||||
|
INTEGER_LITERAL_EMIT;
|
||||||
|
|
||||||
INSTRUCTION_FORMAT11x_PHRASE
|
INSTRUCTION_FORMAT11x_PHRASE
|
||||||
: INSTRUCTION_FORMAT11x_EMIT
|
: INSTRUCTION_FORMAT11x_EMIT
|
||||||
WS
|
WS
|
||||||
@ -293,8 +300,8 @@ INSTRUCTION_FORMAT3rc_METHOD_PHRASE
|
|||||||
WS? ',' WS?
|
WS? ',' WS?
|
||||||
FULLY_QUALIFIED_MEMBER_NAME_EMITCHILDREN
|
FULLY_QUALIFIED_MEMBER_NAME_EMITCHILDREN
|
||||||
METHOD_PROTOTYPE_EMITCHILDREN;
|
METHOD_PROTOTYPE_EMITCHILDREN;
|
||||||
|
|
||||||
|
|
||||||
fragment CLASS_DIRECTIVE_EMIT
|
fragment CLASS_DIRECTIVE_EMIT
|
||||||
: CLASS_DIRECTIVE {emit($CLASS_DIRECTIVE, CLASS_DIRECTIVE);};
|
: CLASS_DIRECTIVE {emit($CLASS_DIRECTIVE, CLASS_DIRECTIVE);};
|
||||||
fragment CLASS_DIRECTIVE
|
fragment CLASS_DIRECTIVE
|
||||||
@ -576,6 +583,11 @@ fragment INSTRUCTION_FORMAT10x
|
|||||||
: 'return-void'
|
: 'return-void'
|
||||||
| 'nop';
|
| 'nop';
|
||||||
|
|
||||||
|
fragment INSTRUCTION_FORMAT11n_EMIT
|
||||||
|
: INSTRUCTION_FORMAT11n {emit($INSTRUCTION_FORMAT11n, INSTRUCTION_FORMAT11n);};
|
||||||
|
fragment INSTRUCTION_FORMAT11n
|
||||||
|
: 'const/4';
|
||||||
|
|
||||||
fragment INSTRUCTION_FORMAT11x_EMIT
|
fragment INSTRUCTION_FORMAT11x_EMIT
|
||||||
: INSTRUCTION_FORMAT11x {emit($INSTRUCTION_FORMAT11x, INSTRUCTION_FORMAT11x);};
|
: INSTRUCTION_FORMAT11x {emit($INSTRUCTION_FORMAT11x, INSTRUCTION_FORMAT11x);};
|
||||||
fragment INSTRUCTION_FORMAT11x
|
fragment INSTRUCTION_FORMAT11x
|
||||||
|
@ -50,6 +50,7 @@ tokens {
|
|||||||
I_REGISTERS;
|
I_REGISTERS;
|
||||||
I_STATEMENTS;
|
I_STATEMENTS;
|
||||||
I_STATEMENT_FORMAT10x;
|
I_STATEMENT_FORMAT10x;
|
||||||
|
I_STATEMENT_FORMAT11n;
|
||||||
I_STATEMENT_FORMAT11x;
|
I_STATEMENT_FORMAT11x;
|
||||||
I_STATEMENT_FORMAT12x;
|
I_STATEMENT_FORMAT12x;
|
||||||
I_STATEMENT_FORMAT21c_TYPE;
|
I_STATEMENT_FORMAT21c_TYPE;
|
||||||
@ -122,6 +123,9 @@ instruction
|
|||||||
//e.g. return
|
//e.g. return
|
||||||
: INSTRUCTION_FORMAT10x
|
: INSTRUCTION_FORMAT10x
|
||||||
-> ^(I_STATEMENT_FORMAT10x[$start, "I_STATEMENT_FORMAT10x"] INSTRUCTION_FORMAT10x)
|
-> ^(I_STATEMENT_FORMAT10x[$start, "I_STATEMENT_FORMAT10x"] INSTRUCTION_FORMAT10x)
|
||||||
|
| //e.g. const/4 v0, 5
|
||||||
|
INSTRUCTION_FORMAT11n REGISTER INTEGER_LITERAL
|
||||||
|
-> ^(I_STATEMENT_FORMAT11n[$start, "I_STARTMENT_FORMAT11n"] INSTRUCTION_FORMAT11n REGISTER INTEGER_LITERAL)
|
||||||
| //e.g. move-result-object v1
|
| //e.g. move-result-object v1
|
||||||
INSTRUCTION_FORMAT11x REGISTER
|
INSTRUCTION_FORMAT11x REGISTER
|
||||||
-> ^(I_STATEMENT_FORMAT11x[$start, "I_STATEMENT_FORMAT11x"] INSTRUCTION_FORMAT11x REGISTER)
|
-> ^(I_STATEMENT_FORMAT11x[$start, "I_STATEMENT_FORMAT11x"] INSTRUCTION_FORMAT11x REGISTER)
|
||||||
|
@ -48,6 +48,14 @@ import org.JesusFreke.dexlib.code.Format.*;
|
|||||||
public ClassDefItem classDefItem;
|
public ClassDefItem classDefItem;
|
||||||
public ClassDataItem classDataItem;
|
public ClassDataItem classDataItem;
|
||||||
|
|
||||||
|
private static byte parseIntLiteral_nibble(String intLiteral) {
|
||||||
|
byte val = Byte.parseByte(intLiteral);
|
||||||
|
if (val < -(1<<3) || val >= 1<<3) {
|
||||||
|
//TODO: throw correct exception type
|
||||||
|
throw new RuntimeException("The literal integer value must be between -8 and 7, inclusive");
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
private static byte parseRegister_nibble(String register) {
|
private static byte parseRegister_nibble(String register) {
|
||||||
//register should be in the format "v12"
|
//register should be in the format "v12"
|
||||||
@ -256,6 +264,15 @@ instruction returns[Instruction instruction]
|
|||||||
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT10x.text);
|
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT10x.text);
|
||||||
$instruction = Format10x.Format.make(dexFile, opcode.value);
|
$instruction = Format10x.Format.make(dexFile, opcode.value);
|
||||||
}
|
}
|
||||||
|
| //e.g. const/4 v0, 5
|
||||||
|
^(I_STATEMENT_FORMAT11n INSTRUCTION_FORMAT11n REGISTER INTEGER_LITERAL)
|
||||||
|
{
|
||||||
|
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT11n.text);
|
||||||
|
byte regA = parseRegister_nibble($REGISTER.text);
|
||||||
|
byte litB = parseIntLiteral_nibble($INTEGER_LITERAL.text);
|
||||||
|
|
||||||
|
$instruction = Format11n.Format.make(dexFile, opcode.value, regA, litB);
|
||||||
|
}
|
||||||
| //e.g. move-result-object v1
|
| //e.g. move-result-object v1
|
||||||
^(I_STATEMENT_FORMAT11x INSTRUCTION_FORMAT11x REGISTER)
|
^(I_STATEMENT_FORMAT11x INSTRUCTION_FORMAT11x REGISTER)
|
||||||
{
|
{
|
||||||
|
@ -51,7 +51,7 @@ public enum Opcode
|
|||||||
RETURN((byte)0x0f, "RETURN", (byte)2, ReferenceType.none, "11x"),
|
RETURN((byte)0x0f, "RETURN", (byte)2, ReferenceType.none, "11x"),
|
||||||
RETURN_WIDE((byte)0x10, "RETURN-WIDE", (byte)2, ReferenceType.none, "11x"),
|
RETURN_WIDE((byte)0x10, "RETURN-WIDE", (byte)2, ReferenceType.none, "11x"),
|
||||||
RETURN_OBJECT((byte)0x11, "RETURN-OBJECT", (byte)2, ReferenceType.none, "11x"),
|
RETURN_OBJECT((byte)0x11, "RETURN-OBJECT", (byte)2, ReferenceType.none, "11x"),
|
||||||
CONST_4((byte)0x12, "CONST-4", (byte)2, ReferenceType.none, "11n"),
|
CONST_4((byte)0x12, "CONST/4", (byte)2, ReferenceType.none, "11n"),
|
||||||
CONST_16((byte)0x13, "CONST/16", (byte)4, ReferenceType.none, "21s"),
|
CONST_16((byte)0x13, "CONST/16", (byte)4, ReferenceType.none, "21s"),
|
||||||
CONST((byte)0x14, "CONST", (byte)6, ReferenceType.none, "31i"),
|
CONST((byte)0x14, "CONST", (byte)6, ReferenceType.none, "31i"),
|
||||||
CONST_HIGH16((byte)0x15, "CONST/HIGH16", (byte)4, ReferenceType.none, "21h"),
|
CONST_HIGH16((byte)0x15, "CONST/HIGH16", (byte)4, ReferenceType.none, "21h"),
|
||||||
|
@ -15,6 +15,9 @@
|
|||||||
;org/JesusFreke/HelloWorld2/HelloWorld2
|
;org/JesusFreke/HelloWorld2/HelloWorld2
|
||||||
;[Lorg/JesusFreke/HelloWorld2/HelloWorld2;
|
;[Lorg/JesusFreke/HelloWorld2/HelloWorld2;
|
||||||
;[I
|
;[I
|
||||||
|
;0
|
||||||
|
;-8
|
||||||
|
;7
|
||||||
|
|
||||||
|
|
||||||
.method static constructor <clinit>()V ;test
|
.method static constructor <clinit>()V ;test
|
||||||
@ -99,6 +102,48 @@
|
|||||||
|
|
||||||
move-object v2, v1
|
move-object v2, v1
|
||||||
|
|
||||||
|
invoke-virtual {v2, v3}, java/lang/String/concat(Ljava/lang/String;)Ljava/lang/String;
|
||||||
|
move-result-object v2
|
||||||
|
|
||||||
|
|
||||||
|
;test out Format11n, with various literals
|
||||||
|
;with 0
|
||||||
|
const/4 v1, 0
|
||||||
|
invoke-static {v1}, java/lang/Integer/toString(I)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
|
||||||
|
|
||||||
|
|
||||||
|
;with -8
|
||||||
|
const/4 v1, -8
|
||||||
|
invoke-static {v1}, java/lang/Integer/toString(I)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
|
||||||
|
|
||||||
|
|
||||||
|
;with 7
|
||||||
|
const/4 v1, 7
|
||||||
|
invoke-static {v1}, java/lang/Integer/toString(I)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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user