--- 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()) {