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