From f1f9b24333ca9ca80e7bf49ae845bca1a727c835 Mon Sep 17 00:00:00 2001
From: Mick Jordan <mick.jordan@oracle.com>
Date: Fri, 27 Feb 2015 18:51:36 -0800
Subject: [PATCH] add connection forceOpens

---
 .../nodes/builtin/base/ForeignFunctions.java  | 39 +++++++++++++++++--
 1 file changed, 36 insertions(+), 3 deletions(-)

diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ForeignFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ForeignFunctions.java
index e61c764b33..6257433b7b 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ForeignFunctions.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ForeignFunctions.java
@@ -742,11 +742,22 @@ public class ForeignFunctions {
                     quoteSet = s;
                 }
             }
+            boolean wasOpen = true;
             try {
+                wasOpen = conn.forceOpen("r");
                 return CountFields.execute(conn, sepChar, quoteSet, nskip, RRuntime.fromLogical(blskip), comChar);
             } catch (IllegalStateException | IOException ex) {
                 errorProfile.enter();
                 throw RError.error(getEncapsulatingSourceSection(), RError.Message.GENERIC, ex.getMessage());
+            } finally {
+                if (!wasOpen) {
+                    try {
+                        conn.internalClose();
+                    } catch (IOException ex) {
+                        errorProfile.enter();
+                        throw RError.error(getEncapsulatingSourceSection(), RError.Message.GENERIC, ex.getMessage());
+                    }
+                }
             }
         }
 
@@ -761,11 +772,22 @@ public class ForeignFunctions {
             Object[] argValues = args.getValues();
             RConnection conn = (RConnection) argValues[0];
             int nlines = castInt(frame, castVector(frame, argValues[1]));
+            boolean wasOpen = true;
             try {
+                wasOpen = conn.forceOpen("r");
                 return RDataFactory.createStringVector(conn.readLines(nlines), RDataFactory.COMPLETE_VECTOR);
             } catch (IOException ex) {
                 errorProfile.enter();
                 throw RError.error(getEncapsulatingSourceSection(), RError.Message.ERROR_READING_CONNECTION, ex.getMessage());
+            } finally {
+                if (!wasOpen) {
+                    try {
+                        conn.internalClose();
+                    } catch (IOException ex) {
+                        errorProfile.enter();
+                        throw RError.error(getEncapsulatingSourceSection(), RError.Message.GENERIC, ex.getMessage());
+                    }
+                }
             }
         }
 
@@ -835,12 +857,12 @@ public class ForeignFunctions {
             controlVisibility();
             Object[] argValues = args.getValues();
             Object conArg = argValues[1];
-            RConnection con;
+            RConnection conn;
             if (!(conArg instanceof RConnection)) {
                 errorProfile.enter();
                 throw RError.error(getEncapsulatingSourceSection(), RError.Message.GENERIC, "'file' is not a connection");
             } else {
-                con = (RConnection) conArg;
+                conn = (RConnection) conArg;
             }
             // TODO check connection writeable
 
@@ -899,11 +921,22 @@ public class ForeignFunctions {
                     quoteCol[qi - 1] = true;
                 }
             }
+            boolean wasOpen = true;
             try {
-                WriteTable.execute(con, argValues[0], nr, nc, rnamesArg, csep, ceol, cna, cdec.charAt(0), RRuntime.fromLogical(qmethod), quoteCol, quoteRn);
+                wasOpen = conn.forceOpen("wt");
+                WriteTable.execute(conn, argValues[0], nr, nc, rnamesArg, csep, ceol, cna, cdec.charAt(0), RRuntime.fromLogical(qmethod), quoteCol, quoteRn);
             } catch (IOException | IllegalArgumentException ex) {
                 errorProfile.enter();
                 throw RError.error(getEncapsulatingSourceSection(), RError.Message.GENERIC, ex.getMessage());
+            } finally {
+                if (!wasOpen) {
+                    try {
+                        conn.internalClose();
+                    } catch (IOException ex) {
+                        errorProfile.enter();
+                        throw RError.error(getEncapsulatingSourceSection(), RError.Message.GENERIC, ex.getMessage());
+                    }
+                }
             }
             return RNull.instance;
         }
-- 
GitLab