diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/fluent/InitialPhaseBuilder.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/fluent/InitialPhaseBuilder.java index c66079bf6e6e723802b7c99c7355f7918945afdb..bd4a64d4495fafce14268ffefce2f12595c60e04 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/fluent/InitialPhaseBuilder.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/fluent/InitialPhaseBuilder.java @@ -150,20 +150,32 @@ public class InitialPhaseBuilder<T> extends ArgCastBuilder<T, InitialPhaseBuilde return this; } - public CoercedPhaseBuilder<RAbstractIntVector, Integer> asIntegerVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { - pipelineBuilder().appendAsVector(RType.Integer, preserveNames, preserveDimensions, preserveAttributes); + public CoercedPhaseBuilder<RAbstractIntVector, Integer> asIntegerVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, boolean reuseNonShared) { + pipelineBuilder().appendAsVector(RType.Integer, preserveNames, preserveDimensions, preserveAttributes, reuseNonShared); return new CoercedPhaseBuilder<>(pipelineBuilder(), Integer.class); } + public CoercedPhaseBuilder<RAbstractIntVector, Integer> asIntegerVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { + return asIntegerVector(preserveNames, preserveDimensions, preserveAttributes, false); + } + public CoercedPhaseBuilder<RAbstractIntVector, Integer> asIntegerVector() { - return asIntegerVector(false, false, false); + return asIntegerVector(false, false, false, false); } - public CoercedPhaseBuilder<RAbstractDoubleVector, Double> asDoubleVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { - pipelineBuilder().appendAsVector(RType.Double, preserveNames, preserveDimensions, preserveAttributes); + public CoercedPhaseBuilder<RAbstractIntVector, Integer> asIntegerVector(boolean reuseNonShared) { + return asIntegerVector(false, false, false, reuseNonShared); + } + + public CoercedPhaseBuilder<RAbstractDoubleVector, Double> asDoubleVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, boolean reuseNonShared) { + pipelineBuilder().appendAsVector(RType.Double, preserveNames, preserveDimensions, preserveAttributes, reuseNonShared); return new CoercedPhaseBuilder<>(pipelineBuilder(), Double.class); } + public CoercedPhaseBuilder<RAbstractDoubleVector, Double> asDoubleVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { + return asDoubleVector(preserveNames, preserveDimensions, preserveAttributes, false); + } + public CoercedPhaseBuilder<RAbstractDoubleVector, Double> asDoubleVector() { return asDoubleVector(false, false, false); } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/fluent/PipelineBuilder.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/fluent/PipelineBuilder.java index b0be4bf824b26e2a8147df4946a1ef51324462c2..bc3596e0b7faebc9e59ce4739bb16883a28503f5 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/fluent/PipelineBuilder.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/fluent/PipelineBuilder.java @@ -84,6 +84,11 @@ public final class PipelineBuilder { append(new CoercionStep<>(type, true, preserveNames, preserveDimensions, preserveAttributes, true, false)); } + public void appendAsVector(RType type, boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, boolean reuseNonShared) { + assert type == RType.Integer || type == RType.Double || type == RType.Complex || type == RType.Character || type == RType.Logical || type == RType.Raw; + append(new CoercionStep<>(type, true, preserveNames, preserveDimensions, preserveAttributes, true, reuseNonShared)); + } + public void appendNotNA(Object naReplacement, Message message, Object[] messageArgs) { append(new NotNAStep<>(naReplacement, createMessage(message, messageArgs))); } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastBaseNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastBaseNode.java index cd0d124a10d0e064aa7f9a459cfe999da4f4e50c..e978790e993e88ae7858bcdb73eee4f7fc9dffc4 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastBaseNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastBaseNode.java @@ -184,7 +184,8 @@ public abstract class CastBaseNode extends CastNode { } protected boolean isReusable(RAbstractVector v) { - if (reuseNonShared && v instanceof RSharingAttributeStorage) { + // Reusing only of complete vectors otherwise we will produce different warning output + if (reuseNonShared && v.isComplete() && v instanceof RSharingAttributeStorage) { return !((RSharingAttributeStorage) v).isShared(); } return false; diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java index f455f2677381788864593d2b3382480eea1fdf60..1abeca2dcef292e1dd7cf185cde76e143bddf694 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java @@ -182,7 +182,7 @@ public abstract class CastIntegerNode extends CastIntegerBaseNode { @Specialization(guards = "!isReusable(operand)") protected RIntVector doDoubleVector(RAbstractDoubleVector operand) { - return createResultVector(operand, index -> naCheck.convertDoubleToInt(operand.getDataAt(index))); + return vectorCopy(operand, naCheck.convertDoubleVectorToIntData(operand), operand.isComplete()); } @Specialization(guards = "!isReusable(operand)") diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test index 7378e3a895004313e7d816a5c6603e2812406799..0ce65d24bf23991d78283fc76837e4c42ee96134 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test @@ -6928,6 +6928,12 @@ NAs introduced by coercion #{ as.integer(c(1.0,2.5,3.9)) } [1] 1 2 3 +##com.oracle.truffle.r.test.builtins.TestBuiltin_asinteger.testAsInteger# +#{ as.integer(c(100, -1e-13, Inf, -Inf, NaN, 3.14159265358979, NA)) } +[1] 100 0 NA NA NA 3 NA +Warning message: +NAs introduced by coercion to integer range + ##com.oracle.truffle.r.test.builtins.TestBuiltin_asinteger.testAsInteger#Output.IgnoreWarningContext# #{ as.integer(c(3+3i, 4+4i)) } [1] 3 4 diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_asinteger.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_asinteger.java index 19aeddb65d4d96a5da38c47f76af20880fac9004..a50e12c6b81ab1ec737b653fa8a9dbb25323af97 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_asinteger.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_asinteger.java @@ -147,5 +147,6 @@ public class TestBuiltin_asinteger extends TestBase { assertEval("{ as.integer(as.character(NA)) }"); assertEval("{ as.integer(\"1\", as.character(NA)) }"); assertEval("{ as.integer.cls <- function(x) 42; as.integer(structure(c(1,2), class='cls')); }"); + assertEval("{ as.integer(c(100, -1e-13, Inf, -Inf, NaN, 3.14159265358979, NA)) }"); } }