From 378e91342c056e4c29a2046a16de2e5468ceb9aa Mon Sep 17 00:00:00 2001
From: Zbynek Slajchrt <zbynek.slajchrt@oracle.com>
Date: Tue, 23 Aug 2016 12:38:33 +0200
Subject: [PATCH] Arg reimplemented using UnaryArithmeticBuiltinNode and Arg
 tests un-ignored

---
 .../truffle/r/nodes/builtin/base/Arg.java     | 121 ++++++------------
 .../r/test/builtins/TestBuiltin_Arg.java      |  16 +--
 2 files changed, 48 insertions(+), 89 deletions(-)

diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Arg.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Arg.java
index 1e79286928..36e527030a 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Arg.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Arg.java
@@ -22,8 +22,8 @@
  */
 package com.oracle.truffle.r.nodes.builtin.base;
 
-import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.numericValue;
 import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.complexValue;
+import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.numericValue;
 import static com.oracle.truffle.r.runtime.RDispatch.COMPLEX_GROUP_GENERIC;
 import static com.oracle.truffle.r.runtime.builtins.RBehavior.PURE;
 import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.PRIMITIVE;
@@ -34,6 +34,8 @@ import com.oracle.truffle.r.nodes.builtin.CastBuilder;
 import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
 import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RRuntime;
+import com.oracle.truffle.r.nodes.unary.UnaryArithmeticBuiltinNode;
+import com.oracle.truffle.r.runtime.RType;
 import com.oracle.truffle.r.runtime.builtins.RBuiltin;
 import com.oracle.truffle.r.runtime.data.RComplex;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
@@ -44,116 +46,75 @@ import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector;
 import com.oracle.truffle.r.runtime.ops.na.NACheck;
 
 @RBuiltin(name = "Arg", kind = PRIMITIVE, parameterNames = {"z"}, dispatch = COMPLEX_GROUP_GENERIC, behavior = PURE)
