Skip to content
Snippets Groups Projects
Commit cd88ec75 authored by Michael Haupt's avatar Michael Haupt
Browse files

specialise for frame slot instead of name in RemoveAndAnswerNode (avoids...

specialise for frame slot instead of name in RemoveAndAnswerNode (avoids repeated frame slot lookup)
parent edab1d1a
No related branches found
No related tags found
No related merge requests found
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
*/ */
package com.oracle.truffle.r.nodes.access; package com.oracle.truffle.r.nodes.access;
import com.oracle.truffle.api.*;
import com.oracle.truffle.api.frame.*; import com.oracle.truffle.api.frame.*;
import com.oracle.truffle.r.nodes.*; import com.oracle.truffle.r.nodes.*;
import com.oracle.truffle.r.parser.ast.*; import com.oracle.truffle.r.parser.ast.*;
...@@ -33,40 +34,68 @@ import com.oracle.truffle.r.runtime.*; ...@@ -33,40 +34,68 @@ import com.oracle.truffle.r.runtime.*;
* perform checking; it is to be used for internal purposes. A sample use case is a * perform checking; it is to be used for internal purposes. A sample use case is a
* {@linkplain RTruffleVisitor#visit(Replacement) replacement}. * {@linkplain RTruffleVisitor#visit(Replacement) replacement}.
*/ */
public final class RemoveAndAnswerNode extends RNode implements VisibilityController { public abstract class RemoveAndAnswerNode extends RNode {
/**
* The name of the variable that is to be removed and whose value is to be returned.
*/
private final String name;
private RemoveAndAnswerNode(String name) {
this.name = name;
}
public static RemoveAndAnswerNode create(String name) { public static RemoveAndAnswerNode create(String name) {
return new RemoveAndAnswerNode(name); return new RemoveAndAnswerUninitializedNode(name);
} }
public static RemoveAndAnswerNode create(Object name) { public static RemoveAndAnswerNode create(Object name) {
return new RemoveAndAnswerNode(name.toString()); return new RemoveAndAnswerUninitializedNode(name.toString());
} }
@Override protected static final class RemoveAndAnswerUninitializedNode extends RemoveAndAnswerNode {
public Object execute(VirtualFrame frame) {
controlVisibility(); /**
FrameSlot fs = frame.getFrameDescriptor().findFrameSlot(name); * The name of the variable that is to be removed and whose value is to be returned.
if (fs == null) { */
RError.warning(this.getEncapsulatingSourceSection(), RError.Message.UNKNOWN_OBJECT, name); protected final String name;
protected RemoveAndAnswerUninitializedNode(String name) {
this.name = name;
}
@Override
public Object execute(VirtualFrame frame) {
CompilerAsserts.neverPartOfCompilation();
return specialize(frame).execute(frame);
}
private RemoveAndAnswerNode specialize(VirtualFrame frame) {
FrameSlot fs = frame.getFrameDescriptor().findFrameSlot(name);
if (fs == null) {
RError.warning(this.getEncapsulatingSourceSection(), RError.Message.UNKNOWN_OBJECT, name);
}
return replace(new RemoveAndAnswerResolvedNode(fs));
} }
Object result = frame.getValue(fs);
frame.setObject(fs, null); // use null (not an R value) to represent "undefined"
return result;
} }
@Override protected static final class RemoveAndAnswerResolvedNode extends RemoveAndAnswerNode implements VisibilityController {
public boolean getVisibility() {
return false; @Override
public boolean getVisibility() {
return false;
}
/**
* The frame slot representing the variable that is to be removed and whose value is to be
* returned.
*/
private final FrameSlot slot;
protected RemoveAndAnswerResolvedNode(FrameSlot slot) {
this.slot = slot;
}
@Override
public Object execute(VirtualFrame frame) {
controlVisibility();
Object result = frame.getValue(slot);
frame.setObject(slot, null); // use null (not an R value) to represent "undefined"
return result;
}
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment