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 976b61992990d177d734c61253a4d532d1ab275d..6e757481983688e1068f7792b648627fd80c6453 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 7d98b6e7bc2b2f4279d07b5f2258cddfc72ba727..da20086731adf7fa4e28255ad62dc2eb0fd7245c 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 bc3fe353635825c7ea4c1a29f1243ce8e3efc234..8b29ba97646474ff959850fc90d603dda9aeca3d 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;