mirror of
https://github.com/revanced/smali.git
synced 2025-05-11 20:04:28 +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_EMIT;
|
||||
|
||||
INSTRUCTION_FORMAT11n_PHRASE
|
||||
: INSTRUCTION_FORMAT11n_EMIT
|
||||
WS
|
||||
REGISTER_EMIT
|
||||
WS? ',' WS?
|
||||
INTEGER_LITERAL_EMIT;
|
||||
|
||||
INSTRUCTION_FORMAT11x_PHRASE
|
||||
: INSTRUCTION_FORMAT11x_EMIT
|
||||
WS
|
||||
@ -293,8 +300,8 @@ INSTRUCTION_FORMAT3rc_METHOD_PHRASE
|
||||
WS? ',' WS?
|
||||
FULLY_QUALIFIED_MEMBER_NAME_EMITCHILDREN
|
||||
METHOD_PROTOTYPE_EMITCHILDREN;
|
||||
|
||||
|
||||
|
||||
|
||||
fragment CLASS_DIRECTIVE_EMIT
|
||||
: CLASS_DIRECTIVE {emit($CLASS_DIRECTIVE, CLASS_DIRECTIVE);};
|
||||
fragment CLASS_DIRECTIVE
|
||||
@ -576,6 +583,11 @@ fragment INSTRUCTION_FORMAT10x
|
||||
: 'return-void'
|
||||
| 'nop';
|
||||
|
||||
fragment INSTRUCTION_FORMAT11n_EMIT
|
||||
: INSTRUCTION_FORMAT11n {emit($INSTRUCTION_FORMAT11n, INSTRUCTION_FORMAT11n);};
|
||||
fragment INSTRUCTION_FORMAT11n
|
||||
: 'const/4';
|
||||
|
||||
fragment INSTRUCTION_FORMAT11x_EMIT
|
||||
: INSTRUCTION_FORMAT11x {emit($INSTRUCTION_FORMAT11x, INSTRUCTION_FORMAT11x);};
|
||||
fragment INSTRUCTION_FORMAT11x
|
||||
|
@ -50,6 +50,7 @@ tokens {
|
||||
I_REGISTERS;
|
||||
I_STATEMENTS;
|
||||
I_STATEMENT_FORMAT10x;
|
||||
I_STATEMENT_FORMAT11n;
|
||||
I_STATEMENT_FORMAT11x;
|
||||
I_STATEMENT_FORMAT12x;
|
||||
I_STATEMENT_FORMAT21c_TYPE;
|
||||
@ -122,6 +123,9 @@ instruction
|
||||
//e.g. return
|
||||
: 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
|
||||
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 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) {
|
||||
//register should be in the format "v12"
|
||||
@ -256,6 +264,15 @@ instruction returns[Instruction instruction]
|
||||
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT10x.text);
|
||||
$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
|
||||
^(I_STATEMENT_FORMAT11x INSTRUCTION_FORMAT11x REGISTER)
|
||||
{
|
||||
|
@ -51,7 +51,7 @@ public enum Opcode
|
||||
RETURN((byte)0x0f, "RETURN", (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"),
|
||||
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((byte)0x14, "CONST", (byte)6, ReferenceType.none, "31i"),
|
||||
CONST_HIGH16((byte)0x15, "CONST/HIGH16", (byte)4, ReferenceType.none, "21h"),
|
||||
|
@ -15,6 +15,9 @@
|
||||
;org/JesusFreke/HelloWorld2/HelloWorld2
|
||||
;[Lorg/JesusFreke/HelloWorld2/HelloWorld2;
|
||||
;[I
|
||||
;0
|
||||
;-8
|
||||
;7
|
||||
|
||||
|
||||
.method static constructor <clinit>()V ;test
|
||||
@ -99,6 +102,48 @@
|
||||
|
||||
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