From 842c1c42d873526dba8f3c584b8e3846ce4813c1 Mon Sep 17 00:00:00 2001 From: Adam Welc <adam.welc@oracle.com> Date: Fri, 3 Jun 2016 15:50:46 -0700 Subject: [PATCH] Fixed a problem with negation of complex numbers. --- .../truffle/r/nodes/unary/UnaryNotNode.java | 29 +++++++++++++++---- .../truffle/r/test/ExpectedTestOutput.test | 4 +++ .../library/base/TestSimpleIfEvaluator.java | 1 + 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/UnaryNotNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/UnaryNotNode.java index f62c4c1542..262744ccbc 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/UnaryNotNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/UnaryNotNode.java @@ -32,6 +32,7 @@ import com.oracle.truffle.r.runtime.RDispatch; import com.oracle.truffle.r.runtime.RError; import com.oracle.truffle.r.runtime.RRuntime; import com.oracle.truffle.r.runtime.data.RAttributeProfiles; +import com.oracle.truffle.r.runtime.data.RComplex; import com.oracle.truffle.r.runtime.data.RDataFactory; import com.oracle.truffle.r.runtime.data.RList; import com.oracle.truffle.r.runtime.data.RLogicalVector; @@ -64,6 +65,10 @@ public abstract class UnaryNotNode extends RBuiltinNode { return RRuntime.asLogical(operand == 0); } + private static byte not(RComplex operand) { + return RRuntime.asLogical(operand.getRealPart() == 0 && operand.getImaginaryPart() == 0); + } + private static byte notRaw(RRaw operand) { return (byte) (255 - operand.getValue()); } @@ -145,6 +150,25 @@ public abstract class UnaryNotNode extends RBuiltinNode { return resultVector; } + @Specialization + protected RLogicalVector doComplexVector(RAbstractComplexVector vector) { + int length = vector.getLength(); + byte[] result; + if (zeroLengthProfile.profile(length == 0)) { + result = new byte[0]; + } else { + na.enable(vector); + result = new byte[length]; + for (int i = 0; i < length; i++) { + RComplex value = vector.getDataAt(i); + result[i] = na.check(value) ? RRuntime.LOGICAL_NA : not(value); + } + } + RLogicalVector resultVector = RDataFactory.createLogicalVector(result, na.neverSeenNA()); + resultVector.copyNamesDimsDimNamesFrom(attrProfiles, vector, this); + return resultVector; + } + @Specialization protected RRawVector doRawVector(RRawVector vector) { int length = vector.getLength(); @@ -167,11 +191,6 @@ public abstract class UnaryNotNode extends RBuiltinNode { return RDataFactory.createEmptyLogicalVector(); } - @Specialization(guards = {"vector.getLength() == 0"}) - protected RLogicalVector doComplexVector(@SuppressWarnings("unused") RAbstractComplexVector vector) { - return RDataFactory.createEmptyLogicalVector(); - } - @Specialization(guards = {"list.getLength() == 0"}) protected RLogicalVector doList(@SuppressWarnings("unused") RList list) { return RDataFactory.createEmptyLogicalVector(); 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 99635c1c27..e56dcc464d 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 @@ -61674,6 +61674,10 @@ Error in if (x) 1 else 2 : argument is of length zero #{ f <- function(x) { if (x) 1 else 2 } ; f(NA) } Error in if (x) 1 else 2 : missing value where TRUE/FALSE needed +##com.oracle.truffle.r.test.library.base.TestSimpleIfEvaluator.testIf +#{ if (!(7+42i)) TRUE else FALSE } +[1] FALSE + ##com.oracle.truffle.r.test.library.base.TestSimpleIfEvaluator.testIf #{ if (FALSE==1) TRUE else FALSE } [1] FALSE diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleIfEvaluator.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleIfEvaluator.java index a5ac77267d..29916d0e1f 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleIfEvaluator.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/base/TestSimpleIfEvaluator.java @@ -68,6 +68,7 @@ public class TestSimpleIfEvaluator extends TestBase { assertEval("{ if (FALSE==1) TRUE else FALSE }"); assertEval("{ f <- function(v) { if (FALSE==v) TRUE else FALSE } ; f(TRUE) ; f(1) }"); assertEval(Output.ContainsError, Output.ContainsWarning, "{ x<-list(1,2); if (x) 7 else 42 }"); + assertEval("{ if (!(7+42i)) TRUE else FALSE }"); } @Test -- GitLab