diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/write/UpdateArrayHelperNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/write/UpdateArrayHelperNode.java index 1aafaa28910009c2b00768c5c8dafe1c4b233f91..3e4fe4a735792b50c4327e066e3dfae9f47f8b09 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/write/UpdateArrayHelperNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/array/write/UpdateArrayHelperNode.java @@ -428,6 +428,9 @@ public abstract class UpdateArrayHelperNode extends RNode { if (positions.getNames() != null) { posNames.enter(); RStringVector names = getNamesVector(resultVector); + if (names.isShared()) { + names = (RStringVector) names.copy(); + } RStringVector newNames = positions.getNames(); namesNACheck.enable(newNames); for (int i = 0; i < positions.getLength(); i++) { 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 ac740568d2caa912dafa0ca42a325ea57e3eee25..e2535269553d1d7add16633fe27c04a5551edc9a 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 c36881a67a63f00edb18700f790904cffa9d659f..2c9e2c38492368283822b95575bd3016250fa54a 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.runtime/src/com/oracle/truffle/r/runtime/data/RVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RVector.java index 8ff364820954b83bea850200e04369cf70ba2b14..b5afd53f0a44c8559cb1a4b264f960a208fcb972 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RVector.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RVector.java @@ -118,13 +118,12 @@ public abstract class RVector extends RBounded implements RShareable, RAbstractV public final RStringVector getNames() { if (names == null) { if (dimNames != null && dimNames.getLength() == 1) { - RStringVector res = (RStringVector) dimNames.getDataAt(0); - return res.isShared() ? (RStringVector) res.copy() : res; + return (RStringVector) dimNames.getDataAt(0); } else { return null; } } else { - return names.isShared() ? (RStringVector) names.copy() : names; + return names; } } 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 6961b243528e30db5451e426062650812ead24ce..0931c413ba1a2c5db8880a94cb22aa78824719fc 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 1c9b4239aca87b862666be93631dfff1256caba6..3eb4a2154f7d1ccc374eb97d74223aeee79e50e3 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 f785f9d1fdd1ce8a65e63b26618a9712cbf1ec41..4514533592b37132501e5804ff3bbadcdc282cf7 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