Disallow a null handler array.
Change-Id: Ib26da2d0595e725186d5cd3ad87fa10dd9a896a7
diff --git a/src/main/java/com/android/tools/r8/dex/DexParser.java b/src/main/java/com/android/tools/r8/dex/DexParser.java
index a416e51..978a7e7 100644
--- a/src/main/java/com/android/tools/r8/dex/DexParser.java
+++ b/src/main/java/com/android/tools/r8/dex/DexParser.java
@@ -859,7 +859,7 @@
int insnsSize = dexReader.getUint();
short[] code = new short[insnsSize];
Try[] tries = new Try[triesSize];
- DexCode.TryHandler[] handlers = null;
+ TryHandler[] handlers = new TryHandler[0];
if (insnsSize != 0) {
for (int i = 0; i < insnsSize; i++) {
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 d9103a5..bb5706d 100644
--- a/src/main/java/com/android/tools/r8/dex/FileWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/FileWriter.java
@@ -408,7 +408,7 @@
}
result += insnSize * 2;
result += code.tries.length * 8;
- if ((code.handlers != null) && (code.handlers.length > 0)) {
+ if (code.handlers.length > 0) {
result = alignSize(4, result);
result += LebUtils.sizeAsUleb128(code.handlers.length);
for (TryHandler handler : code.handlers) {
diff --git a/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java b/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java
index e05af85..128ea1d 100644
--- a/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java
+++ b/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java
@@ -194,9 +194,6 @@
private TryHandler[] rewriteHandlerOffsets() {
DexCode code = method.getCode().asDexCode();
- if (code.handlers == null) {
- return null;
- }
TryHandler[] result = new TryHandler[code.handlers.length];
for (int i = 0; i < code.handlers.length; i++) {
TryHandler handler = code.handlers[i];
@@ -545,21 +542,19 @@
tryRangeStartAndEndTargets.put(start.getOffset(), start);
tryRangeStartAndEndTargets.put(end.getOffset(), end);
}
- if (code.handlers != null) {
- for (TryHandler handler : code.handlers) {
- List<Instruction> targets = new ArrayList<>();
- if (handler.catchAllAddr != NO_HANDLER) {
- Instruction target = offsetToInstruction.get(handler.catchAllAddr);
- assert target != null;
- targets.add(target);
- }
- for (TypeAddrPair pair : handler.pairs) {
- Instruction target = offsetToInstruction.get(pair.addr);
- assert target != null;
- targets.add(target);
- }
- handlerTargets.put(handler, targets);
+ for (TryHandler handler : code.handlers) {
+ List<Instruction> targets = new ArrayList<>();
+ if (handler.catchAllAddr != NO_HANDLER) {
+ Instruction target = offsetToInstruction.get(handler.catchAllAddr);
+ assert target != null;
+ targets.add(target);
}
+ for (TypeAddrPair pair : handler.pairs) {
+ Instruction target = offsetToInstruction.get(pair.addr);
+ assert target != null;
+ targets.add(target);
+ }
+ handlerTargets.put(handler, targets);
}
}
diff --git a/src/main/java/com/android/tools/r8/graph/DexCode.java b/src/main/java/com/android/tools/r8/graph/DexCode.java
index f9e4285..5ff8573 100644
--- a/src/main/java/com/android/tools/r8/graph/DexCode.java
+++ b/src/main/java/com/android/tools/r8/graph/DexCode.java
@@ -67,6 +67,9 @@
this.tries = tries;
this.handlers = handlers;
this.debugInfo = debugInfo;
+ assert tries != null;
+ assert handlers != null;
+ assert instructions != null;
hashCode(); // Cache the hash code eagerly.
}
@@ -247,11 +250,9 @@
for (Instruction insn : instructions) {
insn.registerUse(registry);
}
- if (handlers != null) {
- for (TryHandler handler : handlers) {
- for (TypeAddrPair pair : handler.pairs) {
- registry.registerTypeReference(pair.type);
- }
+ for (TryHandler handler : handlers) {
+ for (TypeAddrPair pair : handler.pairs) {
+ registry.registerTypeReference(pair.type);
}
}
}
@@ -318,14 +319,12 @@
builder.append(atry.toString());
builder.append('\n');
}
- if (handlers != null) {
- builder.append("Handlers (numbers are offsets)\n");
- for (int handlerIndex = 0; handlerIndex < handlers.length; handlerIndex++) {
- TryHandler handler = handlers[handlerIndex];
- builder.append(" ").append(handlerIndex).append(": ");
- builder.append(handler.toString());
- builder.append('\n');
- }
+ builder.append("Handlers (numbers are offsets)\n");
+ for (int handlerIndex = 0; handlerIndex < handlers.length; handlerIndex++) {
+ TryHandler handler = handlers[handlerIndex];
+ builder.append(" ").append(handlerIndex).append(": ");
+ builder.append(handler.toString());
+ builder.append('\n');
}
}
return builder.toString();
@@ -381,13 +380,11 @@
builder.append(atry.toString());
builder.append('\n');
}
- if (handlers != null) {
builder.append("Handlers (numbers are offsets)\n");
for (TryHandler handler : handlers) {
builder.append(handler.toString());
builder.append('\n');
}
- }
}
return builder.toString();
}
@@ -410,11 +407,9 @@
if (debugInfo != null) {
getDebugInfoForWriting().collectIndexedItems(indexedItems, graphLens);
}
- if (handlers != null) {
for (TryHandler handler : handlers) {
handler.collectIndexedItems(indexedItems, graphLens);
}
- }
}
public DexDebugInfoForWriting getDebugInfoForWriting() {
diff --git a/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java b/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java
index 71d5ffb..c72cf47 100644
--- a/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java
+++ b/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java
@@ -20,6 +20,7 @@
import com.android.tools.r8.graph.DexAnnotationSet;
import com.android.tools.r8.graph.DexCode;
import com.android.tools.r8.graph.DexCode.Try;
+import com.android.tools.r8.graph.DexCode.TryHandler;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexString;
@@ -150,14 +151,7 @@
private DexCode jumboStringProcess(
DexItemFactory factory, DexString string, Instruction[] instructions) {
- DexCode code = new DexCode(
- 1,
- 0,
- 0,
- instructions,
- new Try[0],
- null,
- null);
+ DexCode code = new DexCode(1, 0, 0, instructions, new Try[0], new TryHandler[0], null);
MethodAccessFlags flags = MethodAccessFlags.fromSharedAccessFlags(Constants.ACC_PUBLIC, false);
DexEncodedMethod method =
new DexEncodedMethod(
diff --git a/src/test/java/com/android/tools/r8/regress/b111960171/B111960171.java b/src/test/java/com/android/tools/r8/regress/b111960171/B111960171.java
index 21d088f..d05520f 100644
--- a/src/test/java/com/android/tools/r8/regress/b111960171/B111960171.java
+++ b/src/test/java/com/android/tools/r8/regress/b111960171/B111960171.java
@@ -65,13 +65,13 @@
public void disableDex2OatInliningWithTryCatch()
throws IOException, CompilationFailedException, ExecutionException {
MethodSubject method = compileTestClassAndGetMethod(AndroidApiLevel.M.getLevel());
- assertTrue(method.getMethod().getCode().asDexCode().handlers != null);
+ assertTrue(method.getMethod().getCode().asDexCode().handlers.length > 0);
}
@Test
public void dontDisableDex2OatInliningWithTryCatch()
throws IOException, CompilationFailedException, ExecutionException {
MethodSubject method = compileTestClassAndGetMethod(AndroidApiLevel.N.getLevel());
- assertTrue(method.getMethod().getCode().asDexCode().handlers == null);
+ assertTrue(method.getMethod().getCode().asDexCode().handlers.length == 0);
}
}