From fd19434febfd83c905ad1a3db5d1df4b2338ba57 Mon Sep 17 00:00:00 2001
From: Lukas Stadler <lukas.stadler@oracle.com>
Date: Thu, 2 Feb 2017 14:57:36 +0100
Subject: [PATCH] fix missing Node.insert calls and thread safety problems

---
 .../truffle/r/nodes/builtin/base/UpdateSlot.java    | 13 ++++++++++---
 .../r/nodes/builtin/base/foreign/LookupAdapter.java |  6 +++---
 .../access/vector/CachedExtractVectorNode.java      |  2 +-
 .../com/oracle/truffle/r/nodes/objects/AsS4.java    |  2 +-
 4 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateSlot.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateSlot.java
index 42af29b001..9dcc170b84 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateSlot.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateSlot.java
@@ -89,14 +89,21 @@ public abstract class UpdateSlot extends RBuiltinNode {
         if (checkSlotAssignFunction == null) {
             CompilerDirectives.transferToInterpreterAndInvalidate();
             checkSlotAssignFunction = (RFunction) checkAtAssignmentFind.execute(frame);
+        }
+        if (checkAtAssignmentCall == null) {
+            CompilerDirectives.transferToInterpreterAndInvalidate();
             checkAtAssignmentCall = insert(CallRFunctionNode.create(checkSlotAssignFunction.getTarget()));
-            assert objClassHierarchy == null && valClassHierarchy == null;
+        }
+        if (objClassHierarchy == null) {
+            CompilerDirectives.transferToInterpreterAndInvalidate();
             objClassHierarchy = insert(ClassHierarchyNodeGen.create(true, false));
+        }
+        if (valClassHierarchy == null) {
+            CompilerDirectives.transferToInterpreterAndInvalidate();
             valClassHierarchy = insert(ClassHierarchyNodeGen.create(true, false));
-
         }
         RStringVector objClass = objClassHierarchy.execute(object);
-        RStringVector valClass = objClassHierarchy.execute(value);
+        RStringVector valClass = valClassHierarchy.execute(value);
         RFunction currentFunction = (RFunction) checkAtAssignmentFind.execute(frame);
         if (cached.profile(currentFunction == checkSlotAssignFunction)) {
             // TODO: technically, someone could override checkAtAssignment function and access the
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/LookupAdapter.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/LookupAdapter.java
index 4f119f7a18..e71e6060a3 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/LookupAdapter.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/foreign/LookupAdapter.java
@@ -155,15 +155,15 @@ abstract class LookupAdapter extends RBuiltinNode {
         protected Object extractNativeCallInfo(VirtualFrame frame, RList symbol) {
             if (nameExtract == null) {
                 CompilerDirectives.transferToInterpreterAndInvalidate();
-                nameExtract = ExtractVectorNode.create(ElementAccessMode.SUBSCRIPT, true);
+                nameExtract = insert(ExtractVectorNode.create(ElementAccessMode.SUBSCRIPT, true));
             }
             if (addressExtract == null) {
                 CompilerDirectives.transferToInterpreterAndInvalidate();
-                addressExtract = ExtractVectorNode.create(ElementAccessMode.SUBSCRIPT, true);
+                addressExtract = insert(ExtractVectorNode.create(ElementAccessMode.SUBSCRIPT, true));
             }
             if (packageExtract == null) {
                 CompilerDirectives.transferToInterpreterAndInvalidate();
-                packageExtract = ExtractVectorNode.create(ElementAccessMode.SUBSCRIPT, true);
+                packageExtract = insert(ExtractVectorNode.create(ElementAccessMode.SUBSCRIPT, true));
             }
             String name = RRuntime.asString(nameExtract.applyAccessField(frame, symbol, "name"));
             SymbolHandle address = ((RExternalPtr) addressExtract.applyAccessField(frame, symbol, "address")).getAddr();
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedExtractVectorNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedExtractVectorNode.java
index a1905a771a..a1447c00d9 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedExtractVectorNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedExtractVectorNode.java
@@ -273,7 +273,7 @@ final class CachedExtractVectorNode extends CachedVectorNode {
     private Object extract(int dimensionIndex, RAbstractStringVector vector, Object pos, PositionProfile profile) {
         if (extractDimNames == null) {
             CompilerDirectives.transferToInterpreterAndInvalidate();
-            extractDimNames = new ExtractDimNamesNode(numberOfDimensions);
+            extractDimNames = insert(new ExtractDimNamesNode(numberOfDimensions));
         }
         return extractDimNames.extract(dimensionIndex, vector, pos, profile);
     }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/AsS4.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/AsS4.java
index 9daa82af3e..dd6ba6f6a1 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/AsS4.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/objects/AsS4.java
@@ -54,7 +54,7 @@ public abstract class AsS4 extends Node {
             if (complete != 0) {
                 if (getS4DataSlot == null) {
                     CompilerDirectives.transferToInterpreterAndInvalidate();
-                    getS4DataSlot = GetS4DataSlotNodeGen.create(RType.Any);
+                    getS4DataSlot = insert(GetS4DataSlotNodeGen.create(RType.Any));
 
                 }
                 RTypedValue value = getS4DataSlot.executeObject(obj);
-- 
GitLab