src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java
changeset 52910 583fd71c47d6
parent 52578 7dd81e82d083
child 53033 dcbb71b9e7c0
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java	Sat Dec 08 05:04:19 2018 +0100
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java	Sat Dec 08 00:56:10 2018 -0800
@@ -245,7 +245,6 @@
 import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
 import static org.graalvm.compiler.core.common.GraalOptions.HotSpotPrintInlining;
 import static org.graalvm.compiler.core.common.GraalOptions.PrintProfilingInformation;
-import static org.graalvm.compiler.core.common.GraalOptions.ResolveClassBeforeStaticInvoke;
 import static org.graalvm.compiler.core.common.GraalOptions.StressExplicitExceptionCode;
 import static org.graalvm.compiler.core.common.GraalOptions.StressInvokeWithExceptionNode;
 import static org.graalvm.compiler.core.common.type.StampFactory.objectNonNull;
@@ -267,6 +266,7 @@
 import java.util.Comparator;
 import java.util.Formatter;
 import java.util.List;
+import java.util.function.Supplier;
 
 import jdk.internal.vm.compiler.collections.EconomicMap;
 import jdk.internal.vm.compiler.collections.Equivalence;
@@ -867,7 +867,7 @@
 
                 ProfilingPlugin profilingPlugin = this.graphBuilderConfig.getPlugins().getProfilingPlugin();
                 if (profilingPlugin != null && profilingPlugin.shouldProfile(this, method)) {
-                    FrameState stateBefore = frameState.create(bci(), getNonIntrinsicAncestor(), false, null, null);
+                    FrameState stateBefore = createCurrentFrameState();
                     profilingPlugin.profileInvoke(this, method, stateBefore);
                 }
 
