diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedExtractVectorNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedExtractVectorNode.java index 589acd316b992ddc87812d2e6fb7306c88c4562d..eb2f361dadc14089dcda2eb3dba83a24d268cb7e 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedExtractVectorNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedExtractVectorNode.java @@ -330,7 +330,7 @@ final class CachedExtractVectorNode extends CachedVectorNode { Object result; if (dataAt == RNull.instance) { result = RNull.instance; - } else if (positions[i] instanceof RAbstractContainer && ((RAbstractContainer) positions[i]).getLength() == 0) { + } else if (positionsCheckNode.isEmptyPosition(i, positions[i])) { result = RNull.instance; } else { result = extract(i, (RAbstractStringVector) dataAt, positions[i], positionProfile[i]); diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckNode.java index 9dffa7e5111fdd7459b8c5f77352b2daa85eed54..952e52fa7759fc7a4a99526d544195f7ffc589ae 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckNode.java @@ -37,6 +37,7 @@ import com.oracle.truffle.r.runtime.RError; import com.oracle.truffle.r.runtime.RRuntime; import com.oracle.truffle.r.runtime.RType; import com.oracle.truffle.r.runtime.data.RDataFactory; +import com.oracle.truffle.r.runtime.data.REmpty; import com.oracle.truffle.r.runtime.data.RMissing; import com.oracle.truffle.r.runtime.data.RTypedValue; import com.oracle.truffle.r.runtime.data.model.RAbstractContainer; @@ -52,6 +53,7 @@ abstract class PositionCheckNode extends Node { protected final int numDimensions; private final VectorLengthProfile positionLengthProfile = VectorLengthProfile.create(); private final ConditionProfile nullDimensionsProfile = ConditionProfile.createBinaryProfile(); + private final ValueProfile positionClassProfile = ValueProfile.createClassProfile(); protected final BranchProfile error = BranchProfile.create(); protected final boolean replace; protected final RType containerType; @@ -277,4 +279,12 @@ abstract class PositionCheckNode extends Node { } + public boolean isEmptyPosition(Object position) { + if (positionClass == REmpty.class) { + return false; + } + Object castPosition = positionClassProfile.profile(position); + return castPosition instanceof RAbstractContainer && ((RAbstractContainer) castPosition).getLength() == 0; + } + } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckSubscriptNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckSubscriptNode.java index bc43a33bc3f77f8bb4bdec0c85238637caa52577..f59b3838d79be3793b6151180a76a38b307b7ad5 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckSubscriptNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckSubscriptNode.java @@ -100,9 +100,7 @@ abstract class PositionCheckSubscriptNode extends PositionCheckNode { } assert positionLength == 1; positionNACheck.enable(position); - RAbstractVector result = doIntegerImpl(profile, dimSize, position.getDataAt(0), position, getNamesNode); - return result; - + return doIntegerImpl(profile, dimSize, position.getDataAt(0), position, getNamesNode); } private RAbstractVector doIntegerImpl(PositionProfile profile, int dimSize, int value, RAbstractVector originalVector, GetNamesAttributeNode getNamesNode) { diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionsCheckNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionsCheckNode.java index 3ab96e71be61213a05440038eba694b6d25bac6b..38d0127dda7cd0c8995b48fbae41221589106cfb 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionsCheckNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionsCheckNode.java @@ -194,4 +194,8 @@ final class PositionsCheckNode extends Node { boolean containsNA; } + + public boolean isEmptyPosition(int i, Object position) { + return positionsCheck[i].isEmptyPosition(position); + } }