diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/TrigExpFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/TrigExpFunctions.java index f570ce8ddd0f819a69ca099b84a4c55456a40c1a..2a0c714f4fd2bc0266c3f7a8ddd99f1850c70f1e 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/TrigExpFunctions.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/TrigExpFunctions.java @@ -22,6 +22,8 @@ */ package com.oracle.truffle.r.nodes.builtin.base; +import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.asDoubleVector; +import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.numericValue; 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.INTERNAL; @@ -50,7 +52,7 @@ 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.data.RDoubleVector; -import com.oracle.truffle.r.runtime.data.RMissing; +import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector; import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector; import com.oracle.truffle.r.runtime.ops.BinaryArithmetic; import com.oracle.truffle.r.runtime.ops.BinaryArithmetic.Pow.CHypot; @@ -307,7 +309,7 @@ public class TrigExpFunctions { @Override public RComplex op(double re, double im) { - throw new UnsupportedOperationException(); + throw RError.error(this, RError.Message.UNIMPLEMENTED_COMPLEX_FUN); } } @@ -496,8 +498,8 @@ public class TrigExpFunctions { @Override protected void createCasts(CastBuilder casts) { - casts.arg(0).asDoubleVector(); - casts.arg(1).asDoubleVector(); + casts.arg(0).mapIf(numericValue(), asDoubleVector()); + casts.arg(1).mapIf(numericValue(), asDoubleVector()); } private double doFunDouble(double y, double x) { @@ -568,12 +570,10 @@ public class TrigExpFunctions { @Fallback @TruffleBoundary protected Object atan2(Object x, Object y) { - if (x instanceof RMissing) { - throw RError.error(this, RError.Message.ARGUMENT_MISSING, getRBuiltin().parameterNames()[0]); - } else if (y instanceof RMissing) { - throw RError.error(this, RError.Message.ARGUMENT_MISSING, getRBuiltin().parameterNames()[1]); + if (x instanceof RAbstractComplexVector || y instanceof RAbstractComplexVector) { + throw RInternalError.unimplemented("atan2 for complex values"); } - throw RInternalError.unimplemented(); + throw RError.error(this, RError.Message.NON_NUMERIC_MATH); } } } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Xtfrm.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Xtfrm.java index f84ded8be8fd927d4c5873c518941a09afb30117..99f982afd3ca6f3126b7838a2a4603c9ee61001e 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Xtfrm.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Xtfrm.java @@ -27,8 +27,10 @@ import static com.oracle.truffle.r.runtime.builtins.RBehavior.COMPLEX; import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.PRIMITIVE; import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.profiles.ConditionProfile; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.nodes.builtin.base.GetFunctionsFactory.GetNodeGen; import com.oracle.truffle.r.runtime.RArguments; @@ -36,13 +38,16 @@ import com.oracle.truffle.r.runtime.RType; import com.oracle.truffle.r.runtime.builtins.RBuiltin; import com.oracle.truffle.r.runtime.context.RContext; import com.oracle.truffle.r.runtime.data.RFunction; +import com.oracle.truffle.r.runtime.env.REnvironment; @RBuiltin(name = "xtfrm", kind = PRIMITIVE, parameterNames = {"x"}, dispatch = INTERNAL_GENERIC, behavior = COMPLEX) public abstract class Xtfrm extends RBuiltinNode { + @Child private GetFunctions.Get getNode; @Specialization - protected Object xtfrm(VirtualFrame frame, Object x) { + protected Object xtfrm(VirtualFrame frame, Object x, + @Cached("createBinaryProfile()") ConditionProfile createProfile) { /* * Although this is a PRIMITIVE, there is an xtfrm.default that we must call if "x" is not * of a class that already has an xtfrm.class function defined. We only get here in the @@ -52,7 +57,12 @@ public abstract class Xtfrm extends RBuiltinNode { CompilerDirectives.transferToInterpreterAndInvalidate(); getNode = insert(GetNodeGen.create(null)); } - RFunction func = (RFunction) getNode.execute(frame, "xtfrm.default", RArguments.getEnvironment(frame), RType.Function.getName(), true); + + REnvironment env = RArguments.getEnvironment(frame); + if (createProfile.profile(env == null)) { + env = REnvironment.createEnclosingEnvironments(frame.materialize()); + } + RFunction func = (RFunction) getNode.execute(frame, "xtfrm.default", env, RType.Function.getName(), true); return RContext.getEngine().evalFunction(func, null, null, null, x); } } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RASTUtils.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RASTUtils.java index 3fcebd52abc9f882090778fd15c89a07b65fac07..6177e70fc4ace48c67d0f1453f6e555e2b5b5b82 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RASTUtils.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RASTUtils.java @@ -42,6 +42,7 @@ import com.oracle.truffle.r.runtime.ArgumentsSignature; import com.oracle.truffle.r.runtime.RInternalError; import com.oracle.truffle.r.runtime.context.RContext; import com.oracle.truffle.r.runtime.data.RDataFactory; +import com.oracle.truffle.r.runtime.data.REmpty; import com.oracle.truffle.r.runtime.data.RFunction; import com.oracle.truffle.r.runtime.data.RLanguage; import com.oracle.truffle.r.runtime.data.RMissing; @@ -175,7 +176,12 @@ public class RASTUtils { if (value instanceof RNode) { return (RNode) value; } else if (value instanceof RSymbol) { - return RContext.getASTBuilder().lookup(RSyntaxNode.SOURCE_UNAVAILABLE, ((RSymbol) value).getName(), false).asRNode(); + RSymbol symbol = (RSymbol) value; + if (symbol.isMissing()) { + return RContext.getASTBuilder().constant(RSyntaxNode.SOURCE_UNAVAILABLE, REmpty.instance).asRNode(); + } else { + return RContext.getASTBuilder().lookup(RSyntaxNode.SOURCE_UNAVAILABLE, ((RSymbol) value).getName(), false).asRNode(); + } } else if (value instanceof RLanguage) { RLanguage l = (RLanguage) value; return RASTUtils.cloneNode(l.getRep()); 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 20c4bc5f05bb42ab32a4c3f8395f7d28c0fe2444..c17eb68799d2ed604c9648be9cf2581341d8ce43 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 @@ -7849,6 +7849,18 @@ Error in atan2() : argument "y" is missing, with no default #{ atan2(0.7) } Error in atan2(0.7) : argument "x" is missing, with no default +##com.oracle.truffle.r.test.builtins.TestBuiltin_atan2.testTrigExp +#{ atan2(2, as.symbol('45')) } +Error in atan2(y, x) : non-numeric argument to mathematical function + +##com.oracle.truffle.r.test.builtins.TestBuiltin_atan2.testTrigExp +#{ atan2(2, new.env()) } +Error in atan2(y, x) : non-numeric argument to mathematical function + +##com.oracle.truffle.r.test.builtins.TestBuiltin_atan2.testTrigExp +#{ atan2(NULL, 1) } +Error in atan2(y, x) : non-numeric argument to mathematical function + ##com.oracle.truffle.r.test.builtins.TestBuiltin_atan2.testTrigExp #{ atan2(c(0.3,0.6,0.9), 0.4) } [1] 0.6435011 0.9827937 1.1525720 diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_atan2.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_atan2.java index 1af08075df92fae89094e65ddcec44f4dc8ecf5d..ee785542b930ecc1d6d9c3f29c30598053b85026 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_atan2.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_atan2.java @@ -55,5 +55,8 @@ public class TestBuiltin_atan2 extends TestBase { assertEval("{ atan2(c(0.3,0.6,0.9), c(0.4, 0.3)) }"); assertEval("{ atan2() }"); assertEval("{ atan2(0.7) }"); + assertEval("{ atan2(NULL, 1) }"); + assertEval("{ atan2(2, new.env()) }"); + assertEval("{ atan2(2, as.symbol('45')) }"); } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_tanpi.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_tanpi.java index 345ec4d9c0b132e93f249912159a4289785c223b..493d8442509d23d523afe342b455dbb9b38f04eb 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_tanpi.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_tanpi.java @@ -56,8 +56,7 @@ public class TestBuiltin_tanpi extends TestBase { @Test public void testtan6() { - assertEval(Ignored.Unimplemented, - "argv <- list(c(-0.560475646552213-0.710406563699301i, -0.23017748948328+0.25688370915653i, 1.55870831414912-0.24669187846237i, 0.070508391424576-0.347542599397733i, 0.129287735160946-0.951618567265016i, 1.71506498688328-0.04502772480892i, 0.460916205989202-0.784904469457076i, -1.26506123460653-1.66794193658814i, -0.686852851893526-0.380226520287762i, -0.445661970099958+0.918996609060766i, 1.22408179743946-0.57534696260839i, 0.359813827057364+0.607964322225033i, 0.40077145059405-1.61788270828916i, 0.11068271594512-0.055561965524539i, -0.555841134754075+0.519407203943462i, 1.78691313680308+0.30115336216671i, 0.497850478229239+0.105676194148943i, -1.96661715662964-0.64070600830538i, 0.701355901563686-0.849704346033582i, -0.47279140772793-1.02412879060491i, -1.06782370598685+0.11764659710013i, -0.217974914658295-0.947474614184802i, -1.02600444830724-0.49055744370067i, -0.72889122929114-0.256092192198247i, -0.62503926784926+1.84386200523221i, -1.68669331074241-0.65194990169546i, 0.837787044494525+0.235386572284857i, 0.153373117836515+0.077960849563711i, -1.13813693701195-0.96185663413013i, 1.25381492106993-0.0713080861236i, 0.42646422147681+1.44455085842335i, -0.295071482992271+0.451504053079215i, 0.895125661045022+0.04123292199294i, 0.878133487533042-0.422496832339625i, 0.82158108163749-2.05324722154052i, 0.68864025410009+1.13133721341418i, 0.55391765353759-1.46064007092482i, -0.061911710576722+0.739947510877334i, -0.30596266373992+1.90910356921748i, -0.38047100101238-1.4438931609718i, -0.694706978920513+0.701784335374711i, -0.207917278019599-0.262197489402468i, -1.26539635156826-1.57214415914549i, 2.16895596533851-1.51466765378175i, 1.20796199830499-1.60153617357459i, -1.12310858320335-0.5309065221703i, -0.40288483529908-1.4617555849959i, -0.466655353623219+0.687916772975828i, 0.77996511833632+2.10010894052567i, -0.08336906647183-1.28703047603518i, 0.253318513994755+0.787738847475178i, -0.028546755348703+0.76904224100091i, -0.042870457291316+0.332202578950118i, 1.36860228401446-1.00837660827701i, -0.225770985659268-0.119452606630659i, 1.51647060442954-0.28039533517025i, -1.54875280423022+0.56298953322048i, 0.584613749636069-0.372438756103829i, 0.123854243844614+0.976973386685621i, 0.215941568743973-0.374580857767014i, 0.37963948275988+1.05271146557933i, -0.5023234531093-1.04917700666607i, -0.33320738366942-1.26015524475811i, -1.01857538310709+3.2410399349424i, -1.07179122647558-0.41685758816043i, 0.303528641404258+0.298227591540715i, 0.448209778629426+0.636569674033849i, 0.053004226730504-0.483780625708744i, 0.922267467879738+0.516862044313609i, 2.05008468562714+0.36896452738509i, -0.491031166056535-0.215380507641693i, -2.30916887564081+0.06529303352532i, 1.00573852446226-0.03406725373846i, -0.70920076258239+2.12845189901618i, -0.688008616467358-0.741336096272828i, 1.0255713696967-1.09599626707466i, -0.284773007051009+0.037788399171079i, -1.22071771225454+0.31048074944314i, 0.18130347974915+0.436523478910183i, -0.138891362439045-0.458365332711106i, 0.00576418589989-1.06332613397119i, 0.38528040112633+1.26318517608949i, -0.370660031792409-0.349650387953555i, 0.644376548518833-0.865512862653374i, -0.220486561818751-0.236279568941097i, 0.331781963915697-0.197175894348552i, 1.09683901314935+1.10992028971364i, 0.435181490833803+0.084737292197196i, -0.325931585531227+0.754053785184521i, 1.14880761845109-0.49929201717226i, 0.993503855962119+0.214445309581601i, 0.54839695950807-0.324685911490835i, 0.238731735111441+0.094583528173571i, -0.627906076039371-0.895363357977542i, 1.36065244853001-1.31080153332797i, -0.60025958714713+1.99721338474797i, 2.18733299301658+0.60070882367242i, 1.53261062618519-1.25127136162494i, -0.235700359100477-0.611165916680421i, -1.02642090030678-1.18548008459731i));tanpi(argv[[1]]);"); + assertEval("argv <- list(c(-0.560475646552213-0.710406563699301i, -0.23017748948328+0.25688370915653i, 1.55870831414912-0.24669187846237i, 0.070508391424576-0.347542599397733i, 0.129287735160946-0.951618567265016i, 1.71506498688328-0.04502772480892i, 0.460916205989202-0.784904469457076i, -1.26506123460653-1.66794193658814i, -0.686852851893526-0.380226520287762i, -0.445661970099958+0.918996609060766i, 1.22408179743946-0.57534696260839i, 0.359813827057364+0.607964322225033i, 0.40077145059405-1.61788270828916i, 0.11068271594512-0.055561965524539i, -0.555841134754075+0.519407203943462i, 1.78691313680308+0.30115336216671i, 0.497850478229239+0.105676194148943i, -1.96661715662964-0.64070600830538i, 0.701355901563686-0.849704346033582i, -0.47279140772793-1.02412879060491i, -1.06782370598685+0.11764659710013i, -0.217974914658295-0.947474614184802i, -1.02600444830724-0.49055744370067i, -0.72889122929114-0.256092192198247i, -0.62503926784926+1.84386200523221i, -1.68669331074241-0.65194990169546i, 0.837787044494525+0.235386572284857i, 0.153373117836515+0.077960849563711i, -1.13813693701195-0.96185663413013i, 1.25381492106993-0.0713080861236i, 0.42646422147681+1.44455085842335i, -0.295071482992271+0.451504053079215i, 0.895125661045022+0.04123292199294i, 0.878133487533042-0.422496832339625i, 0.82158108163749-2.05324722154052i, 0.68864025410009+1.13133721341418i, 0.55391765353759-1.46064007092482i, -0.061911710576722+0.739947510877334i, -0.30596266373992+1.90910356921748i, -0.38047100101238-1.4438931609718i, -0.694706978920513+0.701784335374711i, -0.207917278019599-0.262197489402468i, -1.26539635156826-1.57214415914549i, 2.16895596533851-1.51466765378175i, 1.20796199830499-1.60153617357459i, -1.12310858320335-0.5309065221703i, -0.40288483529908-1.4617555849959i, -0.466655353623219+0.687916772975828i, 0.77996511833632+2.10010894052567i, -0.08336906647183-1.28703047603518i, 0.253318513994755+0.787738847475178i, -0.028546755348703+0.76904224100091i, -0.042870457291316+0.332202578950118i, 1.36860228401446-1.00837660827701i, -0.225770985659268-0.119452606630659i, 1.51647060442954-0.28039533517025i, -1.54875280423022+0.56298953322048i, 0.584613749636069-0.372438756103829i, 0.123854243844614+0.976973386685621i, 0.215941568743973-0.374580857767014i, 0.37963948275988+1.05271146557933i, -0.5023234531093-1.04917700666607i, -0.33320738366942-1.26015524475811i, -1.01857538310709+3.2410399349424i, -1.07179122647558-0.41685758816043i, 0.303528641404258+0.298227591540715i, 0.448209778629426+0.636569674033849i, 0.053004226730504-0.483780625708744i, 0.922267467879738+0.516862044313609i, 2.05008468562714+0.36896452738509i, -0.491031166056535-0.215380507641693i, -2.30916887564081+0.06529303352532i, 1.00573852446226-0.03406725373846i, -0.70920076258239+2.12845189901618i, -0.688008616467358-0.741336096272828i, 1.0255713696967-1.09599626707466i, -0.284773007051009+0.037788399171079i, -1.22071771225454+0.31048074944314i, 0.18130347974915+0.436523478910183i, -0.138891362439045-0.458365332711106i, 0.00576418589989-1.06332613397119i, 0.38528040112633+1.26318517608949i, -0.370660031792409-0.349650387953555i, 0.644376548518833-0.865512862653374i, -0.220486561818751-0.236279568941097i, 0.331781963915697-0.197175894348552i, 1.09683901314935+1.10992028971364i, 0.435181490833803+0.084737292197196i, -0.325931585531227+0.754053785184521i, 1.14880761845109-0.49929201717226i, 0.993503855962119+0.214445309581601i, 0.54839695950807-0.324685911490835i, 0.238731735111441+0.094583528173571i, -0.627906076039371-0.895363357977542i, 1.36065244853001-1.31080153332797i, -0.60025958714713+1.99721338474797i, 2.18733299301658+0.60070882367242i, 1.53261062618519-1.25127136162494i, -0.235700359100477-0.611165916680421i, -1.02642090030678-1.18548008459731i));tanpi(argv[[1]]);"); } @Test diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_xtfrm.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_xtfrm.java index 3fe5a6f3a9e54cb9309933a5602b956e47c4bed1..ac501a592bb192ff88a35a979cf18589c14103eb 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_xtfrm.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_xtfrm.java @@ -64,8 +64,7 @@ public class TestBuiltin_xtfrm extends TestBase { @Test public void testxtfrm10() { - assertEval(Ignored.Unknown, - "argv <- list(structure(c(-0.00456054471709705, -0.0386783362736307, -0.0164476694679408, -0.191054486056936, -0.648560736432306, -0.0674820314025517, -0.0740415039370447, -0.0243389397466521, -0.00751319716764208, -2.290078352999e-05, -0.0207911295071267, -0.0697881087827301, -0.00348607275095251, -0.00951045408299201, -0.00166106374745221, -0.0259659490166321, -0.0293880116898911, -0.0140288480262381, -0.0027358575950958, -0.000491817024731849, -0.00823790481253382, -0.00148071888751321, -0.00122448210109329, -0.0168483392795904, -0.0206872529040578, -0.000471241810355829, -0.00239800266383851, -0.00875711097940079, -0.0461679706262251, -0.0100810672498937, -0.0758745277496017, -0.0537304828043233, -0.0171367489531612, -0.01057973675541, -0.0676085282986778, -0.069201293818924, -0.00065957876422003, -1.97617272327839e-05, -0.00439039022584134), .Names = c('1962.25', '1962.5', '1962.75', '1963', '1963.25', '1963.5', '1963.75', '1964', '1964.25', '1964.5', '1964.75', '1965', '1965.25', '1965.5', '1965.75', '1966', '1966.25', '1966.5', '1966.75', '1967', '1967.25', '1967.5', '1967.75', '1968', '1968.25', '1968.5', '1968.75', '1969', '1969.25', '1969.5', '1969.75', '1970', '1970.25', '1970.5', '1970.75', '1971', '1971.25', '1971.5', '1971.75')));xtfrm(argv[[1]]);"); + assertEval("argv <- list(structure(c(-0.00456054471709705, -0.0386783362736307, -0.0164476694679408, -0.191054486056936, -0.648560736432306, -0.0674820314025517, -0.0740415039370447, -0.0243389397466521, -0.00751319716764208, -2.290078352999e-05, -0.0207911295071267, -0.0697881087827301, -0.00348607275095251, -0.00951045408299201, -0.00166106374745221, -0.0259659490166321, -0.0293880116898911, -0.0140288480262381, -0.0027358575950958, -0.000491817024731849, -0.00823790481253382, -0.00148071888751321, -0.00122448210109329, -0.0168483392795904, -0.0206872529040578, -0.000471241810355829, -0.00239800266383851, -0.00875711097940079, -0.0461679706262251, -0.0100810672498937, -0.0758745277496017, -0.0537304828043233, -0.0171367489531612, -0.01057973675541, -0.0676085282986778, -0.069201293818924, -0.00065957876422003, -1.97617272327839e-05, -0.00439039022584134), .Names = c('1962.25', '1962.5', '1962.75', '1963', '1963.25', '1963.5', '1963.75', '1964', '1964.25', '1964.5', '1964.75', '1965', '1965.25', '1965.5', '1965.75', '1966', '1966.25', '1966.5', '1966.75', '1967', '1967.25', '1967.5', '1967.75', '1968', '1968.25', '1968.5', '1968.75', '1969', '1969.25', '1969.5', '1969.75', '1970', '1970.25', '1970.5', '1970.75', '1971', '1971.25', '1971.5', '1971.75')));xtfrm(argv[[1]]);"); } @Test