diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/NChar.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/NChar.java index 8278cc60981a9f8cf7b03093de861ca479e18696..1f0a0a0deb44b0cb65f736923ed39858c624ab8f 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/NChar.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/NChar.java @@ -31,6 +31,7 @@ import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.INTERNAL; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.profiles.ConditionProfile; import com.oracle.truffle.api.profiles.LoopConditionProfile; import com.oracle.truffle.r.nodes.builtin.CastBuilder; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; @@ -39,6 +40,7 @@ import com.oracle.truffle.r.runtime.builtins.RBuiltin; import com.oracle.truffle.r.runtime.data.RAttributeProfiles; import com.oracle.truffle.r.runtime.data.RDataFactory; import com.oracle.truffle.r.runtime.data.RIntVector; +import com.oracle.truffle.r.runtime.data.RList; import com.oracle.truffle.r.runtime.data.RNull; import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector; import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector; @@ -65,7 +67,8 @@ public abstract class NChar extends RBuiltinNode { @Specialization protected RIntVector ncharInt(RAbstractIntVector vector, String type, boolean allowNA, boolean keepNA, @Cached("createCountingProfile()") LoopConditionProfile loopProfile, - @Cached("create()") RAttributeProfiles attrProfiles) { + @Cached("create()") RAttributeProfiles attrProfiles, + @Cached("createBinaryProfile()") ConditionProfile nullDimNamesProfile) { int len = vector.getLength(); int[] result = new int[len]; loopProfile.profileCounted(len); @@ -77,20 +80,31 @@ public abstract class NChar extends RBuiltinNode { result[i] = (int) (Math.log10(x) + 1); // not the fastest one } } - return RDataFactory.createIntVector(result, true, vector.getNames(attrProfiles)); + RIntVector resultVector = RDataFactory.createIntVector(result, true, vector.getDimensions(), vector.getNames(attrProfiles)); + RList dimNames = vector.getDimNames(attrProfiles); + if (nullDimNamesProfile.profile(dimNames != null)) { + resultVector.setDimNames(dimNames); + } + return resultVector; } @SuppressWarnings("unused") @Specialization protected RIntVector nchar(RAbstractStringVector vector, String type, boolean allowNA, boolean keepNA, @Cached("createCountingProfile()") LoopConditionProfile loopProfile, - @Cached("create()") RAttributeProfiles attrProfiles) { + @Cached("create()") RAttributeProfiles attrProfiles, + @Cached("createBinaryProfile()") ConditionProfile nullDimNamesProfile) { int len = vector.getLength(); int[] result = new int[len]; loopProfile.profileCounted(len); for (int i = 0; loopProfile.inject(i < len); i++) { result[i] = vector.getDataAt(i).length(); } - return RDataFactory.createIntVector(result, true, vector.getNames(attrProfiles)); + RIntVector resultVector = RDataFactory.createIntVector(result, true, vector.getDimensions(), vector.getNames(attrProfiles)); + RList dimNames = vector.getDimNames(attrProfiles); + if (nullDimNamesProfile.profile(dimNames != null)) { + resultVector.setDimNames(dimNames); + } + return resultVector; } } 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 23155f5972230c49d5b3b2f5f98f9ae11a719610..bc39543b242e537fe5ae0ce8f5e67d3ffb8bb08e 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 @@ -24612,6 +24612,13 @@ Warning message: In is.na(quote(x())) : is.na() applied to non-(list or vector) of type 'language' +##com.oracle.truffle.r.test.builtins.TestBuiltin_isna.testIsNA +#v <- c(a=1,b=1234,c='ff',d='gg'); dim(v) <- c(foo=2,bar=2); dimnames(v) <- list(a=c('foo', 'bar'), n=c('f','g')); is.na(v) + n +a f g + foo FALSE FALSE + bar FALSE FALSE + ##com.oracle.truffle.r.test.builtins.TestBuiltin_isna.testIsNA #{ is.na(1[10]) } [1] TRUE @@ -32514,6 +32521,13 @@ Wyoming 97203 West #nargs( ); [1] NA +##com.oracle.truffle.r.test.builtins.TestBuiltin_nchar.testNChar +#v <- c(a=1,b=1234,c='ff',d='gg'); dim(v) <- c(foo=2,bar=2); dimnames(v) <- list(a=c('foo', 'bar'), n=c('f','g')); nchar(v) + n +a f g + foo 1 2 + bar 4 2 + ##com.oracle.truffle.r.test.builtins.TestBuiltin_nchar.testNChar #{ .Internal(nchar('ff', 'chars', FALSE)) } [1] 2 diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_isna.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_isna.java index e7290d237c5fb23470405701ad86070938ec2687..62579fa7e73d6e5798f23895b5bd37c3fe736e55 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_isna.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_isna.java @@ -254,5 +254,8 @@ public class TestBuiltin_isna extends TestBase { // Note: is.na.data.frame calls do.call("cbind", lapply(x, "is.na")) - there is the error // Probably the same error as in testisna13 assertEval(Ignored.Unimplemented, "is.na(data.frame(col1=1:5, col2=c(NA, 1, NA, 2, NA)))"); + + assertEval("v <- c(a=1,b=1234,c='ff',d='gg'); dim(v) <- c(foo=2,bar=2); dimnames(v) <- list(a=c('foo', 'bar'), n=c('f','g')); is.na(v)"); + } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_nchar.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_nchar.java index eb57d88caea23c253cce644a916e49e6d435029f..232fe1a6a324287bbc63a5b50dc842a2c459bc65 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_nchar.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_nchar.java @@ -84,5 +84,7 @@ public class TestBuiltin_nchar extends TestBase { assertEval("{ nchar(c(10,130)) }"); assertEval("{ .Internal(nchar(c(10,130), 'chars', FALSE)) }"); assertEval("{ .Internal(nchar('ff', 'chars', FALSE)) }"); + + assertEval("v <- c(a=1,b=1234,c='ff',d='gg'); dim(v) <- c(foo=2,bar=2); dimnames(v) <- list(a=c('foo', 'bar'), n=c('f','g')); nchar(v)"); } }