diff --git a/com.oracle.truffle.r.nodes.test/src/com/oracle/truffle/r/nodes/access/vector/ExtractVectorNodeTest.java b/com.oracle.truffle.r.nodes.test/src/com/oracle/truffle/r/nodes/access/vector/ExtractVectorNodeTest.java index 7461c2db64119fac2900b7d4a75528f9bd83a4af..493c99a19620accd491332e806e1461c84abca13 100644 --- a/com.oracle.truffle.r.nodes.test/src/com/oracle/truffle/r/nodes/access/vector/ExtractVectorNodeTest.java +++ b/com.oracle.truffle.r.nodes.test/src/com/oracle/truffle/r/nodes/access/vector/ExtractVectorNodeTest.java @@ -217,15 +217,29 @@ public class ExtractVectorNodeTest extends TestBase { } @Theory - public void testCompletenessAfterExtraction(RType targetType) { + public void testCompletenessAfterScalarExtraction(RType targetType) { RAbstractVector vector = generateVector(targetType, 4, false); + assumeTrue(targetType != RType.List); assumeThat(vector.isComplete(), is(false)); RAbstractVector result = executeExtract(ElementAccessMode.SUBSET, vector, RInteger.valueOf(1)); assertThat(result.isComplete(), is(true)); } + @Theory + public void testCompletenessAfterExtraction(RType targetType) { + RAbstractVector vector = generateVector(targetType, 4, false); + + assumeTrue(targetType != RType.List); + assumeThat(vector.isComplete(), is(false)); + // extract some non NA elements + int[] positions = targetType == RType.Complex ? new int[]{1, 3} : new int[]{1, 2}; + RAbstractVector result = executeExtract(ElementAccessMode.SUBSET, vector, RDataFactory.createIntVector(positions, true)); + + assertThat(result.isComplete(), is(true)); + } + @Theory public void testCompletenessAfterSelectAll(RType targetType) { RAbstractVector vector = generateVector(targetType, 4, false); diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/BinaryBooleanScalarNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/BinaryBooleanScalarNode.java index 24672b60829f63b8fb5df40c2f7e5c3d7aa16526..79066816d08601c10f17f593d7f11fa4c6226eac 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/BinaryBooleanScalarNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/BinaryBooleanScalarNode.java @@ -120,11 +120,12 @@ public abstract class BinaryBooleanScalarNode extends RBuiltinNode.Arg2 { } private byte castImpl(RAbstractVector vector) { - this.check.enable(!vector.isComplete()); if (vector.getLength() == 0) { seenEmpty.enter(); + this.check.enable(true); return RRuntime.LOGICAL_NA; } + this.check.enable(!vector.isComplete()); RType type = vector.getRType(); CompilerAsserts.compilationConstant(type); switch (type) { diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDataFactory.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDataFactory.java index 2587193a855ef1fc6a9fd79822a15f1459f97366..4d2214df1c02417d30f4c278add801cdc54dd65d 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDataFactory.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDataFactory.java @@ -967,7 +967,7 @@ public final class RDataFactory { if (fillNA) { Arrays.fill(data, RRuntime.LOGICAL_NA); } - return createLogicalVector(data, false); + return createLogicalVector(data, !fillNA); } public static RLogicalVector createLogicalVector(byte[] data, boolean complete) { diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RList.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RList.java index ee3847e78bdd6e922630eb9882c3f90b42138ccd..c886692fd1f02b6cd248f2b8199660c55aa03e93 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RList.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RList.java @@ -28,10 +28,16 @@ import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.r.runtime.RType; import com.oracle.truffle.r.runtime.data.model.RAbstractContainer; import com.oracle.truffle.r.runtime.data.model.RAbstractListVector; +import com.oracle.truffle.r.runtime.data.model.RAbstractVector; import com.oracle.truffle.r.runtime.data.nodes.FastPathVectorAccess.FastPathFromListAccess; import com.oracle.truffle.r.runtime.data.nodes.SlowPathVectorAccess.SlowPathFromListAccess; import com.oracle.truffle.r.runtime.data.nodes.VectorAccess; +/** + * A note on the RList complete flag {@link RAbstractVector#isComplete() } - it is always + * initialized with <code>false</code> in {@link RListBase#RListBase(java.lang.Object[])} and never + * expected to change. + */ public final class RList extends RListBase implements RAbstractListVector { public String elementNamePrefix; 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 43039d80a1facd3c392b8cf758a7f46f97081d96..73637118f3f030410565aacc9f338eb1d4733b31 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 @@ -116,6 +116,8 @@ public interface RAbstractVector extends RAbstractContainer { assert access.getListElement(iter) != null : "element " + iter.getIndex() + " of vector " + vector + " is null"; } } + } else if (access.getType() == RType.List) { + assert !vector.isComplete(); } if (vector.isComplete()) { // check all vectors for completeness