From 164d4de89c7a16132a6833c513ee6fa4baede1db Mon Sep 17 00:00:00 2001
From: Mick Jordan <mick.jordan@oracle.com>
Date: Tue, 3 Feb 2015 10:03:20 -0800
Subject: [PATCH] support closures in combine

---
 .../src/com/oracle/truffle/r/nodes/unary/CastListNode.java   | 5 +++++
 .../src/com/oracle/truffle/r/nodes/unary/PrecedenceNode.java | 5 +++++
 .../src/com/oracle/truffle/r/test/ExpectedTestOutput.test    | 4 ++++
 .../src/com/oracle/truffle/r/test/all/AllTests.java          | 5 +++++
 .../com/oracle/truffle/r/test/simple/TestSimpleBuiltins.java | 4 ++++
 5 files changed, 23 insertions(+)

diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastListNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastListNode.java
index ac740568d2..e253526955 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastListNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastListNode.java
@@ -118,4 +118,9 @@ public abstract class CastListNode extends CastNode {
         }
         return RDataFactory.createList(data, RDataFactory.createStringVector(names, complete));
     }
+
+    @Specialization
+    protected RList doFunction(RFunction func) {
+        return RDataFactory.createList(new Object[]{func});
+    }
 }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/PrecedenceNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/PrecedenceNode.java
index c36881a67a..2c9e2c3849 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/PrecedenceNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/PrecedenceNode.java
@@ -139,6 +139,11 @@ public abstract class PrecedenceNode extends UnaryNode {
         return STRING_PRECEDENCE;
     }
 
+    @Specialization
+    protected int doFunction(RFunction func, byte recursive) {
+        return LIST_PRECEDENCE;
+    }
+
     @Specialization(guards = "isRecursive")
     protected int doListRecursive(VirtualFrame frame, RList val, byte recursive) {
         int precedence = -1;
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test
index 6961b24352..0931c413ba 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test
@@ -7583,6 +7583,10 @@ x
 x y
 1 2
 
+##com.oracle.truffle.r.test.simple.TestSimpleBuiltins.testCombine
+#{ f <- function() { }; length(c(f, 2)) == 2 }
+[1] TRUE
+
 ##com.oracle.truffle.r.test.simple.TestSimpleBuiltins.testCombine
 #{ f <- function(x,y) { c(x,y) } ; f(1,1) ; f(1, TRUE) ; f(NULL, NULL) }
 NULL
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/all/AllTests.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/all/AllTests.java
index 1c9b4239ac..3eb4a2154f 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/all/AllTests.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/all/AllTests.java
@@ -6739,6 +6739,11 @@ public class AllTests extends TestBase {
         assertEval("{ x<-expression(1); c(x,2) }");
     }
 
+    @Test
+    public void TestSimpleBuiltins_testCombine_85e7fa7a14d25590b451c65e76fb380a() {
+        assertEval("{ f <- function() { }; length(c(f, 2)) == 2 }");
+    }
+
     @Test
     public void TestSimpleBuiltins_testCombineBroken_d365e1ffe5f8c886f6d1911c69b3af00() {
         assertEval("{ c(1i,0/0) }");
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/simple/TestSimpleBuiltins.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/simple/TestSimpleBuiltins.java
index f785f9d1fd..4514533592 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/simple/TestSimpleBuiltins.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/simple/TestSimpleBuiltins.java
@@ -611,6 +611,10 @@ public class TestSimpleBuiltins extends TestBase {
 
         assertEval("{ x<-expression(1); c(x) }");
         assertEval("{ x<-expression(1); c(x,2) }");
+
+        // print output for a function in a list doesn't match GnuR,
+        // which seems to invoke deparse, so we just check the c didn't fail.
+        assertEval("{ f <- function() { }; length(c(f, 2)) == 2 }");
     }
 
     @Test
-- 
GitLab