From e66c54b4702eed16b41210c9a19225b4c7cdd442 Mon Sep 17 00:00:00 2001 From: Florian Angerer <florian.angerer@oracle.com> Date: Thu, 24 Aug 2017 17:28:43 +0200 Subject: [PATCH] Introduced 'asIntegerVectorClosure' (and similar) in cast pipelines. --- .../truffle/r/nodes/builtin/base/APerm.java | 4 ++-- .../truffle/r/nodes/builtin/CastBuilder.java | 16 +++++++++---- .../r/nodes/builtin/casts/PipelineStep.java | 11 ++++----- .../builtin/casts/PipelineToCastNode.java | 8 +++---- .../casts/fluent/InitialPhaseBuilder.java | 24 ++++++++++--------- .../builtin/casts/fluent/PipelineBuilder.java | 4 ++-- .../truffle/r/nodes/unary/CastBaseNode.java | 19 +++++++-------- .../r/nodes/unary/CastDoubleBaseNode.java | 4 ++-- .../truffle/r/nodes/unary/CastDoubleNode.java | 12 +++++----- .../r/nodes/unary/CastIntegerBaseNode.java | 4 ++-- .../r/nodes/unary/CastIntegerNode.java | 16 ++++++------- .../truffle/r/test/ExpectedTestOutput.test | 12 +++++----- 12 files changed, 71 insertions(+), 63 deletions(-) diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/APerm.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/APerm.java index a4f4376e81..39146e8235 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/APerm.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/APerm.java @@ -10,7 +10,7 @@ */ package com.oracle.truffle.r.nodes.builtin.base; -import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.asIntegerVector; +import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.asIntegerVectorClosure; import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.complexValue; import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.logicalValue; import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.numericValue; @@ -55,7 +55,7 @@ public abstract class APerm extends RBuiltinNode.Arg3 { static { Casts casts = new Casts(APerm.class); casts.arg("a").mustNotBeNull(RError.Message.FIRST_ARG_MUST_BE_ARRAY); - casts.arg("perm").allowNull().mustBe(numericValue().or(stringValue()).or(complexValue())).mapIf(numericValue().or(complexValue()), asIntegerVector(true)); + casts.arg("perm").allowNull().mustBe(numericValue().or(stringValue()).or(complexValue())).mapIf(numericValue().or(complexValue()), asIntegerVectorClosure()); casts.arg("resize").mustBe(numericValue().or(logicalValue()), Message.INVALID_LOGICAL, "resize").asLogicalVector().findFirst(); } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/CastBuilder.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/CastBuilder.java index 85c0769241..d22c10086a 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/CastBuilder.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/CastBuilder.java @@ -332,16 +332,16 @@ public final class CastBuilder { return new CoercionStep<>(RType.Integer, true); } - public static <T> PipelineStep<T, RAbstractIntVector> asIntegerVector(boolean reuseNonShared) { - return new CoercionStep<>(RType.Integer, true, false, false, false, true, reuseNonShared); + public static <T> PipelineStep<T, RAbstractIntVector> asIntegerVectorClosure() { + return new CoercionStep<>(RType.Integer, true, false, false, false, true, true); } public static <T> PipelineStep<T, RAbstractIntVector> asIntegerVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { return new CoercionStep<>(RType.Integer, true, preserveNames, preserveDimensions, preserveAttributes, true, false); } - public static <T> PipelineStep<T, RAbstractIntVector> asIntegerVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, boolean reuseNonShared) { - return new CoercionStep<>(RType.Integer, true, preserveNames, preserveDimensions, preserveAttributes, true, reuseNonShared); + public static <T> PipelineStep<T, RAbstractIntVector> asIntegerVectorClosure(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { + return new CoercionStep<>(RType.Integer, true, preserveNames, preserveDimensions, preserveAttributes, true, true); } public static <T> PipelineStep<T, Double> asDouble() { @@ -352,10 +352,18 @@ public final class CastBuilder { return new CoercionStep<>(RType.Double, true); } + public static <T> PipelineStep<T, RAbstractDoubleVector> asDoubleVectorClosure() { + return new CoercionStep<>(RType.Double, true, false, false, false, true, true); + } + public static <T> PipelineStep<T, RAbstractDoubleVector> asDoubleVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { return new CoercionStep<>(RType.Double, true, preserveNames, preserveDimensions, preserveAttributes); } + public static <T> PipelineStep<T, RAbstractDoubleVector> asDoubleVectorClosure(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { + return new CoercionStep<>(RType.Double, true, preserveNames, preserveDimensions, preserveAttributes, true, true); + } + public static <T> PipelineStep<T, String> asString() { return new CoercionStep<>(RType.Character, false); } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/PipelineStep.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/PipelineStep.java index 474168dc90..4e9bdc24d3 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/PipelineStep.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/PipelineStep.java @@ -177,11 +177,10 @@ public abstract class PipelineStep<T, R> { public final boolean vectorCoercion; /** - * Allows the cast node to create and use wrappers for non-shared vectors. Only use if you - * know the vector to be casted won't escape and preferably if the vector is just used - * read-only. + * Allows the cast node to create and use wrappers for vectors. Only use if you know the + * vector to be casted won't escape and preferably if the vector is just used read-only. */ - public final boolean reuseNonShared; + public final boolean useClosure; public CoercionStep(RType type, boolean vectorCoercion) { this(type, vectorCoercion, false, false, false, true, false); @@ -191,14 +190,14 @@ public abstract class PipelineStep<T, R> { this(type, vectorCoercion, preserveNames, preserveDimensions, preserveAttributes, true, false); } - public CoercionStep(RType type, boolean vectorCoercion, boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, boolean preserveNonVector, boolean reuseNonShared) { + public CoercionStep(RType type, boolean vectorCoercion, boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, boolean preserveNonVector, boolean useClosure) { this.type = type; this.vectorCoercion = vectorCoercion; this.preserveNames = preserveNames; this.preserveAttributes = preserveAttributes; this.preserveDimensions = preserveDimensions; this.preserveNonVector = preserveNonVector; - this.reuseNonShared = reuseNonShared; + this.useClosure = useClosure; } public RType getType() { diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/PipelineToCastNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/PipelineToCastNode.java index f9f7dde80c..e0c252dfd5 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/PipelineToCastNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/casts/PipelineToCastNode.java @@ -226,11 +226,11 @@ public final class PipelineToCastNode { RType type = step.getType(); switch (type) { case Integer: - return step.vectorCoercion ? CastIntegerNodeGen.create(step.preserveNames, step.preserveDimensions, step.preserveAttributes, false, step.reuseNonShared) - : CastIntegerBaseNodeGen.create(step.preserveNames, step.preserveDimensions, step.preserveAttributes, false, step.reuseNonShared); + return step.vectorCoercion ? CastIntegerNodeGen.create(step.preserveNames, step.preserveDimensions, step.preserveAttributes, false, step.useClosure) + : CastIntegerBaseNodeGen.create(step.preserveNames, step.preserveDimensions, step.preserveAttributes, false, step.useClosure); case Double: - return step.vectorCoercion ? CastDoubleNodeGen.create(step.preserveNames, step.preserveDimensions, step.preserveAttributes, false, step.reuseNonShared) - : CastDoubleBaseNodeGen.create(step.preserveNames, step.preserveDimensions, step.preserveAttributes, false, step.reuseNonShared); + return step.vectorCoercion ? CastDoubleNodeGen.create(step.preserveNames, step.preserveDimensions, step.preserveAttributes, false, step.useClosure) + : CastDoubleBaseNodeGen.create(step.preserveNames, step.preserveDimensions, step.preserveAttributes, false, step.useClosure); case Character: return step.vectorCoercion ? CastStringNodeGen.create(step.preserveNames, step.preserveDimensions, step.preserveAttributes) : CastStringBaseNodeGen.create(step.preserveNames, step.preserveDimensions, step.preserveAttributes); 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 bd4a64d449..0773eb2923 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,30 +150,32 @@ public class InitialPhaseBuilder<T> extends ArgCastBuilder<T, InitialPhaseBuilde return this; } - public CoercedPhaseBuilder<RAbstractIntVector, Integer> asIntegerVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, boolean reuseNonShared) { - pipelineBuilder().appendAsVector(RType.Integer, preserveNames, preserveDimensions, preserveAttributes, reuseNonShared); + public CoercedPhaseBuilder<RAbstractIntVector, Integer> asIntegerVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { + pipelineBuilder().appendAsVector(RType.Integer, preserveNames, preserveDimensions, preserveAttributes); 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); } - public CoercedPhaseBuilder<RAbstractIntVector, Integer> asIntegerVector() { - return asIntegerVector(false, false, false, false); + public CoercedPhaseBuilder<RAbstractIntVector, Integer> asIntegerVectorClosure(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { + pipelineBuilder().appendAsVectorClosure(RType.Integer, preserveNames, preserveDimensions, preserveAttributes); + return new CoercedPhaseBuilder<>(pipelineBuilder(), Integer.class); } - public CoercedPhaseBuilder<RAbstractIntVector, Integer> asIntegerVector(boolean reuseNonShared) { - return asIntegerVector(false, false, false, reuseNonShared); + public CoercedPhaseBuilder<RAbstractIntVector, Integer> asIntegerVectorClosure() { + return asIntegerVectorClosure(false, false, false); } - public CoercedPhaseBuilder<RAbstractDoubleVector, Double> asDoubleVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, boolean reuseNonShared) { - pipelineBuilder().appendAsVector(RType.Double, preserveNames, preserveDimensions, preserveAttributes, reuseNonShared); + public CoercedPhaseBuilder<RAbstractDoubleVector, Double> asDoubleVectorClosure(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { + pipelineBuilder().appendAsVectorClosure(RType.Double, preserveNames, preserveDimensions, preserveAttributes); return new CoercedPhaseBuilder<>(pipelineBuilder(), Double.class); } public CoercedPhaseBuilder<RAbstractDoubleVector, Double> asDoubleVector(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { - return asDoubleVector(preserveNames, preserveDimensions, preserveAttributes, false); + pipelineBuilder().appendAsVector(RType.Double, preserveNames, preserveDimensions, preserveAttributes); + return new CoercedPhaseBuilder<>(pipelineBuilder(), Double.class); } public CoercedPhaseBuilder<RAbstractDoubleVector, Double> asDoubleVector() { 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 bc3596e0b7..c40a4f293f 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,9 +84,9 @@ 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) { + public void appendAsVectorClosure(RType type, boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { 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)); + append(new CoercionStep<>(type, true, preserveNames, preserveDimensions, preserveAttributes, true, true)); } public void appendNotNA(Object naReplacement, Message message, Object[] 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 46d1c12b92..8216976903 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 @@ -41,7 +41,6 @@ import com.oracle.truffle.r.runtime.RRuntime; import com.oracle.truffle.r.runtime.RType; import com.oracle.truffle.r.runtime.data.RList; import com.oracle.truffle.r.runtime.data.RNull; -import com.oracle.truffle.r.runtime.data.RSharingAttributeStorage; import com.oracle.truffle.r.runtime.data.RStringVector; import com.oracle.truffle.r.runtime.data.RTypedValue; import com.oracle.truffle.r.runtime.data.model.RAbstractContainer; @@ -65,8 +64,8 @@ public abstract class CastBaseNode extends CastNode { private final boolean preserveDimensions; private final boolean preserveAttributes; - /** {@code true} if a cast should try to reuse a non-shared vector. */ - private final boolean reuseNonShared; + /** {@code true} if a cast should wrap the input in a closure. */ + private final boolean useClosure; /** * GnuR provides several, sometimes incompatible, ways to coerce given value to given type. This @@ -83,7 +82,7 @@ public abstract class CastBaseNode extends CastNode { this(preserveNames, preserveDimensions, preserveAttributes, forRFFI, false); } - protected CastBaseNode(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, boolean forRFFI, boolean reuseNonShared) { + protected CastBaseNode(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, boolean forRFFI, boolean useClosure) { this.preserveNames = preserveNames; this.preserveDimensions = preserveDimensions; this.preserveAttributes = preserveAttributes; @@ -91,8 +90,8 @@ public abstract class CastBaseNode extends CastNode { if (preserveDimensions) { getDimNamesNode = GetDimNamesAttributeNode.create(); } - this.reuseNonShared = reuseNonShared; - reuseClassProfile = reuseNonShared ? ValueProfile.createClassProfile() : null; + this.useClosure = useClosure; + reuseClassProfile = useClosure ? ValueProfile.createClassProfile() : null; } public final boolean preserveNames() { @@ -112,7 +111,7 @@ public abstract class CastBaseNode extends CastNode { } public final boolean reuseNonShared() { - return reuseNonShared; + return useClosure; } protected abstract RType getTargetType(); @@ -183,12 +182,12 @@ public abstract class CastBaseNode extends CastNode { return RNull.instance; } - protected boolean isReusable(RAbstractVector v) { - return reuseNonShared; + protected boolean useClosure() { + return useClosure; } protected RAbstractVector castWithReuse(RType targetType, RAbstractVector v, ConditionProfile naProfile) { - assert isReusable(v); + assert useClosure(); return reuseClassProfile.profile(v.castSafe(targetType, naProfile, preserveAttributes())); } } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleBaseNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleBaseNode.java index 6fee221df0..15a9514d39 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleBaseNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleBaseNode.java @@ -44,8 +44,8 @@ public abstract class CastDoubleBaseNode extends CastBaseNode { super(preserveNames, preserveDimensions, preserveAttributes); } - protected CastDoubleBaseNode(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, boolean forRFFI, boolean withReuse) { - super(preserveNames, preserveDimensions, preserveAttributes, forRFFI, withReuse); + protected CastDoubleBaseNode(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, boolean forRFFI, boolean useClosure) { + super(preserveNames, preserveDimensions, preserveAttributes, forRFFI, useClosure); } @Override diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleNode.java index a135756833..67ee125a0d 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastDoubleNode.java @@ -92,27 +92,27 @@ public abstract class CastDoubleNode extends CastDoubleBaseNode { return vectorCopy(operand, ddata, !seenNA); } - @Specialization(guards = "isReusable(operand)") + @Specialization(guards = "useClosure()") protected RAbstractDoubleVector doIntVectorReuse(RAbstractIntVector operand) { return (RAbstractDoubleVector) castWithReuse(RType.Double, operand, naProfile.getConditionProfile()); } - @Specialization(guards = "isReusable(operand)") + @Specialization(guards = "useClosure()") protected RAbstractDoubleVector doLogicalVectorDimsReuse(RAbstractLogicalVector operand) { return (RAbstractDoubleVector) castWithReuse(RType.Double, operand, naProfile.getConditionProfile()); } - @Specialization(guards = "isReusable(operand)") + @Specialization(guards = "useClosure()") protected RAbstractDoubleVector doRawVectorReuse(RRawVector operand) { return (RAbstractDoubleVector) castWithReuse(RType.Double, operand, naProfile.getConditionProfile()); } - @Specialization(guards = "!isReusable(operand)") + @Specialization(guards = "!useClosure()") protected RDoubleVector doIntVector(RAbstractIntVector operand) { return createResultVector(operand, index -> naCheck.convertIntToDouble(operand.getDataAt(index))); } - @Specialization(guards = "!isReusable(operand)") + @Specialization(guards = "!useClosure()") protected RDoubleVector doLogicalVectorDims(RAbstractLogicalVector operand) { return createResultVector(operand, index -> naCheck.convertLogicalToDouble(operand.getDataAt(index))); } @@ -172,7 +172,7 @@ public abstract class CastDoubleNode extends CastDoubleBaseNode { return vectorCopy(operand, ddata, naCheck.neverSeenNA()); } - @Specialization(guards = "!isReusable(operand)") + @Specialization(guards = "!useClosure()") protected RDoubleVector doRawVector(RRawVector operand) { return createResultVector(operand, index -> RRuntime.raw2double(operand.getDataAt(index))); } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerBaseNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerBaseNode.java index 10e420d5b1..f223992784 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerBaseNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerBaseNode.java @@ -41,8 +41,8 @@ public abstract class CastIntegerBaseNode extends CastBaseNode { @Child private CastIntegerNode recursiveCastInteger; - protected CastIntegerBaseNode(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, boolean forRFFI, boolean withReuse) { - super(preserveNames, preserveDimensions, preserveAttributes, forRFFI, withReuse); + protected CastIntegerBaseNode(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, boolean forRFFI, boolean useClosure) { + super(preserveNames, preserveDimensions, preserveAttributes, forRFFI, useClosure); } protected CastIntegerBaseNode(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { 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 79df7b5d66..636037c3cf 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 @@ -57,8 +57,8 @@ public abstract class CastIntegerNode extends CastIntegerBaseNode { private final BranchProfile warningBranch = BranchProfile.create(); - protected CastIntegerNode(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, boolean forRFFI, boolean withReuse) { - super(preserveNames, preserveDimensions, preserveAttributes, forRFFI, withReuse); + protected CastIntegerNode(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, boolean forRFFI, boolean useClosure) { + super(preserveNames, preserveDimensions, preserveAttributes, forRFFI, useClosure); } protected CastIntegerNode(boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { @@ -160,32 +160,32 @@ public abstract class CastIntegerNode extends CastIntegerBaseNode { return vectorCopy(operand, idata, !seenNA); } - @Specialization(guards = "isReusable(operand)") + @Specialization(guards = "useClosure()") public RAbstractIntVector doLogicalVectorReuse(RAbstractLogicalVector operand) { return (RAbstractIntVector) castWithReuse(RType.Integer, operand, naProfile.getConditionProfile()); } - @Specialization(guards = "isReusable(operand)") + @Specialization(guards = "useClosure()") protected RAbstractIntVector doDoubleVectorReuse(RAbstractDoubleVector operand) { return (RAbstractIntVector) castWithReuse(RType.Integer, operand, naProfile.getConditionProfile()); } - @Specialization(guards = "isReusable(operand)") + @Specialization(guards = "useClosure()") protected RAbstractIntVector doRawVectorReuse(RAbstractRawVector operand) { return (RAbstractIntVector) castWithReuse(RType.Integer, operand, naProfile.getConditionProfile()); } - @Specialization(guards = "!isReusable(operand)") + @Specialization(guards = "!useClosure()") public RIntVector doLogicalVector(RAbstractLogicalVector operand) { return createResultVector(operand, index -> naCheck.convertLogicalToInt(operand.getDataAt(index))); } - @Specialization(guards = "!isReusable(operand)") + @Specialization(guards = "!useClosure()") protected RIntVector doDoubleVector(RAbstractDoubleVector operand) { return vectorCopy(operand, naCheck.convertDoubleVectorToIntData(operand), naCheck.neverSeenNA()); } - @Specialization(guards = "!isReusable(operand)") + @Specialization(guards = "!useClosure()") protected RIntVector doRawVector(RAbstractRawVector operand) { return createResultVector(operand, index -> RRuntime.raw2int(operand.getDataAt(index))); } 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 0ce65d24bf..d02c501de9 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 @@ -69573,7 +69573,7 @@ Error in t.default(new.env()) : argument is not a matrix b 1 c 2 -##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare# +##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNonSquare# #{ m <- matrix(1:8, 2, 4) ; t(m) } [,1] [,2] [1,] 1 2 @@ -69581,7 +69581,7 @@ c 2 [3,] 5 6 [4,] 7 8 -##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare# +##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNonSquare# #{ m <- matrix(as.raw(c(1:8)), 2, 4); t(m) } [,1] [,2] [1,] 01 02 @@ -69589,7 +69589,7 @@ c 2 [3,] 05 06 [4,] 07 08 -##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare# +##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNonSquare# #{ m <- matrix(c('1', '2', '3', '4', '5', '6', '7', '8'), 2, 4); t(m) } [,1] [,2] [1,] "1" "2" @@ -69597,7 +69597,7 @@ c 2 [3,] "5" "6" [4,] "7" "8" -##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare# +##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNonSquare# #{ m <- matrix(c(T, F, F, F, T, F, F, T), 2, 4); t(m) } [,1] [,2] [1,] TRUE FALSE @@ -69605,7 +69605,7 @@ c 2 [3,] TRUE FALSE [4,] FALSE TRUE -##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare# +##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNonSquare# #{ m <- matrix(list(a=1,b=2,c=3,d=4,e=5,f=6,g=7,h=8), 2, 4); t(m) } [,1] [,2] [1,] 1 2 @@ -69613,7 +69613,7 @@ c 2 [3,] 5 6 [4,] 7 8 -##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare# +##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNonSquare# #{ m <- matrix(seq(0.1,0.8,0.1), 2, 4) ; t(m) } [,1] [,2] [1,] 0.1 0.2 -- GitLab