[ApiModel] Account for try-catch ranges
Bug: 207812068
Change-Id: I6494955ca198562ab9b9cee731056aa1b4d4002c
diff --git a/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java b/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java
index a5b539b..597a07d 100644
--- a/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java
+++ b/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java
@@ -181,6 +181,7 @@
@Override
public void registerExceptionGuard(DexType guard) {
+ setMaxApiReferenceLevel(guard);
enqueuer.traceExceptionGuard(guard, getContext());
}
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfTryCatchReferenceTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfTryCatchReferenceTest.java
index 5b78b3c..9565973 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfTryCatchReferenceTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfTryCatchReferenceTest.java
@@ -5,6 +5,7 @@
package com.android.tools.r8.apimodel;
import static com.android.tools.r8.apimodel.ApiModelingTestHelper.setMockApiLevelForClass;
+import static com.android.tools.r8.apimodel.ApiModelingTestHelper.setMockApiLevelForDefaultInstanceInitializer;
import static org.junit.Assert.assertEquals;
import com.android.tools.r8.NeverInline;
@@ -35,7 +36,6 @@
@Test
public void testR8() throws Exception {
Method tryCatch = TestClass.class.getDeclaredMethod("testTryCatch");
- Method callTestClass = Caller.class.getDeclaredMethod("callTestClass");
testForR8(parameters.getBackend())
.addProgramClasses(Main.class, TestClass.class, Caller.class, KeptClass.class)
.addLibraryClasses(ApiException.class)
@@ -45,19 +45,28 @@
Reference.methodFromMethod(KeptClass.class.getDeclaredMethod("keptMethodThatMayThrow")))
.addKeepMainRule(Main.class)
.apply(setMockApiLevelForClass(ApiException.class, exceptionApiLevel))
+ .apply(setMockApiLevelForDefaultInstanceInitializer(ApiException.class, exceptionApiLevel))
.apply(ApiModelingTestHelper::enableApiCallerIdentification)
.enableInliningAnnotations()
.addHorizontallyMergedClassesInspector(
- // TODO(b/207812068): The classes should not be merged.
- inspector -> inspector.assertClassesMerged(TestClass.class, Caller.class))
+ horizontallyMergedClassesInspector -> {
+ if (parameters.isDexRuntime()
+ && parameters.getApiLevel().isGreaterThanOrEqualTo(exceptionApiLevel)) {
+ horizontallyMergedClassesInspector.assertClassesMerged(
+ TestClass.class, Caller.class);
+ } else {
+ horizontallyMergedClassesInspector.assertNoClassesMerged();
+ }
+ })
.apply(
ApiModelingTestHelper.addTracedApiReferenceLevelCallBack(
(reference, apiLevel) -> {
if (reference.equals(Reference.methodFromMethod(tryCatch))) {
- // TODO(b/207812068): The api level should be
- // max(exceptionApiLevel, parameters.getApiLevel()).
assertEquals(
- parameters.isCfRuntime() ? AndroidApiLevel.B : parameters.getApiLevel(),
+ exceptionApiLevel.max(
+ parameters.isCfRuntime()
+ ? AndroidApiLevel.B
+ : parameters.getApiLevel()),
apiLevel);
}
}))
@@ -89,6 +98,9 @@
public static class KeptClass {
public static void keptMethodThatMayThrow() {
+ if (System.currentTimeMillis() == 0) {
+ throw new ApiException();
+ }
System.out.println("Hello World");
}
}