From 0fee2c2961dabfc8f1a4180964868e69b18a07ba Mon Sep 17 00:00:00 2001
From: Lukas Stadler <lukas.stadler@oracle.com>
Date: Tue, 3 May 2016 14:11:45 +0200
Subject: [PATCH] unify materializeNonShared and getNonShared

---
 .../truffle/r/nodes/builtin/base/UpdateAttr.java  |  4 ++--
 .../r/nodes/builtin/base/UpdateAttributes.java    |  4 ++--
 .../truffle/r/nodes/builtin/base/UpdateClass.java |  6 +++---
 .../truffle/r/nodes/builtin/base/UpdateDim.java   |  4 ++--
 .../r/nodes/builtin/base/UpdateDimNames.java      |  4 ++--
 .../r/nodes/builtin/base/UpdateLevels.java        |  4 ++--
 .../truffle/r/nodes/builtin/base/UpdateNames.java |  4 ++--
 .../r/nodes/builtin/base/UpdateOldClass.java      |  4 ++--
 .../truffle/r/nodes/unary/GetNonSharedNode.java   |  3 ++-
 .../truffle/r/runtime/conn/ConnectionSupport.java |  2 +-
 .../truffle/r/runtime/conn/RConnection.java       |  2 +-
 .../truffle/r/runtime/data/RExpression.java       |  6 ------
 .../oracle/truffle/r/runtime/data/RLanguage.java  |  2 +-
 .../oracle/truffle/r/runtime/data/RPairList.java  |  2 +-
 .../truffle/r/runtime/data/RScalarVector.java     |  4 ++--
 .../oracle/truffle/r/runtime/data/RSequence.java  |  5 ++---
 .../oracle/truffle/r/runtime/data/RShareable.java |  4 ++--
 .../r/runtime/data/RSharingAttributeStorage.java  |  2 +-
 .../oracle/truffle/r/runtime/data/RVector.java    |  5 -----
 .../r/runtime/data/closures/RToVectorClosure.java | 15 ++++++++-------
 .../r/runtime/data/model/RAbstractContainer.java  |  2 +-
 21 files changed, 39 insertions(+), 49 deletions(-)

diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateAttr.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateAttr.java
index 638946ec85..d7d74400b2 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateAttr.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateAttr.java
@@ -122,7 +122,7 @@ public abstract class UpdateAttr extends RInvisibleBuiltinNode {
     protected RAbstractContainer updateAttr(RAbstractContainer container, String name, RNull value) {
         controlVisibility();
         String internedName = intern(name);
-        RAbstractContainer result = container.materializeNonShared();
+        RAbstractContainer result = (RAbstractContainer) container.getNonShared();
         // the name is interned, so identity comparison is sufficient
         if (internedName == RRuntime.DIM_ATTR_KEY) {
             result.setDimensions(null);
@@ -155,7 +155,7 @@ public abstract class UpdateAttr extends RInvisibleBuiltinNode {
     protected RAbstractContainer updateAttr(RAbstractContainer container, String name, Object value) {
         controlVisibility();
         String internedName = intern(name);
-        RAbstractContainer result = container.materializeNonShared();
+        RAbstractContainer result = (RAbstractContainer) container.getNonShared();
         // the name is interned, so identity comparison is sufficient
         if (internedName == RRuntime.DIM_ATTR_KEY) {
             RAbstractIntVector dimsVector = castInteger(castVector(value));
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateAttributes.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateAttributes.java
index b17d4c24aa..90d04224e4 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateAttributes.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateAttributes.java
@@ -98,7 +98,7 @@ public abstract class UpdateAttributes extends RInvisibleBuiltinNode {
     @Specialization
     protected RAbstractVector updateAttributes(RAbstractVector abstractVector, @SuppressWarnings("unused") RNull list) {
         controlVisibility();
-        RAbstractVector resultVector = (RAbstractVector) abstractVector.materializeNonShared();
+        RAbstractVector resultVector = (RAbstractVector) abstractVector.getNonShared();
         resultVector.resetAllAttributes(true);
         return resultVector;
     }
@@ -111,7 +111,7 @@ public abstract class UpdateAttributes extends RInvisibleBuiltinNode {
             throw RError.error(this, RError.Message.ATTRIBUTES_NAMED);
         }
         RStringVector listNames = (RStringVector) listNamesObject;
-        RAbstractContainer result = container.materializeNonShared();
+        RAbstractContainer result = (RAbstractContainer) container.getNonShared();
         if (numAttributesProfile.profile(list.getLength() == 0)) {
             result.resetAllAttributes(true);
         } else {
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateClass.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateClass.java
index cd33324c69..518f22a57c 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateClass.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateClass.java
@@ -76,7 +76,7 @@ public abstract class UpdateClass extends RBuiltinNode {
     protected Object setClass(RAbstractContainer arg, @SuppressWarnings("unused") RNull className) {
         controlVisibility();
 
-        RAbstractContainer result = arg.materializeNonShared();
+        RAbstractContainer result = (RAbstractContainer) arg.getNonShared();
         return result.setClassAttr(null, false);
     }
 
@@ -111,7 +111,7 @@ public abstract class UpdateClass extends RBuiltinNode {
                 return setClass((RAbstractVector) result, RNull.instance);
             }
         }
-        RAbstractContainer result = arg.materializeNonShared();
+        RAbstractContainer result = (RAbstractContainer) arg.getNonShared();
         if (result instanceof RAbstractVector) {
             RAbstractVector resultVector = (RAbstractVector) result;
             if (RType.Matrix.getName().equals(className)) {
@@ -138,7 +138,7 @@ public abstract class UpdateClass extends RBuiltinNode {
     @TruffleBoundary
     protected Object setClass(RAbstractContainer arg, RStringVector className) {
         controlVisibility();
-        RAbstractContainer result = arg.materializeNonShared();
+        RAbstractContainer result = (RAbstractContainer) arg.getNonShared();
         return result.setClassAttr(className, false);
     }
 
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateDim.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateDim.java
index f60fdc88af..920f33a652 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateDim.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateDim.java
@@ -52,7 +52,7 @@ public abstract class UpdateDim extends RInvisibleBuiltinNode {
     @Specialization
     protected RAbstractVector updateDim(RAbstractVector vector, @SuppressWarnings("unused") RNull dimensions) {
         controlVisibility();
-        RVector result = (RVector) vector.materializeNonShared();
+        RVector result = (RVector) vector.getNonShared();
         result.resetDimensions(null);
         return result;
     }
@@ -66,7 +66,7 @@ public abstract class UpdateDim extends RInvisibleBuiltinNode {
         }
         int[] dimsData = castInteger(dimensions).materialize().getDataCopy();
         RVector.verifyDimensions(vector.getLength(), dimsData, this);
-        RVector result = (RVector) vector.materializeNonShared();
+        RVector result = (RVector) vector.getNonShared();
         result.resetDimensions(dimsData);
         return result;
     }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateDimNames.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateDimNames.java
index 56b3c8c2b8..5e604e8492 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateDimNames.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateDimNames.java
@@ -94,7 +94,7 @@ public abstract class UpdateDimNames extends RInvisibleBuiltinNode {
     protected RAbstractContainer updateDimnamesNull(RAbstractContainer container, @SuppressWarnings("unused") RNull list, //
                     @Cached("create(DIMNAMES_ATTR_KEY)") RemoveAttributeNode remove) {
         controlVisibility();
-        RAbstractContainer result = container.materializeNonShared();
+        RAbstractContainer result = (RAbstractContainer) container.getNonShared();
         if (isRVectorProfile.profile(container instanceof RVector)) {
             RVector vector = (RVector) container;
             if (vector.getInternalDimNames() != null) {
@@ -117,7 +117,7 @@ public abstract class UpdateDimNames extends RInvisibleBuiltinNode {
     protected RAbstractContainer updateDimnames(RAbstractContainer container, RList list, //
                     @Cached("create(DIMNAMES_ATTR_KEY)") PutAttributeNode put) {
         controlVisibility();
-        RAbstractContainer result = container.materializeNonShared();
+        RAbstractContainer result = (RAbstractContainer) container.getNonShared();
         setDimNames(result, convertToListOfStrings(list), put);
         return result;
     }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateLevels.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateLevels.java
index 0d3d387ae3..f1c8b0c90c 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateLevels.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateLevels.java
@@ -43,7 +43,7 @@ public abstract class UpdateLevels extends RInvisibleBuiltinNode {
     @Specialization
     protected RAbstractVector updateLevels(RAbstractVector vector, @SuppressWarnings("unused") RNull levels) {
         controlVisibility();
-        RVector v = (RVector) vector.materializeNonShared();
+        RVector v = (RVector) vector.getNonShared();
         v.removeAttr(attrProfiles, RRuntime.LEVELS_ATTR_KEY);
         return v;
     }
@@ -51,7 +51,7 @@ public abstract class UpdateLevels extends RInvisibleBuiltinNode {
     @Specialization(guards = "levelsNotNull(levels)")
     protected RAbstractVector updateLevels(RAbstractVector vector, Object levels) {
         controlVisibility();
-        RVector v = (RVector) vector.materializeNonShared();
+        RVector v = (RVector) vector.getNonShared();
         v.setAttr(RRuntime.LEVELS_ATTR_KEY, castVector(levels));
         return v;
     }
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateNames.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateNames.java
index 1ff67547bc..4ff586756d 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateNames.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateNames.java
@@ -58,7 +58,7 @@ public abstract class UpdateNames extends RInvisibleBuiltinNode {
         controlVisibility();
         Object newNames = castString(names);
         if (newNames == RNull.instance) {
-            RAbstractContainer result = container.materializeNonShared();
+            RAbstractContainer result = (RAbstractContainer) container.getNonShared();
             result.setNames(null);
             return result;
         }
@@ -69,7 +69,7 @@ public abstract class UpdateNames extends RInvisibleBuiltinNode {
         } else {
             stringVector = (RStringVector) ((RAbstractVector) newNames).materialize();
         }
-        RAbstractContainer result = container.materializeNonShared();
+        RAbstractContainer result = (RAbstractContainer) container.getNonShared();
         if (stringVector.getLength() < result.getLength()) {
             stringVector = stringVector.copyResized(result.getLength(), true);
         } else if (stringVector == container) {
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateOldClass.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateOldClass.java
index 2e9e238247..ced6ef86dc 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateOldClass.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateOldClass.java
@@ -73,7 +73,7 @@ public abstract class UpdateOldClass extends RInvisibleBuiltinNode {
     @TruffleBoundary
     protected Object setOldClass(RAbstractContainer arg, RStringVector className) {
         controlVisibility();
-        RAbstractContainer result = arg.materializeNonShared();
+        RAbstractContainer result = (RAbstractContainer) arg.getNonShared();
         return result.setClassAttr(className, false);
     }
 
@@ -81,7 +81,7 @@ public abstract class UpdateOldClass extends RInvisibleBuiltinNode {
     @TruffleBoundary
     protected Object setOldClass(RAbstractContainer arg, @SuppressWarnings("unused") RNull className) {
         controlVisibility();
-        RAbstractContainer result = arg.materializeNonShared();
+        RAbstractContainer result = (RAbstractContainer) arg.getNonShared();
         return result.setClassAttr(null, false);
     }
 
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/GetNonSharedNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/GetNonSharedNode.java
index 6c0435a233..4166d6769e 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/GetNonSharedNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/GetNonSharedNode.java
@@ -30,6 +30,7 @@ import com.oracle.truffle.api.source.SourceSection;
 import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.RSerialize;
 import com.oracle.truffle.r.runtime.data.RShareable;
+import com.oracle.truffle.r.runtime.data.RTypedValue;
 import com.oracle.truffle.r.runtime.env.REnvironment;
 import com.oracle.truffle.r.runtime.nodes.RNode;
 import com.oracle.truffle.r.runtime.nodes.RSyntaxNode;
@@ -41,7 +42,7 @@ public abstract class GetNonSharedNode extends RNode implements RSyntaxNode {
     private final ValueProfile shareableTypeProfile = ValueProfile.createClassProfile();
 
     @Specialization
-    protected RShareable getNonShared(RShareable shareable) {
+    protected RTypedValue getNonShared(RShareable shareable) {
         return shareableTypeProfile.profile(shareable).getNonShared();
     }
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/ConnectionSupport.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/ConnectionSupport.java
index 770f37352d..58a135e705 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/ConnectionSupport.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/ConnectionSupport.java
@@ -346,7 +346,7 @@ public class ConnectionSupport {
 
     // TODO implement all open modes
 
-    public static class InvalidConnection extends RConnection {
+    public static final class InvalidConnection extends RConnection {
 
         public static final InvalidConnection instance = new InvalidConnection();
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/RConnection.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/RConnection.java
index 62dfc59351..10f6982922 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/RConnection.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/RConnection.java
@@ -370,7 +370,7 @@ public abstract class RConnection extends RAttributeStorage implements RTypedVal
     }
 
     @Override
-    public RAbstractContainer materializeNonShared() {
+    public RTypedValue getNonShared() {
         return this;
     }
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RExpression.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RExpression.java
index a365680d20..c3bcbb9421 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RExpression.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RExpression.java
@@ -115,12 +115,6 @@ public class RExpression implements RShareable, RAbstractContainer {
         return RExpression.class;
     }
 
-    @Override
-    public RExpression materializeNonShared() {
-        RVector d = data.materializeNonShared();
-        return data != d ? RDataFactory.createExpression((RList) d) : this;
-    }
-
     @Override
     public Object getDataAtAsObject(int index) {
         return data.getDataAtAsObject(index);
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLanguage.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLanguage.java
index a053031e4e..46b363d3d6 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLanguage.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLanguage.java
@@ -128,7 +128,7 @@ public class RLanguage extends RSharingAttributeStorage implements RAbstractCont
     }
 
     @Override
-    public RLanguage materializeNonShared() {
+    public RLanguage getNonShared() {
         return (RLanguage) getNonShared();
     }
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPairList.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPairList.java
index b265557d72..bc3fe35363 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPairList.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPairList.java
@@ -236,7 +236,7 @@ public class RPairList extends RAttributeStorage implements RAbstractContainer {
     }
 
     @Override
-    public RVector materializeNonShared() {
+    public RVector getNonShared() {
         RInternalError.shouldNotReachHere();
         return null;
     }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RScalarVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RScalarVector.java
index e494a76e15..6d7ddced92 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RScalarVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RScalarVector.java
@@ -81,8 +81,8 @@ public abstract class RScalarVector extends RScalar implements RAbstractVector {
     }
 
     @Override
-    public RAbstractContainer materializeNonShared() {
-        return materialize().materializeNonShared();
+    public RTypedValue getNonShared() {
+        return materialize().getNonShared();
     }
 
     @Override
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSequence.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSequence.java
index bac78060ac..20b9d77fca 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSequence.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSequence.java
@@ -169,9 +169,8 @@ public abstract class RSequence implements RAbstractVector {
     }
 
     @Override
-    public final RVector materializeNonShared() {
-        RVector resultVector = this.materialize().materializeNonShared();
-        return resultVector;
+    public final RTypedValue getNonShared() {
+        return materialize().getNonShared();
     }
 
     @Override
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RShareable.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RShareable.java
index 029e4443be..2e008ca8f5 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RShareable.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RShareable.java
@@ -22,7 +22,7 @@
  */
 package com.oracle.truffle.r.runtime.data;
 
-public interface RShareable {
+public interface RShareable extends RTypedValue {
 
     // SHARED_PERMANENT_VAL describes both overflow value and a value that can be set to prevent
     // further updates to ref count (for sharing between different threads) - can potentially be
@@ -48,6 +48,6 @@ public interface RShareable {
 
     void makeSharedPermanent();
 
-    RShareable getNonShared();
+    RTypedValue getNonShared();
 
 }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSharingAttributeStorage.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSharingAttributeStorage.java
index a915cdb26f..f87a82b76a 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSharingAttributeStorage.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSharingAttributeStorage.java
@@ -61,7 +61,7 @@ public abstract class RSharingAttributeStorage extends RAttributeStorage impleme
     }
 
     @Override
-    public RShareable getNonShared() {
+    public RTypedValue getNonShared() {
         if (isShared()) {
             RShareable res = copy();
             assert res.isTemporary();
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RVector.java
index 9292adf55f..d1984cecaa 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RVector.java
@@ -788,11 +788,6 @@ public abstract class RVector extends RSharingAttributeStorage implements RShare
         return implicitClassHeader;
     }
 
-    @Override
-    public RVector materializeNonShared() {
-        return (RVector) getNonShared();
-    }
-
     @Override
     public final RShareable materializeToShareable() {
         return materialize();
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToVectorClosure.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToVectorClosure.java
index 21952499cc..98c8a9b3b5 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToVectorClosure.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToVectorClosure.java
@@ -27,6 +27,7 @@ import com.oracle.truffle.r.runtime.data.RAttributes;
 import com.oracle.truffle.r.runtime.data.RList;
 import com.oracle.truffle.r.runtime.data.RShareable;
 import com.oracle.truffle.r.runtime.data.RStringVector;
+import com.oracle.truffle.r.runtime.data.RTypedValue;
 import com.oracle.truffle.r.runtime.data.RVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractContainer;
 import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
@@ -45,7 +46,7 @@ abstract class RToVectorClosure implements RAbstractVector {
     }
 
     @Override
-    public Void getInternalStore() {
+    public final Void getInternalStore() {
         return null;
     }
 
@@ -164,7 +165,7 @@ abstract class RToVectorClosure implements RAbstractVector {
     }
 
     @Override
-    public RStringVector getImplicitClass() {
+    public final RStringVector getImplicitClass() {
         return vector.getImplicitClass();
     }
 
@@ -174,8 +175,8 @@ abstract class RToVectorClosure implements RAbstractVector {
     }
 
     @Override
-    public final RAbstractVector materializeNonShared() {
-        return (RAbstractVector) vector.materializeNonShared();
+    public final RTypedValue getNonShared() {
+        return vector.getNonShared();
     }
 
     @Override
@@ -184,17 +185,17 @@ abstract class RToVectorClosure implements RAbstractVector {
     }
 
     @Override
-    public int getGPBits() {
+    public final int getGPBits() {
         return vector.getGPBits();
     }
 
     @Override
-    public void setGPBits(int value) {
+    public final void setGPBits(int value) {
         vector.setGPBits(value);
     }
 
     @Override
-    public boolean isS4() {
+    public final boolean isS4() {
         return false;
     }
 }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractContainer.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractContainer.java
index ebe23dd5ce..befd4e8678 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractContainer.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractContainer.java
@@ -45,7 +45,7 @@ public interface RAbstractContainer extends RAttributable, RTypedValue {
 
     Class<?> getElementClass();
 
-    RAbstractContainer materializeNonShared();
+    RTypedValue getNonShared();
 
     RShareable materializeToShareable();
 
-- 
GitLab