@@ -1251,7 +1251,7 @@
     protected void genGoto() {
         ProfilingPlugin profilingPlugin = this.graphBuilderConfig.getPlugins().getProfilingPlugin();
         if (profilingPlugin != null && profilingPlugin.shouldProfile(this, method)) {
-            FrameState stateBefore = frameState.create(bci(), getNonIntrinsicAncestor(), false, null, null);
+            FrameState stateBefore = createCurrentFrameState();
             int targetBci = currentBlock.getSuccessor(0).startBci;
             profilingPlugin.profileGoto(this, method, bci(), targetBci, stateBefore);
         }
@@ -1447,27 +1447,35 @@
         if (callTargetIsResolved(target)) {
             ResolvedJavaMethod resolvedTarget = (ResolvedJavaMethod) target;
             ResolvedJavaType holder = resolvedTarget.getDeclaringClass();
-            if (!holder.isInitialized() && ResolveClassBeforeStaticInvoke.getValue(options)) {
+            maybeEagerlyInitialize(holder);
+            ClassInitializationPlugin classInitializationPlugin = graphBuilderConfig.getPlugins().getClassInitializationPlugin();
+            if (!holder.isInitialized() && classInitializationPlugin == null) {
                 handleUnresolvedInvoke(target, InvokeKind.Static);
-            } else {
-                ValueNode classInit = null;
-                ClassInitializationPlugin classInitializationPlugin = graphBuilderConfig.getPlugins().getClassInitializationPlugin();
-                if (classInitializationPlugin != null && classInitializationPlugin.shouldApply(this, resolvedTarget.getDeclaringClass())) {
-                    FrameState stateBefore = frameState.create(bci(), getNonIntrinsicAncestor(), false, null, null);
-                    classInit = classInitializationPlugin.apply(this, resolvedTarget.getDeclaringClass(), stateBefore);
-                }
-
-                ValueNode[] args = frameState.popArguments(resolvedTarget.getSignature().getParameterCount(false));
-                Invoke invoke = appendInvoke(InvokeKind.Static, resolvedTarget, args);
-                if (invoke != null) {
-                    invoke.setClassInit(classInit);
-                }
+                return;
+            }
+
+            ValueNode[] classInit = {null};
+            if (classInitializationPlugin != null) {
+                classInitializationPlugin.apply(this, resolvedTarget.getDeclaringClass(), this::createCurrentFrameState, classInit);
+            }
+
+            ValueNode[] args = frameState.popArguments(resolvedTarget.getSignature().getParameterCount(false));
+            Invoke invoke = appendInvoke(InvokeKind.Static, resolvedTarget, args);
+            if (invoke != null && classInit[0] != null) {
+                invoke.setClassInit(classInit[0]);
             }
         } else {
             handleUnresolvedInvoke(target, InvokeKind.Static);
         }
     }
 
+    /**
+     * Creates a frame state for the current parse position.
+     */
+    private FrameState createCurrentFrameState() {
+        return frameState.create(bci(), getNonIntrinsicAncestor(), false, null, null);
+    }
+
     protected void genInvokeInterface(int cpi, int opcode) {
         JavaMethod target = lookupMethod(cpi, opcode);
         genInvokeInterface(target);
@@ -1543,7 +1551,7 @@
                 invokeDynamicPlugin.recordDynamicMethod(this, cpi, opcode, target);
 
                 // Will perform runtime type checks and static initialization
-                FrameState stateBefore = frameState.create(bci(), getNonIntrinsicAncestor(), false, null, null);
+                FrameState stateBefore = createCurrentFrameState();
                 appendixNode = invokeDynamicPlugin.genAppendixNode(this, cpi, opcode, appendix, stateBefore);
             } else {
                 appendixNode = ConstantNode.forConstant(appendix, metaAccess, graph);
@@ -3353,7 +3361,7 @@
         FrameState stateBefore = null;
         ProfilingPlugin profilingPlugin = this.graphBuilderConfig.getPlugins().getProfilingPlugin();
         if (profilingPlugin != null && profilingPlugin.shouldProfile(this, method)) {
-            stateBefore = frameState.create(bci(), getNonIntrinsicAncestor(), false, null, null);
+            stateBefore = createCurrentFrameState();
         }
 
         // Remove a logic negation node.
@@ -3497,7 +3505,7 @@
             BciBlock successorBlock = nextBlock.successors.get(0);
             ProfilingPlugin profilingPlugin = graphBuilderConfig.getPlugins().getProfilingPlugin();
             if (profilingPlugin != null && profilingPlugin.shouldProfile(this, method)) {
-                FrameState stateBefore = frameState.create(bci(), getNonIntrinsicAncestor(), false, null, null);
+                FrameState stateBefore = createCurrentFrameState();
                 profilingPlugin.profileGoto(this, method, bci(), successorBlock.startBci, stateBefore);
             }
             appendGoto(successorBlock);
@@ -3505,7 +3513,7 @@
         } else {
             ProfilingPlugin profilingPlugin = graphBuilderConfig.getPlugins().getProfilingPlugin();
             if (profilingPlugin != null && profilingPlugin.shouldProfile(this, method)) {
-                FrameState stateBefore = frameState.create(bci(), getNonIntrinsicAncestor(), false, null, null);
+                FrameState stateBefore = createCurrentFrameState();
                 profilingPlugin.profileGoto(this, method, bci(), nextBlock.startBci, stateBefore);
             }
             appendGoto(nextBlock);
@@ -4025,6 +4033,12 @@
         }
     }
 
+    protected void maybeEagerlyInitialize(ResolvedJavaType resolvedType) {
+        if (!resolvedType.isInitialized() && eagerInitializing) {
+            initialize(resolvedType);
+        }
+    }
+
     private JavaTypeProfile getProfileForTypeCheck(TypeReference type) {
         if (parsingIntrinsic() || profilingInfo == null || !optimisticOpts.useTypeCheckHints(getOptions()) || type.isExact()) {
             return null;
@@ -4182,6 +4196,8 @@
             return;
         }
 
+        maybeEagerlyInitialize(resolvedType);
+
         ClassInitializationPlugin classInitializationPlugin = graphBuilderConfig.getPlugins().getClassInitializationPlugin();
         if (!resolvedType.isInitialized() && classInitializationPlugin == null) {
             handleIllegalNewInstance(resolvedType);
@@ -4198,9 +4214,8 @@
             }
         }
 
