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