From 4310c08d79e4267f69c51580ef62677a6fe72179 Mon Sep 17 00:00:00 2001
From: stepan <stepan.sindelar@oracle.com>
Date: Tue, 13 Mar 2018 15:06:54 +0100
Subject: [PATCH] Make sure 'cdr' in pairlists is always a pairlist or NULL

---
 .../oracle/truffle/r/runtime/data/RPairList.java    |  1 +
 .../truffle/r/test/runtime/data/RPairListTests.java | 13 +++++++++----
 2 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPairList.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPairList.java
index b729095f5d..13c539fe23 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPairList.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPairList.java
@@ -38,6 +38,7 @@ import com.oracle.truffle.r.runtime.data.nodes.FastPathVectorAccess.FastPathFrom
 import com.oracle.truffle.r.runtime.data.nodes.SlowPathVectorAccess.SlowPathFromListAccess;
 import com.oracle.truffle.r.runtime.data.nodes.VectorAccess;
 import com.oracle.truffle.r.runtime.gnur.SEXPTYPE;
+import com.oracle.truffle.r.runtime.nodes.RSyntaxNode;
 
 /**
  * Denotes the (rarely seen) {@code pairlist} type in R.
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/runtime/data/RPairListTests.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/runtime/data/RPairListTests.java
index e7015b1508..5b0a4bfa62 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/runtime/data/RPairListTests.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/runtime/data/RPairListTests.java
@@ -34,6 +34,7 @@ import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RList;
 import com.oracle.truffle.r.runtime.data.RNull;
 import com.oracle.truffle.r.runtime.data.RPairList;
+import com.oracle.truffle.r.runtime.data.RSymbol;
 
 public class RPairListTests {
     @Test
@@ -48,7 +49,7 @@ public class RPairListTests {
 
     @Test
     public void testToList() {
-        RPairList pairList = RDataFactory.createPairList(1, RDataFactory.createPairList(2, RNull.instance, "name2"), "name1");
+        RPairList pairList = RDataFactory.createPairList(1, RDataFactory.createPairList(2, RNull.instance, sym("name2")), sym("name1"));
         RList result = pairList.toRList();
         assertArrayEquals(new String[]{"name1", "name2"}, result.getNames().getReadonlyData());
         assertArrayEquals(new Object[]{1, 2}, result.getDataWithoutCopying());
@@ -56,13 +57,17 @@ public class RPairListTests {
 
     @Test
     public void testCopy() {
-        RPairList pairList = RDataFactory.createPairList(1, RDataFactory.createPairList(2, RNull.instance, "name2"), "name1");
+        RPairList pairList = RDataFactory.createPairList(1, RDataFactory.createPairList(2, RNull.instance, sym("name2")), sym("name1"));
         RPairList copy = pairList.copy();
         assertEquals(2, copy.getLength());
-        assertEquals("name1", copy.getTag());
+        assertEquals("name1", copy.getTag().toString());
         assertEquals(1, copy.car());
-        assertEquals("name2", ((RPairList) copy.cdr()).getTag());
+        assertEquals("name2", ((RPairList) copy.cdr()).getTag().toString());
         assertEquals(2, ((RPairList) copy.cdr()).car());
         assertSame(RNull.instance, ((RPairList) copy.cdr()).cdr());
     }
+
+    private static RSymbol sym(String name) {
+        return RDataFactory.createSymbol(name);
+    }
 }
-- 
GitLab