Fix bad assert checking 16-bits value
Bug: 65007724
Change-Id: Id594b684c4908fef9a25a56ed901a5eb319834a3
diff --git a/src/main/java/com/android/tools/r8/dex/FileWriter.java b/src/main/java/com/android/tools/r8/dex/FileWriter.java
index 38e292c..f4fa365 100644
--- a/src/main/java/com/android/tools/r8/dex/FileWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/FileWriter.java
@@ -445,10 +445,10 @@
private void writeFieldItem(DexField field) {
int classIdx = mapping.getOffsetFor(field.clazz);
- assert (short) classIdx == classIdx;
+ assert (classIdx & 0xFFFF) == classIdx;
dest.putShort((short) classIdx);
int typeIdx = mapping.getOffsetFor(field.type);
- assert (short) typeIdx == typeIdx;
+ assert (typeIdx & 0xFFFF) == typeIdx;
dest.putShort((short) typeIdx);
DexString name = namingLens.lookupName(field);
dest.putInt(mapping.getOffsetFor(name));
@@ -456,10 +456,10 @@
private void writeMethodItem(DexMethod method) {
int classIdx = mapping.getOffsetFor(method.holder);
- assert (short) classIdx == classIdx;
+ assert (classIdx & 0xFFFF) == classIdx;
dest.putShort((short) classIdx);
int protoIdx = mapping.getOffsetFor(method.proto);
- assert (short) protoIdx == protoIdx;
+ assert (protoIdx & 0xFFFF) == protoIdx;
dest.putShort((short) protoIdx);
DexString name = namingLens.lookupName(method);
dest.putInt(mapping.getOffsetFor(name));
@@ -694,7 +694,7 @@
assert methodHandle.isFieldHandle();
fieldOrMethodIdx = mapping.getOffsetFor(methodHandle.asField());
}
- assert (short) fieldOrMethodIdx == fieldOrMethodIdx;
+ assert (fieldOrMethodIdx & 0xFFFF) == fieldOrMethodIdx;
dest.putShort((short) fieldOrMethodIdx);
dest.putShort((short) 0); // unused
}
diff --git a/src/test/java/com/android/tools/r8/jasmin/Regress65007724.java b/src/test/java/com/android/tools/r8/jasmin/Regress65007724.java
new file mode 100644
index 0000000..1eb0586
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/jasmin/Regress65007724.java
@@ -0,0 +1,35 @@
+// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.jasmin;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class Regress65007724 extends JasminTestBase {
+ @Test
+ public void testThat16BitsIndexAreAllowed() throws Exception {
+ JasminBuilder builder = new JasminBuilder();
+
+ for (int i = 0; i < 35000; i++) {
+ builder.addClass("C" + i);
+ }
+
+ JasminBuilder.ClassBuilder clazz = builder.addClass("Test");
+
+ clazz.addStaticField("f", "LC34000;", null);
+
+ clazz.addMainMethod(
+ ".limit stack 2",
+ ".limit locals 1",
+ "getstatic java/lang/System/out Ljava/io/PrintStream;",
+ "ldc \"Hello World!\"",
+ "invokevirtual java/io/PrintStream/print(Ljava/lang/String;)V",
+ "return");
+
+ String expected = runOnJava(builder, clazz.name);
+ String artResult = runOnArtD8(builder, clazz.name);
+ assertEquals(expected, artResult);
+ }
+}