From 43c42a06a5d8d1f308e33686a721f5e3b539a3bb Mon Sep 17 00:00:00 2001
From: Mick Jordan <mick.jordan@oracle.com>
Date: Thu, 11 Aug 2016 15:04:19 -0700
Subject: [PATCH] cast pipelines for some .fastr functions

---
 .../nodes/builtin/fastr/FastRStackTrace.java  | 19 +++++++--------
 .../nodes/builtin/fastr/FastRSyntaxTree.java  | 24 +++++++++----------
 .../r/nodes/builtin/fastr/FastRThrowIt.java   | 10 +++++---
 .../r/nodes/builtin/fastr/FastRTree.java      | 21 ++++++++--------
 4 files changed, 39 insertions(+), 35 deletions(-)

diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRStackTrace.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRStackTrace.java
index 8c70d8e253..e041b2b205 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRStackTrace.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRStackTrace.java
@@ -22,14 +22,14 @@
  */
 package com.oracle.truffle.r.nodes.builtin.fastr;
 
+import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.*;
 import static com.oracle.truffle.r.runtime.RVisibility.OFF;
 import static com.oracle.truffle.r.runtime.builtins.RBehavior.COMPLEX;
 import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.PRIMITIVE;
 
-import com.oracle.truffle.api.dsl.Fallback;
 import com.oracle.truffle.api.dsl.Specialization;
+import com.oracle.truffle.r.nodes.builtin.CastBuilder;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
-import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.Utils;
 import com.oracle.truffle.r.runtime.builtins.RBuiltin;
@@ -44,16 +44,15 @@ public abstract class FastRStackTrace extends RBuiltinNode {
         return new Object[]{RRuntime.LOGICAL_FALSE};
     }
 
+    @Override
+    protected void createCasts(CastBuilder casts) {
+        casts.arg("print.frame.contents").asLogicalVector().findFirst().map(toBoolean());
+    }
+
     @Specialization
-    protected RNull printStackTrace(byte printFrameContents) {
-        boolean printFrameSlots = printFrameContents == RRuntime.LOGICAL_TRUE;
-        RContext.getInstance().getConsoleHandler().print(Utils.createStackTrace(printFrameSlots));
+    protected RNull printStackTrace(boolean printFrameContents) {
+        RContext.getInstance().getConsoleHandler().print(Utils.createStackTrace(printFrameContents));
         return RNull.instance;
     }
 
-    @SuppressWarnings("unused")
-    @Fallback
-    protected Object fallback(Object a1) {
-        throw RError.error(this, RError.Message.INVALID_ARGUMENT, "print.frame.contents");
-    }
 }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRSyntaxTree.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRSyntaxTree.java
index ed3638bc5c..a56f3e5159 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRSyntaxTree.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRSyntaxTree.java
@@ -22,6 +22,7 @@
  */
 package com.oracle.truffle.r.nodes.builtin.fastr;
 
+import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.*;
 import static com.oracle.truffle.r.runtime.RVisibility.OFF;
 import static com.oracle.truffle.r.runtime.builtins.RBehavior.IO;
 import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.PRIMITIVE;
@@ -29,11 +30,11 @@ import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.PRIMITIVE;
 import java.io.IOException;
 
 import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
-import com.oracle.truffle.api.dsl.Fallback;
 import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.api.nodes.Node;
 import com.oracle.truffle.api.nodes.NodeVisitor;
 import com.oracle.truffle.api.source.SourceSection;
+import com.oracle.truffle.r.nodes.builtin.CastBuilder;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
 import com.oracle.truffle.r.nodes.function.FunctionDefinitionNode;
 import com.oracle.truffle.r.nodes.instrumentation.RSyntaxTags;
@@ -44,7 +45,6 @@ import com.oracle.truffle.r.runtime.conn.StdConnections;
 import com.oracle.truffle.r.runtime.data.RFunction;
 import com.oracle.truffle.r.runtime.data.RMissing;
 import com.oracle.truffle.r.runtime.data.RNull;
-import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
 import com.oracle.truffle.r.runtime.nodes.RNode;
 import com.oracle.truffle.r.runtime.nodes.RSyntaxCall;
 import com.oracle.truffle.r.runtime.nodes.RSyntaxConstant;
@@ -76,13 +76,19 @@ public abstract class FastRSyntaxTree extends RBuiltinNode {
         return new Object[]{RMissing.instance, "rsyntaxnode", RRuntime.LOGICAL_FALSE, RRuntime.LOGICAL_FALSE};
     }
 
+    @Override
+    protected void createCasts(CastBuilder casts) {
+        casts.arg("func").mustBe(instanceOf(RFunction.class));
+        casts.arg("visitMode").asStringVector().findFirst();
+        casts.arg("printSource").asLogicalVector().findFirst().map(toBoolean());
+        casts.arg("printTags").asLogicalVector().findFirst().map(toBoolean());
+    }
+
     @Specialization
     @TruffleBoundary
