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