[ApiModel] Only stub classes in exception handlers
Bug: b/258270051
Bug: b/259076765
Change-Id: I32b01ec1fda259614ff9adc193f751ff45e5c0f3
diff --git a/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java b/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java
index c6d8571..4337302 100644
--- a/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java
+++ b/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java
@@ -6,32 +6,28 @@
import static com.android.tools.r8.utils.MapUtils.ignoreKey;
-import com.android.tools.r8.dex.code.CfOrDexInstruction;
import com.android.tools.r8.errors.MissingGlobalSyntheticsConsumerDiagnostic;
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.AppInfo;
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.Code;
import com.android.tools.r8.graph.DexClass;
+import com.android.tools.r8.graph.DexCode.TryHandler;
+import com.android.tools.r8.graph.DexCode.TryHandler.TypeAddrPair;
import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexLibraryClass;
-import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.MethodAccessFlags;
import com.android.tools.r8.graph.ProgramDefinition;
-import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.ThrowExceptionCode;
-import com.android.tools.r8.graph.UseRegistry;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.synthesis.CommittedItems;
import com.android.tools.r8.utils.ThreadUtils;
import com.android.tools.r8.utils.WorkList;
import com.google.common.collect.Sets;
import java.util.Arrays;
-import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -45,108 +41,16 @@
*/
public class ApiReferenceStubber {
- private class ReferencesToApiLevelUseRegistry extends UseRegistry<ProgramMethod> {
-
- public ReferencesToApiLevelUseRegistry(ProgramMethod context) {
- super(appView, context);
- }
-
- @Override
- public void registerInitClass(DexType type) {
- // Intentionally empty.
- }
-
- @Override
- public void registerInvokeVirtual(DexMethod method) {
- // Intentionally empty.
- }
-
- @Override
- public void registerInvokeDirect(DexMethod method) {
- // Intentionally empty.
- }
-
- @Override
- public void registerInvokeStatic(DexMethod method) {
- // Intentionally empty.
- }
-
- @Override
- public void registerInvokeInterface(DexMethod method) {
- // Intentionally empty.
- }
-
- @Override
- public void registerInvokeSuper(DexMethod method) {
- // Intentionally empty.
- }
-
- @Override
- public void registerInstanceFieldRead(DexField field) {
- // Intentionally empty.
- }
-
- @Override
- public void registerInstanceFieldWrite(DexField field) {
- // Intentionally empty.
- }
-
- @Override
- public void registerStaticFieldRead(DexField field) {
- // Intentionally empty.
- }
-
- @Override
- public void registerStaticFieldWrite(DexField field) {
- // Intentionally empty.
- }
-
- @Override
- public void registerTypeReference(DexType type) {
- checkReferenceToLibraryClass(type);
- }
-
- @Override
- public void registerInstanceOf(DexType type) {
- checkReferenceToLibraryClass(type);
- }
-
- @Override
- public void registerConstClass(
- DexType type,
- ListIterator<? extends CfOrDexInstruction> iterator,
- boolean ignoreCompatRules) {
- checkReferenceToLibraryClass(type);
- }
-
- @Override
- public void registerCheckCast(DexType type, boolean ignoreCompatRules) {
- checkReferenceToLibraryClass(type);
- }
-
- @Override
- public void registerExceptionGuard(DexType guard) {
- checkReferenceToLibraryClass(guard);
- }
-
- private void checkReferenceToLibraryClass(DexReference reference) {
- DexType rewrittenType = appView.graphLens().lookupType(reference.getContextType());
- findReferencedLibraryClasses(rewrittenType, getContext().getContextClass());
- }
- }
-
private final AppView<?> appView;
private final Map<DexLibraryClass, Set<ProgramDefinition>> referencingContexts =
new ConcurrentHashMap<>();
private final Set<DexLibraryClass> libraryClassesToMock = Sets.newConcurrentHashSet();
private final Set<DexType> seenTypes = Sets.newConcurrentHashSet();
private final AndroidApiLevelCompute apiLevelCompute;
- private final DexItemFactory factory;
public ApiReferenceStubber(AppView<?> appView) {
this.appView = appView;
apiLevelCompute = appView.apiLevelCompute();
- factory = appView.dexItemFactory();
}
public void run(ExecutorService executorService) throws ExecutionException {
@@ -195,7 +99,18 @@
.forEach(superType -> findReferencedLibraryClasses(superType, clazz));
clazz.forEachProgramMethodMatching(
DexEncodedMethod::hasCode,
- method -> method.registerCodeReferences(new ReferencesToApiLevelUseRegistry(method)));
+ method -> {
+ Code code = method.getDefinition().getCode();
+ if (!code.isDexCode()) {
+ return;
+ }
+ for (TryHandler handler : code.asDexCode().getHandlers()) {
+ for (TypeAddrPair pair : handler.pairs) {
+ DexType rewrittenType = appView.graphLens().lookupType(pair.getType());
+ findReferencedLibraryClasses(rewrittenType, clazz);
+ }
+ }
+ });
}
private void findReferencedLibraryClasses(DexType type, DexProgramClass context) {