Skip to content
Snippets Groups Projects
Commit 39b2ebb7 authored by Lukas Stadler's avatar Lukas Stadler
Browse files

some more cleanup in ExecuteMethod

parent 39cb41f1
No related branches found
No related tags found
No related merge requests found
......@@ -15,6 +15,7 @@ import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.dsl.Fallback;
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.api.frame.FrameDescriptor;
import com.oracle.truffle.api.frame.FrameSlot;
import com.oracle.truffle.api.frame.MaterializedFrame;
import com.oracle.truffle.r.library.methods.MethodsListDispatchFactory.GetGenericInternalNodeGen;
import com.oracle.truffle.r.nodes.access.variables.LocalReadVariableNode;
......@@ -24,7 +25,6 @@ import com.oracle.truffle.r.nodes.function.ClassHierarchyScalarNode;
import com.oracle.truffle.r.nodes.function.ClassHierarchyScalarNodeGen;
import com.oracle.truffle.r.nodes.function.PromiseHelperNode;
import com.oracle.truffle.r.nodes.function.RCallNode;
import com.oracle.truffle.r.nodes.objects.ExecuteMethod;
import com.oracle.truffle.r.nodes.unary.CastToVectorNode;
import com.oracle.truffle.r.nodes.unary.CastToVectorNodeGen;
import com.oracle.truffle.r.runtime.ArgumentsSignature;
......@@ -287,7 +287,7 @@ public class MethodsListDispatch {
break;
}
FrameDescriptor currentFrameDesc = currentFrame.getFrameDescriptor();
Object o = ExecuteMethod.slotRead(currentFrame, currentFrameDesc, name);
Object o = slotRead(currentFrame, currentFrameDesc, name);
if (o != null) {
if (o instanceof RPromise) {
o = PromiseHelperNode.evaluateSlowPath(null, (RPromise) o);
......@@ -319,6 +319,16 @@ public class MethodsListDispatch {
// FastR
return generic == null ? RNull.instance : generic;
}
@TruffleBoundary
private static Object slotRead(MaterializedFrame currentFrame, FrameDescriptor desc, String name) {
FrameSlot slot = desc.findFrameSlot(name);
if (slot != null) {
return currentFrame.getValue(slot);
} else {
return null;
}
}
}
public abstract static class R_nextMethodCall extends RExternalBuiltinNode.Arg2 {
......
......@@ -46,7 +46,7 @@ public abstract class DispatchGeneric extends RBaseNode {
@CompilationFinal private RFunction inheritForDispatchFunction;
@Child private RArgumentsNode argsNode = RArgumentsNode.create();
@Child private LoadMethod loadMethod = LoadMethodNodeGen.create();
@Child private ExecuteMethod executeMethod = ExecuteMethodNodeGen.create();
@Child private ExecuteMethod executeMethod = new ExecuteMethod();
@TruffleBoundary
private static String createMultiDispatchString(RStringVector classes) {
......
......@@ -12,52 +12,33 @@
*/
package com.oracle.truffle.r.nodes.objects;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.Truffle;
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.api.frame.FrameDescriptor;
import com.oracle.truffle.api.frame.FrameSlot;
import com.oracle.truffle.api.frame.FrameSlotKind;
import com.oracle.truffle.api.frame.MaterializedFrame;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.r.nodes.RRootNode;
import com.oracle.truffle.r.nodes.access.variables.LocalReadVariableNode;
import com.oracle.truffle.r.nodes.access.variables.ReadVariableNode;
import com.oracle.truffle.r.nodes.function.CallMatcherNode;
import com.oracle.truffle.r.nodes.function.FormalArguments;
import com.oracle.truffle.r.nodes.function.RMissingHelper;
import com.oracle.truffle.r.nodes.function.signature.CollectArgumentsNode;
import com.oracle.truffle.r.nodes.function.signature.CollectArgumentsNodeGen;
import com.oracle.truffle.r.nodes.function.signature.RArgumentsNode;
import com.oracle.truffle.r.runtime.ArgumentsSignature;
import com.oracle.truffle.r.runtime.RArguments;
import com.oracle.truffle.r.runtime.RArguments.S4Args;
import com.oracle.truffle.r.runtime.RInternalError;
import com.oracle.truffle.r.runtime.RRuntime;
import com.oracle.truffle.r.runtime.context.RContext;
import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames;
import com.oracle.truffle.r.runtime.data.RFunction;
import com.oracle.truffle.r.runtime.data.RMissing;
import com.oracle.truffle.r.runtime.env.frame.FrameSlotChangeMonitor;
import com.oracle.truffle.r.runtime.nodes.RBaseNode;
public abstract class ExecuteMethod extends RBaseNode {
public abstract Object executeObject(VirtualFrame frame, RFunction fdef);
public final class ExecuteMethod extends RBaseNode {
@Child private LocalReadVariableNode readDefined = LocalReadVariableNode.create(RRuntime.R_DOT_DEFINED, true);
@Child private LocalReadVariableNode readMethod = LocalReadVariableNode.create(RRuntime.R_DOT_METHOD, true);
@Child private LocalReadVariableNode readTarget = LocalReadVariableNode.create(RRuntime.R_DOT_TARGET, true);
@Child private ReadVariableNode readGeneric = ReadVariableNode.create(RRuntime.R_DOT_GENERIC);
@Child private ReadVariableNode readMethods = ReadVariableNode.create(RRuntime.R_DOT_METHODS);
@Child private RArgumentsNode argsNode = RArgumentsNode.create();
@Child private CollectArgumentsNode collectArgs;
@Child private CallMatcherNode callMatcher;
@Specialization
protected Object executeMethod(VirtualFrame frame, RFunction fdef) {
public Object executeObject(VirtualFrame frame, RFunction fdef) {
if (collectArgs == null) {
CompilerDirectives.transferToInterpreterAndInvalidate();
collectArgs = insert(CollectArgumentsNodeGen.create());
......@@ -72,37 +53,4 @@ public abstract class ExecuteMethod extends RBaseNode {
return callMatcher.execute(frame, signature, oldArgs, fdef, s4Args);
}
@TruffleBoundary
static Object callMethod(RFunction fdef, MaterializedFrame newFrame) {
return RContext.getEngine().evalGeneric(fdef, newFrame);
}
@TruffleBoundary
public static Object slotRead(MaterializedFrame currentFrame, FrameDescriptor desc, String name) {
FrameSlot slot = desc.findFrameSlot(name);
if (slot != null) {
return currentFrame.getValue(slot);
} else {
return null;
}
}
@TruffleBoundary
static void slotInit(MaterializedFrame newFrame, FrameDescriptor desc, String name, Object value) {
if (value instanceof Byte) {
FrameSlot frameSlot = FrameSlotChangeMonitor.findOrAddFrameSlot(desc, name, FrameSlotKind.Byte);
newFrame.setByte(frameSlot, (byte) value);
} else if (value instanceof Integer) {
FrameSlot frameSlot = FrameSlotChangeMonitor.findOrAddFrameSlot(desc, name, FrameSlotKind.Int);
newFrame.setInt(frameSlot, (int) value);
} else if (value instanceof Double) {
FrameSlot frameSlot = FrameSlotChangeMonitor.findOrAddFrameSlot(desc, name, FrameSlotKind.Double);
newFrame.setDouble(frameSlot, (double) value);
} else {
FrameSlot frameSlot = FrameSlotChangeMonitor.findOrAddFrameSlot(desc, name, FrameSlotKind.Object);
newFrame.setObject(frameSlot, value);
}
}
}
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