From bde2c48432c862fd2b92dcd015ed75a85c3f7744 Mon Sep 17 00:00:00 2001 From: Tomas Stupka <tomas.stupka@oracle.com> Date: Thu, 23 Mar 2017 16:19:43 +0100 Subject: [PATCH] [GR-2098] Support for NaN vector access --- .../access/vector/PositionCheckSubsetNode.java | 2 +- .../com/oracle/truffle/r/runtime/RDeparse.java | 2 +- .../r/test/library/base/TestSimpleLists.java | 4 ++++ .../r/test/library/base/TestSimpleMatrix.java | 5 ++++- .../r/test/library/base/TestSimpleVectors.java | 17 +++++++++++++++++ 5 files changed, 27 insertions(+), 3 deletions(-) diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckSubsetNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckSubsetNode.java index 22dfb909a4..f45d9018a6 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckSubsetNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckSubsetNode.java @@ -144,7 +144,6 @@ abstract class PositionCheckSubsetNode extends PositionCheckNode { @Cached("create()") GetNamesAttributeNode getNamesNode, @Cached("create()") SetNamesAttributeNode setNamesNode) { RAbstractIntVector intPosition = RDataFactory.createIntVector(positionLength); - intPosition.setComplete(position.isComplete()); // requires names preservation RStringVector names = hasNamesProfile.profile(getNamesNode.getNames(position)); if (names != null) { @@ -204,6 +203,7 @@ abstract class PositionCheckSubsetNode extends PositionCheckNode { } intPosition.setDataAt(convertedStore, i, intPositionValue); } + intPosition.setComplete(!hasSeenNA); return doIntegerProfiled(profile, dimensionLength, intPosition, positionLength, hasSeenPositive, hasSeenNegative, hasSeenNA, outOfBoundsCount, zeroCount, maxOutOfBoundsIndex); } diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RDeparse.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RDeparse.java index 3fe65ddf1d..a2b582ecce 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RDeparse.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RDeparse.java @@ -642,7 +642,7 @@ public class RDeparse { } } else if (value instanceof RPairList) { RPairList arglist = (RPairList) value; - assert arglist.getType() == SEXPTYPE.LISTSXP; + assert arglist.getType() == null || arglist.getType() == SEXPTYPE.LISTSXP : arglist.getType(); append("pairlist("); int i = 0; boolean lbreak = false; diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleLists.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleLists.java index 88b2cbf42e..f9391d284b 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleLists.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleLists.java @@ -48,10 +48,14 @@ public class TestSimpleLists extends TestBase { assertEval(Output.IgnoreErrorContext, "{ l <- list(1,2,3) ; l[[0]] }"); assertEval("{ l <- list(1,2,3) ; l[[NA]] }"); + assertEval("{ l <- list(1,2,3) ; l[[NaN]] }"); assertEval("{ l <- list(1,2,3) ; typeof(l[[NA]]) }"); + assertEval("{ l <- list(1,2,3) ; typeof(l[[NaN]]) }"); assertEval("{ l <- list(1,2,3) ; l[NA] }"); + assertEval("{ l <- list(1,2,3) ; l[NaN] }"); assertEval("{ l <- list(1,2,3) ; typeof(l[NA]) }"); + assertEval("{ l <- list(1,2,3) ; typeof(l[NaN]) }"); assertEval("{ l <- list(1,2,3) ; l[-2] }"); assertEval("{ l <- list(1,2,3) ; typeof(l[-2]) }"); diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleMatrix.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleMatrix.java index 3ce0c94e12..2324ef9e6a 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleMatrix.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleMatrix.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -82,8 +82,11 @@ public class TestSimpleMatrix extends TestBase { assertEval(template("{ x<-%0; dim(x)<-c(1,4); dimnames(x)<-list(\"z\", c(\"a\", \"b\", \"c\", \"d\")); x[1, c(1,3)] }", TESTED_4L_VECTORS)); assertEval(template("{ x<-%0; dim(x)<-c(1,4); dimnames(x)<-list(\"z\", c(\"a\", \"b\", \"d\", \"e\")); x[1, c(1,3)] }", TESTED_4L_VECTORS)); assertEval(template("{ x<-%0; dim(x)<-c(2,2); x[c(1, NA), ] }", TESTED_4L_VECTORS)); + assertEval(template("{ x<-%0; dim(x)<-c(2,2); x[c(1, NaN), ] }", TESTED_4L_VECTORS)); assertEval(template("{ x<-%0; dim(x)<-c(2,2); x[c(TRUE, NA), ] }", TESTED_4L_VECTORS)); + assertEval(template("{ x<-%0; dim(x)<-c(2,2); x[c(TRUE, NaN), ] }", TESTED_4L_VECTORS)); assertEval(template("{ x<-%0; x<-1:4; dim(x)<-c(2,2); x[NA, ] }", TESTED_4L_VECTORS)); + assertEval(template("{ x<-%0; x<-1:4; dim(x)<-c(2,2); x[NaN, ] }", TESTED_4L_VECTORS)); // A misalignment error similar to those in TestSimpleVector (testIgnored1-3) WhiteList wl = WhiteList.create("matrix formatting1"); wl.add("{ x<-c(as.raw(1),as.raw(2),as.raw(3),as.raw(4)); dim(x)<-c(2,2); dimnames(x)<-list(c(\"a\", \"b\"), c(\"c\", \"d\")); x[c(1,NA), 1] }", diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleVectors.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleVectors.java index 21158c964e..60ee20a4ef 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleVectors.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleVectors.java @@ -162,6 +162,7 @@ public class TestSimpleVectors extends TestBase { assertEval("{ x<-3:1; x[1L] }"); assertEval("{ x<-3:1; x[2L] }"); assertEval("{ x<-3:1; x[3L] }"); + assertEval("{ x<-3:1; x[NA_integer_] }"); } @Test @@ -192,6 +193,8 @@ public class TestSimpleVectors extends TestBase { assertEval("{ x<-3:1; x[1.1] }"); assertEval("{ x<-3:1; x[2.1] }"); assertEval("{ x<-3:1; x[3.1] }"); + assertEval("{ x<-3:1; x[NaN] }"); + assertEval("{ x<-3:1; x[NA_real_] }"); } @Test @@ -225,6 +228,7 @@ public class TestSimpleVectors extends TestBase { assertEval("{ x<-NULL; x[1L] }"); assertEval("{ x<-NULL; x[2L] }"); assertEval("{ x<-NULL; x[3L] }"); + assertEval("{ x<-NULL; x[NaN] }"); assertEval("{ x<-1.1:3.1; x[1L] }"); assertEval("{ x<-1.1:3.1; x[2L] }"); assertEval("{ x<-1.1:3.1; x[3L] }"); @@ -242,7 +246,10 @@ public class TestSimpleVectors extends TestBase { assertEval("{ x<-1L; x[-2L] }"); assertEval("{ x<-1L; x[TRUE] }"); assertEval("{ x<-1L; x[FALSE] }"); + assertEval("{ x<-1L; x[NA_real_] }"); + assertEval("{ x<-1L; x[NA_integer_] }"); assertEval("{ x<-1L; x[NA] }"); + assertEval("{ x<-1L; x[NaN] }"); } @Test @@ -262,6 +269,7 @@ public class TestSimpleVectors extends TestBase { assertEval("{ x<-1; x[TRUE] }"); assertEval("{ x<-1; x[FALSE] }"); assertEval("{ x<-1; x[NA] }"); + assertEval("{ x<-1; x[NaN] }"); } @Test @@ -399,6 +407,10 @@ public class TestSimpleVectors extends TestBase { assertEval(Output.IgnoreErrorContext, "{ x<-7; x[[0]]<-42; x }"); assertEval("{ x<-1:4; x[c(1, 0)]<-42; x }"); assertEval("{ x<-1:4; x[c(0, 1)]<-42; x }"); + assertEval("{ x<-1:4; x[c(1, NA)]<-42; x }"); + assertEval("{ x<-1:4; x[c(1, NaN)]<-42; x }"); + assertEval("{ x<-1:4; x[c(NA, 1)]<-42; x }"); + assertEval("{ x<-1:4; x[c(NaN, 1)]<-42; x }"); assertEval("{ x<-1:4; x[c(1, 0)]<-c(7, 42); x }"); assertEval("{ x<-1:4; x[c(0, 1)]<-c(7, 42); x }"); assertEval("{ x<-1:4; dim(x)<-c(2,2); x[NULL]<-42; x }"); @@ -407,7 +419,9 @@ public class TestSimpleVectors extends TestBase { assertEval("{ x<-1:4; dim(x)<-c(2,2); x[c(1,4)]<-c(42, 43); x }"); assertEval(Output.IgnoreErrorContext, "{ x<-1:4; dim(x)<-c(2,2); x[[c(1,4)]]<-c(42, 43); x }"); assertEval("{ x<-1:4; dim(x)<-c(2,2); x[c(1,NA)]<-c(42, 43); x }"); + assertEval("{ x<-1:4; dim(x)<-c(2,2); x[c(1,NaN)]<-c(42, 43); x }"); assertEval("{ x<-1:4; dim(x)<-c(2,2); x[c(NA,1)]<-c(42, 43); x }"); + assertEval("{ x<-1:4; dim(x)<-c(2,2); x[c(NaN,1)]<-c(42, 43); x }"); assertEval(Output.IgnoreErrorContext, "{ x<-1:4; dim(x)<-c(2,2); x[[c(1,0)]]<-c(42, 43); x }"); assertEval("{ x<-1:4; dim(x)<-c(2,2); x[c(1,0)]<-c(42, 43); x }"); assertEval(Output.IgnoreErrorContext, "{ x<-1:4; dim(x)<-c(2,2); x[[c(1,0,0)]]<-c(42, 43); x }"); @@ -689,6 +703,9 @@ public class TestSimpleVectors extends TestBase { assertEval("{ e <- quote(f(x=a, y=b)); names(e[-1]) }"); assertEval("{ x<-quote(function(x, y) 42); x[[2]] }"); + assertEval("{ x<-quote(function(x, y) 42); x[2] }"); + assertEval("{ x<-quote(function(x, y) 42); x[NA] }"); + assertEval("{ x<-quote(function(x, y) 42); x[NaN] }"); assertEval("{ x<-quote(function(x, y) 42); typeof(x[[2]][[1]]) }"); assertEval("{ x<-quote(function(x, y) 42); names(x[[2]]) }"); assertEval("{ x<-quote(function(x, y=7) 42); x[[2]] }"); -- GitLab