-        if (classInitializationPlugin != null && classInitializationPlugin.shouldApply(this, resolvedType)) {
-            FrameState stateBefore = frameState.create(bci(), getNonIntrinsicAncestor(), false, null, null);
-            classInitializationPlugin.apply(this, resolvedType, stateBefore);
+        if (classInitializationPlugin != null) {
+            classInitializationPlugin.apply(this, resolvedType, this::createCurrentFrameState);
         }
 
         for (NodePlugin plugin : graphBuilderConfig.getPlugins().getNodePlugins()) {
@@ -4272,9 +4287,8 @@
     private void genNewObjectArray(ResolvedJavaType resolvedType) {
 
         ClassInitializationPlugin classInitializationPlugin = this.graphBuilderConfig.getPlugins().getClassInitializationPlugin();
-        if (classInitializationPlugin != null && classInitializationPlugin.shouldApply(this, resolvedType.getArrayClass())) {
-            FrameState stateBefore = frameState.create(bci(), getNonIntrinsicAncestor(), false, null, null);
-            classInitializationPlugin.apply(this, resolvedType.getArrayClass(), stateBefore);
+        if (classInitializationPlugin != null) {
+            classInitializationPlugin.apply(this, resolvedType.getArrayClass(), this::createCurrentFrameState);
         }
 
         ValueNode length = frameState.pop(JavaKind.Int);
@@ -4308,9 +4322,8 @@
     private void genNewMultiArray(ResolvedJavaType resolvedType, int rank, ValueNode[] dims) {
 
         ClassInitializationPlugin classInitializationPlugin = this.graphBuilderConfig.getPlugins().getClassInitializationPlugin();
-        if (classInitializationPlugin != null && classInitializationPlugin.shouldApply(this, resolvedType)) {
-            FrameState stateBefore = frameState.create(bci(), getNonIntrinsicAncestor(), false, null, null);
-            classInitializationPlugin.apply(this, resolvedType, stateBefore);
+        if (classInitializationPlugin != null) {
+            classInitializationPlugin.apply(this, resolvedType, this::createCurrentFrameState);
         }
 
         for (int i = rank - 1; i >= 0; i--) {
@@ -4495,10 +4508,11 @@
             return;
         }
 
+        ResolvedJavaType holder = resolvedField.getDeclaringClass();
+        maybeEagerlyInitialize(holder);
         ClassInitializationPlugin classInitializationPlugin = this.graphBuilderConfig.getPlugins().getClassInitializationPlugin();
-        if (classInitializationPlugin != null && classInitializationPlugin.shouldApply(this, resolvedField.getDeclaringClass())) {
-            FrameState stateBefore = frameState.create(bci(), getNonIntrinsicAncestor(), false, null, null);
-            classInitializationPlugin.apply(this, resolvedField.getDeclaringClass(), stateBefore);
+        if (classInitializationPlugin != null) {
+            classInitializationPlugin.apply(this, holder, this::createCurrentFrameState);
         }
 
         for (NodePlugin plugin : graphBuilderConfig.getPlugins().getNodePlugins()) {
@@ -4573,12 +4587,17 @@
         }
 
         ClassInitializationPlugin classInitializationPlugin = this.graphBuilderConfig.getPlugins().getClassInitializationPlugin();
-        if (classInitializationPlugin != null && classInitializationPlugin.shouldApply(this, resolvedField.getDeclaringClass())) {
-            JavaKind[] pushedSlotKinds = {field.getJavaKind()};
-            ValueNode[] pushedValues = {value};
-            FrameState stateBefore = frameState.create(bci(), getNonIntrinsicAncestor(), false, pushedSlotKinds, pushedValues);
-            assert stackSizeBefore == stateBefore.stackSize();
-            classInitializationPlugin.apply(this, resolvedField.getDeclaringClass(), stateBefore);
+        ResolvedJavaType holder = resolvedField.getDeclaringClass();
+        maybeEagerlyInitialize(holder);
+        if (classInitializationPlugin != null) {
+            Supplier<FrameState> stateBefore = () -> {
+                JavaKind[] pushedSlotKinds = {field.getJavaKind()};
+                ValueNode[] pushedValues = {value};
+                FrameState fs = frameState.create(bci(), getNonIntrinsicAncestor(), false, pushedSlotKinds, pushedValues);
+                assert stackSizeBefore == fs.stackSize();
+                return fs;
+            };
+            classInitializationPlugin.apply(this, holder, stateBefore);
         }
 
         for (NodePlugin plugin : graphBuilderConfig.getPlugins().getNodePlugins()) {