From ed5129f924a0950fdc03574d81343863f462115a Mon Sep 17 00:00:00 2001 From: Florian Angerer <florian.angerer@oracle.com> Date: Tue, 10 Oct 2017 16:54:14 +0200 Subject: [PATCH] Fix race when concurrently initializing builtins. --- .../oracle/truffle/r/nodes/builtin/RBuiltinRootNode.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RBuiltinRootNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RBuiltinRootNode.java index 59f8e13740..379d3db97a 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RBuiltinRootNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/RBuiltinRootNode.java @@ -95,6 +95,11 @@ public final class RBuiltinRootNode extends RRootNode { initialize(); Object[] arguments = new Object[args.length]; for (int i = 0; i < args.length; i++) { + if (args[i] == null) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + args[i] = insert(AccessArgumentNode.create(i)); + args[i].setFormals(call.getFormals()); + } arguments[i] = args[i].execute(frame); } return call.execute(frame, null, new RArgsValuesAndNames(arguments, factory.getSignature()), null); @@ -117,10 +122,6 @@ public final class RBuiltinRootNode extends RRootNode { assert factory.getSignature().getVarArgCount() == 0 || factory.getSignature().getVarArgIndex() == factory.getSignature().getLength() - 1 : "only last argument can be vararg"; } call = insert(new BuiltinCallNode(builtin, factory, formalArguments, null, true)); - for (int i = 0; i < args.length; i++) { - args[i] = insert(AccessArgumentNode.create(i)); - args[i].setFormals(formalArguments); - } } } -- GitLab