diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/FastRGridExternalLookup.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/FastRGridExternalLookup.java index 75d9d6ee5c0736b70933c19c375dcf9ca5eb5f1a..beb97cd30e1db39d6818bdc9726038447d2d9bd8 100644 --- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/FastRGridExternalLookup.java +++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/FastRGridExternalLookup.java @@ -39,7 +39,6 @@ import com.oracle.truffle.r.nodes.builtin.RInternalCodeBuiltinNode; import com.oracle.truffle.r.runtime.RInternalCode; 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.RList; import com.oracle.truffle.r.runtime.data.RNull; @@ -193,6 +192,6 @@ public final class FastRGridExternalLookup { } private static RExternalBuiltinNode getExternalFastRGridBuiltinNode(String name) { - return new RInternalCodeBuiltinNode(RContext.getInstance(), "grid", RInternalCode.loadSourceRelativeTo(LInitGrid.class, "fastrGrid.R"), name); + return new RInternalCodeBuiltinNode("grid", RInternalCode.loadSourceRelativeTo(LInitGrid.class, "fastrGrid.R"), name); } } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/CallAndExternalFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/CallAndExternalFunctions.java index 2eb33a9b1299a8e003ef3c6a189b701c63599768..5960ab3be7d4a1c7c74fe33c98b62aaaadeebfec 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/CallAndExternalFunctions.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/CallAndExternalFunctions.java @@ -62,12 +62,12 @@ import com.oracle.truffle.r.library.tools.ToolsTextFactory.DoTabExpandNodeGen; import com.oracle.truffle.r.library.utils.CountFieldsNodeGen; import com.oracle.truffle.r.library.utils.Crc64NodeGen; import com.oracle.truffle.r.library.utils.DownloadNodeGen; -import com.oracle.truffle.r.library.utils.UnzipNodeGen; import com.oracle.truffle.r.library.utils.MenuNodeGen; import com.oracle.truffle.r.library.utils.ObjectSizeNodeGen; import com.oracle.truffle.r.library.utils.RprofNodeGen; import com.oracle.truffle.r.library.utils.RprofmemNodeGen; import com.oracle.truffle.r.library.utils.TypeConvertNodeGen; +import com.oracle.truffle.r.library.utils.UnzipNodeGen; import com.oracle.truffle.r.nodes.builtin.RExternalBuiltinNode; import com.oracle.truffle.r.nodes.builtin.RInternalCodeBuiltinNode; import com.oracle.truffle.r.nodes.objects.GetPrimNameNodeGen; @@ -581,7 +581,7 @@ public class CallAndExternalFunctions { return getExternalModelBuiltinNode("updateform"); case "Cdqrls": - return new RInternalCodeBuiltinNode(RContext.getInstance(), "stats", RInternalCode.loadSourceRelativeTo(RandFunctionsNodes.class, "lm.R"), "Cdqrls"); + return new RInternalCodeBuiltinNode("stats", RInternalCode.loadSourceRelativeTo(RandFunctionsNodes.class, "lm.R"), "Cdqrls"); case "dnorm": return StatsFunctionsNodes.Function3_1Node.create(new DNorm()); diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/LookupAdapter.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/LookupAdapter.java index 40e7c89190b120ecd29164dbe0d3adeb38019c92..881a395fcde021c36f781208e3960553207e47c7 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/LookupAdapter.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/LookupAdapter.java @@ -39,7 +39,6 @@ import com.oracle.truffle.r.runtime.RError; import com.oracle.truffle.r.runtime.RInternalCode; 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.RExternalPtr; import com.oracle.truffle.r.runtime.data.RList; @@ -173,7 +172,7 @@ abstract class LookupAdapter extends RBuiltinNode.Arg3 implements Lookup { } protected static RExternalBuiltinNode getExternalModelBuiltinNode(String name) { - return new RInternalCodeBuiltinNode(RContext.getInstance(), "stats", RInternalCode.loadSourceRelativeTo(RandFunctionsNodes.class, "model.R"), name); + return new RInternalCodeBuiltinNode("stats", RInternalCode.loadSourceRelativeTo(RandFunctionsNodes.class, "model.R"), name); } protected static final int CallNST = DLL.NativeSymbolType.Call.ordinal(); diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RInternalCodeBuiltinNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RInternalCodeBuiltinNode.java index 05e91851108907a73d5716dc0e76df049bb96fa4..d742c32b3c49adf12a1751084d89d2ea0bdb08ad 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RInternalCodeBuiltinNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RInternalCodeBuiltinNode.java @@ -22,8 +22,6 @@ */ package com.oracle.truffle.r.nodes.builtin; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.source.Source; import com.oracle.truffle.r.nodes.function.CallMatcherNode; @@ -40,20 +38,17 @@ import com.oracle.truffle.r.runtime.data.RFunction; */ public final class RInternalCodeBuiltinNode extends RExternalBuiltinNode { - private final RContext context; private final String basePackage; private final Source code; private final String functionName; @Child private CallMatcherNode call = CallMatcherNode.create(true); - @CompilationFinal private RFunction function; static { Casts.noCasts(RInternalCodeBuiltinNode.class); } - public RInternalCodeBuiltinNode(RContext context, String basePackage, Source code, String functionName) { - this.context = context; + public RInternalCodeBuiltinNode(String basePackage, Source code, String functionName) { this.basePackage = basePackage; this.code = code; this.functionName = functionName; @@ -66,15 +61,13 @@ public final class RInternalCodeBuiltinNode extends RExternalBuiltinNode { @Override public Object call(VirtualFrame frame, RArgsValuesAndNames actualArgs) { + RInternalCode internalCode = RInternalCode.lookup(RContext.getInstance(), basePackage, code); + RFunction function = internalCode.lookupFunction(functionName); if (function == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - RInternalCode internalCode = RInternalCode.lookup(context, basePackage, code); - this.function = internalCode.lookupFunction(functionName); - if (this.function == null) { - throw RInternalError.shouldNotReachHere("Could not load RInternalCodeBuiltin function '" + functionName + "'."); - } + throw RInternalError.shouldNotReachHere("Could not load RInternalCodeBuiltin function '" + functionName + "'."); } return call.execute(frame, actualArgs.getSignature(), actualArgs.getArguments(), function, functionName, null); } + } diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RInternalCode.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RInternalCode.java index 2a29784e9d0ce13e72fedcfe15f6ef086edab9b0..90d023e31c62ba4bf10880c1224d146134ad2096 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RInternalCode.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RInternalCode.java @@ -72,6 +72,7 @@ public final class RInternalCode { } } + @TruffleBoundary public synchronized RFunction lookupFunction(String name) { REnvironment env = this.evaluatedEnvironment; if (env == null) { @@ -83,6 +84,7 @@ public final class RInternalCode { return fun; } + @TruffleBoundary public static RInternalCode lookup(RContext context, String basePackage, Source source) { ContextStateImpl state = context.stateInternalCode; RInternalCode code = state.get(source);