diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/qirinterface/IsExportableVisitor.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/qirinterface/IsExportableVisitor.java index c87f05dd8342e8fa4a8bcc35cf3c50015d9e18c8..ffc2a2538ef78d3576673a2da8cd030104d96c14 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/qirinterface/IsExportableVisitor.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/qirinterface/IsExportableVisitor.java @@ -98,6 +98,10 @@ public class IsExportableVisitor implements RSyntaxNodeVisitor<Boolean> { @Override public final Boolean visit(final RCallNode call) { final Arguments<RSyntaxNode> args = call.getArguments(); + try { + return visitBuiltin(((LookupNode) call.getFunction()).getIdentifier()); + } catch (RuntimeException e) { + } if (!call.getFunction().asRSyntaxNode().accept(this)) return false; for (int i = 0; i < args.getLength(); i++) @@ -109,13 +113,42 @@ public class IsExportableVisitor implements RSyntaxNodeVisitor<Boolean> { @Override public final Boolean visit(final RCallSpecialNode call) { final RSyntaxElement[] args = call.getSyntaxArguments(); - // TODO: Handle builtin + if (!visitBuiltin(call.expectedFunction.getName())) + return false; for (int i = 0; i < args.length; i++) if (!((RSyntaxNode) args[i]).accept(this)) return false; return true; } + private final static Boolean visitBuiltin(final String name) { + switch (name) { + case "c": + case "$": + case "+": + case "-": + case "*": + case "/": + case "==": + case "!=": + case "&": + case "&&": + case "|": + case "||": + case "<=": + case "<": + case ">=": + case ">": + case "!": + case "(": + return true; + case "print": + return false; + default: + throw new RuntimeException("Unknown call special node: " + name); + } + } + @Override public final Boolean visit(final ReplacementDispatchNode repl) { return repl.lhs.asRSyntaxNode().accept(this) && repl.rhs.asRSyntaxNode().accept(this); diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/qirinterface/QIRInterface.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/qirinterface/QIRInterface.java index 9e22f84a4974638c5e3b32b5c2fea5207cdaf0c5..38208be03e37dad2080a5fec373e88c025633fff 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/qirinterface/QIRInterface.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/qirinterface/QIRInterface.java @@ -286,7 +286,8 @@ public final class QIRInterface { } catch (UnsupportedOperationException e) { final SourceSection funSrc = fun.getCallTarget().getRootNode().getSourceSection(); // TODO: Handle dependencies and exportability - return new QIRExportableTruffleNode(funSrc, "r", QIRInterface::execute, QIRInterface::apply, funSrc.getCharacters().toString()); + return fun.getBody().accept(IsExportableVisitor.instance) ? new QIRExportableTruffleNode(funSrc, "r", QIRInterface::execute, QIRInterface::apply, funSrc.getCharacters().toString()) + : new QIRUnexportableTruffleNode(funSrc, "r", QIRInterface::execute, QIRInterface::apply, funSrc.getCharacters().toString()); } } } \ No newline at end of file