summaryrefslogtreecommitdiff
path: root/pp.c
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2012-06-06 23:07:18 -0700
committerFather Chrysostomos <sprout@cpan.org>2012-06-07 08:18:55 -0700
commit288163b0396d677d915ce0beb12619dc26646926 (patch)
treed630380f0c0258edb4e0420798334a22873a5903 /pp.c
parent7dbe31506f4be3f410f64640daa16b8ad483d61f (diff)
downloadperl-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.c12
1 files changed, 3 insertions, 9 deletions
diff --git a/pp.c b/pp.c
index 811d185922..0066513202 100644
--- a/pp.c
+++ b/pp.c
@@ -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