Skip to content
Snippets Groups Projects
Commit c2bf4014 authored by Lukas Stadler's avatar Lukas Stadler
Browse files

preserve dimensions in nchar

parent d1fec7ac
Branches
No related tags found
No related merge requests found
......@@ -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;
}
}
......@@ -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
......@@ -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)");
}
}
......@@ -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)");
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment