use of org.graalvm.compiler.nodes.java.RegisterFinalizerNode in project graal by oracle.
the class StandardGraphBuilderPlugins method registerObjectPlugins.
private static void registerObjectPlugins(InvocationPlugins plugins) {
Registration r = new Registration(plugins, Object.class);
r.register1("<init>", Receiver.class, new InvocationPlugin() {
@Override
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) {
/*
* Object.<init> is a common instrumentation point so only perform this rewrite if
* the current definition is the normal empty method with a single return bytecode.
* The finalizer registration will instead be performed by the BytecodeParser.
*/
if (targetMethod.getCodeSize() == 1) {
ValueNode object = receiver.get();
if (RegisterFinalizerNode.mayHaveFinalizer(object, b.getAssumptions())) {
b.add(new RegisterFinalizerNode(object));
}
return true;
}
return false;
}
});
r.register1("getClass", Receiver.class, new InvocationPlugin() {
@Override
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) {
ValueNode object = receiver.get();
ValueNode folded = GetClassNode.tryFold(b.getMetaAccess(), b.getConstantReflection(), NodeView.DEFAULT, GraphUtil.originalValue(object));
if (folded != null) {
b.addPush(JavaKind.Object, folded);
} else {
Stamp stamp = StampFactory.objectNonNull(TypeReference.createTrusted(b.getAssumptions(), b.getMetaAccess().lookupJavaType(Class.class)));
b.addPush(JavaKind.Object, new GetClassNode(stamp, object));
}
return true;
}
});
}
use of org.graalvm.compiler.nodes.java.RegisterFinalizerNode in project graal by oracle.
the class BytecodeParser method beforeReturn.
private void beforeReturn(ValueNode x, JavaKind kind) {
if (graph.method() != null && graph.method().isJavaLangObjectInit()) {
/*
* Get the receiver from the initial state since bytecode rewriting could do arbitrary
* things to the state of the locals.
*/
ValueNode receiver = graph.start().stateAfter().localAt(0);
assert receiver != null && receiver.getStackKind() == JavaKind.Object;
if (RegisterFinalizerNode.mayHaveFinalizer(receiver, graph.getAssumptions())) {
append(new RegisterFinalizerNode(receiver));
}
}
genInfoPointNode(InfopointReason.METHOD_END, x);
if (finalBarrierRequired) {
assert originalReceiver != null;
/*
* When compiling an OSR with a final field store, don't bother tracking the original
* receiver since the receiver cannot be EA'ed.
*/
append(new FinalFieldBarrierNode(entryBCI == INVOCATION_ENTRY_BCI ? originalReceiver : null));
}
synchronizedEpilogue(BytecodeFrame.AFTER_BCI, x, kind);
}
Aggregations