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