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 621292af809b246636c5832544e47c4257068b49..ce6a668a1d7d4a1758fe6505bcba8cf22fb26b69 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 87ac3095c6689f05bc93ba6516e6732797683790..1bdce4fb65e441e2951aeb3a516f2f6457ea8a23 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 c1cfe4461c2f329c6d60fda68c3fe648c2db9791..77f8e4293eab0192390b1f6552f99e863b47a582 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 b6ebdd269672c73bb84b594f94f946f4d9f4ecaa..b42c2d6f77235b2467e3710f84f488c19e996cd0 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 197d34d2141713847879757bd77ad64346113d36..e37787fd868e78c8d4c0f6523e10dbc293eb290d 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 450619ae328cc4fc651def3802f51f53a819dff1..17a03fc109ffdb06804919ad7e20376ae49d0f08 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 504c6d41736f379caba1fb6be7ba138c84e7909f..f672375dec1e61b7580f9ab933f1256fa133365f 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 048c4df3c36edce15fde06bd28ebb359229ddab3..8e097a7a97a430f0e34301f0e884ae43b44e47d4 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 d953368972fabada7ca055075c28f3a11f174569..8da699c972bc7448564d0178c33d9e7079b15c40 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 76ce7c6cfb8fcebd4d0e36070b7b81c4408df3b8..314b58af2dc90e4c1b3cf5653ab364312bf15f14 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 8781775fadc4f7191059b85344f8b23a3f473692..f9a75146fe100015669b7696d0c07fe4169de795 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 682431c3822ab0148602ee50de5bcbaf029cf72c..ee59d39da0552ac2d5483e9b28c762e12bbbfcf0 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 47b40aec93ea685560373b1f496bf83e0ccfee57..2e2b076c975bf3fb8b2bf88d6582cc73b76c82a2 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 4e1a9ef4866d2deb895723fbfbce7e44fb5efaf6..930526998fc0672d6b855b6ff55be175aafc5399 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 ab8c782a3f97d0e8882eb8d551d50debf22905f0..c223c64054322e529a90b95aa7604c89c0cd24e7 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 92401aea21e6a7f5a42f0c130ab62b3c716806ce..727f43772b68078cd1061ee364a1c6185a5ffabb 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 ea019fe0a4d23b6cd5a43837a78d79f5b1095925..e6f99db40e80746821447236403f97d8655b4315 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 2a1c503de5361dcd250c061344b5c621f97c0e8a..ff0ac5f5732aa924f1c6e86a7b4da6e2079d1dd6 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 53f2c49bd1d3ab1402ba5f9622ed7c32434bf6f8..f76d746806f59a662716945e38833fe32abe671c 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 af93f141e09f2791c2e7fcc4b809b2302ce22355..c6e5f960d14c5c54ded61a751aef5c19cc2d46a8 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 e5fe39c6a8072bf343a0f169dfe81af770a1acd1..43039d80a1facd3c392b8cf758a7f46f97081d96 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 27bba89617efd2e283c08797c865ac62d2293808..faa2dfb98cf92f29066b8402f14a360efb33cf20 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 96de1c9491927796a27920553135dda2a29bfca2..798006a13b57040f459279e096fa87dbc0b99efd 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 cdb561977cb05e699fa4f9c26a0fbe577896a357..31ce4935a26c0e7554abe576565453f55d156ab9 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();