From fc762c7abb62d16dfe0f7a8deff53fd13a24c81f Mon Sep 17 00:00:00 2001
From: Mick Jordan <mick.jordan@oracle.com>
Date: Wed, 22 Jun 2016 15:16:54 -0700
Subject: [PATCH] implement Rf_allocVector(LANGSXP)

---
 .../r/runtime/ffi/jnr/CallRFFIHelper.java     |  6 ++++++
 .../truffle/r/runtime/data/RDataFactory.java  |  4 ++++
 .../truffle/r/runtime/data/RPairList.java     | 19 +++++++++++++++++++
 3 files changed, 29 insertions(+)

diff --git a/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java b/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java
index 976b619929..6e75748198 100644
--- a/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java
+++ b/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java
@@ -420,6 +420,12 @@ public class CallRFFIHelper {
                 return RDataFactory.createRawVector(new byte[n]);
             case VECSXP:
                 return RDataFactory.createList(n);
+            case LANGSXP:
+                if (n == 0) {
+                    return RNull.instance;
+                } else {
+                    return RDataFactory.createPairList(n);
+                }
             default:
                 throw unimplemented("unexpected SEXPTYPE " + type);
         }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDataFactory.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDataFactory.java
index 7d98b6e7bc..da20086731 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDataFactory.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDataFactory.java
@@ -407,6 +407,10 @@ public final class RDataFactory {
         return traceDataCreated(new RPairList());
     }
 
+    public static RPairList createPairList(int n) {
+        return traceDataCreated(RPairList.create(n));
+    }
+
     public static RPairList createPairList(Object car) {
         return traceDataCreated(new RPairList(car, RNull.instance, RNull.instance, null));
     }
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 bc3fe35363..8b29ba9764 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
@@ -72,6 +72,25 @@ public class RPairList extends RAttributeStorage implements RAbstractContainer {
         this.type = type;
     }
 
+    /**
+     * Creates a pairlist of length {@code n > 0}.
+     */
+    public static RPairList create(int n) {
+        assert n > 0;
+        RPairList head = null;
+        RPairList pl = null;
+        for (int i = 0; i < n; i++) {
+            RPairList next = new RPairList();
+            if (pl == null) {
+                head = next;
+            } else {
+                pl.cdr = next;
+            }
+            pl = next;
+        }
+        return head;
+    }
+
     @Override
     public RType getRType() {
         return RType.PairList;
-- 
GitLab