Add support for blank register ranges
diff --git a/smali/src/main/antlr3/org/jf/smali/smaliParser.g b/smali/src/main/antlr3/org/jf/smali/smaliParser.g
index 19d4ff7..f25533c 100644
--- a/smali/src/main/antlr3/org/jf/smali/smaliParser.g
+++ b/smali/src/main/antlr3/org/jf/smali/smaliParser.g
@@ -603,7 +603,7 @@
| ->^(I_REGISTER_LIST[$start, "I_REGISTER_LIST"]);
register_range
- : REGISTER (DOTDOT REGISTER)? -> ^(I_REGISTER_RANGE[$start, "I_REGISTER_RANGE"] REGISTER REGISTER?);
+ : (startreg=REGISTER (DOTDOT endreg=REGISTER)?)? -> ^(I_REGISTER_RANGE[$start, "I_REGISTER_RANGE"] $startreg? $endreg?);
verification_error_reference
: CLASS_DESCRIPTOR | fully_qualified_field | fully_qualified_method;
diff --git a/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g b/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g
index 54aeccb..46c364b 100644
--- a/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g
+++ b/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g
@@ -895,22 +895,24 @@
})*);
register_range[int totalMethodRegisters, int methodParameterRegisters] returns[int startRegister, int endRegister]
- : ^(I_REGISTER_RANGE startReg=REGISTER endReg=REGISTER?)
+ : ^(I_REGISTER_RANGE (startReg=REGISTER endReg=REGISTER?)?)
{
- $startRegister = parseRegister_short($startReg.text, $totalMethodRegisters, $methodParameterRegisters);
- if ($endReg == null) {
- $endRegister = $startRegister;
- } else {
- $endRegister = parseRegister_short($endReg.text, $totalMethodRegisters, $methodParameterRegisters);
- }
+ if ($startReg == null) {
+ $startRegister = 0;
+ $endRegister = -1;
+ } else {
+ $startRegister = parseRegister_short($startReg.text, $totalMethodRegisters, $methodParameterRegisters);
+ if ($endReg == null) {
+ $endRegister = $startRegister;
+ } else {
+ $endRegister = parseRegister_short($endReg.text, $totalMethodRegisters, $methodParameterRegisters);
+ }
- int registerCount = $endRegister-$startRegister+1;
- if (registerCount > 256) {
- throw new SemanticException(input, $I_REGISTER_RANGE, "A register range can span a maximum of 256 registers");
- }
- if (registerCount < 1) {
- throw new SemanticException(input, $I_REGISTER_RANGE, "A register range must have the lower register listed first");
- }
+ int registerCount = $endRegister-$startRegister+1;
+ if (registerCount < 1) {
+ throw new SemanticException(input, $I_REGISTER_RANGE, "A register range must have the lower register listed first");
+ }
+ }
}
;