< prev index next >
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java
Print this page
rev 52509 : [mq]: graal
*** 422,431 ****
--- 422,432 ----
import org.graalvm.compiler.nodes.type.StampTool;
import org.graalvm.compiler.nodes.util.GraphUtil;
import org.graalvm.compiler.options.OptionValues;
import org.graalvm.compiler.phases.OptimisticOptimizations;
import org.graalvm.compiler.phases.util.ValueMergeUtil;
+ import org.graalvm.compiler.serviceprovider.GraalServices;
import jdk.internal.vm.compiler.word.LocationIdentity;
import jdk.vm.ci.code.BailoutException;
import jdk.vm.ci.code.BytecodeFrame;
import jdk.vm.ci.code.CodeUtil;
*** 1035,1044 ****
--- 1036,1054 ----
DeoptimizeNode deopt = append(new DeoptimizeNode(InvalidateRecompile, Unresolved));
deopt.updateNodeSourcePosition(() -> createBytecodePosition());
}
/**
+ * @param type the type being instantiated
+ */
+ protected void handleIllegalNewInstance(JavaType type) {
+ assert !graphBuilderConfig.unresolvedIsError();
+ DeoptimizeNode deopt = append(new DeoptimizeNode(InvalidateRecompile, Unresolved));
+ deopt.updateNodeSourcePosition(() -> createBytecodePosition());
+ }
+
+ /**
* @param type the type of the array being instantiated
* @param length the length of the array
*/
protected void handleUnresolvedNewObjectArray(JavaType type, ValueNode length) {
assert !graphBuilderConfig.unresolvedIsError();
*** 1416,1425 ****
--- 1426,1443 ----
return resolvedType.isInterface() || resolvedType.isLinked();
}
return false;
}
+ /**
+ * Check if a type is resolved. Can be overwritten by sub-classes to implement different type
+ * resolution rules.
+ */
+ protected boolean typeIsResolved(JavaType type) {
+ return type instanceof ResolvedJavaType;
+ }
+
protected void genInvokeStatic(int cpi, int opcode) {
JavaMethod target = lookupMethod(cpi, opcode);
assert !uninitializedIsError ||
(target instanceof ResolvedJavaMethod && ((ResolvedJavaMethod) target).getDeclaringClass().isInitialized()) : target;
genInvokeStatic(target);
*** 1475,1485 ****
}
}
protected void genInvokeVirtual(int cpi, int opcode) {
JavaMethod target = lookupMethod(cpi, opcode);
! genInvokeVirtual(target);
}
private boolean genDynamicInvokeHelper(ResolvedJavaMethod target, int cpi, int opcode) {
assert opcode == INVOKEDYNAMIC || opcode == INVOKEVIRTUAL;
--- 1493,1524 ----
}
}
protected void genInvokeVirtual(int cpi, int opcode) {
JavaMethod target = lookupMethod(cpi, opcode);
! if (callTargetIsResolved(target)) {
! genInvokeVirtual((ResolvedJavaMethod) target);
! } else {
! handleUnresolvedInvoke(target, InvokeKind.Virtual);
! }
! }
!
! protected void genInvokeVirtual(ResolvedJavaMethod resolvedTarget) {
! int cpi = stream.readCPI();
!
! /*
! * Special handling for runtimes that rewrite an invocation of MethodHandle.invoke(...) or
! * MethodHandle.invokeExact(...) to a static adapter. HotSpot does this - see
! * https://wiki.openjdk.java.net/display/HotSpot/Method+handles+and+invokedynamic
! */
!
! if (genDynamicInvokeHelper(resolvedTarget, cpi, INVOKEVIRTUAL)) {
! return;
! }
!
! ValueNode[] args = frameState.popArguments(resolvedTarget.getSignature().getParameterCount(true));
! appendInvoke(InvokeKind.Virtual, resolvedTarget, args);
}
private boolean genDynamicInvokeHelper(ResolvedJavaMethod target, int cpi, int opcode) {
assert opcode == INVOKEDYNAMIC || opcode == INVOKEVIRTUAL;
*** 1528,1567 ****
}
return true;
}
- void genInvokeVirtual(JavaMethod target) {
- if (!genInvokeVirtualHelper(target)) {
- handleUnresolvedInvoke(target, InvokeKind.Virtual);
- }
- }
-
- private boolean genInvokeVirtualHelper(JavaMethod target) {
- if (!callTargetIsResolved(target)) {
- return false;
- }
-
- ResolvedJavaMethod resolvedTarget = (ResolvedJavaMethod) target;
- int cpi = stream.readCPI();
-
- /*
- * Special handling for runtimes that rewrite an invocation of MethodHandle.invoke(...) or
- * MethodHandle.invokeExact(...) to a static adapter. HotSpot does this - see
- * https://wiki.openjdk.java.net/display/HotSpot/Method+handles+and+invokedynamic
- */
-
- if (genDynamicInvokeHelper(resolvedTarget, cpi, INVOKEVIRTUAL)) {
- return true;
- }
-
- ValueNode[] args = frameState.popArguments(target.getSignature().getParameterCount(true));
- appendInvoke(InvokeKind.Virtual, (ResolvedJavaMethod) target, args);
-
- return true;
- }
-
protected void genInvokeSpecial(int cpi, int opcode) {
JavaMethod target = lookupMethod(cpi, opcode);
genInvokeSpecial(target);
}
--- 1567,1576 ----
*** 3016,3026 ****
JavaType catchType = block.handler.getCatchType();
if (graphBuilderConfig.eagerResolving()) {
catchType = lookupType(block.handler.catchTypeCPI(), INSTANCEOF);
}
! if (catchType instanceof ResolvedJavaType) {
TypeReference checkedCatchType = TypeReference.createTrusted(graph.getAssumptions(), (ResolvedJavaType) catchType);
if (graphBuilderConfig.getSkippedExceptionTypes() != null) {
for (ResolvedJavaType skippedType : graphBuilderConfig.getSkippedExceptionTypes()) {
if (skippedType.isAssignableFrom(checkedCatchType.getType())) {
--- 3025,3035 ----
JavaType catchType = block.handler.getCatchType();
if (graphBuilderConfig.eagerResolving()) {
catchType = lookupType(block.handler.catchTypeCPI(), INSTANCEOF);
}
! if (typeIsResolved(catchType)) {
TypeReference checkedCatchType = TypeReference.createTrusted(graph.getAssumptions(), (ResolvedJavaType) catchType);
if (graphBuilderConfig.getSkippedExceptionTypes() != null) {
for (ResolvedJavaType skippedType : graphBuilderConfig.getSkippedExceptionTypes()) {
if (skippedType.isAssignableFrom(checkedCatchType.getType())) {
*** 3665,3675 ****
Object con = lookupConstant(cpi, opcode);
if (con instanceof JavaType) {
// this is a load of class constant which might be unresolved
JavaType type = (JavaType) con;
! if (type instanceof ResolvedJavaType) {
frameState.push(JavaKind.Object, appendConstant(getConstantReflection().asJavaClass((ResolvedJavaType) type)));
} else {
handleUnresolvedLoadConstant(type);
}
} else if (con instanceof JavaConstant) {
--- 3674,3684 ----
Object con = lookupConstant(cpi, opcode);
if (con instanceof JavaType) {
// this is a load of class constant which might be unresolved
JavaType type = (JavaType) con;
! if (typeIsResolved(type)) {
frameState.push(JavaKind.Object, appendConstant(getConstantReflection().asJavaClass((ResolvedJavaType) type)));
} else {
handleUnresolvedLoadConstant(type);
}
} else if (con instanceof JavaConstant) {
*** 3921,3940 ****
JavaType result = constantPool.lookupType(cpi, bytecode);
assert !graphBuilderConfig.unresolvedIsError() || result instanceof ResolvedJavaType;
return result;
}
private JavaMethod lookupMethod(int cpi, int opcode) {
maybeEagerlyResolve(cpi, opcode);
JavaMethod result = constantPool.lookupMethod(cpi, opcode);
! assert !graphBuilderConfig.unresolvedIsError() || result instanceof ResolvedJavaMethod : result;
return result;
}
protected JavaField lookupField(int cpi, int opcode) {
maybeEagerlyResolve(cpi, opcode);
JavaField result = constantPool.lookupField(cpi, method, opcode);
assert !graphBuilderConfig.unresolvedIsError() || result instanceof ResolvedJavaField : "Not resolved: " + result;
if (parsingIntrinsic() || eagerInitializing) {
if (result instanceof ResolvedJavaField) {
ResolvedJavaType declaringClass = ((ResolvedJavaField) result).getDeclaringClass();
if (!declaringClass.isInitialized()) {
--- 3930,3989 ----
JavaType result = constantPool.lookupType(cpi, bytecode);
assert !graphBuilderConfig.unresolvedIsError() || result instanceof ResolvedJavaType;
return result;
}
+ private String unresolvedMethodAssertionMessage(JavaMethod result) {
+ String message = result.format("%H.%n(%P)%R");
+ if (GraalServices.Java8OrEarlier) {
+ JavaType declaringClass = result.getDeclaringClass();
+ String className = declaringClass.getName();
+ switch (className) {
+ case "Ljava/nio/ByteBuffer;":
+ case "Ljava/nio/ShortBuffer;":
+ case "Ljava/nio/CharBuffer;":
+ case "Ljava/nio/IntBuffer;":
+ case "Ljava/nio/LongBuffer;":
+ case "Ljava/nio/FloatBuffer;":
+ case "Ljava/nio/DoubleBuffer;":
+ case "Ljava/nio/MappedByteBuffer;": {
+ switch (result.getName()) {
+ case "position":
+ case "limit":
+ case "mark":
+ case "reset":
+ case "clear":
+ case "flip":
+ case "rewind": {
+ String returnType = result.getSignature().getReturnType(null).toJavaName();
+ if (returnType.equals(declaringClass.toJavaName())) {
+ message += String.format(" [Probably cause: %s was compiled with javac from JDK 9+ using " +
+ "`-target 8` and `-source 8` options. See https://bugs.openjdk.java.net/browse/JDK-4774077 for details.]", method.getDeclaringClass().toClassName());
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+ return message;
+ }
+
private JavaMethod lookupMethod(int cpi, int opcode) {
maybeEagerlyResolve(cpi, opcode);
JavaMethod result = constantPool.lookupMethod(cpi, opcode);
! assert !graphBuilderConfig.unresolvedIsError() || result instanceof ResolvedJavaMethod : unresolvedMethodAssertionMessage(result);
return result;
}
protected JavaField lookupField(int cpi, int opcode) {
maybeEagerlyResolve(cpi, opcode);
JavaField result = constantPool.lookupField(cpi, method, opcode);
+ return lookupField(result);
+ }
+
+ protected JavaField lookupField(JavaField result) {
assert !graphBuilderConfig.unresolvedIsError() || result instanceof ResolvedJavaField : "Not resolved: " + result;
if (parsingIntrinsic() || eagerInitializing) {
if (result instanceof ResolvedJavaField) {
ResolvedJavaType declaringClass = ((ResolvedJavaField) result).getDeclaringClass();
if (!declaringClass.isInitialized()) {
*** 3982,4001 ****
} else {
return profilingInfo.getTypeProfile(bci());
}
}
! private void genCheckCast() {
! int cpi = getStream().readCPI();
JavaType type = lookupType(cpi, CHECKCAST);
ValueNode object = frameState.pop(JavaKind.Object);
! if (!(type instanceof ResolvedJavaType)) {
handleUnresolvedCheckCast(type, object);
- return;
}
! ResolvedJavaType resolvedType = (ResolvedJavaType) type;
TypeReference checkedType = TypeReference.createTrusted(graph.getAssumptions(), resolvedType);
JavaTypeProfile profile = getProfileForTypeCheck(checkedType);
for (NodePlugin plugin : graphBuilderConfig.getPlugins().getNodePlugins()) {
if (plugin.handleCheckCast(this, object, checkedType.getType(), profile)) {
--- 4031,4056 ----
} else {
return profilingInfo.getTypeProfile(bci());
}
}
! private void genCheckCast(int cpi) {
JavaType type = lookupType(cpi, CHECKCAST);
ValueNode object = frameState.pop(JavaKind.Object);
+ genCheckCast(type, object);
+ }
! protected void genCheckCast(JavaType type, ValueNode object) {
! if (typeIsResolved(type)) {
! genCheckCast((ResolvedJavaType) type, object);
! } else {
handleUnresolvedCheckCast(type, object);
}
! }
!
! protected void genCheckCast(ResolvedJavaType resolvedType, ValueNode objectIn) {
! ValueNode object = objectIn;
TypeReference checkedType = TypeReference.createTrusted(graph.getAssumptions(), resolvedType);
JavaTypeProfile profile = getProfileForTypeCheck(checkedType);
for (NodePlugin plugin : graphBuilderConfig.getPlugins().getNodePlugins()) {
if (plugin.handleCheckCast(this, object, checkedType.getType(), profile)) {
*** 4039,4062 ****
}
}
frameState.push(JavaKind.Object, castNode);
}
! private void genInstanceOf() {
! int cpi = getStream().readCPI();
JavaType type = lookupType(cpi, INSTANCEOF);
ValueNode object = frameState.pop(JavaKind.Object);
! if (!(type instanceof ResolvedJavaType)) {
handleUnresolvedInstanceOf(type, object);
- return;
}
! TypeReference resolvedType = TypeReference.createTrusted(graph.getAssumptions(), (ResolvedJavaType) type);
! JavaTypeProfile profile = getProfileForTypeCheck(resolvedType);
for (NodePlugin plugin : graphBuilderConfig.getPlugins().getNodePlugins()) {
! if (plugin.handleInstanceOf(this, object, resolvedType.getType(), profile)) {
return;
}
}
LogicNode instanceOfNode = null;
--- 4094,4124 ----
}
}
frameState.push(JavaKind.Object, castNode);
}
! private void genInstanceOf(int cpi) {
JavaType type = lookupType(cpi, INSTANCEOF);
ValueNode object = frameState.pop(JavaKind.Object);
+ genInstanceOf(type, object);
+ }
! protected void genInstanceOf(JavaType type, ValueNode object) {
! if (typeIsResolved(type)) {
! genInstanceOf((ResolvedJavaType) type, object);
! } else {
handleUnresolvedInstanceOf(type, object);
}
! }
!
! protected void genInstanceOf(ResolvedJavaType resolvedType, ValueNode objectIn) {
! ValueNode object = objectIn;
! TypeReference checkedType = TypeReference.createTrusted(graph.getAssumptions(), resolvedType);
! JavaTypeProfile profile = getProfileForTypeCheck(checkedType);
for (NodePlugin plugin : graphBuilderConfig.getPlugins().getNodePlugins()) {
! if (plugin.handleInstanceOf(this, object, checkedType.getType(), profile)) {
return;
}
}
LogicNode instanceOfNode = null;
*** 4067,4082 ****
if (singleType != null) {
LogicNode typeCheck = append(createInstanceOf(TypeReference.createExactTrusted(singleType), object, profile));
if (!typeCheck.isTautology()) {
append(new FixedGuardNode(typeCheck, DeoptimizationReason.TypeCheckedInliningViolated, DeoptimizationAction.InvalidateReprofile));
}
! instanceOfNode = LogicConstantNode.forBoolean(resolvedType.getType().isAssignableFrom(singleType));
}
}
}
if (instanceOfNode == null) {
! instanceOfNode = createInstanceOf(resolvedType, object, null);
}
LogicNode logicNode = genUnique(instanceOfNode);
int next = getStream().nextBCI();
int value = getStream().readUByte(next);
--- 4129,4144 ----
if (singleType != null) {
LogicNode typeCheck = append(createInstanceOf(TypeReference.createExactTrusted(singleType), object, profile));
if (!typeCheck.isTautology()) {
append(new FixedGuardNode(typeCheck, DeoptimizationReason.TypeCheckedInliningViolated, DeoptimizationAction.InvalidateReprofile));
}
! instanceOfNode = LogicConstantNode.forBoolean(checkedType.getType().isAssignableFrom(singleType));
}
}
}
if (instanceOfNode == null) {
! instanceOfNode = createInstanceOf(checkedType, object, null);
}
LogicNode logicNode = genUnique(instanceOfNode);
int next = getStream().nextBCI();
int value = getStream().readUByte(next);
*** 4104,4127 ****
protected void genNewInstance(int cpi) {
JavaType type = lookupType(cpi, NEW);
genNewInstance(type);
}
! void genNewInstance(JavaType type) {
! if (!(type instanceof ResolvedJavaType)) {
handleUnresolvedNewInstance(type);
- return;
}
! ResolvedJavaType resolvedType = (ResolvedJavaType) type;
if (resolvedType.isAbstract() || resolvedType.isInterface()) {
! handleUnresolvedNewInstance(type);
return;
}
ClassInitializationPlugin classInitializationPlugin = graphBuilderConfig.getPlugins().getClassInitializationPlugin();
if (!resolvedType.isInitialized() && classInitializationPlugin == null) {
! handleUnresolvedNewInstance(type);
return;
}
ResolvedJavaType[] skippedExceptionTypes = this.graphBuilderConfig.getSkippedExceptionTypes();
if (skippedExceptionTypes != null) {
--- 4166,4192 ----
protected void genNewInstance(int cpi) {
JavaType type = lookupType(cpi, NEW);
genNewInstance(type);
}
! protected void genNewInstance(JavaType type) {
! if (typeIsResolved(type)) {
! genNewInstance((ResolvedJavaType) type);
! } else {
handleUnresolvedNewInstance(type);
}
! }
!
! protected void genNewInstance(ResolvedJavaType resolvedType) {
if (resolvedType.isAbstract() || resolvedType.isInterface()) {
! handleIllegalNewInstance(resolvedType);
return;
}
ClassInitializationPlugin classInitializationPlugin = graphBuilderConfig.getPlugins().getClassInitializationPlugin();
if (!resolvedType.isInitialized() && classInitializationPlugin == null) {
! handleIllegalNewInstance(resolvedType);
return;
}
ResolvedJavaType[] skippedExceptionTypes = this.graphBuilderConfig.getSkippedExceptionTypes();
if (skippedExceptionTypes != null) {
*** 4190,4207 ****
frameState.push(JavaKind.Object, append(createNewArray(elementType, length, true)));
}
private void genNewObjectArray(int cpi) {
JavaType type = lookupType(cpi, ANEWARRAY);
! if (!(type instanceof ResolvedJavaType)) {
ValueNode length = frameState.pop(JavaKind.Int);
handleUnresolvedNewObjectArray(type, length);
! return;
}
! ResolvedJavaType resolvedType = (ResolvedJavaType) type;
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);
--- 4255,4277 ----
frameState.push(JavaKind.Object, append(createNewArray(elementType, length, true)));
}
private void genNewObjectArray(int cpi) {
JavaType type = lookupType(cpi, ANEWARRAY);
+ genNewObjectArray(type);
+ }
! private void genNewObjectArray(JavaType type) {
! if (typeIsResolved(type)) {
! genNewObjectArray((ResolvedJavaType) type);
! } else {
ValueNode length = frameState.pop(JavaKind.Int);
handleUnresolvedNewObjectArray(type, length);
! }
}
! 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);
*** 4219,4237 ****
private void genNewMultiArray(int cpi) {
JavaType type = lookupType(cpi, MULTIANEWARRAY);
int rank = getStream().readUByte(bci() + 3);
ValueNode[] dims = new ValueNode[rank];
! if (!(type instanceof ResolvedJavaType)) {
for (int i = rank - 1; i >= 0; i--) {
dims[i] = frameState.pop(JavaKind.Int);
}
handleUnresolvedNewMultiArray(type, dims);
- return;
}
! ResolvedJavaType resolvedType = (ResolvedJavaType) type;
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);
--- 4289,4313 ----
private void genNewMultiArray(int cpi) {
JavaType type = lookupType(cpi, MULTIANEWARRAY);
int rank = getStream().readUByte(bci() + 3);
ValueNode[] dims = new ValueNode[rank];
+ genNewMultiArray(type, rank, dims);
+ }
! private void genNewMultiArray(JavaType type, int rank, ValueNode[] dims) {
! if (typeIsResolved(type)) {
! genNewMultiArray((ResolvedJavaType) type, rank, dims);
! } else {
for (int i = rank - 1; i >= 0; i--) {
dims[i] = frameState.pop(JavaKind.Int);
}
handleUnresolvedNewMultiArray(type, dims);
}
! }
!
! 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);
*** 4258,4273 ****
JavaField field = lookupField(cpi, opcode);
genGetField(field, receiverInput);
}
private void genGetField(JavaField field, ValueNode receiverInput) {
- ValueNode receiver = maybeEmitExplicitNullCheck(receiverInput);
if (field instanceof ResolvedJavaField) {
ResolvedJavaField resolvedField = (ResolvedJavaField) field;
genGetField(resolvedField, receiver);
} else {
! handleUnresolvedLoadField(field, receiver);
}
}
private void genGetField(ResolvedJavaField resolvedField, ValueNode receiver) {
if (!parsingIntrinsic() && GeneratePIC.getValue(getOptions())) {
--- 4334,4349 ----
JavaField field = lookupField(cpi, opcode);
genGetField(field, receiverInput);
}
private void genGetField(JavaField field, ValueNode receiverInput) {
if (field instanceof ResolvedJavaField) {
+ ValueNode receiver = maybeEmitExplicitNullCheck(receiverInput);
ResolvedJavaField resolvedField = (ResolvedJavaField) field;
genGetField(resolvedField, receiver);
} else {
! handleUnresolvedLoadField(field, receiverInput);
}
}
private void genGetField(ResolvedJavaField resolvedField, ValueNode receiver) {
if (!parsingIntrinsic() && GeneratePIC.getValue(getOptions())) {
*** 4368,4380 ****
protected void genPutField(JavaField field) {
genPutField(field, frameState.pop(field.getJavaKind()));
}
private void genPutField(JavaField field, ValueNode value) {
! ValueNode receiver = maybeEmitExplicitNullCheck(frameState.pop(JavaKind.Object));
if (field instanceof ResolvedJavaField) {
ResolvedJavaField resolvedField = (ResolvedJavaField) field;
if (!parsingIntrinsic() && GeneratePIC.getValue(getOptions())) {
graph.recordField(resolvedField);
}
--- 4444,4457 ----
protected void genPutField(JavaField field) {
genPutField(field, frameState.pop(field.getJavaKind()));
}
private void genPutField(JavaField field, ValueNode value) {
! ValueNode receiverInput = frameState.pop(JavaKind.Object);
if (field instanceof ResolvedJavaField) {
+ ValueNode receiver = maybeEmitExplicitNullCheck(receiverInput);
ResolvedJavaField resolvedField = (ResolvedJavaField) field;
if (!parsingIntrinsic() && GeneratePIC.getValue(getOptions())) {
graph.recordField(resolvedField);
}
*** 4388,4398 ****
if (resolvedField.isFinal() && method.isConstructor()) {
finalBarrierRequired = true;
}
genStoreField(receiver, resolvedField, value);
} else {
! handleUnresolvedStoreField(field, value, receiver);
}
}
protected void genGetStatic(int cpi, int opcode) {
JavaField field = lookupField(cpi, opcode);
--- 4465,4475 ----
if (resolvedField.isFinal() && method.isConstructor()) {
finalBarrierRequired = true;
}
genStoreField(receiver, resolvedField, value);
} else {
! handleUnresolvedStoreField(field, value, receiverInput);
}
}
protected void genGetStatic(int cpi, int opcode) {
JavaField field = lookupField(cpi, opcode);
*** 4482,4491 ****
--- 4559,4569 ----
JavaField field = lookupField(cpi, opcode);
genPutStatic(field);
}
protected void genPutStatic(JavaField field) {
+ int stackSizeBefore = frameState.stackSize();
ValueNode value = frameState.pop(field.getJavaKind());
ResolvedJavaField resolvedField = resolveStaticFieldAccess(field, value);
if (resolvedField == null) {
return;
}
*** 4494,4504 ****
graph.recordField(resolvedField);
}
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);
}
for (NodePlugin plugin : graphBuilderConfig.getPlugins().getNodePlugins()) {
if (plugin.handleStoreStaticField(this, resolvedField, value)) {
--- 4572,4585 ----
graph.recordField(resolvedField);
}
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);
}
for (NodePlugin plugin : graphBuilderConfig.getPlugins().getNodePlugins()) {
if (plugin.handleStoreStaticField(this, resolvedField, value)) {
*** 4867,4878 ****
case NEW : genNewInstance(stream.readCPI()); break;
case NEWARRAY : genNewPrimitiveArray(stream.readLocalIndex()); break;
case ANEWARRAY : genNewObjectArray(stream.readCPI()); break;
case ARRAYLENGTH : genArrayLength(); break;
case ATHROW : genThrow(); break;
! case CHECKCAST : genCheckCast(); break;
! case INSTANCEOF : genInstanceOf(); break;
case MONITORENTER : genMonitorEnter(frameState.pop(JavaKind.Object), stream.nextBCI()); break;
case MONITOREXIT : genMonitorExit(frameState.pop(JavaKind.Object), null, stream.nextBCI()); break;
case MULTIANEWARRAY : genNewMultiArray(stream.readCPI()); break;
case IFNULL : genIfNull(Condition.EQ); break;
case IFNONNULL : genIfNull(Condition.NE); break;
--- 4948,4959 ----
case NEW : genNewInstance(stream.readCPI()); break;
case NEWARRAY : genNewPrimitiveArray(stream.readLocalIndex()); break;
case ANEWARRAY : genNewObjectArray(stream.readCPI()); break;
case ARRAYLENGTH : genArrayLength(); break;
case ATHROW : genThrow(); break;
! case CHECKCAST : genCheckCast(stream.readCPI()); break;
! case INSTANCEOF : genInstanceOf(stream.readCPI()); break;
case MONITORENTER : genMonitorEnter(frameState.pop(JavaKind.Object), stream.nextBCI()); break;
case MONITOREXIT : genMonitorExit(frameState.pop(JavaKind.Object), null, stream.nextBCI()); break;
case MULTIANEWARRAY : genNewMultiArray(stream.readCPI()); break;
case IFNULL : genIfNull(Condition.EQ); break;
case IFNONNULL : genIfNull(Condition.NE); break;
< prev index next >