diff --git a/com.oracle.truffle.r.native/run/Makefile b/com.oracle.truffle.r.native/run/Makefile index 0a684b9a7db16dc65fdc670364e1819f65bcacff..d3a025305eef0751aebc45a726af8d88f79e8169 100644 --- a/com.oracle.truffle.r.native/run/Makefile +++ b/com.oracle.truffle.r.native/run/Makefile @@ -80,7 +80,7 @@ $(FASTR_BIN_DIR)/R: Makefile R.sh Rscript.sh Rscript_exec.sh cp examples-header.R examples-footer.R $(FASTR_SHARE_DIR)/R includedir: Makefile $(TOPDIR)/include/jni/include/R.h - cp -rp $(TOPDIR)/include/jni/include $(FASTR_R_HOME)/include + cp -r $(TOPDIR)/include/jni/include $(FASTR_R_HOME)/include clean: rm -rf $(FASTR_BIN_DIR) diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Mapply.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Mapply.java index 54bdd0b10afa27f724aed6899cb1a3af5498751b..612c8a44625bd07e3ff575960c28ec101b5e1876 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Mapply.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Mapply.java @@ -121,7 +121,19 @@ public abstract class Mapply extends RBuiltinNode { for (int i = 0; i < maxLength; i++) { /* Evaluate and store the arguments */ for (int listIndex = 0; listIndex < dotsLength; listIndex++) { - RAbstractContainer vec = (RAbstractContainer) dots.getDataAt(listIndex); + Object listElem = dots.getDataAt(listIndex); + RAbstractContainer vec = null; + if (listElem instanceof RAbstractContainer) { + vec = (RAbstractContainer) listElem; + } else { + // TODO scalar types are a nuisance! + if (listElem instanceof String) { + vec = RDataFactory.createStringVectorFromScalar((String) listElem); + } else { + throw RInternalError.unimplemented(); + } + } + int adjIndex = i % lengths[listIndex]; RArgsValuesAndNames indexArg; if (adjIndex < INDEX_CACHE.length) { diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Unlist.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Unlist.java index 4ab724c8373188111532779c346e48144fc0a8da..2efaf2f07c8c4bd3ae5604bbb6af3368e1711305 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Unlist.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Unlist.java @@ -139,6 +139,13 @@ public abstract class Unlist extends RBuiltinNode { return RNull.instance; } + @SuppressWarnings("unused") + @Specialization(guards = "isOneNull(list)") + protected RNull unlistOneNullList(VirtualFrame frame, RList list, byte recursive, byte useNames) { + controlVisibility(); + return RNull.instance; + } + // TODO: initially unlist was on the slow path - hence initial recursive implementation is on // the slow path as well; ultimately we may consider (non-recursive) optimization @Specialization(guards = "!isEmpty(list)") @@ -276,6 +283,7 @@ public abstract class Unlist extends RBuiltinNode { } return RDataFactory.createList(result, namesInfo != null && namesInfo.namesAssigned ? RDataFactory.createStringVector(namesData, RDataFactory.INCOMPLETE_VECTOR) : null); } + default: throw RInternalError.unimplemented(); } @@ -693,4 +701,8 @@ public abstract class Unlist extends RBuiltinNode { public static boolean isEmpty(RAbstractVector vector) { return vector.getLength() == 0; } + + public static boolean isOneNull(RList list) { + return list.getLength() == 1 && list.getDataAt(0) == RNull.instance; + } } diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/ConnectionSupport.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/ConnectionSupport.java index 74dd248f194b5316581fd995a7d7519c944b9fab..0404e5901d79290900e295817ab083694c5a0183 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/ConnectionSupport.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/ConnectionSupport.java @@ -153,9 +153,11 @@ public class ConnectionSupport implements RContext.StateFactory { if (con instanceof TextConnections.TextRConnection) { RError.warning(RError.NO_NODE, RError.Message.UNUSED_TEXTCONN, con.descriptor, ((TextConnections.TextRConnection) con).description); } - int index = con.descriptor; - closeAndDestroy(con); - allConnections.set(index, null); + if (con != null) { + int index = con.descriptor; + closeAndDestroy(con); + allConnections.set(index, null); + } } }