From 0d0f3b99d2b61073c8e3a9410750f2cc877a453c Mon Sep 17 00:00:00 2001
From: Adam Welc <adam.welc@oracle.com>
Date: Sun, 28 Aug 2016 14:07:48 -0700
Subject: [PATCH] Rewritten parameter casts for the unlist builtin.

---
 .../truffle/r/nodes/builtin/base/Unlist.java  | 26 ++++++++-----------
 1 file changed, 11 insertions(+), 15 deletions(-)

diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Unlist.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Unlist.java
index d440e5ec64..26f0329783 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Unlist.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Unlist.java
@@ -11,11 +11,13 @@
  */
 package com.oracle.truffle.r.nodes.builtin.base;
 
+import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.*;
 import static com.oracle.truffle.r.runtime.builtins.RBehavior.PURE;
 import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.INTERNAL;
 
 import com.oracle.truffle.api.CompilerDirectives;
 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.dsl.TypeSystemReference;
 import com.oracle.truffle.api.frame.VirtualFrame;
@@ -47,8 +49,8 @@ public abstract class Unlist extends RBuiltinNode {
 
     @Override
     protected void createCasts(CastBuilder casts) {
-        casts.firstBoolean(1);
-        casts.firstBoolean(2);
+        casts.arg("recursive").asLogicalVector().findFirst(RRuntime.LOGICAL_TRUE).map(toBoolean());
+        casts.arg("use.names").asLogicalVector().findFirst(RRuntime.LOGICAL_TRUE).map(toBoolean());
     }
 
     @Child private PrecedenceNode precedenceNode = PrecedenceNodeGen.create();
@@ -143,21 +145,9 @@ public abstract class Unlist extends RBuiltinNode {
         return RNull.instance;
     }
 
-    @SuppressWarnings("unused")
-    @Specialization(guards = "!isVectorList(vector)")
-    protected RAbstractVector unlistVector(RAbstractVector vector, boolean recursive, boolean useNames) {
-        return vector;
-    }
-
     @SuppressWarnings("unused")
     @Specialization(guards = "isEmpty(list)")
-    protected RNull unlistEmptyList(VirtualFrame frame, RList list, boolean recursive, boolean useNames) {
-        return RNull.instance;
-    }
-
-    @SuppressWarnings("unused")
-    @Specialization(guards = "isOneNull(list)")
-    protected RNull unlistOneNullList(VirtualFrame frame, RList list, boolean recursive, boolean useNames) {
+    protected RNull unlistEmptyList(RList list, boolean recursive, boolean useNames) {
         return RNull.instance;
     }
 
@@ -184,6 +174,12 @@ public abstract class Unlist extends RBuiltinNode {
         }
     }
 
+    @SuppressWarnings("unused")
+    @Fallback
+    protected Object unlist(Object o, boolean recursive, boolean useNames) {
+        return o;
+    }
+
     @TruffleBoundary
     private RAbstractVector unlistHelper(RList list, boolean recursive, boolean useNames, int precedence, int totalSize) {
         String[] namesData = useNames ? new String[totalSize] : null;
-- 
GitLab