diff options
author | Perl 5 Porters <perl5-porters@africa.nicoh.com> | 1996-12-25 11:25:00 +1200 |
---|---|---|
committer | Chip Salzenberg <chip@atlantic.net> | 1996-12-25 11:25:00 +1200 |
commit | 7a4c00b4303a05a04564a03a88f4fa5c7a06a6e9 (patch) | |
tree | ed0b5c9815e3415ad3fb0f0239c9dbcc595f6997 /pp.c | |
parent | b0c42ed9ba0f4415d135379bc4867084c8c23f6a (diff) | |
download | perl-7a4c00b4303a05a04564a03a88f4fa5c7a06a6e9.tar.gz |
[inseparable changes from patch from perl5.003_15 to perl5.003_16]
CORE PORTABILITY
Subject: _13: patches for unicos/unicosmk
Date: Fri, 20 Dec 1996 14:38:50 -0600
From: Dean Roehrich <roehrich@cray.com>
Files: Configure MANIFEST hints/unicos.sh hints/unicosmk.sh
private-msgid: <199612202038.OAA22805@poplar.cray.com>
LIBRARY AND EXTENSIONS
Subject: Refresh IO to 1.14
From: Graham Barr <gbarr@ti.com>
Files: MANIFEST ext/IO/IO.xs ext/IO/README ext/IO/lib/IO/File.pm ext/IO/lib/IO/Handle.pm ext/IO/lib/IO/Pipe.pm ext/IO/lib/IO/Seekable.pm ext/IO/lib/IO/Select.pm ext/IO/lib/IO/Socket.pm t/lib/io_dup.t t/lib/io_pipe.t t/lib/io_sel.t t/lib/io_sock.t t/lib/io_tell.t t/lib/io_udp.t t/lib/io_xs.t
OTHER CORE CHANGES
Subject: Fix 'foreach(@ARGV) { while (<>) { push @p,$_ } }'
From: Chip Salzenberg <chip@atlantic.net>
Files: cop.h pp_hot.c scope.c
Subject: Eliminate warnings from C< undef $x; $x OP= "foo" >
From: Chip Salzenberg <chip@atlantic.net>
Files: doop.c pp.c pp.h pp_hot.c
Subject: Try again to improve method caching
Date: Mon, 23 Dec 1996 20:13:56 -0500 (EST)
From: Ilya Zakharevich <ilya@math.ohio-state.edu>
Files: gv.c sv.c
Msg-ID: <199612240113.UAA09487@monk.mps.ohio-state.edu>
(applied based on p5p patch as commit 81c78688fe5c3927ad37ba29de14c86e38120317)
Subject: Be more careful about 'o' magic memory management
From: Chip Salzenberg <chip@atlantic.net>
Files: mg.c sv.c
Subject: Fix bad pointer refs when localized object loses magic
From: Chip Salzenberg <chip@atlantic.net>
Files: scope.c
Diffstat (limited to 'pp.c')
-rw-r--r-- | pp.c | 48 |
1 files changed, 26 insertions, 22 deletions
@@ -619,7 +619,7 @@ PP(pp_pow) { dSP; dATARGET; tryAMAGICbin(pow,opASSIGN); { - dPOPTOPnnrl; + dPOPTOPnnrl_ul; SETn( pow( left, right) ); RETURN; } @@ -629,7 +629,7 @@ PP(pp_multiply) { dSP; dATARGET; tryAMAGICbin(mult,opASSIGN); { - dPOPTOPnnrl; + dPOPTOPnnrl_ul; SETn( left * right ); RETURN; } @@ -639,25 +639,24 @@ PP(pp_divide) { dSP; dATARGET; tryAMAGICbin(div,opASSIGN); { - dPOPnv; - if (value == 0.0) + dPOPPOPnnrl_ul; + double value; + if (right == 0.0) DIE("Illegal division by zero"); #ifdef SLOPPYDIVIDE /* insure that 20./5. == 4. */ { - double x; - I32 k; - x = POPn; - if ((double)I_32(x) == x && - (double)I_32(value) == value && - (k = I_32(x)/I_32(value))*I_32(value) == I_32(x)) { + IV k; + if ((double)I_V(left) == left && + (double)I_V(right) == right && + (k = I_V(left)/I_V(right))*I_V(right) == I_V(left)) { value = k; } else { - value = x/value; + value = left / right; } } #else - value = POPn / value; + value = left / right; #endif PUSHn( value ); RETURN; @@ -682,7 +681,7 @@ PP(pp_modulo) SETi( left % right ); } else { - register double left = TOPn; + register double left = USE_LEFT(TOPs) ? SvNV(TOPs) : 0.0; if (left < 0.0) SETu( (right - (U_V(-left) - 1) % right) - 1 ); else @@ -729,14 +728,19 @@ PP(pp_repeat) if (SvROK(tmpstr)) sv_unref(tmpstr); } - SvSetSV(TARG, tmpstr); - SvPV_force(TARG, len); - if (count >= 1) { - SvGROW(TARG, (count * len) + 1); - if (count > 1) - repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1); - SvCUR(TARG) *= count; - *SvEND(TARG) = '\0'; + if (USE_LEFT(tmpstr) || SvTYPE(tmpstr) > SVt_PVMG) { + SvSetSV(TARG, tmpstr); + SvPV_force(TARG, len); + if (count != 1) { + if (count < 1) + SvCUR_set(TARG, 0); + else { + SvGROW(TARG, (count * len) + 1); + repeatcpy(SvPVX(TARG) + len, SvPVX(TARG), len, count - 1); + SvCUR(TARG) *= count; + } + *SvEND(TARG) = '\0'; + } (void)SvPOK_only(TARG); } else @@ -751,7 +755,7 @@ PP(pp_subtract) { dSP; dATARGET; tryAMAGICbin(subtr,opASSIGN); { - dPOPTOPnnrl; + dPOPTOPnnrl_ul; SETn( left - right ); RETURN; } |