Skip to content

Commit

Permalink
Add explicit null checks in AnnotationsSupport.
Browse files Browse the repository at this point in the history
  • Loading branch information
peter-hofer committed Mar 15, 2021
1 parent 339576c commit d45278f
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -392,7 +392,8 @@ public StructuredGraph buildGraph(DebugContext debug, ResolvedJavaMethod method,
ValueNode otherAttribute = kit.createInvokeWithExceptionAndUnwind(otherMethod, InvokeKind.Interface, state, bci++, other);

/* Access our value. We know that it is in a field. */
ValueNode ourAttribute = kit.append(LoadFieldNode.create(null, receiver, ourField));
ValueNode receiverNonNull = kit.maybeCreateExplicitNullCheck(receiver);
ValueNode ourAttribute = kit.append(LoadFieldNode.create(null, receiverNonNull, ourField));

if (attributeType.isPrimitive()) {
/*
Expand Down Expand Up @@ -422,7 +423,8 @@ public StructuredGraph buildGraph(DebugContext debug, ResolvedJavaMethod method,
} else {
/* Just call Object.equals(). Primitive values are already boxed. */
ResolvedJavaMethod m = kit.findMethod(Object.class, "equals", false);
attributeEqual = kit.createInvokeWithExceptionAndUnwind(m, InvokeKind.Virtual, state, bci++, ourAttribute, otherAttribute);
ValueNode ourAttributeNonNull = kit.maybeCreateExplicitNullCheck(ourAttribute);
attributeEqual = kit.createInvokeWithExceptionAndUnwind(m, InvokeKind.Virtual, state, bci++, ourAttributeNonNull, otherAttribute);
}

kit.startIf(graph.unique(new IntegerEqualsNode(attributeEqual, trueValue)), BranchProbabilityNode.LIKELY_PROBABILITY);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
*/
package com.oracle.svm.hosted.phases;

import org.graalvm.compiler.core.common.type.Stamp;
import org.graalvm.compiler.core.common.type.StampFactory;
import org.graalvm.compiler.core.common.type.StampPair;
import org.graalvm.compiler.debug.DebugContext;
import org.graalvm.compiler.java.FrameStateBuilder;
Expand All @@ -34,9 +36,12 @@
import org.graalvm.compiler.nodes.ConstantNode;
import org.graalvm.compiler.nodes.IfNode;
import org.graalvm.compiler.nodes.LogicNode;
import org.graalvm.compiler.nodes.NodeView;
import org.graalvm.compiler.nodes.PiNode;
import org.graalvm.compiler.nodes.StateSplit;
import org.graalvm.compiler.nodes.UnwindNode;
import org.graalvm.compiler.nodes.ValueNode;
import org.graalvm.compiler.nodes.calc.IsNullNode;
import org.graalvm.compiler.nodes.extended.BranchProbabilityNode;
import org.graalvm.compiler.nodes.extended.BytecodeExceptionNode;
import org.graalvm.compiler.nodes.extended.GuardingNode;
Expand All @@ -45,6 +50,7 @@
import org.graalvm.compiler.nodes.java.ExceptionObjectNode;
import org.graalvm.compiler.nodes.java.LoadFieldNode;
import org.graalvm.compiler.nodes.java.MethodCallTargetNode;
import org.graalvm.compiler.nodes.type.StampTool;
import org.graalvm.compiler.phases.OptimisticOptimizations;
import org.graalvm.compiler.phases.util.Providers;

Expand Down Expand Up @@ -161,4 +167,14 @@ public BytecodeExceptionNode createBytecodeExceptionObjectNode(BytecodeException
}
return exception;
}

public ValueNode maybeCreateExplicitNullCheck(ValueNode object) {
assert object.stamp(NodeView.DEFAULT).isPointerStamp();
if (StampTool.isPointerNonNull(object)) {
return object;
}
createCheckThrowingBytecodeException(IsNullNode.create(object), true, BytecodeExceptionNode.BytecodeExceptionKind.NULL_POINTER);
Stamp nonNullStamp = object.stamp(NodeView.DEFAULT).join(StampFactory.objectNonNull());
return append(PiNode.create(object, nonNullStamp));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,25 +31,21 @@
import java.util.List;

import org.graalvm.compiler.core.common.type.ObjectStamp;
import org.graalvm.compiler.core.common.type.Stamp;
import org.graalvm.compiler.core.common.type.StampFactory;
import org.graalvm.compiler.core.common.type.TypeReference;
import org.graalvm.compiler.debug.DebugContext;
import org.graalvm.compiler.nodes.ConstantNode;
import org.graalvm.compiler.nodes.InvokeWithExceptionNode;
import org.graalvm.compiler.nodes.LogicNode;
import org.graalvm.compiler.nodes.NodeView;
import org.graalvm.compiler.nodes.PiNode;
import org.graalvm.compiler.nodes.StructuredGraph;
import org.graalvm.compiler.nodes.ValueNode;
import org.graalvm.compiler.nodes.calc.IsNullNode;
import org.graalvm.compiler.nodes.extended.BytecodeExceptionNode.BytecodeExceptionKind;
import org.graalvm.compiler.nodes.extended.GuardingNode;
import org.graalvm.compiler.nodes.java.InstanceOfNode;
import org.graalvm.compiler.nodes.java.MonitorEnterNode;
import org.graalvm.compiler.nodes.java.MonitorExitNode;
import org.graalvm.compiler.nodes.java.MonitorIdNode;
import org.graalvm.compiler.nodes.type.StampTool;

import com.oracle.graal.pointsto.infrastructure.WrappedJavaMethod;
import com.oracle.graal.pointsto.meta.HostedProviders;
Expand Down Expand Up @@ -165,12 +161,7 @@ public StructuredGraph buildGraph(DebugContext debug, ResolvedJavaMethod method,
DynamicHub hub = (DynamicHub) SubstrateObjectConstant.asObject(hubConstant);
monitorObject = ConstantNode.forConstant(SubstrateObjectConstant.forObject(hub), providers.getMetaAccess(), graph);
} else {
monitorObject = javaArguments.get(0);
if (!StampTool.isPointerNonNull(monitorObject)) {
kit.createCheckThrowingBytecodeException(IsNullNode.create(monitorObject), true, BytecodeExceptionKind.NULL_POINTER);
Stamp nonNullStamp = monitorObject.stamp(NodeView.DEFAULT).join(StampFactory.objectNonNull());
monitorObject = kit.append(PiNode.create(monitorObject, nonNullStamp));
}
monitorObject = kit.maybeCreateExplicitNullCheck(javaArguments.get(0));
}
MonitorIdNode monitorId = graph.add(new MonitorIdNode(kit.getFrameState().lockDepth(false)));
MonitorEnterNode monitorEnter = kit.append(new MonitorEnterNode(monitorObject, monitorId));
Expand Down

0 comments on commit d45278f

Please sign in to comment.