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 1fec8cd3b23c6b2290daafc56f8784015f74b0b5..08dc511069deb09535a9407207f0a7d224cb8414 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(); }