From 9f01957eadb388345deda9f4d975c98074494753 Mon Sep 17 00:00:00 2001
From: Florian Angerer <florian.angerer@oracle.com>
Date: Fri, 20 Oct 2017 13:03:23 +0200
Subject: [PATCH] Fix: Allow 'NULL' as enclosing env during deserialization.

---
 .../src/com/oracle/truffle/r/runtime/RSerialize.java | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RSerialize.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RSerialize.java
index 291db3b4e6..e9eab41082 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RSerialize.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RSerialize.java
@@ -585,8 +585,12 @@ public class RSerialize {
                                 }
                                 Debug.printClosure(pairList);
                             }
-                            boolean restore = setupLibPath((REnvironment) tagItem);
-                            RFunction func = PairlistDeserializer.processFunction(carItem, cdrItem, (REnvironment) tagItem, currentFunctionName, packageName);
+
+                            // older versions of GnuR allowed 'NULL'
+                            assert tagItem == RNull.instance || tagItem instanceof REnvironment;
+                            REnvironment enclosingEnv = tagItem == RNull.instance ? REnvironment.baseEnv() : (REnvironment) tagItem;
+                            boolean restore = setupLibPath(enclosingEnv);
+                            RFunction func = PairlistDeserializer.processFunction(carItem, cdrItem, enclosingEnv, currentFunctionName, packageName);
                             if (attrItem != RNull.instance) {
                                 setAttributes(func, attrItem);
                                 handleFunctionSrcrefAttr(func);
@@ -2786,6 +2790,10 @@ public class RSerialize {
      * @return {@code true} if a path has been added, {@code false} otherwise.
      */
     private static boolean setupLibPath(REnvironment environment) {
+        if (environment == REnvironment.baseEnv()) {
+            return false;
+        }
+
         REnvironment cur = environment;
         while (cur != REnvironment.emptyEnv() && !cur.isNamespaceEnv()) {
             cur = cur.getParent();
-- 
GitLab