diff options
author | Father Chrysostomos <sprout@cpan.org> | 2012-06-06 23:07:18 -0700 |
---|---|---|
committer | Father Chrysostomos <sprout@cpan.org> | 2012-06-07 08:18:55 -0700 |
commit | 288163b0396d677d915ce0beb12619dc26646926 (patch) | |
tree | d630380f0c0258edb4e0420798334a22873a5903 /pp.c | |
parent | 7dbe31506f4be3f410f64640daa16b8ad483d61f (diff) | |
download | perl-288163b0396d677d915ce0beb12619dc26646926.tar.gz |
pp.c:pp_negate: Move looks_like_number where it matters
Since we already have a check further down to see whether a string
begins with an identifier or sign, and since looks_like_number
was added for strings representing negative numbers, move the
looks_like_number down to where we already know the string
begins with '-'.
This is a micro-optimisation, but it also makes the code more
straightforward (to me at least).
This happens to let magical integers-as-strings fall down to code that
they used not to reach, so that has to change to account.
Diffstat (limited to 'pp.c')
-rw-r--r-- | pp.c | 12 |
1 files changed, 3 insertions, 9 deletions
@@ -2157,10 +2157,6 @@ PP(pp_negate) { SV * const sv = TOPs; - if( !SvNIOK( sv ) && looks_like_number( sv ) ){ - SvIV_please_nomg( sv ); - } - if (SvIOK(sv) || (SvGMAGICAL(sv) && SvIOKp(sv))) { /* It's publicly an integer */ oops_its_an_int: @@ -2195,16 +2191,14 @@ PP(pp_negate) sv_setpvs(TARG, "-"); sv_catsv(TARG, sv); } - else if (*s == '+' || *s == '-') { + else if (*s == '+' || (*s == '-' && !looks_like_number(sv))) { sv_setsv_nomg(TARG, sv); *SvPV_force_nomg(TARG, len) = *s == '-' ? '+' : '-'; } - else { - SvIV_please_nomg(sv); - if (SvIOK(sv)) + else if (SvIV_please_nomg(sv)) goto oops_its_an_int; + else sv_setnv(TARG, -SvNV_nomg(sv)); - } SETTARG; } else |