src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl.java
--- a/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl.java Thu Oct 17 20:27:44 2019 +0100
+++ b/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl.java Thu Oct 17 20:53:35 2019 +0100
@@ -72,7 +72,6 @@
private volatile HotSpotResolvedJavaField[] instanceFields;
private volatile HotSpotResolvedObjectTypeImpl[] interfaces;
private HotSpotConstantPool constantPool;
- private HotSpotResolvedObjectType arrayOfType;
private final JavaConstant mirror;
private HotSpotResolvedObjectTypeImpl superClass;
@@ -103,17 +102,24 @@
* Creates the JVMCI mirror for a {@link Class} object.
*
* <b>NOTE</b>: Creating an instance of this class does not install the mirror for the
- * {@link Class} type. {@link #fromMetaspace} instead.
+ * {@link Class} type.
* </p>
*
* @param metadataPointer the Klass* to create the mirror for
*/
+ @SuppressWarnings("try")
HotSpotResolvedObjectTypeImpl(long metadataPointer, String name) {
super(name);
+ assert metadataPointer != 0;
this.metadataPointer = metadataPointer;
- this.mirror = runtime().compilerToVm.getJavaMirror(this);
- assert metadataPointer != 0;
- assert getName().charAt(0) != '[' || isArray() : getName();
+
+ // The mirror object must be in the global scope since
+ // this object will be cached in HotSpotJVMCIRuntime.resolvedJavaTypes
+ // and live across more than one compilation.
+ try (HotSpotObjectConstantScope global = HotSpotObjectConstantScope.enterGlobalScope()) {
+ this.mirror = runtime().compilerToVm.getJavaMirror(this);
+ assert getName().charAt(0) != '[' || isArray() : getName();
+ }
}
/**
@@ -147,18 +153,6 @@
}
@Override
- public HotSpotResolvedObjectType getArrayClass() {
- if (arrayOfType == null) {
- try {
- arrayOfType = (HotSpotResolvedObjectType) runtime().compilerToVm.lookupType("[" + getName(), this, true);
- } catch (ClassNotFoundException e) {
- throw new JVMCIError(e);
- }
- }
- return arrayOfType;
- }
-
- @Override
public ResolvedJavaType getComponentType() {
return runtime().compilerToVm.getComponentType(this);
}
@@ -579,6 +573,15 @@
// The type isn't known to implement the method.
return null;
}
+ if (resolvedMethod.canBeStaticallyBound()) {
+ // No assumptions are required.
+ return new AssumptionResult<>(resolvedMethod);
+ }
+
+ if (resolvedMethod.canBeStaticallyBound()) {
+ // No assumptions are required.
+ return new AssumptionResult<>(resolvedMethod);
+ }
ResolvedJavaMethod result = resolvedMethod.uniqueConcreteMethod(this);
if (result != null) {
@@ -834,10 +837,8 @@
// Primitive type resolution is context free.
return true;
}
- if (elementType.getName().startsWith("Ljava/")) {
- // Classes in a java.* package can only be defined by the
- // boot class loader. This is enforced by ClassLoader.preDefineClass()
- assert hasSameClassLoader(runtime().getJavaLangObject());
+ if (elementType.getName().startsWith("Ljava/") && hasSameClassLoader(runtime().getJavaLangObject())) {
+ // Classes in a java.* package defined by the boot class loader are always resolved.
return true;
}
HotSpotResolvedObjectTypeImpl otherMirror = ((HotSpotResolvedObjectTypeImpl) accessingClass);