From 3d53034fb746fb15c103edaa66b1296e957ad17c Mon Sep 17 00:00:00 2001
From: Lukas Stadler <lukas.stadler@oracle.com>
Date: Thu, 16 Nov 2017 11:59:53 +0100
Subject: [PATCH] replace RVector.verify and RAbstractVector.checkCompelteness
 with RAbstractVector.verify

---
 .../com/oracle/truffle/r/engine/REngine.java  |  4 +-
 .../r/library/fastrGrid/DoSetViewPort.java    |  3 +-
 .../r/library/fastrGrid/GridState.java        |  5 +-
 .../r/runtime/data/RComplexVector.java        | 14 +----
 .../truffle/r/runtime/data/RDoubleVector.java | 14 +----
 .../truffle/r/runtime/data/RIntVector.java    | 14 +----
 .../truffle/r/runtime/data/RListBase.java     | 17 +-----
 .../r/runtime/data/RLogicalVector.java        | 14 +----
 .../truffle/r/runtime/data/RRawVector.java    |  7 +--
 .../truffle/r/runtime/data/RScalarVector.java |  5 --
 .../truffle/r/runtime/data/RSequence.java     |  5 --
 .../truffle/r/runtime/data/RStringVector.java | 14 +----
 .../truffle/r/runtime/data/RVector.java       | 20 +------
 .../data/model/RAbstractComplexVector.java    | 11 ----
 .../data/model/RAbstractDoubleVector.java     | 11 ----
 .../data/model/RAbstractIntVector.java        | 11 ----
 .../data/model/RAbstractListBaseVector.java   |  5 --
 .../data/model/RAbstractLogicalVector.java    | 11 ----
 .../data/model/RAbstractRawVector.java        |  5 --
 .../data/model/RAbstractStringVector.java     | 11 ----
 .../r/runtime/data/model/RAbstractVector.java | 32 ++++++++++-
 .../r/runtime/data/nodes/VectorAccess.java    | 53 ++++++++++---------
 .../interop/TruffleObjectConverter.java       |  5 --
 .../truffle/r/runtime/ops/na/NACheck.java     |  1 +
 24 files changed, 75 insertions(+), 217 deletions(-)

diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java
index 621292af80..ce6a668a1d 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java
@@ -658,8 +658,8 @@ final class REngine implements Engine, Engine.Timings {
 
     @TruffleBoundary
     private static boolean checkResult(Object result) {
-        if (FastROptions.CheckResultCompleteness.getBooleanValue() && result instanceof RAbstractVector && ((RAbstractVector) result).isComplete()) {
-            assert ((RAbstractVector) result).checkCompleteness() : "vector: " + result + " is not complete, but isComplete flag is true";
+        if (FastROptions.CheckResultCompleteness.getBooleanValue() && result instanceof RAbstractVector) {
+            assert RAbstractVector.verify((RAbstractVector) result);
         }
         return true;
     }
diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/DoSetViewPort.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/DoSetViewPort.java
index 87ac3095c6..1bdce4fb65 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/DoSetViewPort.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/DoSetViewPort.java
@@ -38,6 +38,7 @@ import com.oracle.truffle.r.runtime.data.RNull;
 import com.oracle.truffle.r.runtime.data.model.RAbstractContainer;
 import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
 import com.oracle.truffle.r.runtime.env.REnvironment;
 
 final class DoSetViewPort {
@@ -74,7 +75,7 @@ final class DoSetViewPort {
         pushedViewPort.setDataAt(ViewPort.PVP_DEVWIDTHCM, scalar(Unit.inchesToCm(currentDevice.getWidth())));
         pushedViewPort.setDataAt(ViewPort.PVP_DEVHEIGHTCM, scalar(Unit.inchesToCm(currentDevice.getHeight())));
 
-        assert pushedViewPort.verify();
+        assert RAbstractVector.verify(pushedViewPort);
         return pushedViewPort;
     }
 
diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridState.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridState.java
index c1cfe4461c..77f8e4293e 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridState.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridState.java
@@ -18,6 +18,7 @@ import com.oracle.truffle.r.library.fastrGrid.device.GridDevice;
 import com.oracle.truffle.r.library.fastrGrid.grDevices.FileDevUtils;
 import com.oracle.truffle.r.runtime.data.RList;
 import com.oracle.truffle.r.runtime.data.RNull;
+import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
 import com.oracle.truffle.r.runtime.env.REnvironment;
 
 public final class GridState {
@@ -104,7 +105,7 @@ public final class GridState {
 
     public void initGPar(GridDevice currentDevice) {
         devState.gpar = GPar.createNew(currentDevice);
-        assert devState.gpar.verify();
+        assert RAbstractVector.verify(devState.gpar);
     }
 
     /**
@@ -143,7 +144,7 @@ public final class GridState {
     }
 
     public void setViewPort(RList viewPort) {
-        assert viewPort.verify();
+        assert RAbstractVector.verify(viewPort);
         devState.viewPort = viewPort;
     }
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RComplexVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RComplexVector.java
index b6ebdd2696..b42c2d6f77 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RComplexVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RComplexVector.java
@@ -45,7 +45,7 @@ public final class RComplexVector extends RVector<double[]> implements RAbstract
         super(complete);
         assert data.length % 2 == 0;
         this.data = data;
-        assert verify();
+        assert RAbstractVector.verify(this);
     }
 
     RComplexVector(double[] data, boolean complete, int[] dims, RStringVector names, RList dimNames) {
@@ -117,18 +117,6 @@ public final class RComplexVector extends RVector<double[]> implements RAbstract
         return NativeDataAccess.getData(this, data, index);
     }
 
-    @Override
-    public boolean verify() {
-        if (isComplete()) {
-            for (int i = 0; i < getLength(); i++) {
-                if (getDataAt(i).isNA()) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
     @Override
     public double[] getDataCopy() {
         if (data != null) {
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDoubleVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDoubleVector.java
index 197d34d214..e37787fd86 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDoubleVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDoubleVector.java
@@ -44,7 +44,7 @@ public final class RDoubleVector extends RVector<double[]> implements RAbstractD
     RDoubleVector(double[] data, boolean complete) {
         super(complete);
         this.data = data;
-        assert verify();
+        assert RAbstractVector.verify(this);
     }
 
     RDoubleVector(double[] data, boolean complete, int[] dims, RStringVector names, RList dimNames) {
@@ -131,18 +131,6 @@ public final class RDoubleVector extends RVector<double[]> implements RAbstractD
         return NativeDataAccess.getDataLength(this, data);
     }
 
-    @Override
-    public boolean verify() {
-        if (isComplete()) {
-            for (int i = 0; i < getLength(); i++) {
-                if (RRuntime.isNA(getDataAt(i))) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
     @Override
     public double getDataAt(int index) {
         return NativeDataAccess.getData(this, data, index);
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RIntVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RIntVector.java
index 450619ae32..17a03fc109 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RIntVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RIntVector.java
@@ -44,7 +44,7 @@ public final class RIntVector extends RVector<int[]> implements RAbstractIntVect
     RIntVector(int[] data, boolean complete) {
         super(complete);
         this.data = data;
-        assert verify();
+        assert RAbstractVector.verify(this);
     }
 
     RIntVector(int[] data, boolean complete, int[] dims, RStringVector names, RList dimNames) {
@@ -134,18 +134,6 @@ public final class RIntVector extends RVector<int[]> implements RAbstractIntVect
         return NativeDataAccess.getDataLength(this, data);
     }
 
-    @Override
-    public boolean verify() {
-        if (isComplete()) {
-            for (int i = 0; i < getLength(); i++) {
-                if (RRuntime.isNA(getDataAt(i))) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
     @Override
     public int[] getDataCopy() {
         if (data != null) {
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RListBase.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RListBase.java
index 504c6d4173..f672375dec 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RListBase.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RListBase.java
@@ -52,7 +52,7 @@ public abstract class RListBase extends RVector<Object[]> implements RAbstractLi
     RListBase(Object[] data) {
         super(false);
         this.data = data;
-        assert verify();
+        assert RAbstractVector.verify(this);
     }
 
     RListBase(Object[] data, int[] dims, RStringVector names, RList dimNames) {
@@ -93,16 +93,6 @@ public abstract class RListBase extends RVector<Object[]> implements RAbstractLi
         ((Object[]) store)[index] = value;
     }
 
-    @Override
-    public final boolean verify() {
-        for (Object item : data) {
-            if (item == null) {
-                return false;
-            }
-        }
-        return true;
-    }
-
     @Override
     public Object[] getInternalManagedData() {
         return data;
@@ -187,11 +177,6 @@ public abstract class RListBase extends RVector<Object[]> implements RAbstractLi
         return newData;
     }
 
-    @Override
-    public final boolean checkCompleteness() {
-        return true;
-    }
-
     @Override
     public final void setElement(int i, Object value) {
         data[i] = value;
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLogicalVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLogicalVector.java
index 048c4df3c3..8e097a7a97 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLogicalVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLogicalVector.java
@@ -44,7 +44,7 @@ public final class RLogicalVector extends RVector<byte[]> implements RAbstractLo
     RLogicalVector(byte[] data, boolean complete) {
         super(complete);
         this.data = data;
-        assert verify();
+        assert RAbstractVector.verify(this);
     }
 
     RLogicalVector(byte[] data, boolean complete, int[] dims, RStringVector names, RList dimNames) {
@@ -136,18 +136,6 @@ public final class RLogicalVector extends RVector<byte[]> implements RAbstractLo
         return NativeDataAccess.getDataLength(this, data);
     }
 
-    @Override
-    public boolean verify() {
-        if (isComplete()) {
-            for (int i = 0; i < getLength(); i++) {
-                if (RRuntime.isNA(getDataAt(i))) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
     @Override
     public byte getDataAt(int index) {
         return NativeDataAccess.getData(this, data, index);
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RRawVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RRawVector.java
index d953368972..8da699c972 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RRawVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RRawVector.java
@@ -43,7 +43,7 @@ public final class RRawVector extends RVector<byte[]> implements RAbstractRawVec
     RRawVector(byte[] data) {
         super(true);
         this.data = data;
-        assert verify();
+        assert RAbstractVector.verify(this);
     }
 
     RRawVector(byte[] data, int[] dims, RStringVector names, RList dimNames) {
@@ -119,11 +119,6 @@ public final class RRawVector extends RVector<byte[]> implements RAbstractRawVec
         return NativeDataAccess.getDataLength(this, data);
     }
 
-    @Override
-    public boolean verify() {
-        return true;
-    }
-
     @Override
     public byte[] getDataCopy() {
         if (data != 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 76ce7c6cfb..314b58af2d 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
@@ -175,9 +175,4 @@ public abstract class RScalarVector extends RScalar implements RAbstractVector {
     public boolean isArray() {
         return false;
     }
-
-    @Override
-    public final boolean checkCompleteness() {
-        return isComplete();
-    }
 }
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 8781775fad..f9a75146fe 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
@@ -65,11 +65,6 @@ public abstract class RSequence implements RAbstractVector {
         return true;
     }
 
-    @Override
-    public boolean checkCompleteness() {
-        return true;
-    }
-
     @Override
     public void setComplete(boolean complete) {
         // sequences are always complete
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RStringVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RStringVector.java
index 682431c382..ee59d39da0 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RStringVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RStringVector.java
@@ -45,7 +45,7 @@ public final class RStringVector extends RVector<String[]> implements RAbstractS
     RStringVector(String[] data, boolean complete) {
         super(complete);
         this.data = data;
-        assert verify();
+        assert RAbstractVector.verify(this);
     }
 
     RStringVector(String[] data, boolean complete, int[] dims, RStringVector names, RList dimNames) {
@@ -127,18 +127,6 @@ public final class RStringVector extends RVector<String[]> implements RAbstractS
         return data;
     }
 
-    @Override
-    public boolean verify() {
-        if (isComplete()) {
-            for (String b : data) {
-                if (b == RRuntime.STRING_NA) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
     @Override
     public String getDataAt(int i) {
         return data[i];
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 47b40aec93..2e2b076c97 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
@@ -31,7 +31,6 @@ import com.oracle.truffle.api.object.DynamicObject;
 import com.oracle.truffle.r.runtime.RError;
 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.SuppressFBWarnings;
 import com.oracle.truffle.r.runtime.data.model.RAbstractContainer;
 import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector;
@@ -59,9 +58,6 @@ import com.oracle.truffle.r.runtime.ops.na.NACheck;
  */
 public abstract class RVector<ArrayT> extends RSharingAttributeStorage implements RAbstractVector, RFFIAccess {
 
-    private static final RStringVector implicitClassHeaderArray = RDataFactory.createStringVector(new String[]{RType.Array.getName()}, true);
-    private static final RStringVector implicitClassHeaderMatrix = RDataFactory.createStringVector(new String[]{RType.Matrix.getName()}, true);
-
     protected boolean complete; // "complete" means: does not contain NAs
 
     protected RVector(boolean complete) {
@@ -140,7 +136,7 @@ public abstract class RVector<ArrayT> extends RSharingAttributeStorage implement
     @Override
     public final void setComplete(boolean complete) {
         this.complete = complete;
-        assert verify();
+        assert RAbstractVector.verify(this);
     }
 
     private void removeAttributeMapping(String key) {
@@ -537,8 +533,6 @@ public abstract class RVector<ArrayT> extends RSharingAttributeStorage implement
 
     protected abstract RVector<ArrayT> internalCopy();
 
-    public abstract boolean verify();
-
     /**
      * Update a data item in the vector. Possibly not as efficient as type-specific methods, but in
      * some cases it likely does not matter (e.g. if used alongside I/O operations).
@@ -751,18 +745,6 @@ public abstract class RVector<ArrayT> extends RSharingAttributeStorage implement
         }
     }
 
-    // As shape of the vector may change at run-time we need to compute
-    // class hierarchy on the fly.
-    protected final RStringVector getClassHierarchyHelper(RStringVector implicitClassHeader) {
-        if (isMatrix()) {
-            return implicitClassHeaderMatrix;
-        }
-        if (isArray()) {
-            return implicitClassHeaderArray;
-        }
-        return implicitClassHeader;
-    }
-
     public static void verifyDimensions(int vectorLength, int[] newDimensions, RBaseNode invokingNode) {
         int length = 1;
         for (int i = 0; i < newDimensions.length; i++) {
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractComplexVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractComplexVector.java
index 4e1a9ef486..930526998f 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractComplexVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractComplexVector.java
@@ -22,7 +22,6 @@
  */
 package com.oracle.truffle.r.runtime.data.model;
 
-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.RComplexVector;
@@ -44,16 +43,6 @@ public interface RAbstractComplexVector extends RAbstractAtomicVector {
         throw new UnsupportedOperationException();
     }
 
-    @Override
-    default boolean checkCompleteness() {
-        for (int i = 0; i < getLength(); i++) {
-            if (RRuntime.isNA(getDataAt(i))) {
-                return false;
-            }
-        }
-        return true;
-    }
-
     @Override
     default RType getRType() {
         return RType.Complex;
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractDoubleVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractDoubleVector.java
index ab8c782a3f..c223c64054 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractDoubleVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractDoubleVector.java
@@ -22,7 +22,6 @@
  */
 package com.oracle.truffle.r.runtime.data.model;
 
-import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.RType;
 import com.oracle.truffle.r.runtime.data.RDoubleVector;
 
@@ -47,16 +46,6 @@ public interface RAbstractDoubleVector extends RAbstractAtomicVector {
     @Override
     RDoubleVector materialize();
 
-    @Override
-    default boolean checkCompleteness() {
-        for (int i = 0; i < getLength(); i++) {
-            if (RRuntime.isNA(getDataAt(i))) {
-                return false;
-            }
-        }
-        return true;
-    }
-
     @Override
     default RType getRType() {
         return RType.Double;
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractIntVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractIntVector.java
index 92401aea21..727f43772b 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractIntVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractIntVector.java
@@ -22,7 +22,6 @@
  */
 package com.oracle.truffle.r.runtime.data.model;
 
-import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.RType;
 import com.oracle.truffle.r.runtime.data.RIntVector;
 
@@ -47,16 +46,6 @@ public interface RAbstractIntVector extends RAbstractAtomicVector {
     @Override
     RIntVector materialize();
 
-    @Override
-    default boolean checkCompleteness() {
-        for (int i = 0; i < getLength(); i++) {
-            if (RRuntime.isNA(getDataAt(i))) {
-                return false;
-            }
-        }
-        return true;
-    }
-
     @Override
     default RType getRType() {
         return RType.Integer;
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractListBaseVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractListBaseVector.java
index ea019fe0a4..e6f99db40e 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractListBaseVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractListBaseVector.java
@@ -35,9 +35,4 @@ public interface RAbstractListBaseVector extends RAbstractVector {
     default void setDataAt(Object store, int index, Object value) {
         throw new UnsupportedOperationException();
     }
-
-    @Override
-    default boolean checkCompleteness() {
-        return true;
-    }
 }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractLogicalVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractLogicalVector.java
index 2a1c503de5..ff0ac5f573 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractLogicalVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractLogicalVector.java
@@ -22,7 +22,6 @@
  */
 package com.oracle.truffle.r.runtime.data.model;
 
-import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.RType;
 import com.oracle.truffle.r.runtime.data.RLogicalVector;
 
@@ -47,16 +46,6 @@ public interface RAbstractLogicalVector extends RAbstractAtomicVector {
     @Override
     RLogicalVector materialize();
 
-    @Override
-    default boolean checkCompleteness() {
-        for (int i = 0; i < getLength(); i++) {
-            if (RRuntime.isNA(getDataAt(i))) {
-                return false;
-            }
-        }
-        return true;
-    }
-
     @Override
     default RType getRType() {
         return RType.Logical;
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractRawVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractRawVector.java
index 53f2c49bd1..f76d746806 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractRawVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractRawVector.java
@@ -43,11 +43,6 @@ public interface RAbstractRawVector extends RAbstractAtomicVector {
     @Override
     RRawVector materialize();
 
-    @Override
-    default boolean checkCompleteness() {
-        return true;
-    }
-
     @Override
     default RType getRType() {
         return RType.Raw;
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractStringVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractStringVector.java
index af93f141e0..c6e5f960d1 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractStringVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractStringVector.java
@@ -22,7 +22,6 @@
  */
 package com.oracle.truffle.r.runtime.data.model;
 
-import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.RType;
 import com.oracle.truffle.r.runtime.data.RStringVector;
 
@@ -47,16 +46,6 @@ public interface RAbstractStringVector extends RAbstractAtomicVector {
     @Override
     RStringVector materialize();
 
-    @Override
-    default boolean checkCompleteness() {
-        for (int i = 0; i < getLength(); i++) {
-            if (RRuntime.isNA(getDataAt(i))) {
-                return false;
-            }
-        }
-        return true;
-    }
-
     @Override
     default RType getRType() {
         return RType.Character;
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractVector.java
index e5fe39c6a8..43039d80a1 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractVector.java
@@ -22,10 +22,13 @@
  */
 package com.oracle.truffle.r.runtime.data.model;
 
+import com.oracle.truffle.api.CompilerAsserts;
 import com.oracle.truffle.api.profiles.ConditionProfile;
 import com.oracle.truffle.r.runtime.RType;
 import com.oracle.truffle.r.runtime.data.MemoryCopyTracer;
 import com.oracle.truffle.r.runtime.data.RVector;
+import com.oracle.truffle.r.runtime.data.nodes.VectorAccess;
+import com.oracle.truffle.r.runtime.data.nodes.VectorAccess.SequentialIterator;
 
 /**
  * When implementing, make sure to invoke related {@link MemoryCopyTracer} methods.
@@ -62,8 +65,6 @@ public interface RAbstractVector extends RAbstractContainer {
 
     boolean isArray();
 
-    boolean checkCompleteness();
-
     /**
      * Casts a vector to another {@link RType}. If a safe cast to the target {@link RType} is not
      * supported <code>null</code> is returned. Instead of materializing the cast for each index the
@@ -99,4 +100,31 @@ public interface RAbstractVector extends RAbstractContainer {
     }
 
     void setComplete(boolean complete);
+
+    /**
+     * Verifies the integrity of the vector, mainly whether a vector that claims to be
+     * {@link #isComplete()} contains NA values.
+     */
+    static boolean verify(RAbstractVector vector) {
+        CompilerAsserts.neverPartOfCompilation();
+        VectorAccess access = vector.slowPathAccess();
+        assert access.getType().isVector();
+        if (!access.getType().isAtomic()) {
+            // check non-atomic vectors for nullness
+            try (SequentialIterator iter = access.access(vector)) {
+                while (access.next(iter)) {
+                    assert access.getListElement(iter) != null : "element " + iter.getIndex() + " of vector " + vector + " is null";
+                }
+            }
+        }
+        if (vector.isComplete()) {
+            // check all vectors for completeness
+            try (SequentialIterator iter = access.access(vector)) {
+                while (access.next(iter)) {
+                    assert !access.isNA(iter) : "element " + iter.getIndex() + " of vector " + vector + " is NA";
+                }
+            }
+        }
+        return true;
+    }
 }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/nodes/VectorAccess.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/nodes/VectorAccess.java
index 27bba89617..faa2dfb98c 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/nodes/VectorAccess.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/nodes/VectorAccess.java
@@ -436,33 +436,38 @@ public abstract class VectorAccess extends Node {
         return isNA(iter.store, index);
     }
 
-    private static final RStringVector TEMPLATE_CHARACTER = RDataFactory.getPermanent().createStringVector(4);
-    private static final RComplexVector TEMPLATE_COMPLEX = RDataFactory.getPermanent().createComplexVector(4);
-    private static final RDoubleVector TEMPLATE_DOUBLE = RDataFactory.getPermanent().createDoubleVector(4);
-    private static final RIntVector TEMPLATE_INTEGER = RDataFactory.getPermanent().createIntVector(4);
-    private static final RList TEMPLATE_LIST = RDataFactory.getPermanent().createList(4);
-    private static final RExpression TEMPLATE_EXPRESSION = RDataFactory.createExpression(4);
-    private static final RLogicalVector TEMPLATE_LOGICAL = RDataFactory.getPermanent().createLogicalVector(4);
-    private static final RRawVector TEMPLATE_RAW = RDataFactory.getPermanent().createRawVector(4);
+    /**
+     * Placed in a separate class to avoid circular dependencies during class initialization.
+     */
+    private static final class Lazy {
+        private static final RStringVector TEMPLATE_CHARACTER = RDataFactory.getPermanent().createStringVector(4);
+        private static final RComplexVector TEMPLATE_COMPLEX = RDataFactory.getPermanent().createComplexVector(4);
+        private static final RDoubleVector TEMPLATE_DOUBLE = RDataFactory.getPermanent().createDoubleVector(4);
+        private static final RIntVector TEMPLATE_INTEGER = RDataFactory.getPermanent().createIntVector(4);
+        private static final RList TEMPLATE_LIST = RDataFactory.getPermanent().createList(4);
+        private static final RExpression TEMPLATE_EXPRESSION = RDataFactory.createExpression(4);
+        private static final RLogicalVector TEMPLATE_LOGICAL = RDataFactory.getPermanent().createLogicalVector(4);
+        private static final RRawVector TEMPLATE_RAW = RDataFactory.getPermanent().createRawVector(4);
+    }
 
     public static VectorAccess createNew(RType type) {
         switch (type) {
             case Character:
-                return TEMPLATE_CHARACTER.access();
+                return Lazy.TEMPLATE_CHARACTER.access();
             case Complex:
-                return TEMPLATE_COMPLEX.access();
+                return Lazy.TEMPLATE_COMPLEX.access();
             case Double:
-                return TEMPLATE_DOUBLE.access();
+                return Lazy.TEMPLATE_DOUBLE.access();
             case Integer:
-                return TEMPLATE_INTEGER.access();
+                return Lazy.TEMPLATE_INTEGER.access();
             case List:
-                return TEMPLATE_LIST.access();
+                return Lazy.TEMPLATE_LIST.access();
             case Expression:
-                return TEMPLATE_EXPRESSION.access();
+                return Lazy.TEMPLATE_EXPRESSION.access();
             case Logical:
-                return TEMPLATE_LOGICAL.access();
+                return Lazy.TEMPLATE_LOGICAL.access();
             case Raw:
-                return TEMPLATE_RAW.access();
+                return Lazy.TEMPLATE_RAW.access();
             case RInteropChar:
             case RInteropFloat:
             case RInteropLong:
@@ -475,21 +480,21 @@ public abstract class VectorAccess extends Node {
     public static VectorAccess createSlowPathNew(RType type) {
         switch (type) {
             case Character:
-                return TEMPLATE_CHARACTER.slowPathAccess();
+                return Lazy.TEMPLATE_CHARACTER.slowPathAccess();
             case Complex:
-                return TEMPLATE_COMPLEX.slowPathAccess();
+                return Lazy.TEMPLATE_COMPLEX.slowPathAccess();
             case Double:
-                return TEMPLATE_DOUBLE.slowPathAccess();
+                return Lazy.TEMPLATE_DOUBLE.slowPathAccess();
             case Integer:
-                return TEMPLATE_INTEGER.slowPathAccess();
+                return Lazy.TEMPLATE_INTEGER.slowPathAccess();
             case List:
-                return TEMPLATE_LIST.slowPathAccess();
+                return Lazy.TEMPLATE_LIST.slowPathAccess();
             case Expression:
-                return TEMPLATE_EXPRESSION.slowPathAccess();
+                return Lazy.TEMPLATE_EXPRESSION.slowPathAccess();
             case Logical:
-                return TEMPLATE_LOGICAL.slowPathAccess();
+                return Lazy.TEMPLATE_LOGICAL.slowPathAccess();
             case Raw:
-                return TEMPLATE_RAW.slowPathAccess();
+                return Lazy.TEMPLATE_RAW.slowPathAccess();
             case RInteropChar:
             case RInteropFloat:
             case RInteropLong:
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/TruffleObjectConverter.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/TruffleObjectConverter.java
index 96de1c9491..798006a13b 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/TruffleObjectConverter.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/TruffleObjectConverter.java
@@ -334,11 +334,6 @@ public final class TruffleObjectConverter {
             return false;
         }
 
-        @Override
-        public boolean checkCompleteness() {
-            throw RInternalError.shouldNotReachHere();
-        }
-
         @Override
         public void setComplete(boolean complete) {
             throw RInternalError.shouldNotReachHere();
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ops/na/NACheck.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ops/na/NACheck.java
index cdb561977c..31ce4935a2 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ops/na/NACheck.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ops/na/NACheck.java
@@ -172,6 +172,7 @@ public final class NACheck {
     }
 
     public boolean checkListElement(Object value) {
+        assert value != null;
         if (state != NO_CHECK && value == RNull.instance) {
             if (state == CHECK_DEOPT) {
                 CompilerDirectives.transferToInterpreterAndInvalidate();
-- 
GitLab