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:
JesusFreke@JesusFreke.com 2009-04-24 04:37:05 +00:00
parent bf29ac12eb
commit e933da3572
5 changed files with 81 additions and 3 deletions

View File

@ -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

View File

@ -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)

View File

@ -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)
{

View File

@ -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"),

View File

@ -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