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