From 6e6468730f38103eda4a8c59c583c3db6845527f Mon Sep 17 00:00:00 2001
From: Lukas Stadler <lukas.stadler@oracle.com>
Date: Fri, 16 Feb 2018 15:09:00 +0100
Subject: [PATCH] use VectorFactory in cast nodes

---
 .../truffle/r/nodes/unary/CastBaseNode.java   | 39 ++++++++++++-------
 .../r/nodes/unary/CastComplexNode.java        | 10 ++---
 .../truffle/r/nodes/unary/CastDoubleNode.java |  9 ++---
 .../r/nodes/unary/CastExpressionNode.java     | 11 +++---
 .../r/nodes/unary/CastIntegerNode.java        |  8 ++--
 .../truffle/r/nodes/unary/CastListNode.java   | 22 +++++------
 .../r/nodes/unary/CastLogicalNode.java        |  7 ++--
 .../truffle/r/nodes/unary/CastRawNode.java    | 10 ++---
 .../truffle/r/nodes/unary/CastStringNode.java |  6 +--
 .../truffle/r/nodes/unary/CastSymbolNode.java |  5 +--
 .../truffle/r/nodes/unary/PrecedenceNode.java |  5 ++-
 11 files changed, 63 insertions(+), 69 deletions(-)

diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastBaseNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastBaseNode.java
index 8216976903..50b122a47f 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastBaseNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastBaseNode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -32,13 +32,13 @@ import com.oracle.truffle.api.profiles.ValueProfile;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimAttributeNode;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetDimNamesAttributeNode;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode;
-import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.SetDimNamesAttributeNode;
 import com.oracle.truffle.r.runtime.NullProfile;
 import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RError.Message;
 import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.RType;
+import com.oracle.truffle.r.runtime.data.RDataFactory.VectorFactory;
 import com.oracle.truffle.r.runtime.data.RList;
 import com.oracle.truffle.r.runtime.data.RNull;
 import com.oracle.truffle.r.runtime.data.RStringVector;
