Skip to content
Snippets Groups Projects
Commit e541a5a2 authored by Zbynek Slajchrt's avatar Zbynek Slajchrt
Browse files

.fastr.interop.evalFile builtin added

parent a848895c
No related branches found
No related tags found
No related merge requests found
......@@ -355,6 +355,7 @@ public class BasePackage extends RBuiltinPackage {
add(FastRTry.class, FastRTryNodeGen::create);
add(FastRInspect.class, FastRInspectNodeGen::create);
add(FastRInterop.Eval.class, FastRInteropFactory.EvalNodeGen::create);
add(FastRInterop.EvalFile.class, FastRInteropFactory.EvalFileNodeGen::create);
add(FastRInterop.Export.class, FastRInteropFactory.ExportNodeGen::create);
add(FastRInterop.HasSize.class, FastRInteropFactory.HasSizeNodeGen::create);
add(FastRInterop.Import.class, FastRInteropFactory.ImportNodeGen::create);
......
......@@ -31,6 +31,9 @@ import static com.oracle.truffle.r.runtime.RVisibility.ON;
import static com.oracle.truffle.r.runtime.builtins.RBehavior.COMPLEX;
import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.PRIMITIVE;
import java.io.File;
import java.io.IOException;
import com.oracle.truffle.api.CallTarget;
import com.oracle.truffle.api.CompilerAsserts;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
......@@ -44,6 +47,7 @@ import com.oracle.truffle.api.interop.TruffleObject;
import com.oracle.truffle.api.nodes.DirectCallNode;
import com.oracle.truffle.api.nodes.Node;
import com.oracle.truffle.api.source.Source;
import com.oracle.truffle.api.source.Source.Builder;
import com.oracle.truffle.r.nodes.builtin.CastBuilder;
import com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef;
import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
......@@ -99,6 +103,44 @@ public class FastRInterop {
}
}
@RBuiltin(name = ".fastr.interop.evalFile", visibility = OFF, kind = PRIMITIVE, parameterNames = {"path", "mimeType"}, behavior = COMPLEX)
public abstract static class EvalFile extends RBuiltinNode {
@Override
protected void createCasts(CastBuilder casts) {
casts.arg("path").mustBe(stringValue()).asStringVector().mustBe(singleElement()).findFirst();
casts.arg("mimeType").allowMissing().mustBe(stringValue()).asStringVector().mustBe(singleElement()).findFirst();
}
protected CallTarget parse(String path, String mimeType) {
CompilerAsserts.neverPartOfCompilation();
File file = new File(path);
try {
Builder<IOException, RuntimeException, RuntimeException> sourceBuilder = Source.newBuilder(file).name("").internal();
if (mimeType != null) {
sourceBuilder.mimeType(mimeType);
}
Source sourceObject = sourceBuilder.build();
return RContext.getInstance().getEnv().parse(sourceObject);
} catch (Throwable t) {
throw RError.error(this, Message.GENERIC, "Error while parsing: " + t.getMessage());
}
}
@Specialization
@TruffleBoundary
protected Object eval(String path, @SuppressWarnings("unused") RMissing missing) {
return parse(path, null).call();
}
@Specialization
@TruffleBoundary
protected Object eval(String path, String mimeType) {
return parse(path, mimeType).call();
}
}
@RBuiltin(name = ".fastr.interop.export", visibility = OFF, kind = PRIMITIVE, parameterNames = {"name", "value"}, behavior = COMPLEX)
public abstract static class Export extends RBuiltinNode {
......
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