From 3da2f470bdab4c966c522445c83b63e9ab43c74e Mon Sep 17 00:00:00 2001
From: Florian Angerer <florian.angerer@oracle.com>
Date: Mon, 28 Aug 2017 12:59:54 +0200
Subject: [PATCH] Fix: Initialization of eval threads already accesses multi
 slots.

---
 .../r/nodes/builtin/fastr/FastRContext.java   | 20 ++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRContext.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRContext.java
index 1fec8cd3b2..08dc511069 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRContext.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRContext.java
@@ -140,16 +140,26 @@ public class FastRContext {
             EvalThread[] threads = new EvalThread[length];
             int[] data = new int[length];
             int[] multiSlotIndices = new int[length];
+
+            // first, create context infos
+            ChildContextInfo[] childContextInfos = new ChildContextInfo[length];
             for (int i = 0; i < length; i++) {
-                ChildContextInfo info = createContextInfo(contextKind);
-                threads[i] = new EvalThread(RContext.getInstance().threads, info, RSource.fromTextInternalInvisible(exprs.getDataAt(i % exprs.getLength()), RSource.Internal.CONTEXT_EVAL),
-                                FastROptions.SpawnUsesPolyglot.getBooleanValue());
-                data[i] = info.getId();
-                multiSlotIndices[i] = info.getMultiSlotInd();
+                childContextInfos[i] = createContextInfo(contextKind);
+                data[i] = childContextInfos[i].getId();
+                multiSlotIndices[i] = childContextInfos[i].getMultiSlotInd();
             }
+
+            // convert shared slots to multi slots
             if (contextKind == ContextKind.SHARE_ALL) {
                 REnvironment.convertSearchpathToMultiSlot(multiSlotIndices);
             }
+
+            // create eval threads which may already set values to shared slots
+            for (int i = 0; i < length; i++) {
+                threads[i] = new EvalThread(RContext.getInstance().threads, childContextInfos[i],
+                                RSource.fromTextInternalInvisible(exprs.getDataAt(i % exprs.getLength()), RSource.Internal.CONTEXT_EVAL),
+                                FastROptions.SpawnUsesPolyglot.getBooleanValue());
+            }
             for (int i = 0; i < length; i++) {
                 threads[i].start();
             }
-- 
GitLab