From 3f6d81c7895b33108c123e9b3c4583b1e337a6f9 Mon Sep 17 00:00:00 2001 From: Julien Lopez <julien.lopez@lri.fr> Date: Thu, 15 Feb 2018 17:31:09 +0100 Subject: [PATCH] Fixed QIRInterface and IsExportableVisitor --- .../qirinterface/IsExportableVisitor.java | 35 ++++++++++++++++++- .../r/nodes/qirinterface/QIRInterface.java | 3 +- 2 files changed, 36 insertions(+), 2 deletions(-) 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 c87f05dd83..ffc2a2538e 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 9e22f84a49..38208be03e 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 -- GitLab