diff --git a/dexlib/src/main/java/org/jf/dexlib/Util/ByteArrayAnnotatedOutput.java b/dexlib/src/main/java/org/jf/dexlib/Util/ByteArrayAnnotatedOutput.java index 9824f4db..70d86257 100644 --- a/dexlib/src/main/java/org/jf/dexlib/Util/ByteArrayAnnotatedOutput.java +++ b/dexlib/src/main/java/org/jf/dexlib/Util/ByteArrayAnnotatedOutput.java @@ -228,17 +228,18 @@ public final class ByteArrayAnnotatedOutput /** {@inheritDoc} */ public int writeUnsignedLeb128(int value) { - int remaining = value >> 7; + long remaining = (value & 0xFFFFFFFFL) >> 7; + long lValue = value; int count = 0; while (remaining != 0) { - writeByte((value & 0x7f) | 0x80); - value = remaining; + writeByte((int)(lValue & 0x7f) | 0x80); + lValue = remaining; remaining >>= 7; count++; } - writeByte(value & 0x7f); + writeByte((int)(lValue & 0x7f)); return count + 1; } diff --git a/dexlib/src/main/java/org/jf/dexlib/Util/DebugInfoBuilder.java b/dexlib/src/main/java/org/jf/dexlib/Util/DebugInfoBuilder.java index 4a9142aa..167dd1bd 100644 --- a/dexlib/src/main/java/org/jf/dexlib/Util/DebugInfoBuilder.java +++ b/dexlib/src/main/java/org/jf/dexlib/Util/DebugInfoBuilder.java @@ -221,6 +221,7 @@ public class DebugInfoBuilder addressDelta = 0; } + //TODO: need to handle the case when the line delta is larger than a signed int debugInstructions.add(new SpecialOpcode(calculateSpecialOpcode(lineDelta, addressDelta))); diff --git a/dexlib/src/main/java/org/jf/dexlib/Util/Leb128Utils.java b/dexlib/src/main/java/org/jf/dexlib/Util/Leb128Utils.java index 9ed9d367..b76189bc 100644 --- a/dexlib/src/main/java/org/jf/dexlib/Util/Leb128Utils.java +++ b/dexlib/src/main/java/org/jf/dexlib/Util/Leb128Utils.java @@ -36,13 +36,13 @@ public final class Leb128Utils { */ public static int unsignedLeb128Size(int value) { // TODO: This could be much cleverer. + long lValue = value & 0xFFFFFFFFL; - int remaining = value >> 7; + long remaining = lValue >> 7L; int count = 0; - while (remaining != 0) { - value = remaining; - remaining >>= 7; + while (remaining != 0L) { + remaining >>= 7L; count++; } diff --git a/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g b/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g index b7c45525..3c375962 100644 --- a/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g +++ b/smali/src/main/antlr3/org/jf/smali/smaliTreeWalker.g @@ -1239,9 +1239,9 @@ integral_literal returns[int value] : long_literal { literalTools.checkInt($long_literal.value); - $value = (short)$long_literal.value; + $value = (int)$long_literal.value; } - | integer_literal {$value = (short)$integer_literal.value;} + | integer_literal {$value = $integer_literal.value;} | short_literal {$value = $short_literal.value;} | byte_literal {$value = $byte_literal.value;};