-    protected RNull printTree(RFunction function, RAbstractStringVector visitMode, byte printSourceLogical, byte printTagsLogical) {
-        boolean printSource = RRuntime.fromLogical(printSourceLogical);
-        boolean printTags = RRuntime.fromLogical(printTagsLogical);
+    protected RNull printTree(RFunction function, String visitMode, boolean printSource, boolean printTags) {
         FunctionDefinitionNode root = (FunctionDefinitionNode) function.getTarget().getRootNode();
-        switch (visitMode.getDataAt(0)) {
+        switch (visitMode) {
             case "node":
                 root.accept(new NodeVisitor() {
 
@@ -184,12 +190,6 @@ public abstract class FastRSyntaxTree extends RBuiltinNode {
         return result;
     }
 
-    @SuppressWarnings("unused")
-    @Fallback
-    protected Object fallback(Object a1, Object a2, Object a3, Object a4) {
-        throw RError.error(this, RError.Message.INVALID_OR_UNIMPLEMENTED_ARGUMENTS);
-    }
-
     private static void printIndent(int depth) {
         for (int i = 0; i < depth; i++) {
             writeString("  ", false);
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRThrowIt.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRThrowIt.java
index 8baed140fb..c24b8abdd4 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRThrowIt.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRThrowIt.java
@@ -27,6 +27,7 @@ import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.PRIMITIVE;
 
 import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.api.dsl.Specialization;
+import com.oracle.truffle.r.nodes.builtin.CastBuilder;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
 import com.oracle.truffle.r.runtime.JumpToTopLevelException;
 import com.oracle.truffle.r.runtime.RError;
@@ -34,14 +35,17 @@ import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.Utils;
 import com.oracle.truffle.r.runtime.builtins.RBuiltin;
 import com.oracle.truffle.r.runtime.data.RNull;
-import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
 
 @RBuiltin(name = ".fastr.throw", kind = PRIMITIVE, parameterNames = {"name"}, behavior = COMPLEX)
 public abstract class FastRThrowIt extends RBuiltinNode {
+    @Override
+    protected void createCasts(CastBuilder casts) {
+        casts.arg("name").asStringVector().findFirst();
+    }
+
     @Specialization
     @TruffleBoundary
-    protected RNull throwit(RAbstractStringVector x) {
-        String name = x.getDataAt(0);
+    protected RNull throwit(String name) {
         switch (name) {
             case "AIX":
                 throw new ArrayIndexOutOfBoundsException();
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRTree.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRTree.java
index be5c0add50..954eb39b38 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRTree.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRTree.java
@@ -22,16 +22,16 @@
  */
 package com.oracle.truffle.r.nodes.builtin.fastr;
 
+import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.*;
 import static com.oracle.truffle.r.runtime.RVisibility.OFF;
 import static com.oracle.truffle.r.runtime.builtins.RBehavior.IO;
 import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.PRIMITIVE;
 
-import com.oracle.truffle.api.dsl.Fallback;
 import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.api.nodes.NodeUtil;
 import com.oracle.truffle.api.nodes.RootNode;
+import com.oracle.truffle.r.nodes.builtin.CastBuilder;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
-import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.builtins.RBuiltin;
 import com.oracle.truffle.r.runtime.data.RFunction;
@@ -44,17 +44,18 @@ public abstract class FastRTree extends RBuiltinNode {
         return new Object[]{RMissing.instance, RRuntime.LOGICAL_FALSE};
     }
 
+    @Override
+    protected void createCasts(CastBuilder casts) {
+        casts.arg("func").mustBe(instanceOf(RFunction.class));
+        casts.arg("verbose").asLogicalVector().findFirst().map(toBoolean());
+
+    }
+
     @Specialization
-    protected String printTree(RFunction function, byte verbose) {
+    protected String printTree(RFunction function, boolean verbose) {
         RootNode root = function.getTarget().getRootNode();
-        String printedTree = verbose == RRuntime.LOGICAL_TRUE ? NodeUtil.printTreeToString(root) : NodeUtil.printCompactTreeToString(root);
+        String printedTree = verbose ? NodeUtil.printTreeToString(root) : NodeUtil.printCompactTreeToString(root);
         System.out.println(printedTree);
         return printedTree;
     }
-
-    @SuppressWarnings("unused")
-    @Fallback
-    protected Object fallback(Object a1, Object a2) {
-        throw RError.error(this, RError.Message.INVALID_OR_UNIMPLEMENTED_ARGUMENTS);
-    }
 }
-- 
GitLab