summaryrefslogtreecommitdiff
path: root/pp.c
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2006-02-07 17:12:08 +0000
committerNicholas Clark <nick@ccl4.org>2006-02-07 17:12:08 +0000
commit71302fe379907f97d78296ec5f7430559d3a05ca (patch)
tree2476524682451348c6fe00cb99dccd3b17884c47 /pp.c
parenta4a772887f4f3b784d817fd0589ea0a4e83d9549 (diff)
downloadperl-71302fe379907f97d78296ec5f7430559d3a05ca.tar.gz
All the trancendental unary operators can be merged into PP_sin
(cos, exp, log, sqrt) p4raw-id: //depot/perl@27124
Diffstat (limited to 'pp.c')
-rw-r--r--pp.c83
1 files changed, 33 insertions, 50 deletions
diff --git a/pp.c b/pp.c
index 08578cc088..8d6421c7cd 100644
--- a/pp.c
+++ b/pp.c
@@ -2643,20 +2643,43 @@ PP(pp_atan2)
PP(pp_sin)
{
- dVAR; dSP; dTARGET; tryAMAGICun_var(sin_amg);
- {
- const NV value = POPn;
- XPUSHn(Perl_sin(value));
- RETURN;
+ dVAR; dSP; dTARGET;
+ int amg_type = sin_amg;
+ const char *neg_report = NULL;
+ NV (*func)(NV) = &Perl_sin;
+ const int op_type = PL_op->op_type;
+
+ switch (op_type) {
+ case OP_COS:
+ amg_type = cos_amg;
+ func = &Perl_cos;
+ break;
+ case OP_EXP:
+ amg_type = exp_amg;
+ func = &Perl_exp;
+ break;
+ case OP_LOG:
+ amg_type = log_amg;
+ func = &Perl_log;
+ neg_report = "log";
+ break;
+ case OP_SQRT:
+ amg_type = sqrt_amg;
+ func = &Perl_sqrt;
+ neg_report = "sqrt";
+ break;
}
-}
-PP(pp_cos)
-{
- dVAR; dSP; dTARGET; tryAMAGICun_var(cos_amg);
+ tryAMAGICun_var(amg_type);
{
const NV value = POPn;
- XPUSHn(Perl_cos(value));
+ if (neg_report) {
+ if (op_type == OP_LOG ? (value <= 0.0) : (value < 0.0)) {
+ SET_NUMERIC_STANDARD();
+ DIE(aTHX_ "Can't take %s of %"NVgf, neg_report, value);
+ }
+ }
+ XPUSHn(func(value));
RETURN;
}
}
@@ -2705,46 +2728,6 @@ PP(pp_srand)
RETPUSHYES;
}
-PP(pp_exp)
-{
- dVAR; dSP; dTARGET; tryAMAGICun_var(exp_amg);
- {
- NV value;
- value = POPn;
- value = Perl_exp(value);
- XPUSHn(value);
- RETURN;
- }
-}
-
-PP(pp_log)
-{
- dVAR; dSP; dTARGET; tryAMAGICun_var(log_amg);
- {
- const NV value = POPn;
- if (value <= 0.0) {
- SET_NUMERIC_STANDARD();
- DIE(aTHX_ "Can't take log of %"NVgf, value);
- }
- XPUSHn(Perl_log(value));
- RETURN;
- }
-}
-
-PP(pp_sqrt)
-{
- dVAR; dSP; dTARGET; tryAMAGICun_var(sqrt_amg);
- {
- const NV value = POPn;
- if (value < 0.0) {
- SET_NUMERIC_STANDARD();
- DIE(aTHX_ "Can't take sqrt of %"NVgf, value);
- }
- XPUSHn(Perl_sqrt(value));
- RETURN;
- }
-}
-
PP(pp_int)
{
dVAR; dSP; dTARGET; tryAMAGICun(int);