diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Bind.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Bind.java index 14584bfb602fe33c6aaf0ebe0e2016955e4e92c9..4f6dba39bcf6f755e02e3d4248270f4fedd84b60 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Bind.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Bind.java @@ -111,6 +111,7 @@ public abstract class Bind extends RBaseNode { private final ConditionProfile emptyVectorProfile = ConditionProfile.createBinaryProfile(); private final ConditionProfile allEmptyVectorProfile = ConditionProfile.createBinaryProfile(); private final BranchProfile nonNullNames = BranchProfile.create(); + private final ConditionProfile dimNamesInComplete = ConditionProfile.createBinaryProfile(); private final NACheck naCheck = NACheck.create(); protected final ValueProfile resultProfile = ValueProfile.createClassProfile(); protected final ValueProfile vectorProfile = ValueProfile.createClassProfile(); @@ -200,11 +201,11 @@ public abstract class Bind extends RBaseNode { } if (type == BindType.cbind) { - return genericCBind(promiseArgs, vectors, resultVec, resultDimensions, bindDims, rowsAndColumnsNotEqual, allEmpty, vecNames, naCheck.neverSeenNA(), deparseLevel, setDimNode, - getDimNamesNode, getNamesNode); + return genericCBind(promiseArgs, vectors, resultVec, resultDimensions, bindDims, rowsAndColumnsNotEqual, allEmpty, vecNames, deparseLevel, setDimNode, getDimNamesNode, + getNamesNode); } else { - return genericRBind(promiseArgs, vectors, resultVec, resultDimensions, bindDims, rowsAndColumnsNotEqual, allEmpty, vecNames, naCheck.neverSeenNA(), deparseLevel, setDimNode, - getDimNamesNode, getNamesNode); + return genericRBind(promiseArgs, vectors, resultVec, resultDimensions, bindDims, rowsAndColumnsNotEqual, allEmpty, vecNames, deparseLevel, setDimNode, getDimNamesNode, + getNamesNode); } } @@ -472,8 +473,8 @@ public abstract class Bind extends RBaseNode { } public RVector<?> genericCBind(RArgsValuesAndNames promiseArgs, RAbstractVector[] vectors, RVector<?> result, int[] resultDimensions, int[] secondDims, boolean rowsAndColumnsNotEqual, - boolean allEmpty, String[] vecNames, boolean vecNamesComplete, int deparseLevel, - SetDimAttributeNode setDimNode, GetDimNamesAttributeNode getDimNamesNode, GetNamesAttributeNode getNamesNode) { + boolean allEmpty, String[] vecNames, int deparseLevel, SetDimAttributeNode setDimNode, + GetDimNamesAttributeNode getDimNamesNode, GetNamesAttributeNode getNamesNode) { int ind = 0; Object rowDimResultNames = RNull.instance; @@ -516,7 +517,7 @@ public abstract class Bind extends RBaseNode { } } } - Object colDimResultNames = allColDimNamesNull ? RNull.instance : RDataFactory.createStringVector(colDimNamesArray, vecNamesComplete); + Object colDimResultNames = allColDimNamesNull ? RNull.instance : RDataFactory.createStringVector(colDimNamesArray, dimResultNamesComplete(colDimNamesArray)); setDimNode.setDimensions(result, resultDimensions); if (needsDimNames.profile(allEmpty || rowDimResultNames != RNull.instance || colDimResultNames != RNull.instance)) { setDimNames(result, RDataFactory.createList(new Object[]{rowDimResultNames, colDimResultNames})); @@ -626,8 +627,8 @@ public abstract class Bind extends RBaseNode { } public RVector<?> genericRBind(RArgsValuesAndNames promiseArgs, RAbstractVector[] vectors, RVector<?> result, int[] resultDimensions, int[] firstDims, boolean rowsAndColumnsNotEqual, - boolean allEmpty, String[] vecNames, boolean vecNamesComplete, int deparseLevel, - SetDimAttributeNode setDimNode, GetDimNamesAttributeNode getDimNamesNode, GetNamesAttributeNode getNamesNode) { + boolean allEmpty, String[] vecNames, int deparseLevel, SetDimAttributeNode setDimNode, + GetDimNamesAttributeNode getDimNamesNode, GetNamesAttributeNode getNamesNode) { Object colDimResultNames = RNull.instance; String[] rowDimNamesArray = new String[resultDimensions[0]]; @@ -676,7 +677,7 @@ public abstract class Bind extends RBaseNode { dstRowInd += firstDims[i]; } - Object rowDimResultNames = allRowDimNamesNull ? RNull.instance : RDataFactory.createStringVector(rowDimNamesArray, vecNamesComplete); + Object rowDimResultNames = allRowDimNamesNull ? RNull.instance : RDataFactory.createStringVector(rowDimNamesArray, dimResultNamesComplete(rowDimNamesArray)); setDimNode.setDimensions(result, resultDimensions); if (needsDimNames.profile(allEmpty || rowDimResultNames != RNull.instance || colDimResultNames != RNull.instance)) { setDimNames(result, RDataFactory.createList(new Object[]{rowDimResultNames, colDimResultNames})); @@ -684,6 +685,15 @@ public abstract class Bind extends RBaseNode { return result; } + private boolean dimResultNamesComplete(String[] rowDimNamesArray) { + for (String s : rowDimNamesArray) { + if (dimNamesInComplete.profile(s == RRuntime.STRING_NA)) { + return RDataFactory.INCOMPLETE_VECTOR; + } + } + return RDataFactory.COMPLETE_VECTOR; + } + private void setDimNames(RVector<?> result, RList dimNames) { if (setDimNamesNode == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); 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 905c96ba42c7e43f7ead96859f002c13a22f7891..518a18ac1c3f29444059210faea554c43686e327 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 @@ -11984,6 +11984,12 @@ c 2 a c 1 7 42 +##com.oracle.truffle.r.test.builtins.TestBuiltin_cbind.testCbind# +#{x <- numeric(); y <- matrix(2,2); dimnames(y) <- list(c(NA_character_,NA_character_), c(NA_character_)); rbind(x, y) } + <NA> +<NA> 2 +<NA> 2 + ##com.oracle.truffle.r.test.builtins.TestBuiltin_cbind.testDimnames# #{ attributes(cbind(1L)) } $dim diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cbind.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cbind.java index d39f463f15a32fc012ce216b0797e9f95b6d16e2..cccb74db2a90c019cccf53a714362371e920a6e4 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cbind.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_cbind.java @@ -62,6 +62,7 @@ public class TestBuiltin_cbind extends TestBase { assertEval("{ cbind(c(1,c=2)) }"); assertEval("{ v<-c(b=1, c=2); cbind(v) }"); assertEval("{ cbind(matrix(1:4, nrow=2, dimnames=list(c('a', 'b'), c('x', 'y')))) }"); + assertEval("{x <- numeric(); y <- matrix(2,2); dimnames(y) <- list(c(NA_character_,NA_character_), c(NA_character_)); rbind(x, y) }"); assertEval("{ cbind(a=c(1,2), b=c(3,4)) }"); assertEval("{ cbind(a=c(x=1,y=2), b=c(3,4)) }");