diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Transpose.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Transpose.java index decde06b3fcb59b3b4b7e31c572645a33a28b544..6bfbaee4764141396cf2a3c124e30af2bb92d6ab 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Transpose.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Transpose.java @@ -235,22 +235,22 @@ public abstract class Transpose extends RBuiltinNode.Arg1 { }); } - @Specialization(guards = "x.isMatrix()") + @Specialization(guards = {"x.isMatrix()", "!isSquare(x)"}) protected RVector<?> transpose(RAbstractIntVector x) { return transposeInternal(x, l -> new int[l], (a, v, i, j) -> a[i] = v.getDataAt(j), RDataFactory::createIntVector); } - @Specialization(guards = "x.isMatrix()") + @Specialization(guards = {"x.isMatrix()", "!isSquare(x)"}) protected RVector<?> transpose(RAbstractLogicalVector x) { return transposeInternal(x, l -> new byte[l], (a, v, i, j) -> a[i] = v.getDataAt(j), RDataFactory::createLogicalVector); } - @Specialization(guards = "x.isMatrix()") + @Specialization(guards = {"x.isMatrix()", "!isSquare(x)"}) protected RVector<?> transpose(RAbstractDoubleVector x) { return transposeInternal(x, l -> new double[l], (a, v, i, j) -> a[i] = v.getDataAt(j), RDataFactory::createDoubleVector); } - @Specialization(guards = "x.isMatrix()") + @Specialization(guards = {"x.isMatrix()", "!isSquare(x)"}) protected RVector<?> transpose(RAbstractComplexVector x) { return transposeInternal(x, l -> new double[l * 2], (a, v, i, j) -> { RComplex d = v.getDataAt(j); @@ -259,17 +259,17 @@ public abstract class Transpose extends RBuiltinNode.Arg1 { }, RDataFactory::createComplexVector); } - @Specialization(guards = "x.isMatrix()") + @Specialization(guards = {"x.isMatrix()", "!isSquare(x)"}) protected RVector<?> transpose(RAbstractStringVector x) { return transposeInternal(x, l -> new String[l], (a, v, i, j) -> a[i] = v.getDataAt(j), RDataFactory::createStringVector); } - @Specialization(guards = "x.isMatrix()") + @Specialization(guards = {"x.isMatrix()", "!isSquare(x)"}) protected RVector<?> transpose(RAbstractListVector x) { return transposeInternal(x, l -> new Object[l], (a, v, i, j) -> a[i] = v.getDataAt(j), (a, c) -> RDataFactory.createList(a)); } - @Specialization(guards = "x.isMatrix()") + @Specialization(guards = {"x.isMatrix()", "!isSquare(x)"}) protected RVector<?> transpose(RAbstractRawVector x) { return transposeInternal(x, l -> new byte[l], (a, v, i, j) -> a[i] = v.getRawDataAt(j), (a, c) -> RDataFactory.createRawVector(a)); } 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 c172a54400f2be7a297069425eb15d16a365cab0..474168dc902036a5048faa506fbe0044b73cda1b 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,7 +177,9 @@ public abstract class PipelineStep<T, R> { public final boolean vectorCoercion; /** - * Whether the cast should reuse a non-shared vector. + * 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. */ public final boolean reuseNonShared; diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToDoubleVectorClosure.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToDoubleVectorClosure.java index 8a341a3866c901aa271185cbc6df353885d99f78..79a57bf9fb9f29b3870406259ebeba2f9302e7ef 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToDoubleVectorClosure.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/closures/RToDoubleVectorClosure.java @@ -66,7 +66,7 @@ abstract class RToDoubleVectorClosure extends RToVectorClosure implements RAbstr @Override public final RAbstractDoubleVector copyWithNewDimensions(int[] newDimensions) { - if (!keepAttributes) { + if (keepAttributes) { return materialize().copyWithNewDimensions(newDimensions); } return this; diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_t.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_t.java index 2ab45b0034fd6500e88a16c9aea9a9723e40fec6..ca5b37d80674154befc4b2ec214dc4a11909ea31 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_t.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_t.java @@ -61,7 +61,7 @@ public class TestBuiltin_t extends TestBase { } @Test - public void testTransposeNotSquare() { + public void testTransposeNonSquare() { // test square matrices assertEval("{ m <- matrix(1:8, 2, 4) ; t(m) }"); assertEval("{ m <- matrix(seq(0.1,0.8,0.1), 2, 4) ; t(m) }");