diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java index a81e194adf7fd2e3bade2b07eff2102740d98f8a..71a7e7c7183b7deb12ec8bcccd4e06d9167c3026 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java @@ -352,7 +352,7 @@ final class CachedReplaceVectorNode extends CachedVectorNode { if (castType == RType.List) { return CastListNodeGen.create(true, false, true); } else { - return CastTypeNode.createCast(castType, true, true, true); + return CastTypeNode.createCast(castType, true, true, true, false); } } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/CastTypeNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/CastTypeNode.java index 65e0a251a686ca0150292f619be37dd2f3af7466..144f9715275a59198d1cb573a887ef75bcf9c106 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/CastTypeNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/CastTypeNode.java @@ -63,7 +63,12 @@ public abstract class CastTypeNode extends RBaseNode { @TruffleBoundary public static CastNode createCast(RType type) { - return createCast(type, false, false, false); + return createCast(type, false, false, false, false); + } + + @TruffleBoundary + public static CastNode createCast(RType type, boolean reuseNonShared) { + return createCast(type, false, false, false, reuseNonShared); } public static CastTypeNode create() { @@ -71,16 +76,16 @@ public abstract class CastTypeNode extends RBaseNode { } @TruffleBoundary - public static CastNode createCast(RType type, boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { + public static CastNode createCast(RType type, boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, boolean reuseNonShared) { switch (type) { case Character: return CastStringNodeGen.create(preserveNames, preserveDimensions, preserveAttributes); case Complex: return CastComplexNodeGen.create(preserveNames, preserveDimensions, preserveAttributes); case Double: - return CastDoubleNodeGen.create(preserveNames, preserveDimensions, preserveAttributes); + return CastDoubleNodeGen.create(preserveNames, preserveDimensions, preserveAttributes, false, reuseNonShared); case Integer: - return CastIntegerNodeGen.create(preserveNames, preserveDimensions, preserveAttributes); + return CastIntegerNodeGen.create(preserveNames, preserveDimensions, preserveAttributes, false, reuseNonShared); case Logical: return CastLogicalNodeGen.create(preserveNames, preserveDimensions, preserveAttributes); case Raw: 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 997193d66f30f27c89311fbdcccac51030e7012c..f455f2677381788864593d2b3382480eea1fdf60 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 @@ -175,17 +175,17 @@ public abstract class CastIntegerNode extends CastIntegerBaseNode { return (RAbstractIntVector) castWithReuse(RType.Integer, operand, naProfile.getConditionProfile()); } - @Specialization + @Specialization(guards = "!isReusable(operand)") public RIntVector doLogicalVector(RAbstractLogicalVector operand) { return createResultVector(operand, index -> naCheck.convertLogicalToInt(operand.getDataAt(index))); } - @Specialization + @Specialization(guards = "!isReusable(operand)") protected RIntVector doDoubleVector(RAbstractDoubleVector operand) { return createResultVector(operand, index -> naCheck.convertDoubleToInt(operand.getDataAt(index))); } - @Specialization + @Specialization(guards = "!isReusable(operand)") 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 933cf6864b43b7abc5a6bcfaaa216a5720dba576..7378e3a895004313e7d816a5c6603e2812406799 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 @@ -69567,6 +69567,54 @@ Error in t.default(new.env()) : argument is not a matrix b 1 c 2 +##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare# +#{ m <- matrix(1:8, 2, 4) ; t(m) } + [,1] [,2] +[1,] 1 2 +[2,] 3 4 +[3,] 5 6 +[4,] 7 8 + +##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare# +#{ m <- matrix(as.raw(c(1:8)), 2, 4); t(m) } + [,1] [,2] +[1,] 01 02 +[2,] 03 04 +[3,] 05 06 +[4,] 07 08 + +##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare# +#{ m <- matrix(c('1', '2', '3', '4', '5', '6', '7', '8'), 2, 4); t(m) } + [,1] [,2] +[1,] "1" "2" +[2,] "3" "4" +[3,] "5" "6" +[4,] "7" "8" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare# +#{ m <- matrix(c(T, F, F, F, T, F, F, T), 2, 4); t(m) } + [,1] [,2] +[1,] TRUE FALSE +[2,] FALSE FALSE +[3,] TRUE FALSE +[4,] FALSE TRUE + +##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare# +#{ 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 +[2,] 3 4 +[3,] 5 6 +[4,] 7 8 + +##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare# +#{ m <- matrix(seq(0.1,0.8,0.1), 2, 4) ; t(m) } + [,1] [,2] +[1,] 0.1 0.2 +[2,] 0.3 0.4 +[3,] 0.5 0.6 +[4,] 0.7 0.8 + ##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeSquare# #{ m <- matrix(1:64, 8, 8) ; sum(m * t(m)) } [1] 72976 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 d1708c7290420ee542611c772ded21eb3fd00318..2ab45b0034fd6500e88a16c9aea9a9723e40fec6 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 @@ -59,4 +59,15 @@ public class TestBuiltin_t extends TestBase { assertEval("{ m <- matrix(as.raw(c(1,2,3,4)), 2, 2); t(m) }"); assertEval("{ m <- matrix(list(a=1,b=2,c=3,d=4), 2, 2); t(m) }"); } + + @Test + public void testTransposeNotSquare() { + // 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) }"); + assertEval("{ m <- matrix(c(T, F, F, F, T, F, F, T), 2, 4); t(m) }"); + assertEval("{ m <- matrix(c('1', '2', '3', '4', '5', '6', '7', '8'), 2, 4); t(m) }"); + assertEval("{ m <- matrix(as.raw(c(1:8)), 2, 4); t(m) }"); + assertEval("{ m <- matrix(list(a=1,b=2,c=3,d=4,e=5,f=6,g=7,h=8), 2, 4); t(m) }"); + } }