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