diff options
author | Nicholas Clark <nick@ccl4.org> | 2006-02-07 17:12:08 +0000 |
---|---|---|
committer | Nicholas Clark <nick@ccl4.org> | 2006-02-07 17:12:08 +0000 |
commit | 71302fe379907f97d78296ec5f7430559d3a05ca (patch) | |
tree | 2476524682451348c6fe00cb99dccd3b17884c47 /pp.c | |
parent | a4a772887f4f3b784d817fd0589ea0a4e83d9549 (diff) | |
download | perl-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.c | 83 |
1 files changed, 33 insertions, 50 deletions
@@ -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); |