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 42af29b00154e6f9d0d42356bbc46b7345efb9cf..9dcc170b841a3627d3d383a9122823f5e6dc15f8 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 4f119f7a18d955d6c68694a0825f55211779d4b1..e71e6060a33c7377ab27cadcb99ab23d95b9043a 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 a1905a771a8c5eee723c38df14953c62796c8497..a1447c00d9c472a11467a1a0189abf7c88da08ba 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 9daa82af3e5143b1da79fad18d38b3804ba3ccfc..dd6ba6f6a16f2c99731e4d0a9f662530dc94afbb 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);