Skip to content
Snippets Groups Projects
Commit 90914454 authored by Stepan Sindelar's avatar Stepan Sindelar
Browse files

[GR-10619] Fix: UseMethod invoked via interop.

PullRequest: fastr/1592
parents 55b827b5 d1284ba3
No related branches found
No related tags found
No related merge requests found
...@@ -22,24 +22,21 @@ ...@@ -22,24 +22,21 @@
*/ */
package com.oracle.truffle.r.engine.interop; package com.oracle.truffle.r.engine.interop;
import com.oracle.truffle.api.Truffle;
import com.oracle.truffle.api.frame.FrameDescriptor; import com.oracle.truffle.api.frame.FrameDescriptor;
import com.oracle.truffle.api.frame.FrameSlot; import com.oracle.truffle.api.frame.FrameSlot;
import com.oracle.truffle.api.frame.FrameSlotKind; import com.oracle.truffle.api.frame.FrameSlotKind;
import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.frame.MaterializedFrame;
import com.oracle.truffle.api.interop.CanResolve; import com.oracle.truffle.api.interop.CanResolve;
import com.oracle.truffle.api.interop.MessageResolution; import com.oracle.truffle.api.interop.MessageResolution;
import com.oracle.truffle.api.interop.Resolve; import com.oracle.truffle.api.interop.Resolve;
import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.interop.TruffleObject;
import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.nodes.Node;
import com.oracle.truffle.r.nodes.function.RCallBaseNode; import com.oracle.truffle.r.nodes.function.call.RExplicitCallNode;
import com.oracle.truffle.r.nodes.function.RCallNode;
import com.oracle.truffle.r.runtime.ArgumentsSignature; import com.oracle.truffle.r.runtime.ArgumentsSignature;
import com.oracle.truffle.r.runtime.RArguments; import com.oracle.truffle.r.runtime.context.RContext;
import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames; import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames;
import com.oracle.truffle.r.runtime.data.RFunction; import com.oracle.truffle.r.runtime.data.RFunction;
import com.oracle.truffle.r.runtime.data.RObject; import com.oracle.truffle.r.runtime.data.RObject;
import com.oracle.truffle.r.runtime.data.RNull;
import com.oracle.truffle.r.runtime.env.frame.FrameSlotChangeMonitor; import com.oracle.truffle.r.runtime.env.frame.FrameSlotChangeMonitor;
import com.oracle.truffle.r.runtime.env.frame.RFrameSlot; import com.oracle.truffle.r.runtime.env.frame.RFrameSlot;
import com.oracle.truffle.r.runtime.interop.Foreign2R; import com.oracle.truffle.r.runtime.interop.Foreign2R;
...@@ -69,36 +66,17 @@ public class RFunctionMR { ...@@ -69,36 +66,17 @@ public class RFunctionMR {
public abstract static class RFunctionExecuteNode extends Node { public abstract static class RFunctionExecuteNode extends Node {
@Child private Foreign2R foreign2R = Foreign2RNodeGen.create(); @Child private Foreign2R foreign2R = Foreign2RNodeGen.create();
@Child private R2Foreign r2Foreign = R2ForeignNodeGen.create(); @Child private R2Foreign r2Foreign = R2ForeignNodeGen.create();
@Child private RExplicitCallNode call = RExplicitCallNode.create();
private static final FrameDescriptor emptyFrameDescriptor = FrameSlotChangeMonitor.initializeFunctionFrameDescriptor("<interop>", new FrameDescriptor("R interop frame"));
private static final RFrameSlot argsIdentifier = RFrameSlot.createTemp(false);
private static final RFrameSlot explicitCallerId = RFrameSlot.createTemp(false);
private static final FrameSlot slot = FrameSlotChangeMonitor.findOrAddFrameSlot(emptyFrameDescriptor, argsIdentifier, FrameSlotKind.Object);
private static final FrameSlot slotCaller = FrameSlotChangeMonitor.findOrAddFrameSlot(emptyFrameDescriptor, explicitCallerId, FrameSlotKind.Object);
static {
FrameSlotChangeMonitor.initializeFunctionFrameDescriptor("<function>", emptyFrameDescriptor);
}
@Child private RCallBaseNode call = RCallNode.createExplicitCall(argsIdentifier, explicitCallerId);
protected Object access(RFunction receiver, Object[] arguments) { protected Object access(RFunction receiver, Object[] arguments) {
Object[] dummyFrameArgs = RArguments.createUnitialized();
VirtualFrame dummyFrame = Truffle.getRuntime().createVirtualFrame(dummyFrameArgs, emptyFrameDescriptor);
Object[] convertedArguments = new Object[arguments.length]; Object[] convertedArguments = new Object[arguments.length];
for (int i = 0; i < arguments.length; i++) { for (int i = 0; i < arguments.length; i++) {
convertedArguments[i] = foreign2R.execute(arguments[i]); convertedArguments[i] = foreign2R.execute(arguments[i]);
} }
RArgsValuesAndNames actualArgs = new RArgsValuesAndNames(convertedArguments, ArgumentsSignature.empty(arguments.length)); MaterializedFrame globalFrame = RContext.getInstance().stateREnvironment.getGlobalFrame();
try { RArgsValuesAndNames argsAndValues = new RArgsValuesAndNames(convertedArguments, ArgumentsSignature.empty(arguments.length));
FrameSlotChangeMonitor.setObject(dummyFrame, slot, actualArgs); Object result = this.call.call(globalFrame, receiver, argsAndValues);
FrameSlotChangeMonitor.setObject(dummyFrame, slotCaller, RNull.instance); return r2Foreign.execute(result);
Object value = call.execute(dummyFrame, receiver);
return r2Foreign.execute(value);
} finally {
FrameSlotChangeMonitor.setObject(dummyFrame, slot, null);
}
} }
} }
......
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