From 53a0d0f95d2276958fe9ab67ba7a59df3f5cd14c Mon Sep 17 00:00:00 2001
From: Mick Jordan <mick.jordan@oracle.com>
Date: Fri, 14 Aug 2015 14:49:07 -0700
Subject: [PATCH] bug fixes

---
 com.oracle.truffle.r.native/run/Makefile           |  2 +-
 .../truffle/r/nodes/builtin/base/Mapply.java       | 14 +++++++++++++-
 .../truffle/r/nodes/builtin/base/Unlist.java       | 12 ++++++++++++
 .../truffle/r/runtime/conn/ConnectionSupport.java  |  8 +++++---
 4 files changed, 31 insertions(+), 5 deletions(-)

diff --git a/com.oracle.truffle.r.native/run/Makefile b/com.oracle.truffle.r.native/run/Makefile
index 0a684b9a7d..d3a025305e 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 54bdd0b10a..612c8a4462 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 4ab724c837..2efaf2f07c 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 74dd248f19..0404e5901d 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);
+                }
             }
         }
 
-- 
GitLab