diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Ceiling.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Ceiling.java index 1d60402d1004bbcfec766753ad8b3155ed768797..eb47cff18992fa0e9d830703863286b7bbc11c99 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Ceiling.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Ceiling.java @@ -22,6 +22,7 @@ */ package com.oracle.truffle.r.nodes.builtin.base; +import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.complexValue; import static com.oracle.truffle.r.runtime.RDispatch.MATH_GROUP_GENERIC; import static com.oracle.truffle.r.runtime.builtins.RBehavior.PURE; import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.PRIMITIVE; @@ -29,32 +30,61 @@ import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.PRIMITIVE; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.r.nodes.binary.BoxPrimitiveNode; import com.oracle.truffle.r.nodes.binary.BoxPrimitiveNodeGen; +import com.oracle.truffle.r.nodes.builtin.CastBuilder; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; +import com.oracle.truffle.r.nodes.unary.UnaryArithmeticBuiltinNode; import com.oracle.truffle.r.nodes.unary.UnaryArithmeticNode; import com.oracle.truffle.r.nodes.unary.UnaryArithmeticNodeGen; import com.oracle.truffle.r.runtime.RError; 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; import com.oracle.truffle.r.runtime.ops.UnaryArithmeticFactory; @RBuiltin(name = "ceiling", kind = PRIMITIVE, parameterNames = {"x"}, dispatch = MATH_GROUP_GENERIC, behavior = PURE) -public abstract class Ceiling extends RBuiltinNode { +public abstract class Ceiling extends UnaryArithmeticBuiltinNode { - public static final UnaryArithmeticFactory CEILING = CeilingArithmetic::new; + public static final UnaryArithmeticFactory CEILING = FloorNodeGen.create(null); - @Child private BoxPrimitiveNode boxPrimitive = BoxPrimitiveNodeGen.create(); - @Child private UnaryArithmeticNode ceiling = UnaryArithmeticNodeGen.create(CEILING, RError.Message.NON_NUMERIC_MATH, RType.Double); + public Ceiling() { + super(RType.Double, RError.Message.NON_NUMERIC_ARGUMENT_FUNCTION, null); + } - @Specialization - protected Object ceiling(Object value) { - return ceiling.execute(boxPrimitive.execute(value)); + @Override + protected void createCasts(CastBuilder casts) { + casts.arg("x").mustBe(complexValue().not(), RError.Message.UNIMPLEMENTED_COMPLEX_FUN).asDoubleVector(); + } + + @Override + public int op(byte op) { + return op; } - private static final class CeilingArithmetic extends Round.RoundArithmetic { + @Override + public int op(int op) { + return op; + } + + @Override + public double op(double op) { + return Math.ceil(op); + } - @Override - public double op(double op) { - return Math.ceil(op); - } + @Override + protected double opd(double re, double im) { + return op(re); } + + @Override + public RComplex op(double re, double im) { + return RDataFactory.createComplex(op(re), op(im)); + } + + @Specialization + @Override + public Object calculateUnboxed(Object op) { + return super.calculateUnboxed(op); + } + } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Floor.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Floor.java index b4fe2e8b935e1c936ffbe19ae0074144856615fa..41e4306860fc17cd6043184c8475c88ea6a1d3f9 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Floor.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Floor.java @@ -22,39 +22,64 @@ */ package com.oracle.truffle.r.nodes.builtin.base; +import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.complexValue; import static com.oracle.truffle.r.runtime.RDispatch.MATH_GROUP_GENERIC; import static com.oracle.truffle.r.runtime.builtins.RBehavior.PURE; import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.PRIMITIVE; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.r.nodes.binary.BoxPrimitiveNode; -import com.oracle.truffle.r.nodes.binary.BoxPrimitiveNodeGen; -import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; -import com.oracle.truffle.r.nodes.unary.UnaryArithmeticNode; -import com.oracle.truffle.r.nodes.unary.UnaryArithmeticNodeGen; +import com.oracle.truffle.r.nodes.builtin.CastBuilder; +import com.oracle.truffle.r.nodes.unary.UnaryArithmeticBuiltinNode; import com.oracle.truffle.r.runtime.RError; 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; import com.oracle.truffle.r.runtime.ops.UnaryArithmeticFactory; @RBuiltin(name = "floor", kind = PRIMITIVE, parameterNames = {"x"}, dispatch = MATH_GROUP_GENERIC, behavior = PURE) -public abstract class Floor extends RBuiltinNode { +public abstract class Floor extends UnaryArithmeticBuiltinNode { - public static final UnaryArithmeticFactory FLOOR = FloorArithmetic::new; + public static final UnaryArithmeticFactory FLOOR = FloorNodeGen.create(null); - @Child private BoxPrimitiveNode boxPrimitive = BoxPrimitiveNodeGen.create(); - @Child private UnaryArithmeticNode floor = UnaryArithmeticNodeGen.create(FLOOR, RError.Message.NON_NUMERIC_MATH, RType.Double); + public Floor() { + super(RType.Double, RError.Message.NON_NUMERIC_ARGUMENT_FUNCTION, null); + } - @Specialization - protected Object floor(Object value) { - return floor.execute(boxPrimitive.execute(value)); + @Override + protected void createCasts(CastBuilder casts) { + casts.arg("x").mustBe(complexValue().not(), RError.Message.UNIMPLEMENTED_COMPLEX_FUN).asDoubleVector(); + } + + @Override + public int op(byte op) { + return op; } - private static final class FloorArithmetic extends Round.RoundArithmetic { + @Override + public int op(int op) { + return op; + } + + @Override + public double op(double op) { + return Math.floor(op); + } - @Override - public double op(double op) { - return Math.floor(op); - } + @Override + protected double opd(double re, double im) { + return op(re); } + + @Override + public RComplex op(double re, double im) { + return RDataFactory.createComplex(op(re), op(im)); + } + + @Specialization + @Override + public Object calculateUnboxed(Object op) { + return super.calculateUnboxed(op); + } + }