From 6cf7fd1ce8542214eeb73c9ae348d407def8022c Mon Sep 17 00:00:00 2001
From: Miloslav Metelka <miloslav.metelka@oracle.com>
Date: Thu, 9 Feb 2017 13:59:05 +0100
Subject: [PATCH] Several builtins' casts added.

---
 .../r/library/methods/MethodsListDispatch.java    | 15 ++++++++-------
 .../truffle/r/library/stats/SplineFunctions.java  |  8 ++++++++
 .../oracle/truffle/r/library/utils/Rprofmem.java  | 10 ++++++++++
 3 files changed, 26 insertions(+), 7 deletions(-)

diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/methods/MethodsListDispatch.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/methods/MethodsListDispatch.java
index ce07d50f5b..48f6249fe4 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/methods/MethodsListDispatch.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/methods/MethodsListDispatch.java
@@ -203,7 +203,12 @@ public class MethodsListDispatch {
         @Child private AccessSlotNode accessSlotNode;
 
         static {
-            Casts.noCasts(R_M_setPrimitiveMethods.class);
+            Casts casts = new Casts(R_M_setPrimitiveMethods.class);
+            casts.arg(0, "fname").asStringVector().findFirst();
+            casts.arg(1, "op");
+            casts.arg(2, "code").mustBe(stringValue()).asStringVector().findFirst();
+            casts.arg(3, "fundef");
+            casts.arg(4, "mlist");
         }
 
         private AccessSlotNode initAccessSlotNode() {
@@ -215,12 +220,8 @@ public class MethodsListDispatch {
 
         @Specialization
         @TruffleBoundary
-        protected Object setPrimitiveMethods(Object fname, Object op, Object codeVec, RTypedValue fundef, Object mlist) {
-            String fnameString = RRuntime.asString(fname);
-            String codeVecString = RRuntime.asString(codeVec);
-            if (codeVecString == null) {
-                throw RError.error(this, RError.Message.GENERIC, "argument 'code' must be a character string");
-            }
+        protected Object setPrimitiveMethods(String fnameString, Object op, String codeVecString, Object fundefObj, Object mlist) {
+            RTypedValue fundef = (RTypedValue) fundefObj;
 
             if (op == RNull.instance) {
                 byte value = RRuntime.asLogical(RContext.getInstance().allowPrimitiveMethods());
diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/SplineFunctions.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/SplineFunctions.java
index d6b11cfc74..03b79a3c25 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/SplineFunctions.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/stats/SplineFunctions.java
@@ -20,6 +20,8 @@ import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.constant;
 import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.findFirst;
 import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.integerValue;
 import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.numericValue;
+import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.doubleValue;
+import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.instanceOf;
 import com.oracle.truffle.r.nodes.builtin.RExternalBuiltinNode;
 import com.oracle.truffle.r.runtime.RError;
 import static com.oracle.truffle.r.runtime.RError.Message.NA_INTRODUCED_COERCION;
@@ -79,6 +81,12 @@ public class SplineFunctions {
 
     public abstract static class SplineEval extends RExternalBuiltinNode.Arg2 {
 
+        static {
+            Casts casts = new Casts(SplineEval.class);
+            casts.arg(0, "xout").mustBe(doubleValue()).asDoubleVector();
+            casts.arg(1, "z").mustBe(instanceOf(RList.class));
+        }
+
         @Specialization
         @TruffleBoundary
         protected Object splineEval(RAbstractDoubleVector xout, RList z) {
diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/utils/Rprofmem.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/utils/Rprofmem.java
index e96b554c9d..9500f6f83e 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/utils/Rprofmem.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/utils/Rprofmem.java
@@ -30,6 +30,9 @@ import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.api.frame.Frame;
 import com.oracle.truffle.api.nodes.Node;
+import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.doubleValue;
+import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.instanceOf;
+import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.stringValue;
 import com.oracle.truffle.r.nodes.builtin.RExternalBuiltinNode;
 import com.oracle.truffle.r.runtime.RArguments;
 import com.oracle.truffle.r.runtime.RError;
@@ -48,6 +51,13 @@ import com.oracle.truffle.r.runtime.instrument.InstrumentationState.RprofState;
 
 public abstract class Rprofmem extends RExternalBuiltinNode.Arg3 implements RDataFactory.Listener {
 
+    static {
+        Casts casts = new Casts(Rprofmem.class);
+        casts.arg(0, "filename").mustBe(stringValue()).asStringVector();
+        casts.arg(1, "append").mustBe(instanceOf(byte.class));
+        casts.arg(2, "threshold").mustBe(doubleValue()).asDoubleVector();
+    }
+
     @Specialization
     @TruffleBoundary
     public Object doRprofmem(RAbstractStringVector filenameVec, byte appendL, RAbstractDoubleVector thresholdVec) {
-- 
GitLab