Provide access to try/catch guards in code inspector
Change-Id: I5d3a00372a16f56e2cf658b69556340da945e8f5
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CfTryCatchSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/CfTryCatchSubject.java
index 3e47f3b..d6bac64 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/CfTryCatchSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/CfTryCatchSubject.java
@@ -11,12 +11,17 @@
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
+import java.util.Collection;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
class CfTryCatchSubject implements TryCatchSubject {
+ private final CodeInspector inspector;
private final CfCode cfCode;
private final CfTryCatch tryCatch;
- CfTryCatchSubject(CfCode cfCode, CfTryCatch tryCatch) {
+ CfTryCatchSubject(CodeInspector inspector, CfCode cfCode, CfTryCatch tryCatch) {
+ this.inspector = inspector;
this.cfCode = cfCode;
this.tryCatch = tryCatch;
}
@@ -62,6 +67,16 @@
}
@Override
+ public Stream<TypeSubject> streamGuards() {
+ return tryCatch.guards.stream().map(type -> new TypeSubject(inspector, type));
+ }
+
+ @Override
+ public Collection<TypeSubject> guards() {
+ return streamGuards().collect(Collectors.toList());
+ }
+
+ @Override
public int getNumberOfHandlers() {
return tryCatch.guards.size();
}
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
index 2a4c7c5..f43c01c 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
@@ -386,11 +386,11 @@
}
TryCatchSubject createTryCatchSubject(DexCode code, Try tryElement, TryHandler tryHandler) {
- return new DexTryCatchSubject(code, tryElement, tryHandler);
+ return new DexTryCatchSubject(this, code, tryElement, tryHandler);
}
TryCatchSubject createTryCatchSubject(CfCode code, CfTryCatch tryCatch) {
- return new CfTryCatchSubject(code, tryCatch);
+ return new CfTryCatchSubject(this, code, tryCatch);
}
TryCatchIterator createTryCatchIterator(MethodSubject method) {
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/DexTryCatchSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/DexTryCatchSubject.java
index 4a96ff1..4624c33 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/DexTryCatchSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/DexTryCatchSubject.java
@@ -9,13 +9,20 @@
import com.android.tools.r8.graph.DexCode.Try;
import com.android.tools.r8.graph.DexCode.TryHandler;
import com.android.tools.r8.graph.DexCode.TryHandler.TypeAddrPair;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
class DexTryCatchSubject implements TryCatchSubject {
+ private final CodeInspector inspector;
private final DexCode dexCode;
private final Try tryElement;
private final TryHandler tryHandler;
- DexTryCatchSubject(DexCode dexCode, Try tryElement, TryHandler tryHandler) {
+ DexTryCatchSubject(
+ CodeInspector inspector, DexCode dexCode, Try tryElement, TryHandler tryHandler) {
+ this.inspector = inspector;
this.dexCode = dexCode;
this.tryElement = tryElement;
this.tryHandler = tryHandler;
@@ -45,6 +52,18 @@
}
@Override
+ public Stream<TypeSubject> streamGuards() {
+ return Arrays.stream(tryHandler.pairs)
+ .map(pair -> pair.type)
+ .map(type -> new TypeSubject(inspector, type));
+ }
+
+ @Override
+ public Collection<TypeSubject> guards() {
+ return streamGuards().collect(Collectors.toList());
+ }
+
+ @Override
public int getNumberOfHandlers() {
if (tryHandler.catchAllAddr != NO_HANDLER) {
return tryHandler.pairs.length + 1;
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java
index b158404..72b71b0 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java
@@ -89,6 +89,10 @@
return Streams.stream(iterateInstructions());
}
+ public Stream<TryCatchSubject> streamTryCatches() {
+ return Streams.stream(iterateTryCatches());
+ }
+
public void getLineNumberForInstruction(InstructionSubject subject) {
assert hasLineNumberTable();
getLineNumberTable().getLineForInstruction(subject);
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/TryCatchSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/TryCatchSubject.java
index 73e9ef1..d34f4e9 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/TryCatchSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/TryCatchSubject.java
@@ -3,10 +3,17 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.utils.codeinspector;
+import java.util.Collection;
+import java.util.stream.Stream;
+
public interface TryCatchSubject {
RangeSubject getRange();
boolean isCatching(String exceptionType);
boolean hasCatchAll();
+ Stream<TypeSubject> streamGuards();
+
+ Collection<TypeSubject> guards();
+
int getNumberOfHandlers();
}