Refactor code to use isTypeVisibleInContext()
Change-Id: I66a06db282fc8c1393a97adaf13fff1495af6003
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstClass.java b/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
index b122429..21fa465 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
@@ -4,6 +4,8 @@
package com.android.tools.r8.ir.code;
+import static com.android.tools.r8.optimize.MemberRebindingAnalysis.isClassTypeVisibleFromContext;
+
import com.android.tools.r8.cf.LoadStoreHelper;
import com.android.tools.r8.cf.TypeVerificationHelper;
import com.android.tools.r8.cf.code.CfConstClass;
@@ -112,9 +114,7 @@
return AbstractError.specific(appView.dexItemFactory().noClassDefFoundErrorType);
}
// * IllegalAccessError (not visible from the access context).
- ConstraintWithTarget classVisibility =
- ConstraintWithTarget.deriveConstraint(context, baseType, clazz.accessFlags, appView);
- if (classVisibility == ConstraintWithTarget.NEVER) {
+ if (!isClassTypeVisibleFromContext(appView, context, clazz)) {
return AbstractError.specific(appView.dexItemFactory().illegalAccessErrorType);
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java b/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
index 4941c86..503bf0e 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.ir.code;
-import static com.android.tools.r8.optimize.MemberRebindingAnalysis.isTypeVisibleFromContext;
+import static com.android.tools.r8.optimize.MemberRebindingAnalysis.isClassTypeVisibleFromContext;
import com.android.tools.r8.cf.LoadStoreHelper;
import com.android.tools.r8.cf.TypeVerificationHelper;
@@ -169,7 +169,7 @@
}
// Check if the type is guaranteed to be accessible.
- if (!isTypeVisibleFromContext(appView, context, clazz)) {
+ if (!isClassTypeVisibleFromContext(appView, context, clazz)) {
return AbstractError.top();
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
index 5cbae5e..ccbf3be 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
@@ -7,6 +7,7 @@
import static com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.Query.DIRECTLY;
import static com.android.tools.r8.ir.analysis.type.Nullability.definitelyNotNull;
import static com.android.tools.r8.ir.analysis.type.Nullability.maybeNull;
+import static com.android.tools.r8.optimize.MemberRebindingAnalysis.isTypeVisibleFromContext;
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.errors.CompilationError;
@@ -86,7 +87,6 @@
import com.android.tools.r8.ir.code.Xor;
import com.android.tools.r8.ir.conversion.IRConverter;
import com.android.tools.r8.ir.conversion.OptimizationFeedback;
-import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.SwitchUtils.EnumSwitchInfo;
import com.android.tools.r8.ir.regalloc.LinearScanRegisterAllocator;
import com.android.tools.r8.kotlin.Kotlin;
@@ -2061,7 +2061,7 @@
// If the cast type is not accessible in the current context, we should not remove the cast
// in order to preserve IllegalAccessError. Note that JVM and ART behave differently: see
// {@link com.android.tools.r8.ir.optimize.checkcast.IllegalAccessErrorTest}.
- if (isTypeInaccessibleInCurrentContext(castType, code.method)) {
+ if (!isTypeVisibleFromContext(appView, code.method.method.holder, castType)) {
return RemoveCheckCastInstructionIfTrivialResult.NO_REMOVALS;
}
@@ -2113,28 +2113,12 @@
return RemoveCheckCastInstructionIfTrivialResult.NO_REMOVALS;
}
- private boolean isTypeInaccessibleInCurrentContext(DexType type, DexEncodedMethod context) {
- DexType baseType = type.toBaseType(appView.dexItemFactory());
- if (baseType.isPrimitiveType()) {
- return false;
- }
- DexClass clazz = appView.definitionFor(baseType);
- if (clazz == null) {
- // Conservatively say yes.
- return true;
- }
- ConstraintWithTarget classVisibility =
- ConstraintWithTarget.deriveConstraint(
- context.method.holder, baseType, clazz.accessFlags, appView);
- return classVisibility == ConstraintWithTarget.NEVER;
- }
-
// Returns true if the given instance-of instruction was removed.
private boolean removeInstanceOfInstructionIfTrivial(
InstanceOf instanceOf, InstructionIterator it, IRCode code) {
// If the instance-of type is not accessible in the current context, we should not remove the
// instance-of instruction in order to preserve IllegalAccessError.
- if (isTypeInaccessibleInCurrentContext(instanceOf.type(), code.method)) {
+ if (!isTypeVisibleFromContext(appView, code.method.method.holder, instanceOf.type())) {
return false;
}
diff --git a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
index 2ba89ba..760904a 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
@@ -316,11 +316,21 @@
public static boolean isTypeVisibleFromContext(
AppView<?> appView, DexType context, DexType type) {
- DexClass clazz = appView.definitionFor(type);
- return clazz != null && isTypeVisibleFromContext(appView, context, clazz);
+ DexType baseType = type.toBaseType(appView.dexItemFactory());
+ if (baseType.isPrimitiveType()) {
+ return true;
+ }
+ return isClassTypeVisibleFromContext(appView, context, baseType);
}
- public static boolean isTypeVisibleFromContext(
+ public static boolean isClassTypeVisibleFromContext(
+ AppView<?> appView, DexType context, DexType type) {
+ assert type.isClassType();
+ DexClass clazz = appView.definitionFor(type);
+ return clazz != null && isClassTypeVisibleFromContext(appView, context, clazz);
+ }
+
+ public static boolean isClassTypeVisibleFromContext(
AppView<?> appView, DexType context, DexClass clazz) {
ConstraintWithTarget classVisibility =
ConstraintWithTarget.deriveConstraint(context, clazz.type, clazz.accessFlags, appView);
@@ -329,7 +339,7 @@
public static boolean isMemberVisibleFromOriginalContext(
AppView<?> appView, DexType context, DexType holder, AccessFlags<?> memberAccessFlags) {
- if (!isTypeVisibleFromContext(appView, context, holder)) {
+ if (!isClassTypeVisibleFromContext(appView, context, holder)) {
return false;
}
ConstraintWithTarget memberVisibility =