From b8e83a9483f93964640f670e841a2feddd93636c Mon Sep 17 00:00:00 2001
From: Florian Angerer <florian.angerer@oracle.com>
Date: Wed, 25 Oct 2017 18:22:18 +0200
Subject: [PATCH] Fix: Regenerate language closure from list.

---
 .../com/oracle/truffle/r/nodes/RASTUtils.java  |  3 +--
 .../truffle/r/runtime/data/RLanguage.java      | 18 ++++++++++++------
 2 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RASTUtils.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RASTUtils.java
index 595323f56d..f8c5cfe98d 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RASTUtils.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RASTUtils.java
@@ -145,8 +145,7 @@ public final class RASTUtils {
             return RDataFactory.createSymbol(id);
         } else {
             assert element instanceof RSyntaxCall || element instanceof RSyntaxFunction;
-            Closure closure = RContext.getInstance().languageClosureCache.getOrCreateLanguageClosure(((RSyntaxNode) element).asRNode());
-            return RDataFactory.createLanguage(closure);
+            return RDataFactory.createLanguage(Closure.createLanguageClosure(((RSyntaxNode) element).asRNode()));
         }
     }
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLanguage.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLanguage.java
index 7e7ac0239f..7fa8714d7a 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLanguage.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLanguage.java
@@ -87,11 +87,7 @@ public final class RLanguage extends RSharingAttributeStorage implements RAbstra
         return RContext.getRRuntimeASTAccess().createLanguageFromList(l, type);
     }
 
-    public Closure getClosure() {
-        return closure;
-    }
-
-    public RBaseNode getRep() {
+    private void regenerateFromList() {
         if (list != null) {
             // we could rest rep but we keep it around to remember type of the language object
             assert closure.getExpr() != null;
@@ -99,10 +95,20 @@ public final class RLanguage extends RSharingAttributeStorage implements RAbstra
             RPairList oldList = this.list;
             this.list = null;
             RLanguage newLang = (RLanguage) fromList(oldList, RContext.getRRuntimeASTAccess().getRepType(this));
-            this.closure = newLang.getClosure();
+            assert newLang.list == null;
+            this.closure = newLang.closure;
             this.length = newLang.length;
             this.attributes = newLang.attributes;
         }
+    }
+
+    public Closure getClosure() {
+        regenerateFromList();
+        return closure;
+    }
+
+    public RBaseNode getRep() {
+        regenerateFromList();
         return closure.getExpr();
     }
 
-- 
GitLab