# HG changeset patch # User dnsimon # Date 1544835137 28800 # Node ID dcbb71b9e7c0d5294ab61e3bc34f2dea07388bdf # Parent 89bb635ed093eb774cccccdf18c74b2c35d1d6a4 8215319: jck lang/INTF/intf049/intf04901 fails in Graal as JIT mode with -Xcomp and AOTed Graal Reviewed-by: iveresov, never, dlong diff -r 89bb635ed093 -r dcbb71b9e7c0 src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java Fri Dec 14 13:13:06 2018 -0800 +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java Fri Dec 14 16:52:17 2018 -0800 @@ -4195,7 +4195,6 @@ handleIllegalNewInstance(resolvedType); return; } - maybeEagerlyInitialize(resolvedType); ClassInitializationPlugin classInitializationPlugin = graphBuilderConfig.getPlugins().getClassInitializationPlugin(); @@ -4509,7 +4508,6 @@ } ResolvedJavaType holder = resolvedField.getDeclaringClass(); - maybeEagerlyInitialize(holder); ClassInitializationPlugin classInitializationPlugin = this.graphBuilderConfig.getPlugins().getClassInitializationPlugin(); if (classInitializationPlugin != null) { classInitializationPlugin.apply(this, holder, this::createCurrentFrameState); @@ -4545,16 +4543,20 @@ private ResolvedJavaField resolveStaticFieldAccess(JavaField field, ValueNode value) { if (field instanceof ResolvedJavaField) { ResolvedJavaField resolvedField = (ResolvedJavaField) field; - if (resolvedField.getDeclaringClass().isInitialized() || graphBuilderConfig.getPlugins().getClassInitializationPlugin() != null) { + ResolvedJavaType resolvedType = resolvedField.getDeclaringClass(); + maybeEagerlyInitialize(resolvedType); + + if (resolvedType.isInitialized() || graphBuilderConfig.getPlugins().getClassInitializationPlugin() != null) { return resolvedField; } + /* * Static fields have initialization semantics but may be safely accessed under certain * conditions while the class is being initialized. Executing in the clinit or init of - * classes which are subtypes of the field holder are sure to be running in a context - * where the access is safe. + * subclasses (but not implementers) of the field holder are sure to be running in a + * context where the access is safe. */ - if (resolvedField.getDeclaringClass().isAssignableFrom(method.getDeclaringClass())) { + if (!resolvedType.isInterface() && resolvedType.isAssignableFrom(method.getDeclaringClass())) { if (method.isClassInitializer() || method.isConstructor()) { return resolvedField; } @@ -4588,7 +4590,6 @@ ClassInitializationPlugin classInitializationPlugin = this.graphBuilderConfig.getPlugins().getClassInitializationPlugin(); ResolvedJavaType holder = resolvedField.getDeclaringClass(); - maybeEagerlyInitialize(holder); if (classInitializationPlugin != null) { Supplier stateBefore = () -> { JavaKind[] pushedSlotKinds = {field.getJavaKind()};