-public abstract class Arg extends RBuiltinNode {
+public abstract class Arg extends UnaryArithmeticBuiltinNode {
 
-    private final ConditionProfile signumProfile = ConditionProfile.createBinaryProfile();
-    private final NACheck naCheck = NACheck.create();
+    public Arg() {
+        super(RType.Double, RError.Message.NON_NUMERIC_ARGUMENT_FUNCTION, null);
+    }
 
     @Override
     protected void createCasts(CastBuilder casts) {
         casts.arg("z").mustBe(numericValue().or(complexValue()), RError.Message.NON_NUMERIC_ARGUMENT_FUNCTION);
     }
 
-    @Specialization
-    protected double arg(double z) {
-        naCheck.enable(z);
-        if (naCheck.check(z)) {
-            return RRuntime.DOUBLE_NA;
-        }
-        if (signumProfile.profile(z >= 0)) {
-            return 0;
-        } else {
-            return Math.PI;
+    @Override
+    public RType calculateResultType(RType argumentType) {
+        switch (argumentType) {
+            case Complex:
+                return RType.Double;
+            default:
+                return super.calculateResultType(argumentType);
         }
     }
 
-    @Specialization
-    protected RAbstractDoubleVector arg(RAbstractDoubleVector v) {
-        double[] result = new double[v.getLength()];
-
-        naCheck.enable(v);
-        for (int i = 0; i < v.getLength(); i++) {
-            double z = v.getDataAt(i);
-            if (naCheck.check(z)) {
-                result[i] = RRuntime.DOUBLE_NA;
-            } else {
-                result[i] = z >= 0 ? 0 : Math.PI;
-            }
-        }
+    @Override
+    public int op(byte op) {
+        return 0;
+    }
 
-        return RDataFactory.createDoubleVector(result, v.isComplete());
+    @Override
+    public int op(int op) {
+        return op;
     }
 
-    @Specialization
-    protected double arg(int z) {
-        naCheck.enable(z);
-        if (naCheck.check(z)) {
-            return RRuntime.DOUBLE_NA;
-        }
-        if (signumProfile.profile(z >= 0)) {
+    @Override
+    public double op(double op) {
+        if (op >= 0) {
             return 0;
         } else {
             return Math.PI;
         }
     }
 
-    @Specialization
-    protected RAbstractDoubleVector arg(RAbstractIntVector v) {
-        double[] result = new double[v.getLength()];
+    @Override
+    public double opd(double re, double im) {
+        return Math.atan2(im, re);
+    }
 
-        naCheck.enable(v);
-        for (int i = 0; i < v.getLength(); i++) {
-            int z = v.getDataAt(i);
-            if (naCheck.check(z)) {
-                result[i] = RRuntime.DOUBLE_NA;
-            } else {
-                result[i] = z >= 0 ? 0 : Math.PI;
-            }
-        }
+    private final ConditionProfile signumProfile = ConditionProfile.createBinaryProfile();
+    private final NACheck naCheck = NACheck.create();
 
-        return RDataFactory.createDoubleVector(result, v.isComplete());
+    @Override
+    protected void createCasts(CastBuilder casts) {
+        casts.arg("z").mustBe(numericValue().or(complexValue()), RError.Message.NON_NUMERIC_ARGUMENT_FUNCTION);
     }
 
     @Specialization
-    protected double arg(byte z) {
+    protected double arg(double z) {
         naCheck.enable(z);
         if (naCheck.check(z)) {
             return RRuntime.DOUBLE_NA;
         }
-        return 0;
-    }
-
-    @Specialization
-    protected RAbstractDoubleVector arg(RAbstractLogicalVector v) {
-        double[] result = new double[v.getLength()];
-
-        naCheck.enable(v);
-        for (int i = 0; i < v.getLength(); i++) {
-            int z = v.getDataAt(i);
-            if (naCheck.check(z)) {
-                result[i] = RRuntime.DOUBLE_NA;
-            } else {
-                result[i] = 0;
-            }
+        if (signumProfile.profile(z >= 0)) {
+            return 0;
+        } else {
+            return Math.PI;
         }
-
-        return RDataFactory.createDoubleVector(result, v.isComplete());
     }
 
     @Specialization
-    protected RAbstractDoubleVector arg(RAbstractComplexVector v) {
-        double[] result = new double[v.getLength()];
-
-        naCheck.enable(v);
-        for (int i = 0; i < v.getLength(); i++) {
-            RComplex z = v.getDataAt(i);
-            if (naCheck.check(z)) {
-                result[i] = RRuntime.DOUBLE_NA;
-            } else {
-                result[i] = Math.atan2(z.getImaginaryPart(), z.getRealPart());
-            }
-        }
-
-        return RDataFactory.createDoubleVector(result, v.isComplete());
+    @Override
+    public Object calculateUnboxed(Object op) {
+        return super.calculateUnboxed(op);
     }
 }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_Arg.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_Arg.java
index b896511b88..0568155a69 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_Arg.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_Arg.java
@@ -19,38 +19,36 @@ public class TestBuiltin_Arg extends TestBase {
 
     @Test
     public void testArg1() {
-        assertEval(Ignored.Unknown, "argv <- list(1+2i);Arg(argv[[1]]);");
+        assertEval("argv <- list(1+2i);Arg(argv[[1]]);");
     }
 
     @Test
     public void testArg2() {
-        assertEval(Ignored.Unknown,
-                        "argv <- list(c(1554.86976865791+337.57296578684i, 1953.0195914094+434.16395869265i, 2020.8001333202+267.40279521531i, 12019.4947666225+397.6223289386i, 40989.2104557418+1079.1450107273i, 59779.5384921205+1460.5074297272i, 40703.4141691824+1049.8100128697i, 12234.4562968499+469.0052365648i, 2311.58538965355+142.56529231224i, 2158.93441543181+94.80017111005i, 2768.79882180339+256.05759156168i, 3234.20673958634+282.64174433659i, 2796.76248579155+64.23534085425i, 2030.22757739534-164.56566766766i, 1522.09271008314-273.51503749101i, 1109.23177636373-215.24298332377i, 714.154122222449-75.284630456206i, 509.684427096512-24.577531288476i, 628.214718823948+42.431050163574i, 1053.2295477549+190.4802567974i, 1388.73708931304+133.04405268816i, 1213.97041311196-135.67196064028i, 790.469479873384-232.737914916798i, 503.424076694357-99.275737105817i, 430.214847703846+45.250156289826i, 640.795334515383+121.961327286573i, 794.927869993865+100.643091831764i, 554.394621183915-15.753680159958i, 286.476583987294-104.634488576316i, 232.82067569803-92.469328935268i, 229.472155078088-54.85406188579i, 253.438957119958-65.123390974834i, 285.141954428461-79.653095359009i, 257.168942241366-34.332533775171i, 214.215071612655+18.001149572355i, 199.882436088191+0i));Arg(argv[[1]]);");
+        assertEval("argv <- list(c(1554.86976865791+337.57296578684i, 1953.0195914094+434.16395869265i, 2020.8001333202+267.40279521531i, 12019.4947666225+397.6223289386i, 40989.2104557418+1079.1450107273i, 59779.5384921205+1460.5074297272i, 40703.4141691824+1049.8100128697i, 12234.4562968499+469.0052365648i, 2311.58538965355+142.56529231224i, 2158.93441543181+94.80017111005i, 2768.79882180339+256.05759156168i, 3234.20673958634+282.64174433659i, 2796.76248579155+64.23534085425i, 2030.22757739534-164.56566766766i, 1522.09271008314-273.51503749101i, 1109.23177636373-215.24298332377i, 714.154122222449-75.284630456206i, 509.684427096512-24.577531288476i, 628.214718823948+42.431050163574i, 1053.2295477549+190.4802567974i, 1388.73708931304+133.04405268816i, 1213.97041311196-135.67196064028i, 790.469479873384-232.737914916798i, 503.424076694357-99.275737105817i, 430.214847703846+45.250156289826i, 640.795334515383+121.961327286573i, 794.927869993865+100.643091831764i, 554.394621183915-15.753680159958i, 286.476583987294-104.634488576316i, 232.82067569803-92.469328935268i, 229.472155078088-54.85406188579i, 253.438957119958-65.123390974834i, 285.141954428461-79.653095359009i, 257.168942241366-34.332533775171i, 214.215071612655+18.001149572355i, 199.882436088191+0i));Arg(argv[[1]]);");
     }
 
     @Test
     public void testArg3() {
-        assertEval(Ignored.Unknown,
-                        "argv <- list(c(-12.561836573133-726.935211685406i, -19.15961591777-1315.40822424617i, -666.84872452586-2013.90899841237i, -5775.9038598237-11495.8986046958i, -19052.0606820086-36788.5714510618i, -27954.209922899-52600.8398855356i, -19930.6456597181-35739.3494902644i, -7168.9170917163-10787.9325286278i, -2331.00733468417-1545.77448035635i, -1953.77845230855-212.90200115993i, -1953.60071030304+1420.43983282655i, -1700.4015174326+2765.31423009739i, -862.10275212019+2693.95914108523i, 163.24691179114+1837.1971341258i, 824.29498680332+1155.03126302727i, 939.495937605926+679.549172893055i, 686.101881005818+305.166761591578i, 460.339323160381-14.067413050801i, 533.688543397269-293.997358985575i, 773.041200043657-698.096300485637i, 716.84959340189-1127.39175172066i, 226.23728166311-1110.40349894929i, -203.687633095422-740.924670781257i, -271.865544904439-437.858153233594i, -316.769706633022-279.671035520361i, -624.842102639273-228.211019456587i, -806.31350008813-164.912647906911i, -506.559675826232+24.376187336594i, -142.784303570554+217.087547410547i, -44.704338624059+260.225831716256i, 10.565037460572+219.942519605707i, 143.643627814428+218.823069474359i, 232.58540850813+214.905815487636i, 223.286482103748+175.139821578561i, 185.008902762186+116.519845434485i, 171.150234739785-0i));Arg(argv[[1]]);");
+        assertEval("argv <- list(c(-12.561836573133-726.935211685406i, -19.15961591777-1315.40822424617i, -666.84872452586-2013.90899841237i, -5775.9038598237-11495.8986046958i, -19052.0606820086-36788.5714510618i, -27954.209922899-52600.8398855356i, -19930.6456597181-35739.3494902644i, -7168.9170917163-10787.9325286278i, -2331.00733468417-1545.77448035635i, -1953.77845230855-212.90200115993i, -1953.60071030304+1420.43983282655i, -1700.4015174326+2765.31423009739i, -862.10275212019+2693.95914108523i, 163.24691179114+1837.1971341258i, 824.29498680332+1155.03126302727i, 939.495937605926+679.549172893055i, 686.101881005818+305.166761591578i, 460.339323160381-14.067413050801i, 533.688543397269-293.997358985575i, 773.041200043657-698.096300485637i, 716.84959340189-1127.39175172066i, 226.23728166311-1110.40349894929i, -203.687633095422-740.924670781257i, -271.865544904439-437.858153233594i, -316.769706633022-279.671035520361i, -624.842102639273-228.211019456587i, -806.31350008813-164.912647906911i, -506.559675826232+24.376187336594i, -142.784303570554+217.087547410547i, -44.704338624059+260.225831716256i, 10.565037460572+219.942519605707i, 143.643627814428+218.823069474359i, 232.58540850813+214.905815487636i, 223.286482103748+175.139821578561i, 185.008902762186+116.519845434485i, 171.150234739785-0i));Arg(argv[[1]]);");
     }
 
     @Test
     public void testArg4() {
-        assertEval(Ignored.Unknown, "argv <- list(logical(0));Arg(argv[[1]]);");
+        assertEval("argv <- list(logical(0));Arg(argv[[1]]);");
     }
 
     @Test
     public void testArg5() {
-        assertEval(Ignored.Unknown, "argv <- list(structure(numeric(0), .Dim = c(0L, 0L)));Arg(argv[[1]]);");
+        assertEval("argv <- list(structure(numeric(0), .Dim = c(0L, 0L)));Arg(argv[[1]]);");
     }
 
     @Test
     public void testArg6() {
-        assertEval(Ignored.Unknown, "argv <- list(FALSE);Arg(argv[[1]]);");
+        assertEval("argv <- list(FALSE);Arg(argv[[1]]);");
     }
 
     @Test
     public void testArg8() {
-        assertEval(Ignored.Unknown, "argv <- list(-1);do.call('Arg', argv)");
+        assertEval("argv <- list(-1);do.call('Arg', argv)");
     }
 }
-- 
GitLab