Change totalmethodRegisters and methodParameterRegisters to scoped method attributes

This commit is contained in:
Ben Gruver 2013-04-15 22:01:56 -07:00
parent dcd5df117a
commit 4a2b9ef40c

View File

@ -75,8 +75,11 @@ import org.jf.dexlib2.util.MethodUtil;
this.verboseErrors = verboseErrors; this.verboseErrors = verboseErrors;
} }
private byte parseRegister_nibble(String register, int totalMethodRegisters, int methodParameterRegisters) private byte parseRegister_nibble(String register)
throws SemanticException { throws SemanticException {
int totalMethodRegisters = method_stack.peek().totalMethodRegisters;
int methodParameterRegisters = method_stack.peek().methodParameterRegisters;
//register should be in the format "v12" //register should be in the format "v12"
int val = Byte.parseByte(register.substring(1)); int val = Byte.parseByte(register.substring(1));
if (register.charAt(0) == 'p') { if (register.charAt(0) == 'p') {
@ -90,8 +93,10 @@ import org.jf.dexlib2.util.MethodUtil;
} }
//return a short, because java's byte is signed //return a short, because java's byte is signed
private short parseRegister_byte(String register, int totalMethodRegisters, int methodParameterRegisters) private short parseRegister_byte(String register)
throws SemanticException { throws SemanticException {
int totalMethodRegisters = method_stack.peek().totalMethodRegisters;
int methodParameterRegisters = method_stack.peek().methodParameterRegisters;
//register should be in the format "v123" //register should be in the format "v123"
int val = Short.parseShort(register.substring(1)); int val = Short.parseShort(register.substring(1));
if (register.charAt(0) == 'p') { if (register.charAt(0) == 'p') {
@ -104,8 +109,10 @@ import org.jf.dexlib2.util.MethodUtil;
} }
//return an int because java's short is signed //return an int because java's short is signed
private int parseRegister_short(String register, int totalMethodRegisters, int methodParameterRegisters) private int parseRegister_short(String register)
throws SemanticException { throws SemanticException {
int totalMethodRegisters = method_stack.peek().totalMethodRegisters;
int methodParameterRegisters = method_stack.peek().methodParameterRegisters;
//register should be in the format "v12345" //register should be in the format "v12345"
int val = Integer.parseInt(register.substring(1)); int val = Integer.parseInt(register.substring(1));
if (register.charAt(0) == 'p') { if (register.charAt(0) == 'p') {
@ -334,11 +341,13 @@ method returns[Method ret]
int currentAddress; int currentAddress;
HashMap<Integer, Integer> packedSwitchDeclarations; HashMap<Integer, Integer> packedSwitchDeclarations;
HashMap<Integer, Integer> sparseSwitchDeclarations; HashMap<Integer, Integer> sparseSwitchDeclarations;
int totalMethodRegisters;
int methodParameterRegisters;
} }
@init @init
{ {
int totalMethodRegisters = 0; $method::totalMethodRegisters = 0;
int methodParameterRegisters = 0; $method::methodParameterRegisters = 0;
int accessFlags = 0; int accessFlags = 0;
boolean isStatic = false; boolean isStatic = false;
$method::labels = new HashMap<String, Integer>(); $method::labels = new HashMap<String, Integer>();
@ -353,24 +362,24 @@ method returns[Method ret]
{ {
accessFlags = $access_list.value; accessFlags = $access_list.value;
isStatic = AccessFlags.STATIC.isSet(accessFlags); isStatic = AccessFlags.STATIC.isSet(accessFlags);
methodParameterRegisters = MethodUtil.getParameterRegisterCount($method_name_and_prototype.parameters, isStatic); $method::methodParameterRegisters = MethodUtil.getParameterRegisterCount($method_name_and_prototype.parameters, isStatic);
} }
(registers_directive (registers_directive
{ {
if ($registers_directive.isLocalsDirective) { if ($registers_directive.isLocalsDirective) {
totalMethodRegisters = $registers_directive.registers + methodParameterRegisters; $method::totalMethodRegisters = $registers_directive.registers + $method::methodParameterRegisters;
} else { } else {
totalMethodRegisters = $registers_directive.registers; $method::totalMethodRegisters = $registers_directive.registers;
} }
} }
)? )?
labels labels
packed_switch_declarations packed_switch_declarations
sparse_switch_declarations sparse_switch_declarations
statements[totalMethodRegisters, methodParameterRegisters] statements
catches catches
parameters[$method_name_and_prototype.parameters] parameters[$method_name_and_prototype.parameters]
ordered_debug_directives[totalMethodRegisters, methodParameterRegisters] ordered_debug_directives
annotations annotations
) )
{ {
@ -431,14 +440,14 @@ method returns[Method ret]
throw new SemanticException(input, $I_METHOD, "A .registers or .locals directive must be present for a non-abstract/non-final method"); throw new SemanticException(input, $I_METHOD, "A .registers or .locals directive must be present for a non-abstract/non-final method");
} }
if (totalMethodRegisters < methodParameterRegisters) { if ($method::totalMethodRegisters < $method::methodParameterRegisters) {
throw new SemanticException(input, $registers_directive.start, "This method requires at least " + throw new SemanticException(input, $registers_directive.start, "This method requires at least " +
Integer.toString(methodParameterRegisters) + Integer.toString($method::methodParameterRegisters) +
" registers, for the method parameters"); " registers, for the method parameters");
} }
methodImplementation = new ImmutableMethodImplementation( methodImplementation = new ImmutableMethodImplementation(
totalMethodRegisters, $method::totalMethodRegisters,
$statements.instructions, $statements.instructions,
tryBlocks, tryBlocks,
debugItems); debugItems);
@ -614,13 +623,13 @@ parameter[Iterator<String> parameterTypes] returns[MethodParameter parameter]
} }
); );
ordered_debug_directives[int totalMethodRegisters, int methodParameterRegisters] returns[List<DebugItem> debugItems] ordered_debug_directives returns[List<DebugItem> debugItems]
@init {debugItems = Lists.newArrayList();} @init {debugItems = Lists.newArrayList();}
: ^(I_ORDERED_DEBUG_DIRECTIVES : ^(I_ORDERED_DEBUG_DIRECTIVES
( line { $debugItems.add($line.debugItem); } ( line { $debugItems.add($line.debugItem); }
| local[$totalMethodRegisters, $methodParameterRegisters] { $debugItems.add($local.debugItem); } | local { $debugItems.add($local.debugItem); }
| end_local[$totalMethodRegisters, $methodParameterRegisters] { $debugItems.add($end_local.debugItem); } | end_local { $debugItems.add($end_local.debugItem); }
| restart_local[$totalMethodRegisters, $methodParameterRegisters] { $debugItems.add($restart_local.debugItem); } | restart_local { $debugItems.add($restart_local.debugItem); }
| prologue { $debugItems.add($prologue.debugItem); } | prologue { $debugItems.add($prologue.debugItem); }
| epilogue { $debugItems.add($epilogue.debugItem); } | epilogue { $debugItems.add($epilogue.debugItem); }
| source { $debugItems.add($source.debugItem); } | source { $debugItems.add($source.debugItem); }
@ -633,27 +642,27 @@ line returns[DebugItem debugItem]
$debugItem = new ImmutableLineNumber($address.address, $integral_literal.value); $debugItem = new ImmutableLineNumber($address.address, $integral_literal.value);
}; };
local[int totalMethodRegisters, int methodParameterRegisters] returns[DebugItem debugItem] local returns[DebugItem debugItem]
: ^(I_LOCAL REGISTER SIMPLE_NAME nonvoid_type_descriptor string_literal? address) : ^(I_LOCAL REGISTER SIMPLE_NAME nonvoid_type_descriptor string_literal? address)
{ {
int registerNumber = parseRegister_short($REGISTER.text, $totalMethodRegisters, $methodParameterRegisters); int registerNumber = parseRegister_short($REGISTER.text);
$debugItem = new ImmutableStartLocal($address.address, registerNumber, $SIMPLE_NAME.text, $debugItem = new ImmutableStartLocal($address.address, registerNumber, $SIMPLE_NAME.text,
$nonvoid_type_descriptor.type, $string_literal.value); $nonvoid_type_descriptor.type, $string_literal.value);
}; };
end_local[int totalMethodRegisters, int methodParameterRegisters] returns[DebugItem debugItem] end_local returns[DebugItem debugItem]
: ^(I_END_LOCAL REGISTER address) : ^(I_END_LOCAL REGISTER address)
{ {
int registerNumber = parseRegister_short($REGISTER.text, $totalMethodRegisters, $methodParameterRegisters); int registerNumber = parseRegister_short($REGISTER.text);
$debugItem = new ImmutableEndLocal($address.address, registerNumber); $debugItem = new ImmutableEndLocal($address.address, registerNumber);
}; };
restart_local[int totalMethodRegisters, int methodParameterRegisters] returns[DebugItem debugItem] restart_local returns[DebugItem debugItem]
: ^(I_RESTART_LOCAL REGISTER address) : ^(I_RESTART_LOCAL REGISTER address)
{ {
int registerNumber = parseRegister_short($REGISTER.text, $totalMethodRegisters, $methodParameterRegisters); int registerNumber = parseRegister_short($REGISTER.text);
$debugItem = new ImmutableRestartLocal($address.address, registerNumber); $debugItem = new ImmutableRestartLocal($address.address, registerNumber);
}; };
@ -676,13 +685,13 @@ source returns[DebugItem debugItem]
$debugItem = new ImmutableSetSourceFile($address.address, $string_literal.value); $debugItem = new ImmutableSetSourceFile($address.address, $string_literal.value);
}; };
statements[int totalMethodRegisters, int methodParameterRegisters] returns[List<Instruction> instructions, int maxOutRegisters] statements returns[List<Instruction> instructions, int maxOutRegisters]
@init @init
{ {
$instructions = Lists.newArrayList(); $instructions = Lists.newArrayList();
$maxOutRegisters = 0; $maxOutRegisters = 0;
} }
: ^(I_STATEMENTS (instruction[$totalMethodRegisters, $methodParameterRegisters, $instructions] : ^(I_STATEMENTS (instruction[$instructions]
{ {
$method::currentAddress += $instructions.get($instructions.size() - 1).getCodeUnits(); $method::currentAddress += $instructions.get($instructions.size() - 1).getCodeUnits();
if ($maxOutRegisters < $instruction.outRegisters) { if ($maxOutRegisters < $instruction.outRegisters) {
@ -721,7 +730,7 @@ offset_or_label returns[int offsetValue]
| label_ref {$offsetValue = $label_ref.labelAddress-$method::currentAddress;}; | label_ref {$offsetValue = $label_ref.labelAddress-$method::currentAddress;};
register_list[int totalMethodRegisters, int methodParameterRegisters] returns[byte[\] registers, byte registerCount] register_list returns[byte[\] registers, byte registerCount]
@init @init
{ {
$registers = new byte[5]; $registers = new byte[5];
@ -731,23 +740,24 @@ register_list[int totalMethodRegisters, int methodParameterRegisters] returns[by
(REGISTER (REGISTER
{ {
if ($registerCount == 5) { if ($registerCount == 5) {
throw new SemanticException(input, $I_REGISTER_LIST, "A list of registers can only have a maximum of 5 registers. Use the <op>/range alternate opcode instead."); throw new SemanticException(input, $I_REGISTER_LIST, "A list of registers can only have a maximum of 5 " +
"registers. Use the <op>/range alternate opcode instead.");
} }
$registers[$registerCount++] = parseRegister_nibble($REGISTER.text, $totalMethodRegisters, $methodParameterRegisters); $registers[$registerCount++] = parseRegister_nibble($REGISTER.text);
})*); })*);
register_range[int totalMethodRegisters, int methodParameterRegisters] returns[int startRegister, int endRegister] register_range returns[int startRegister, int endRegister]
: ^(I_REGISTER_RANGE (startReg=REGISTER endReg=REGISTER?)?) : ^(I_REGISTER_RANGE (startReg=REGISTER endReg=REGISTER?)?)
{ {
if ($startReg == null) { if ($startReg == null) {
$startRegister = 0; $startRegister = 0;
$endRegister = -1; $endRegister = -1;
} else { } else {
$startRegister = parseRegister_short($startReg.text, $totalMethodRegisters, $methodParameterRegisters); $startRegister = parseRegister_short($startReg.text);
if ($endReg == null) { if ($endReg == null) {
$endRegister = $startRegister; $endRegister = $startRegister;
} else { } else {
$endRegister = parseRegister_short($endReg.text, $totalMethodRegisters, $methodParameterRegisters); $endRegister = parseRegister_short($endReg.text);
} }
int registerCount = $endRegister-$startRegister+1; int registerCount = $endRegister-$startRegister+1;
@ -777,48 +787,48 @@ verification_error_type returns[int verificationError]
$verificationError = VerificationError.getVerificationError($VERIFICATION_ERROR_TYPE.text); $verificationError = VerificationError.getVerificationError($VERIFICATION_ERROR_TYPE.text);
}; };
instruction[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] instruction[List<Instruction> instructions] returns[int outRegisters]
: insn_format10t[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format10t.outRegisters; } : insn_format10t[$instructions] { $outRegisters = $insn_format10t.outRegisters; }
| insn_format10x[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format10x.outRegisters; } | insn_format10x[$instructions] { $outRegisters = $insn_format10x.outRegisters; }
| insn_format11n[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format11n.outRegisters; } | insn_format11n[$instructions] { $outRegisters = $insn_format11n.outRegisters; }
| insn_format11x[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format11x.outRegisters; } | insn_format11x[$instructions] { $outRegisters = $insn_format11x.outRegisters; }
| insn_format12x[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format12x.outRegisters; } | insn_format12x[$instructions] { $outRegisters = $insn_format12x.outRegisters; }
| insn_format20bc[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format20bc.outRegisters; } | insn_format20bc[$instructions] { $outRegisters = $insn_format20bc.outRegisters; }
| insn_format20t[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format20t.outRegisters; } | insn_format20t[$instructions] { $outRegisters = $insn_format20t.outRegisters; }
| insn_format21c_field[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format21c_field.outRegisters; } | insn_format21c_field[$instructions] { $outRegisters = $insn_format21c_field.outRegisters; }
| insn_format21c_string[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format21c_string.outRegisters; } | insn_format21c_string[$instructions] { $outRegisters = $insn_format21c_string.outRegisters; }
| insn_format21c_type[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format21c_type.outRegisters; } | insn_format21c_type[$instructions] { $outRegisters = $insn_format21c_type.outRegisters; }
| insn_format21ih[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format21ih.outRegisters; } | insn_format21ih[$instructions] { $outRegisters = $insn_format21ih.outRegisters; }
| insn_format21lh[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format21lh.outRegisters; } | insn_format21lh[$instructions] { $outRegisters = $insn_format21lh.outRegisters; }
| insn_format21s[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format21s.outRegisters; } | insn_format21s[$instructions] { $outRegisters = $insn_format21s.outRegisters; }
| insn_format21t[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format21t.outRegisters; } | insn_format21t[$instructions] { $outRegisters = $insn_format21t.outRegisters; }
| insn_format22b[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format22b.outRegisters; } | insn_format22b[$instructions] { $outRegisters = $insn_format22b.outRegisters; }
| insn_format22c_field[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format22c_field.outRegisters; } | insn_format22c_field[$instructions] { $outRegisters = $insn_format22c_field.outRegisters; }
| insn_format22c_type[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format22c_type.outRegisters; } | insn_format22c_type[$instructions] { $outRegisters = $insn_format22c_type.outRegisters; }
| insn_format22s[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format22s.outRegisters; } | insn_format22s[$instructions] { $outRegisters = $insn_format22s.outRegisters; }
| insn_format22t[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format22t.outRegisters; } | insn_format22t[$instructions] { $outRegisters = $insn_format22t.outRegisters; }
| insn_format22x[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format22x.outRegisters; } | insn_format22x[$instructions] { $outRegisters = $insn_format22x.outRegisters; }
| insn_format23x[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format23x.outRegisters; } | insn_format23x[$instructions] { $outRegisters = $insn_format23x.outRegisters; }
| insn_format30t[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format30t.outRegisters; } | insn_format30t[$instructions] { $outRegisters = $insn_format30t.outRegisters; }
| insn_format31c[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format31c.outRegisters; } | insn_format31c[$instructions] { $outRegisters = $insn_format31c.outRegisters; }
| insn_format31i[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format31i.outRegisters; } | insn_format31i[$instructions] { $outRegisters = $insn_format31i.outRegisters; }
| insn_format31t[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format31t.outRegisters; } | insn_format31t[$instructions] { $outRegisters = $insn_format31t.outRegisters; }
| insn_format32x[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format32x.outRegisters; } | insn_format32x[$instructions] { $outRegisters = $insn_format32x.outRegisters; }
| insn_format35c_method[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format35c_method.outRegisters; } | insn_format35c_method[$instructions] { $outRegisters = $insn_format35c_method.outRegisters; }
| insn_format35c_type[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format35c_type.outRegisters; } | insn_format35c_type[$instructions] { $outRegisters = $insn_format35c_type.outRegisters; }
| insn_format3rc_method[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format3rc_method.outRegisters; } | insn_format3rc_method[$instructions] { $outRegisters = $insn_format3rc_method.outRegisters; }
| insn_format3rc_type[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format3rc_type.outRegisters; } | insn_format3rc_type[$instructions] { $outRegisters = $insn_format3rc_type.outRegisters; }
| insn_format51l_type[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_format51l_type.outRegisters; } | insn_format51l_type[$instructions] { $outRegisters = $insn_format51l_type.outRegisters; }
| insn_array_data_directive[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_array_data_directive.outRegisters; } | insn_array_data_directive[$instructions] { $outRegisters = $insn_array_data_directive.outRegisters; }
| insn_packed_switch_directive[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_packed_switch_directive.outRegisters; } | insn_packed_switch_directive[$instructions] { $outRegisters = $insn_packed_switch_directive.outRegisters; }
| insn_sparse_switch_directive[$totalMethodRegisters, $methodParameterRegisters, $instructions] { $outRegisters = $insn_sparse_switch_directive.outRegisters; }; | insn_sparse_switch_directive[$instructions] { $outRegisters = $insn_sparse_switch_directive.outRegisters; };
catch [Exception ex] { catch [Exception ex] {
reportError(new SemanticException(input, $start, ex.getMessage())); reportError(new SemanticException(input, $start, ex.getMessage()));
recover(input, null); recover(input, null);
} }
insn_format10t[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format10t[List<Instruction> instructions] returns[int outRegisters]
: //e.g. goto endloop: : //e.g. goto endloop:
{$outRegisters = 0;} {$outRegisters = 0;}
^(I_STATEMENT_FORMAT10t INSTRUCTION_FORMAT10t offset_or_label) ^(I_STATEMENT_FORMAT10t INSTRUCTION_FORMAT10t offset_or_label)
@ -830,7 +840,7 @@ insn_format10t[int totalMethodRegisters, int methodParameterRegisters, List<Inst
$instructions.add(new ImmutableInstruction10t(opcode, addressOffset)); $instructions.add(new ImmutableInstruction10t(opcode, addressOffset));
}; };
insn_format10x[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format10x[List<Instruction> instructions] returns[int outRegisters]
: //e.g. return : //e.g. return
^(I_STATEMENT_FORMAT10x INSTRUCTION_FORMAT10x) ^(I_STATEMENT_FORMAT10x INSTRUCTION_FORMAT10x)
{ {
@ -838,12 +848,12 @@ insn_format10x[int totalMethodRegisters, int methodParameterRegisters, List<Inst
$instructions.add(new ImmutableInstruction10x(opcode)); $instructions.add(new ImmutableInstruction10x(opcode));
}; };
insn_format11n[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format11n[List<Instruction> instructions] returns[int outRegisters]
: //e.g. const/4 v0, 5 : //e.g. const/4 v0, 5
^(I_STATEMENT_FORMAT11n INSTRUCTION_FORMAT11n REGISTER short_integral_literal) ^(I_STATEMENT_FORMAT11n INSTRUCTION_FORMAT11n REGISTER short_integral_literal)
{ {
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT11n.text); Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT11n.text);
byte regA = parseRegister_nibble($REGISTER.text, $totalMethodRegisters, $methodParameterRegisters); byte regA = parseRegister_nibble($REGISTER.text);
short litB = $short_integral_literal.value; short litB = $short_integral_literal.value;
LiteralTools.checkNibble(litB); LiteralTools.checkNibble(litB);
@ -851,28 +861,28 @@ insn_format11n[int totalMethodRegisters, int methodParameterRegisters, List<Inst
$instructions.add(new ImmutableInstruction11n(opcode, regA, litB)); $instructions.add(new ImmutableInstruction11n(opcode, regA, litB));
}; };
insn_format11x[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format11x[List<Instruction> instructions] returns[int outRegisters]
: //e.g. move-result-object v1 : //e.g. move-result-object v1
^(I_STATEMENT_FORMAT11x INSTRUCTION_FORMAT11x REGISTER) ^(I_STATEMENT_FORMAT11x INSTRUCTION_FORMAT11x REGISTER)
{ {
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT11x.text); Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT11x.text);
short regA = parseRegister_byte($REGISTER.text, $totalMethodRegisters, $methodParameterRegisters); short regA = parseRegister_byte($REGISTER.text);
$instructions.add(new ImmutableInstruction11x(opcode, regA)); $instructions.add(new ImmutableInstruction11x(opcode, regA));
}; };
insn_format12x[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format12x[List<Instruction> instructions] returns[int outRegisters]
: //e.g. move v1 v2 : //e.g. move v1 v2
^(I_STATEMENT_FORMAT12x INSTRUCTION_FORMAT12x registerA=REGISTER registerB=REGISTER) ^(I_STATEMENT_FORMAT12x INSTRUCTION_FORMAT12x registerA=REGISTER registerB=REGISTER)
{ {
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT12x.text); Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT12x.text);
byte regA = parseRegister_nibble($registerA.text, $totalMethodRegisters, $methodParameterRegisters); byte regA = parseRegister_nibble($registerA.text);
byte regB = parseRegister_nibble($registerB.text, $totalMethodRegisters, $methodParameterRegisters); byte regB = parseRegister_nibble($registerB.text);
$instructions.add(new ImmutableInstruction12x(opcode, regA, regB)); $instructions.add(new ImmutableInstruction12x(opcode, regA, regB));
}; };
insn_format20bc[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format20bc[List<Instruction> instructions] returns[int outRegisters]
: //e.g. throw-verification-error generic-error, Lsome/class; : //e.g. throw-verification-error generic-error, Lsome/class;
^(I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc verification_error_type verification_error_reference) ^(I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc verification_error_type verification_error_reference)
{ {
@ -884,7 +894,7 @@ insn_format20bc[int totalMethodRegisters, int methodParameterRegisters, List<Ins
$instructions.add(new ImmutableInstruction20bc(opcode, verificationError, referencedItem)); $instructions.add(new ImmutableInstruction20bc(opcode, verificationError, referencedItem));
}; };
insn_format20t[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format20t[List<Instruction> instructions] returns[int outRegisters]
: //e.g. goto/16 endloop: : //e.g. goto/16 endloop:
^(I_STATEMENT_FORMAT20t INSTRUCTION_FORMAT20t offset_or_label) ^(I_STATEMENT_FORMAT20t INSTRUCTION_FORMAT20t offset_or_label)
{ {
@ -895,84 +905,84 @@ insn_format20t[int totalMethodRegisters, int methodParameterRegisters, List<Inst
$instructions.add(new ImmutableInstruction20t(opcode, addressOffset)); $instructions.add(new ImmutableInstruction20t(opcode, addressOffset));
}; };
insn_format21c_field[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format21c_field[List<Instruction> instructions] returns[int outRegisters]
: //e.g. sget_object v0, java/lang/System/out LJava/io/PrintStream; : //e.g. sget_object v0, java/lang/System/out LJava/io/PrintStream;
^(I_STATEMENT_FORMAT21c_FIELD inst=(INSTRUCTION_FORMAT21c_FIELD | INSTRUCTION_FORMAT21c_FIELD_ODEX) REGISTER fully_qualified_field) ^(I_STATEMENT_FORMAT21c_FIELD inst=(INSTRUCTION_FORMAT21c_FIELD | INSTRUCTION_FORMAT21c_FIELD_ODEX) REGISTER fully_qualified_field)
{ {
Opcode opcode = Opcode.getOpcodeByName($inst.text); Opcode opcode = Opcode.getOpcodeByName($inst.text);
short regA = parseRegister_byte($REGISTER.text, $totalMethodRegisters, $methodParameterRegisters); short regA = parseRegister_byte($REGISTER.text);
ImmutableFieldReference fieldReference = $fully_qualified_field.fieldReference; ImmutableFieldReference fieldReference = $fully_qualified_field.fieldReference;
$instructions.add(new ImmutableInstruction21c(opcode, regA, fieldReference)); $instructions.add(new ImmutableInstruction21c(opcode, regA, fieldReference));
}; };
insn_format21c_string[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format21c_string[List<Instruction> instructions] returns[int outRegisters]
: //e.g. const-string v1, "Hello World!" : //e.g. const-string v1, "Hello World!"
^(I_STATEMENT_FORMAT21c_STRING INSTRUCTION_FORMAT21c_STRING REGISTER string_literal) ^(I_STATEMENT_FORMAT21c_STRING INSTRUCTION_FORMAT21c_STRING REGISTER string_literal)
{ {
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT21c_STRING.text); Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT21c_STRING.text);
short regA = parseRegister_byte($REGISTER.text, $totalMethodRegisters, $methodParameterRegisters); short regA = parseRegister_byte($REGISTER.text);
ImmutableStringReference stringReference = new ImmutableStringReference($string_literal.value); ImmutableStringReference stringReference = new ImmutableStringReference($string_literal.value);
instructions.add(new ImmutableInstruction21c(opcode, regA, stringReference)); instructions.add(new ImmutableInstruction21c(opcode, regA, stringReference));
}; };
insn_format21c_type[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format21c_type[List<Instruction> instructions] returns[int outRegisters]
: //e.g. const-class v2, org/jf/HelloWorld2/HelloWorld2 : //e.g. const-class v2, org/jf/HelloWorld2/HelloWorld2
^(I_STATEMENT_FORMAT21c_TYPE INSTRUCTION_FORMAT21c_TYPE REGISTER reference_type_descriptor) ^(I_STATEMENT_FORMAT21c_TYPE INSTRUCTION_FORMAT21c_TYPE REGISTER reference_type_descriptor)
{ {
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT21c_TYPE.text); Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT21c_TYPE.text);
short regA = parseRegister_byte($REGISTER.text, $totalMethodRegisters, $methodParameterRegisters); short regA = parseRegister_byte($REGISTER.text);
ImmutableTypeReference typeReference = new ImmutableTypeReference($reference_type_descriptor.type); ImmutableTypeReference typeReference = new ImmutableTypeReference($reference_type_descriptor.type);
$instructions.add(new ImmutableInstruction21c(opcode, regA, typeReference)); $instructions.add(new ImmutableInstruction21c(opcode, regA, typeReference));
}; };
insn_format21ih[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format21ih[List<Instruction> instructions] returns[int outRegisters]
: //e.g. const/high16 v1, 1234 : //e.g. const/high16 v1, 1234
^(I_STATEMENT_FORMAT21ih INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal) ^(I_STATEMENT_FORMAT21ih INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal)
{ {
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT21ih.text); Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT21ih.text);
short regA = parseRegister_byte($REGISTER.text, $totalMethodRegisters, $methodParameterRegisters); short regA = parseRegister_byte($REGISTER.text);
int litB = $fixed_32bit_literal.value; int litB = $fixed_32bit_literal.value;
instructions.add(new ImmutableInstruction21ih(opcode, regA, litB)); instructions.add(new ImmutableInstruction21ih(opcode, regA, litB));
}; };
insn_format21lh[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format21lh[List<Instruction> instructions] returns[int outRegisters]
: //e.g. const-wide/high16 v1, 1234 : //e.g. const-wide/high16 v1, 1234
^(I_STATEMENT_FORMAT21lh INSTRUCTION_FORMAT21lh REGISTER fixed_64bit_literal) ^(I_STATEMENT_FORMAT21lh INSTRUCTION_FORMAT21lh REGISTER fixed_64bit_literal)
{ {
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT21lh.text); Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT21lh.text);
short regA = parseRegister_byte($REGISTER.text, $totalMethodRegisters, $methodParameterRegisters); short regA = parseRegister_byte($REGISTER.text);
long litB = $fixed_64bit_literal.value; long litB = $fixed_64bit_literal.value;
instructions.add(new ImmutableInstruction21lh(opcode, regA, litB)); instructions.add(new ImmutableInstruction21lh(opcode, regA, litB));
}; };
insn_format21s[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format21s[List<Instruction> instructions] returns[int outRegisters]
: //e.g. const/16 v1, 1234 : //e.g. const/16 v1, 1234
^(I_STATEMENT_FORMAT21s INSTRUCTION_FORMAT21s REGISTER short_integral_literal) ^(I_STATEMENT_FORMAT21s INSTRUCTION_FORMAT21s REGISTER short_integral_literal)
{ {
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT21s.text); Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT21s.text);
short regA = parseRegister_byte($REGISTER.text, $totalMethodRegisters, $methodParameterRegisters); short regA = parseRegister_byte($REGISTER.text);
short litB = $short_integral_literal.value; short litB = $short_integral_literal.value;
$instructions.add(new ImmutableInstruction21s(opcode, regA, litB)); $instructions.add(new ImmutableInstruction21s(opcode, regA, litB));
}; };
insn_format21t[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format21t[List<Instruction> instructions] returns[int outRegisters]
: //e.g. if-eqz v0, endloop: : //e.g. if-eqz v0, endloop:
^(I_STATEMENT_FORMAT21t INSTRUCTION_FORMAT21t REGISTER offset_or_label) ^(I_STATEMENT_FORMAT21t INSTRUCTION_FORMAT21t REGISTER offset_or_label)
{ {
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT21t.text); Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT21t.text);
short regA = parseRegister_byte($REGISTER.text, $totalMethodRegisters, $methodParameterRegisters); short regA = parseRegister_byte($REGISTER.text);
int addressOffset = $offset_or_label.offsetValue; int addressOffset = $offset_or_label.offsetValue;
@ -983,13 +993,13 @@ insn_format21t[int totalMethodRegisters, int methodParameterRegisters, List<Inst
$instructions.add(new ImmutableInstruction21t(opcode, regA, addressOffset)); $instructions.add(new ImmutableInstruction21t(opcode, regA, addressOffset));
}; };
insn_format22b[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format22b[List<Instruction> instructions] returns[int outRegisters]
: //e.g. add-int v0, v1, 123 : //e.g. add-int v0, v1, 123
^(I_STATEMENT_FORMAT22b INSTRUCTION_FORMAT22b registerA=REGISTER registerB=REGISTER short_integral_literal) ^(I_STATEMENT_FORMAT22b INSTRUCTION_FORMAT22b registerA=REGISTER registerB=REGISTER short_integral_literal)
{ {
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT22b.text); Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT22b.text);
short regA = parseRegister_byte($registerA.text, $totalMethodRegisters, $methodParameterRegisters); short regA = parseRegister_byte($registerA.text);
short regB = parseRegister_byte($registerB.text, $totalMethodRegisters, $methodParameterRegisters); short regB = parseRegister_byte($registerB.text);
short litC = $short_integral_literal.value; short litC = $short_integral_literal.value;
LiteralTools.checkByte(litC); LiteralTools.checkByte(litC);
@ -997,52 +1007,52 @@ insn_format22b[int totalMethodRegisters, int methodParameterRegisters, List<Inst
$instructions.add(new ImmutableInstruction22b(opcode, regA, regB, litC)); $instructions.add(new ImmutableInstruction22b(opcode, regA, regB, litC));
}; };
insn_format22c_field[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format22c_field[List<Instruction> instructions] returns[int outRegisters]
: //e.g. iput-object v1, v0, org/jf/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String; : //e.g. iput-object v1, v0, org/jf/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String;
^(I_STATEMENT_FORMAT22c_FIELD inst=(INSTRUCTION_FORMAT22c_FIELD | INSTRUCTION_FORMAT22c_FIELD_ODEX) registerA=REGISTER registerB=REGISTER fully_qualified_field) ^(I_STATEMENT_FORMAT22c_FIELD inst=(INSTRUCTION_FORMAT22c_FIELD | INSTRUCTION_FORMAT22c_FIELD_ODEX) registerA=REGISTER registerB=REGISTER fully_qualified_field)
{ {
Opcode opcode = Opcode.getOpcodeByName($inst.text); Opcode opcode = Opcode.getOpcodeByName($inst.text);
byte regA = parseRegister_nibble($registerA.text, $totalMethodRegisters, $methodParameterRegisters); byte regA = parseRegister_nibble($registerA.text);
byte regB = parseRegister_nibble($registerB.text, $totalMethodRegisters, $methodParameterRegisters); byte regB = parseRegister_nibble($registerB.text);
ImmutableFieldReference fieldReference = $fully_qualified_field.fieldReference; ImmutableFieldReference fieldReference = $fully_qualified_field.fieldReference;
$instructions.add(new ImmutableInstruction22c(opcode, regA, regB, fieldReference)); $instructions.add(new ImmutableInstruction22c(opcode, regA, regB, fieldReference));
}; };
insn_format22c_type[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format22c_type[List<Instruction> instructions] returns[int outRegisters]
: //e.g. instance-of v0, v1, Ljava/lang/String; : //e.g. instance-of v0, v1, Ljava/lang/String;
^(I_STATEMENT_FORMAT22c_TYPE INSTRUCTION_FORMAT22c_TYPE registerA=REGISTER registerB=REGISTER nonvoid_type_descriptor) ^(I_STATEMENT_FORMAT22c_TYPE INSTRUCTION_FORMAT22c_TYPE registerA=REGISTER registerB=REGISTER nonvoid_type_descriptor)
{ {
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT22c_TYPE.text); Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT22c_TYPE.text);
byte regA = parseRegister_nibble($registerA.text, $totalMethodRegisters, $methodParameterRegisters); byte regA = parseRegister_nibble($registerA.text);
byte regB = parseRegister_nibble($registerB.text, $totalMethodRegisters, $methodParameterRegisters); byte regB = parseRegister_nibble($registerB.text);
ImmutableTypeReference typeReference = new ImmutableTypeReference($nonvoid_type_descriptor.type); ImmutableTypeReference typeReference = new ImmutableTypeReference($nonvoid_type_descriptor.type);
$instructions.add(new ImmutableInstruction22c(opcode, regA, regB, typeReference)); $instructions.add(new ImmutableInstruction22c(opcode, regA, regB, typeReference));
}; };
insn_format22s[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format22s[List<Instruction> instructions] returns[int outRegisters]
: //e.g. add-int/lit16 v0, v1, 12345 : //e.g. add-int/lit16 v0, v1, 12345
^(I_STATEMENT_FORMAT22s INSTRUCTION_FORMAT22s registerA=REGISTER registerB=REGISTER short_integral_literal) ^(I_STATEMENT_FORMAT22s INSTRUCTION_FORMAT22s registerA=REGISTER registerB=REGISTER short_integral_literal)
{ {
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT22s.text); Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT22s.text);
byte regA = parseRegister_nibble($registerA.text, $totalMethodRegisters, $methodParameterRegisters); byte regA = parseRegister_nibble($registerA.text);
byte regB = parseRegister_nibble($registerB.text, $totalMethodRegisters, $methodParameterRegisters); byte regB = parseRegister_nibble($registerB.text);
short litC = $short_integral_literal.value; short litC = $short_integral_literal.value;
$instructions.add(new ImmutableInstruction22s(opcode, regA, regB, litC)); $instructions.add(new ImmutableInstruction22s(opcode, regA, regB, litC));
}; };
insn_format22t[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format22t[List<Instruction> instructions] returns[int outRegisters]
: //e.g. if-eq v0, v1, endloop: : //e.g. if-eq v0, v1, endloop:
^(I_STATEMENT_FORMAT22t INSTRUCTION_FORMAT22t registerA=REGISTER registerB=REGISTER offset_or_label) ^(I_STATEMENT_FORMAT22t INSTRUCTION_FORMAT22t registerA=REGISTER registerB=REGISTER offset_or_label)
{ {
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT22t.text); Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT22t.text);
byte regA = parseRegister_nibble($registerA.text, $totalMethodRegisters, $methodParameterRegisters); byte regA = parseRegister_nibble($registerA.text);
byte regB = parseRegister_nibble($registerB.text, $totalMethodRegisters, $methodParameterRegisters); byte regB = parseRegister_nibble($registerB.text);
int addressOffset = $offset_or_label.offsetValue; int addressOffset = $offset_or_label.offsetValue;
@ -1053,30 +1063,30 @@ insn_format22t[int totalMethodRegisters, int methodParameterRegisters, List<Inst
$instructions.add(new ImmutableInstruction22t(opcode, regA, regB, addressOffset)); $instructions.add(new ImmutableInstruction22t(opcode, regA, regB, addressOffset));
}; };
insn_format22x[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format22x[List<Instruction> instructions] returns[int outRegisters]
: //e.g. move/from16 v1, v1234 : //e.g. move/from16 v1, v1234
^(I_STATEMENT_FORMAT22x INSTRUCTION_FORMAT22x registerA=REGISTER registerB=REGISTER) ^(I_STATEMENT_FORMAT22x INSTRUCTION_FORMAT22x registerA=REGISTER registerB=REGISTER)
{ {
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT22x.text); Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT22x.text);
short regA = parseRegister_byte($registerA.text, $totalMethodRegisters, $methodParameterRegisters); short regA = parseRegister_byte($registerA.text);
int regB = parseRegister_short($registerB.text, $totalMethodRegisters, $methodParameterRegisters); int regB = parseRegister_short($registerB.text);
$instructions.add(new ImmutableInstruction22x(opcode, regA, regB)); $instructions.add(new ImmutableInstruction22x(opcode, regA, regB));
}; };
insn_format23x[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format23x[List<Instruction> instructions] returns[int outRegisters]
: //e.g. add-int v1, v2, v3 : //e.g. add-int v1, v2, v3
^(I_STATEMENT_FORMAT23x INSTRUCTION_FORMAT23x registerA=REGISTER registerB=REGISTER registerC=REGISTER) ^(I_STATEMENT_FORMAT23x INSTRUCTION_FORMAT23x registerA=REGISTER registerB=REGISTER registerC=REGISTER)
{ {
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT23x.text); Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT23x.text);
short regA = parseRegister_byte($registerA.text, $totalMethodRegisters, $methodParameterRegisters); short regA = parseRegister_byte($registerA.text);
short regB = parseRegister_byte($registerB.text, $totalMethodRegisters, $methodParameterRegisters); short regB = parseRegister_byte($registerB.text);
short regC = parseRegister_byte($registerC.text, $totalMethodRegisters, $methodParameterRegisters); short regC = parseRegister_byte($registerC.text);
$instructions.add(new ImmutableInstruction23x(opcode, regA, regB, regC)); $instructions.add(new ImmutableInstruction23x(opcode, regA, regB, regC));
}; };
insn_format30t[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format30t[List<Instruction> instructions] returns[int outRegisters]
: //e.g. goto/32 endloop: : //e.g. goto/32 endloop:
^(I_STATEMENT_FORMAT30t INSTRUCTION_FORMAT30t offset_or_label) ^(I_STATEMENT_FORMAT30t INSTRUCTION_FORMAT30t offset_or_label)
{ {
@ -1087,37 +1097,37 @@ insn_format30t[int totalMethodRegisters, int methodParameterRegisters, List<Inst
$instructions.add(new ImmutableInstruction30t(opcode, addressOffset)); $instructions.add(new ImmutableInstruction30t(opcode, addressOffset));
}; };
insn_format31c[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format31c[List<Instruction> instructions] returns[int outRegisters]
: //e.g. const-string/jumbo v1 "Hello World!" : //e.g. const-string/jumbo v1 "Hello World!"
^(I_STATEMENT_FORMAT31c INSTRUCTION_FORMAT31c REGISTER string_literal) ^(I_STATEMENT_FORMAT31c INSTRUCTION_FORMAT31c REGISTER string_literal)
{ {
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT31c.text); Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT31c.text);
short regA = parseRegister_byte($REGISTER.text, $totalMethodRegisters, $methodParameterRegisters); short regA = parseRegister_byte($REGISTER.text);
ImmutableStringReference stringReference = new ImmutableStringReference($string_literal.value); ImmutableStringReference stringReference = new ImmutableStringReference($string_literal.value);
$instructions.add(new ImmutableInstruction31c(opcode, regA, stringReference)); $instructions.add(new ImmutableInstruction31c(opcode, regA, stringReference));
}; };
insn_format31i[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format31i[List<Instruction> instructions] returns[int outRegisters]
: //e.g. const v0, 123456 : //e.g. const v0, 123456
^(I_STATEMENT_FORMAT31i INSTRUCTION_FORMAT31i REGISTER fixed_32bit_literal) ^(I_STATEMENT_FORMAT31i INSTRUCTION_FORMAT31i REGISTER fixed_32bit_literal)
{ {
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT31i.text); Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT31i.text);
short regA = parseRegister_byte($REGISTER.text, $totalMethodRegisters, $methodParameterRegisters); short regA = parseRegister_byte($REGISTER.text);
int litB = $fixed_32bit_literal.value; int litB = $fixed_32bit_literal.value;
$instructions.add(new ImmutableInstruction31i(opcode, regA, litB)); $instructions.add(new ImmutableInstruction31i(opcode, regA, litB));
}; };
insn_format31t[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format31t[List<Instruction> instructions] returns[int outRegisters]
: //e.g. fill-array-data v0, ArrayData: : //e.g. fill-array-data v0, ArrayData:
^(I_STATEMENT_FORMAT31t INSTRUCTION_FORMAT31t REGISTER offset_or_label) ^(I_STATEMENT_FORMAT31t INSTRUCTION_FORMAT31t REGISTER offset_or_label)
{ {
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT31t.text); Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT31t.text);
short regA = parseRegister_byte($REGISTER.text, $totalMethodRegisters, $methodParameterRegisters); short regA = parseRegister_byte($REGISTER.text);
int addressOffset = $offset_or_label.offsetValue; int addressOffset = $offset_or_label.offsetValue;
if (($method::currentAddress + addressOffset) \% 2 != 0) { if (($method::currentAddress + addressOffset) \% 2 != 0) {
@ -1127,20 +1137,20 @@ insn_format31t[int totalMethodRegisters, int methodParameterRegisters, List<Inst
$instructions.add(new ImmutableInstruction31t(opcode, regA, addressOffset)); $instructions.add(new ImmutableInstruction31t(opcode, regA, addressOffset));
}; };
insn_format32x[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format32x[List<Instruction> instructions] returns[int outRegisters]
: //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)
{ {
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT32x.text); Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT32x.text);
int regA = parseRegister_short($registerA.text, $totalMethodRegisters, $methodParameterRegisters); int regA = parseRegister_short($registerA.text);
int regB = parseRegister_short($registerB.text, $totalMethodRegisters, $methodParameterRegisters); int regB = parseRegister_short($registerB.text);
$instructions.add(new ImmutableInstruction32x(opcode, regA, regB)); $instructions.add(new ImmutableInstruction32x(opcode, regA, regB));
}; };
insn_format35c_method[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format35c_method[List<Instruction> instructions] returns[int outRegisters]
: //e.g. invoke-virtual {v0,v1} java/io/PrintStream/print(Ljava/lang/Stream;)V : //e.g. invoke-virtual {v0,v1} java/io/PrintStream/print(Ljava/lang/Stream;)V
^(I_STATEMENT_FORMAT35c_METHOD INSTRUCTION_FORMAT35c_METHOD register_list[$totalMethodRegisters, $methodParameterRegisters] fully_qualified_method) ^(I_STATEMENT_FORMAT35c_METHOD INSTRUCTION_FORMAT35c_METHOD register_list fully_qualified_method)
{ {
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT35c_METHOD.text); Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT35c_METHOD.text);
@ -1154,9 +1164,9 @@ insn_format35c_method[int totalMethodRegisters, int methodParameterRegisters, Li
$instructions.add(new ImmutableInstruction35c(opcode, registerCount, registers[0], registers[1], registers[2], registers[3], registers[4], methodReference)); $instructions.add(new ImmutableInstruction35c(opcode, registerCount, registers[0], registers[1], registers[2], registers[3], registers[4], methodReference));
}; };
insn_format35c_type[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format35c_type[List<Instruction> instructions] returns[int outRegisters]
: //e.g. filled-new-array {v0,v1}, I : //e.g. filled-new-array {v0,v1}, I
^(I_STATEMENT_FORMAT35c_TYPE INSTRUCTION_FORMAT35c_TYPE register_list[$totalMethodRegisters, $methodParameterRegisters] nonvoid_type_descriptor) ^(I_STATEMENT_FORMAT35c_TYPE INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor)
{ {
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT35c_TYPE.text); Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT35c_TYPE.text);
@ -1170,9 +1180,9 @@ insn_format35c_type[int totalMethodRegisters, int methodParameterRegisters, List
$instructions.add(new ImmutableInstruction35c(opcode, registerCount, registers[0], registers[1], registers[2], registers[3], registers[4], typeReference)); $instructions.add(new ImmutableInstruction35c(opcode, registerCount, registers[0], registers[1], registers[2], registers[3], registers[4], typeReference));
}; };
insn_format3rc_method[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format3rc_method[List<Instruction> instructions] returns[int outRegisters]
: //e.g. invoke-virtual/range {v25..v26} java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder; : //e.g. invoke-virtual/range {v25..v26} java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder;
^(I_STATEMENT_FORMAT3rc_METHOD INSTRUCTION_FORMAT3rc_METHOD register_range[$totalMethodRegisters, $methodParameterRegisters] fully_qualified_method) ^(I_STATEMENT_FORMAT3rc_METHOD INSTRUCTION_FORMAT3rc_METHOD register_range fully_qualified_method)
{ {
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT3rc_METHOD.text); Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT3rc_METHOD.text);
int startRegister = $register_range.startRegister; int startRegister = $register_range.startRegister;
@ -1186,9 +1196,9 @@ insn_format3rc_method[int totalMethodRegisters, int methodParameterRegisters, Li
$instructions.add(new ImmutableInstruction3rc(opcode, startRegister, registerCount, methodReference)); $instructions.add(new ImmutableInstruction3rc(opcode, startRegister, registerCount, methodReference));
}; };
insn_format3rc_type[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format3rc_type[List<Instruction> instructions] returns[int outRegisters]
: //e.g. filled-new-array/range {v0..v6} I : //e.g. filled-new-array/range {v0..v6} I
^(I_STATEMENT_FORMAT3rc_TYPE INSTRUCTION_FORMAT3rc_TYPE register_range[$totalMethodRegisters, $methodParameterRegisters] nonvoid_type_descriptor) ^(I_STATEMENT_FORMAT3rc_TYPE INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor)
{ {
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT3rc_TYPE.text); Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT3rc_TYPE.text);
int startRegister = $register_range.startRegister; int startRegister = $register_range.startRegister;
@ -1202,19 +1212,19 @@ insn_format3rc_type[int totalMethodRegisters, int methodParameterRegisters, List
$instructions.add(new ImmutableInstruction3rc(opcode, startRegister, registerCount, typeReference)); $instructions.add(new ImmutableInstruction3rc(opcode, startRegister, registerCount, typeReference));
}; };
insn_format51l_type[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_format51l_type[List<Instruction> instructions] returns[int outRegisters]
: //e.g. const-wide v0, 5000000000L : //e.g. const-wide v0, 5000000000L
^(I_STATEMENT_FORMAT51l INSTRUCTION_FORMAT51l REGISTER fixed_64bit_literal) ^(I_STATEMENT_FORMAT51l INSTRUCTION_FORMAT51l REGISTER fixed_64bit_literal)
{ {
Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT51l.text); Opcode opcode = Opcode.getOpcodeByName($INSTRUCTION_FORMAT51l.text);
short regA = parseRegister_byte($REGISTER.text, $totalMethodRegisters, $methodParameterRegisters); short regA = parseRegister_byte($REGISTER.text);
long litB = $fixed_64bit_literal.value; long litB = $fixed_64bit_literal.value;
$instructions.add(new ImmutableInstruction51l(opcode, regA, litB)); $instructions.add(new ImmutableInstruction51l(opcode, regA, litB));
}; };
insn_array_data_directive[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_array_data_directive[List<Instruction> instructions] returns[int outRegisters]
: //e.g. .array-data 4 1000000 .end array-data : //e.g. .array-data 4 1000000 .end array-data
^(I_STATEMENT_ARRAY_DATA ^(I_ARRAY_ELEMENT_SIZE short_integral_literal) array_elements) ^(I_STATEMENT_ARRAY_DATA ^(I_ARRAY_ELEMENT_SIZE short_integral_literal) array_elements)
{ {
@ -1239,7 +1249,7 @@ insn_array_data_directive[int totalMethodRegisters, int methodParameterRegisters
*/ */
}; };
insn_packed_switch_directive[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_packed_switch_directive[List<Instruction> instructions] returns[int outRegisters]
: :
^(I_STATEMENT_PACKED_SWITCH ^(I_PACKED_SWITCH_START_KEY fixed_32bit_literal) ^(I_STATEMENT_PACKED_SWITCH ^(I_PACKED_SWITCH_START_KEY fixed_32bit_literal)
{ {
@ -1254,7 +1264,7 @@ insn_packed_switch_directive[int totalMethodRegisters, int methodParameterRegist
$instructions.add(new ImmutablePackedSwitchPayload($packed_switch_elements.elements)); $instructions.add(new ImmutablePackedSwitchPayload($packed_switch_elements.elements));
}; };
insn_sparse_switch_directive[int totalMethodRegisters, int methodParameterRegisters, List<Instruction> instructions] returns[int outRegisters] insn_sparse_switch_directive[List<Instruction> instructions] returns[int outRegisters]
: :
{ {
Integer baseAddress = $method::sparseSwitchDeclarations.get($method::currentAddress); Integer baseAddress = $method::sparseSwitchDeclarations.get($method::currentAddress);