From fc094ea97bd372cc3b8fde65b1bf26fcfcc5512d Mon Sep 17 00:00:00 2001
From: Lukas Stadler <lukas.stadler@oracle.com>
Date: Mon, 12 Dec 2016 13:08:13 +0100
Subject: [PATCH] thread safety in CallArgumentsNode

---
 .../r/nodes/function/CallArgumentsNode.java   | 26 +++++++++++++------
 1 file changed, 18 insertions(+), 8 deletions(-)

diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/CallArgumentsNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/CallArgumentsNode.java
index 6359e94caa..818244e964 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/CallArgumentsNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/CallArgumentsNode.java
@@ -161,8 +161,18 @@ public final class CallArgumentsNode extends RBaseNode implements UnmatchedArgum
         return Arguments.create(values, ArgumentsSignature.get(newNames));
     }
 
-    private ArgumentsSignature cachedVarArgsSignature;
-    private ArgumentsSignature cachedResultSignature;
+    private static final class CachedSignature {
+        private final ArgumentsSignature signature;
+        private final ArgumentsSignature resultSignature;
+
+        protected CachedSignature(ArgumentsSignature signature, ArgumentsSignature resultSignature) {
+            this.signature = signature;
+            this.resultSignature = resultSignature;
+        }
+    }
+
+    private CachedSignature cachedVarArgsSignature;
+
     private final BranchProfile regenerateSignatureProfile = BranchProfile.create();
 
     public ArgumentsSignature flattenNames(RArgsValuesAndNames varArgs) {
@@ -170,15 +180,15 @@ public final class CallArgumentsNode extends RBaseNode implements UnmatchedArgum
             return signature;
         }
         ArgumentsSignature varArgsSignature = varArgs.getSignature();
-        if (cachedVarArgsSignature == null) {
+        CachedSignature cached = cachedVarArgsSignature;
+        if (cached == null) {
             CompilerDirectives.transferToInterpreter();
         }
-        if (varArgsSignature == cachedVarArgsSignature) {
-            return cachedResultSignature;
+        if (cached == null || varArgsSignature != cached.signature) {
+            regenerateSignatureProfile.enter();
+            cachedVarArgsSignature = cached = new CachedSignature(varArgsSignature, flattenNamesInternal(varArgsSignature));
         }
-        regenerateSignatureProfile.enter();
-        cachedVarArgsSignature = varArgsSignature;
-        return cachedResultSignature = flattenNamesInternal(varArgsSignature);
+        return cached.resultSignature;
     }
 
     @TruffleBoundary
-- 
GitLab