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