@@ -50,16 +50,17 @@ import com.oracle.truffle.r.runtime.env.REnvironment;
 public abstract class CastBaseNode extends CastNode {
 
     private final BranchProfile listCoercionErrorBranch = BranchProfile.create();
-    private final ConditionProfile hasDimNamesProfile = ConditionProfile.createBinaryProfile();
     private final NullProfile hasDimensionsProfile = NullProfile.create();
     private final NullProfile hasNamesProfile = NullProfile.create();
+    private final NullProfile hasDimNamesProfile = NullProfile.create();
     private final ValueProfile reuseClassProfile;
 
     @Child private GetNamesAttributeNode getNamesNode = GetNamesAttributeNode.create();
     @Child private GetDimAttributeNode getDimNode;
-    @Child private SetDimNamesAttributeNode setDimNamesNode;
     @Child private GetDimNamesAttributeNode getDimNamesNode;
 
+    @Child private VectorFactory factory;
+
     private final boolean preserveNames;
     private final boolean preserveDimensions;
     private final boolean preserveAttributes;
@@ -87,13 +88,18 @@ public abstract class CastBaseNode extends CastNode {
         this.preserveDimensions = preserveDimensions;
         this.preserveAttributes = preserveAttributes;
         this.forRFFI = forRFFI;
-        if (preserveDimensions) {
-            getDimNamesNode = GetDimNamesAttributeNode.create();
-        }
         this.useClosure = useClosure;
         reuseClassProfile = useClosure ? ValueProfile.createClassProfile() : null;
     }
 
+    protected final VectorFactory factory() {
+        if (factory == null) {
+            CompilerDirectives.transferToInterpreterAndInvalidate();
+            factory = insert(VectorFactory.create());
+        }
+        return factory;
+    }
+
     public final boolean preserveNames() {
         return preserveNames;
     }
@@ -135,22 +141,25 @@ public abstract class CastBaseNode extends CastNode {
 
     protected RStringVector getPreservedNames(RAbstractContainer operand) {
         if (preserveNames()) {
+            if (getNamesNode == null) {
+                CompilerDirectives.transferToInterpreterAndInvalidate();
+                getNamesNode = insert(GetNamesAttributeNode.create());
+            }
             return hasNamesProfile.profile(getNamesNode.getNames(operand));
         } else {
             return null;
         }
     }
 
-    protected void preserveDimensionNames(RAbstractContainer operand, RAbstractContainer ret) {
+    protected RList getPreservedDimNames(RAbstractContainer operand) {
         if (preserveDimensions()) {
-            RList dimNames = getDimNamesNode.getDimNames(operand);
-            if (hasDimNamesProfile.profile(dimNames != null)) {
-                if (setDimNamesNode == null) {
-                    CompilerDirectives.transferToInterpreterAndInvalidate();
-                    setDimNamesNode = insert(SetDimNamesAttributeNode.create());
-                }
-                setDimNamesNode.setDimNames(ret, (RList) dimNames.copy());
+            if (getDimNamesNode == null) {
+                CompilerDirectives.transferToInterpreterAndInvalidate();
+                getDimNamesNode = insert(GetDimNamesAttributeNode.create());
             }
+            return hasDimNamesProfile.profile(getDimNamesNode.getDimNames(operand));
+        } else {
+            return null;
         }
     }
 
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastComplexNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastComplexNode.java
index 2d090b4a65..c8e3f629d6 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastComplexNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastComplexNode.java
@@ -123,7 +123,7 @@ public abstract class CastComplexNode extends CastBaseNode {
 
     @Specialization
     protected RComplex doRaw(RRaw operand) {
-        return RDataFactory.createComplex(operand.getValue(), 0);
+        return factory().createComplex(operand.getValue(), 0);
     }
 
     @Specialization
@@ -151,8 +151,7 @@ public abstract class CastComplexNode extends CastBaseNode {
             ddata[index + 1] = complexValue.getImaginaryPart();
             seenNA = seenNA || naProfile.isNA(complexValue);
         }
-        RComplexVector ret = RDataFactory.createComplexVector(ddata, !seenNA, getPreservedDimensions(operand), getPreservedNames(operand));
-        preserveDimensionNames(operand, ret);
+        RComplexVector ret = factory().createComplexVector(ddata, !seenNA, getPreservedDimensions(operand), getPreservedNames(operand), getPreservedDimNames(operand));
         if (preserveRegAttributes()) {
             ret.copyRegAttributesFrom(operand);
         }
@@ -204,8 +203,7 @@ public abstract class CastComplexNode extends CastBaseNode {
         if (warning) {
             warning(RError.Message.NA_INTRODUCED_COERCION);
         }
-        RComplexVector ret = RDataFactory.createComplexVector(ddata, !seenNA, getPreservedDimensions(operand), getPreservedNames(operand));
-        preserveDimensionNames(operand, ret);
+        RComplexVector ret = factory().createComplexVector(ddata, !seenNA, getPreservedDimensions(operand), getPreservedNames(operand), getPreservedDimNames(operand));
         if (preserveRegAttributes()) {
             ret.copyRegAttributesFrom(operand);
         }
@@ -259,7 +257,7 @@ public abstract class CastComplexNode extends CastBaseNode {
                 }
             }
         }
-        RComplexVector ret = RDataFactory.createComplexVector(result, !seenNA, getPreservedDimensions(list), getPreservedNames(list));
+        RComplexVector ret = factory().createComplexVector(result, !seenNA, getPreservedDimensions(list), getPreservedNames(list), null);
         if (preserveRegAttributes()) {
             ret.copyRegAttributesFrom(list);
         }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleNode.java
index 25f98c0075..a1da4842ac 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleNode.java
@@ -36,7 +36,6 @@ import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.RType;
 import com.oracle.truffle.r.runtime.data.RComplex;
-import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RDoubleVector;
 import com.oracle.truffle.r.runtime.data.RList;
 import com.oracle.truffle.r.runtime.data.RPairList;
@@ -73,8 +72,7 @@ public abstract class CastDoubleNode extends CastDoubleBaseNode {
     }
 
     private RDoubleVector vectorCopy(RAbstractContainer operand, double[] data, boolean isComplete) {
-        RDoubleVector ret = RDataFactory.createDoubleVector(data, isComplete, getPreservedDimensions(operand), getPreservedNames(operand));
-        preserveDimensionNames(operand, ret);
+        RDoubleVector ret = factory().createDoubleVector(data, isComplete, getPreservedDimensions(operand), getPreservedNames(operand), getPreservedDimNames(operand));
         if (preserveRegAttributes()) {
             ret.copyRegAttributesFrom(operand);
         }
@@ -152,8 +150,7 @@ public abstract class CastDoubleNode extends CastDoubleBaseNode {
         if (warning) {
             warning(RError.Message.NA_INTRODUCED_COERCION);
         }
-        RDoubleVector ret = RDataFactory.createDoubleVector(ddata, !seenNA, getPreservedDimensions(operand), getPreservedNames(operand));
-        preserveDimensionNames(operand, ret);
+        RDoubleVector ret = factory().createDoubleVector(ddata, !seenNA, getPreservedDimensions(operand), getPreservedNames(operand), getPreservedDimNames(operand));
         if (preserveRegAttributes()) {
             ret.copyRegAttributesFrom(operand);
         }
@@ -216,7 +213,7 @@ public abstract class CastDoubleNode extends CastDoubleBaseNode {
                 }
             }
         }
-        RDoubleVector ret = RDataFactory.createDoubleVector(result, !seenNA, getPreservedDimensions(list), getPreservedNames(list));
+        RDoubleVector ret = factory().createDoubleVector(result, !seenNA, getPreservedDimensions(list), getPreservedNames(list), null);
         if (preserveRegAttributes()) {
             ret.copyRegAttributesFrom(list);
         }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastExpressionNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastExpressionNode.java
index c426860c0f..61d97bf3b4 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastExpressionNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastExpressionNode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,7 +27,6 @@ import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode;
 import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RType;
-import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RExpression;
 import com.oracle.truffle.r.runtime.data.RFunction;
 import com.oracle.truffle.r.runtime.data.RList;
@@ -98,14 +97,14 @@ public abstract class CastExpressionNode extends CastBaseNode {
         if (obj instanceof RList) {
             RList list = (RList) obj;
             // TODO other attributes
-            return RDataFactory.createExpression(data, getNamesNode.getNames(list));
+            return factory().createExpression(data, getNamesNode.getNames(list));
         } else {
-            return RDataFactory.createExpression(data);
+            return factory().createExpression(data);
         }
     }
 
-    private static RExpression create(Object obj) {
-        return RDataFactory.createExpression(new Object[]{obj});
+    private RExpression create(Object obj) {
+        return factory().createExpression(new Object[]{obj});
     }
 
     /**
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java
index a11b5b0def..27ced1f36b 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java
@@ -34,7 +34,6 @@ import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.RType;
 import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames;
 import com.oracle.truffle.r.runtime.data.RComplex;
-import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RDoubleSequence;
 import com.oracle.truffle.r.runtime.data.RIntSequence;
 import com.oracle.truffle.r.runtime.data.RIntVector;
@@ -82,12 +81,11 @@ public abstract class CastIntegerNode extends CastIntegerBaseNode {
     @Specialization
     protected RIntSequence doDoubleSequence(RDoubleSequence operand) {
         // start and stride cannot be NA so no point checking
-        return RDataFactory.createIntSequence(RRuntime.double2intNoCheck(operand.getStart()), RRuntime.double2intNoCheck(operand.getStride()), operand.getLength());
+        return factory().createIntSequence(RRuntime.double2intNoCheck(operand.getStart()), RRuntime.double2intNoCheck(operand.getStride()), operand.getLength());
     }
 
     private RIntVector vectorCopy(RAbstractVector operand, int[] idata, boolean isComplete) {
-        RIntVector ret = RDataFactory.createIntVector(idata, isComplete, getPreservedDimensions(operand), getPreservedNames(operand));
-        preserveDimensionNames(operand, ret);
+        RIntVector ret = factory().createIntVector(idata, isComplete, getPreservedDimensions(operand), getPreservedNames(operand), getPreservedDimNames(operand));
         if (preserveRegAttributes()) {
             ret.copyRegAttributesFrom(operand);
         }
@@ -224,7 +222,7 @@ public abstract class CastIntegerNode extends CastIntegerBaseNode {
                 }
             }
         }
-        RIntVector ret = RDataFactory.createIntVector(result, !seenNA, getPreservedDimensions(list), getPreservedNames(list));
+        RIntVector ret = factory().createIntVector(result, !seenNA, getPreservedDimensions(list), getPreservedNames(list), null);
         if (preserveRegAttributes()) {
             ret.copyRegAttributesFrom(list);
         }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastListNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastListNode.java
index a84cc5a885..ec0161f873 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastListNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastListNode.java
@@ -30,7 +30,6 @@ import com.oracle.truffle.api.profiles.ValueProfile;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.SetClassAttributeNode;
 import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.RType;
-import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RFunction;
 import com.oracle.truffle.r.runtime.data.RInteropScalar;
 import com.oracle.truffle.r.runtime.data.RList;
@@ -64,17 +63,17 @@ public abstract class CastListNode extends CastBaseNode {
 
     @Specialization
     protected RList doNull(@SuppressWarnings("unused") RNull operand) {
-        return RDataFactory.createList();
+        return factory().createList(new Object[0]);
     }
 
     @Specialization
     protected RList doDouble(double operand) {
-        return RDataFactory.createList(new Object[]{operand});
+        return factory().createList(new Object[]{operand});
     }
 
     @Specialization
     protected RList doInt(int operand) {
-        return RDataFactory.createList(new Object[]{operand});
+        return factory().createList(new Object[]{operand});
     }
 
     @Specialization
@@ -85,8 +84,7 @@ public abstract class CastListNode extends CastBaseNode {
         for (int i = 0; i < data.length; i++) {
             data[i] = profiledOperand.getDataAtAsObject(i);
         }
-        RList ret = RDataFactory.createList(data, getPreservedDimensions(operand), getPreservedNames(operand));
-        preserveDimensionNames(operand, ret);
+        RList ret = factory().createList(data, getPreservedDimensions(operand), getPreservedNames(operand), getPreservedDimNames(operand));
         if (preserveRegAttributes()) {
             ret.copyRegAttributesFrom(operand);
         }
@@ -100,27 +98,27 @@ public abstract class CastListNode extends CastBaseNode {
 
     @Specialization
     protected RList doFunction(RFunction func) {
-        return RDataFactory.createList(new Object[]{func});
+        return factory().createList(new Object[]{func});
     }
 
     @Specialization
     protected RList doEnvironment(REnvironment env) {
-        return RDataFactory.createList(new Object[]{env});
+        return factory().createList(new Object[]{env});
     }
 
     @Specialization
     protected RList doS4Object(RS4Object o) {
-        return RDataFactory.createList(new Object[]{o});
+        return factory().createList(new Object[]{o});
     }
 
     @Specialization
     protected RList doRSymbol(RSymbol s) {
-        return RDataFactory.createList(new Object[]{s});
+        return factory().createList(new Object[]{s});
     }
 
     @Specialization
     protected RList doRInterop(RInteropScalar ri) {
-        return RDataFactory.createList(new Object[]{ri});
+        return factory().createList(new Object[]{ri});
     }
 
     @Specialization(guards = {"isForeignObject(obj)"})
@@ -134,7 +132,7 @@ public abstract class CastListNode extends CastBaseNode {
             }
             return (RList) execute(o);
         }
-        return RDataFactory.createList(new Object[]{obj});
+        return factory().createList(new Object[]{obj});
     }
 
     public static CastListNode create() {
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastLogicalNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastLogicalNode.java
index cc36f7a8d9..406dee86e3 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastLogicalNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastLogicalNode.java
@@ -92,8 +92,7 @@ public abstract class CastLogicalNode extends CastLogicalBaseNode {
     }
 
     private RLogicalVector vectorCopy(RAbstractVector operand, byte[] bdata, boolean isComplete) {
-        RLogicalVector ret = RDataFactory.createLogicalVector(bdata, isComplete, getPreservedDimensions(operand), getPreservedNames(operand));
-        preserveDimensionNames(operand, ret);
+        RLogicalVector ret = factory().createLogicalVector(bdata, isComplete, getPreservedDimensions(operand), getPreservedNames(operand), getPreservedDimNames(operand));
         if (preserveRegAttributes()) {
             ret.copyRegAttributesFrom(operand);
         }
@@ -126,7 +125,7 @@ public abstract class CastLogicalNode extends CastLogicalBaseNode {
     protected RLogicalVector asLogical(RAbstractIntVector factor) {
         byte[] data = new byte[factor.getLength()];
         Arrays.fill(data, RRuntime.LOGICAL_NA);
-        return RDataFactory.createLogicalVector(data, RDataFactory.INCOMPLETE_VECTOR);
+        return factory().createLogicalVector(data, RDataFactory.INCOMPLETE_VECTOR);
     }
 
     @Specialization
@@ -182,7 +181,7 @@ public abstract class CastLogicalNode extends CastLogicalBaseNode {
                 }
             }
         }
-        RLogicalVector ret = RDataFactory.createLogicalVector(result, !seenNA, getPreservedDimensions(list), getPreservedNames(list));
+        RLogicalVector ret = factory().createLogicalVector(result, !seenNA, getPreservedDimensions(list), getPreservedNames(list), null);
         if (preserveRegAttributes()) {
             ret.copyRegAttributesFrom(list);
         }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastRawNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastRawNode.java
index fd644286c9..60c7bcd81d 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastRawNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastRawNode.java
@@ -31,7 +31,6 @@ import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.RType;
 import com.oracle.truffle.r.runtime.data.RComplex;
-import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RMissing;
 import com.oracle.truffle.r.runtime.data.RNull;
 import com.oracle.truffle.r.runtime.data.RPairList;
@@ -97,9 +96,9 @@ public abstract class CastRawNode extends CastBaseNode {
     private RRaw checkOutOfRange(int operand, int intResult) {
         if (intResult != operand) {
             warning(RError.Message.OUT_OF_RANGE);
-            return RDataFactory.createRaw((byte) 0);
+            return factory().createRaw((byte) 0);
         }
-        return RDataFactory.createRaw((byte) intResult);
+        return factory().createRaw((byte) intResult);
     }
 
     @Specialization
@@ -157,8 +156,7 @@ public abstract class CastRawNode extends CastBaseNode {
     }
 
     private RRawVector vectorCopy(RAbstractVector operand, byte[] bdata) {
-        RRawVector ret = RDataFactory.createRawVector(bdata, getPreservedDimensions(operand), getPreservedNames(operand));
-        preserveDimensionNames(operand, ret);
+        RRawVector ret = factory().createRawVector(bdata, getPreservedDimensions(operand), getPreservedNames(operand), getPreservedDimNames(operand));
         if (preserveRegAttributes()) {
             ret.copyRegAttributesFrom(operand);
         }
@@ -307,7 +305,7 @@ public abstract class CastRawNode extends CastBaseNode {
         for (int i = 0; i < length; i++) {
             data[i] = ((RRaw) castRawRecursive(value.getDataAt(i))).getValue();
         }
-        RRawVector result = RDataFactory.createRawVector(data, getPreservedDimensions(value), getPreservedNames(value));
+        RRawVector result = factory().createRawVector(data, getPreservedDimensions(value), getPreservedNames(value), null);
         if (preserveRegAttributes()) {
             result.copyRegAttributesFrom(value);
         }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastStringNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastStringNode.java
index 13ba94958a..7b4a6c6920 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastStringNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastStringNode.java
@@ -32,7 +32,6 @@ import com.oracle.truffle.api.profiles.ValueProfile;
 import com.oracle.truffle.r.runtime.RDeparse;
 import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RRuntime;
-import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RIntSequence;
 import com.oracle.truffle.r.runtime.data.RPairList;
 import com.oracle.truffle.r.runtime.data.RStringSequence;
@@ -64,8 +63,7 @@ public abstract class CastStringNode extends CastStringBaseNode {
     public abstract Object executeString(Object o);
 
     private RStringVector vectorCopy(RAbstractContainer operand, String[] data) {
-        RStringVector ret = RDataFactory.createStringVector(data, operand.isComplete(), getPreservedDimensions(operand), getPreservedNames(operand));
-        preserveDimensionNames(operand, ret);
+        RStringVector ret = factory().createStringVector(data, operand.isComplete(), getPreservedDimensions(operand), getPreservedNames(operand), getPreservedDimNames(operand));
         if (preserveRegAttributes()) {
             ret.copyRegAttributesFrom(operand);
         }
@@ -83,7 +81,7 @@ public abstract class CastStringNode extends CastStringBaseNode {
 
     @Specialization
     protected RStringSequence doIntSequence(RIntSequence vector) {
-        return RDataFactory.createStringSequence("", "", vector.getStart(), vector.getStride(), vector.getLength());
+        return factory().createStringSequence("", "", vector.getStart(), vector.getStride(), vector.getLength());
     }
 
     @Specialization(guards = {"!isIntSequence(operandIn)", "!isRAbstractStringVector(operandIn)"})
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastSymbolNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastSymbolNode.java
index ceec657aa9..c83d19c435 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastSymbolNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastSymbolNode.java
@@ -32,7 +32,6 @@ import com.oracle.truffle.r.runtime.RError.Message;
 import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.RType;
 import com.oracle.truffle.r.runtime.data.RComplex;
-import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RList;
 import com.oracle.truffle.r.runtime.data.RNull;
 import com.oracle.truffle.r.runtime.data.RRaw;
@@ -151,8 +150,8 @@ public abstract class CastSymbolNode extends CastBaseNode {
     }
 
     @TruffleBoundary
-    private static RSymbol asSymbol(String s) {
-        return RDataFactory.createSymbolInterned(s);
+    private RSymbol asSymbol(String s) {
+        return factory().createSymbolInterned(s);
     }
 
     @Override
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/PrecedenceNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/PrecedenceNode.java
index 9207a1a2eb..9faa3dfcb9 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/PrecedenceNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/PrecedenceNode.java
@@ -22,6 +22,9 @@
  */
 package com.oracle.truffle.r.nodes.unary;
 
+import static com.oracle.truffle.r.runtime.interop.ForeignArray2R.isForeignArray;
+import static com.oracle.truffle.r.runtime.interop.ForeignArray2R.isJavaIterable;
+
 import com.oracle.truffle.api.CompilerDirectives;
 import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.api.dsl.Cached;
@@ -61,8 +64,6 @@ import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
 import com.oracle.truffle.r.runtime.env.REnvironment;
 import com.oracle.truffle.r.runtime.interop.Foreign2R;
 import com.oracle.truffle.r.runtime.interop.ForeignArray2R;
-import static com.oracle.truffle.r.runtime.interop.ForeignArray2R.isForeignArray;
-import static com.oracle.truffle.r.runtime.interop.ForeignArray2R.isJavaIterable;
 import com.oracle.truffle.r.runtime.nodes.RBaseNode;
 
 @ImportStatic({Message.class, RRuntime.class, ForeignArray2R.class, Foreign2R.class})
-- 
GitLab