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 /scope.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 'scope.c')
-rw-r--r-- | scope.c | 104 |
1 files changed, 41 insertions, 63 deletions
@@ -107,19 +107,14 @@ free_tmps() } } -SV * -save_scalar(gv) -GV *gv; +static SV * +save_scalar_at(sptr) +SV **sptr; { register SV *sv; - SV *osv = GvSV(gv); - - SSCHECK(3); - SSPUSHPTR(gv); - SSPUSHPTR(osv); - SSPUSHINT(SAVEt_SV); + SV *osv = *sptr; - sv = GvSV(gv) = NEWSV(0,0); + sv = *sptr = NEWSV(0,0); if (SvTYPE(osv) >= SVt_PVMG && SvMAGIC(osv) && SvTYPE(osv) != SVt_PVGV) { sv_upgrade(sv, SvTYPE(osv)); if (SvGMAGICAL(osv)) { @@ -143,6 +138,28 @@ GV *gv; return sv; } +SV * +save_scalar(gv) +GV *gv; +{ + SSCHECK(3); + SSPUSHPTR(gv); + SSPUSHPTR(GvSV(gv)); + SSPUSHINT(SAVEt_SV); + return save_scalar_at(&GvSV(gv)); +} + +SV* +save_svref(sptr) +SV **sptr; +{ + SSCHECK(3); + SSPUSHPTR(sptr); + SSPUSHPTR(*sptr); + SSPUSHINT(SAVEt_SVREF); + return save_scalar_at(sptr); +} + void save_gp(gv, empty) GV *gv; @@ -168,42 +185,6 @@ I32 empty; } } -SV* -save_svref(sptr) -SV **sptr; -{ - register SV *sv; - SV *osv = *sptr; - - SSCHECK(3); - SSPUSHPTR(*sptr); - SSPUSHPTR(sptr); - SSPUSHINT(SAVEt_SVREF); - - sv = *sptr = NEWSV(0,0); - if (SvTYPE(osv) >= SVt_PVMG && SvMAGIC(osv) && SvTYPE(osv) != SVt_PVGV) { - sv_upgrade(sv, SvTYPE(osv)); - if (SvGMAGICAL(osv)) { - MAGIC* mg; - bool oldtainted = tainted; - mg_get(osv); - if (tainting && tainted && (mg = mg_find(osv, 't'))) { - SAVESPTR(mg->mg_obj); - mg->mg_obj = osv; - } - SvFLAGS(osv) |= (SvFLAGS(osv) & - (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT; - tainted = oldtainted; - } - SvMAGIC(sv) = SvMAGIC(osv); - SvFLAGS(sv) |= SvMAGICAL(osv); - localizing = 1; - SvSETMAGIC(sv); - localizing = 0; - } - return sv; -} - AV * save_ary(gv) GV *gv; @@ -450,26 +431,13 @@ I32 base; case SAVEt_SV: /* scalar reference */ value = (SV*)SSPOPPTR; gv = (GV*)SSPOPPTR; - sv = GvSV(gv); - if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv) && - SvTYPE(sv) != SVt_PVGV) - { - (void)SvUPGRADE(value, SvTYPE(sv)); - SvMAGIC(value) = SvMAGIC(sv); - SvFLAGS(value) |= SvMAGICAL(sv); - SvMAGICAL_off(sv); - SvMAGIC(sv) = 0; - } - SvREFCNT_dec(sv); - GvSV(gv) = value; - localizing = 2; - SvSETMAGIC(value); - localizing = 0; - break; + ptr = &GvSV(gv); + goto restore_sv; case SAVEt_SVREF: /* scalar reference */ + value = (SV*)SSPOPPTR; ptr = SSPOPPTR; + restore_sv: sv = *(SV**)ptr; - value = (SV*)SSPOPPTR; if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv) && SvTYPE(sv) != SVt_PVGV) { @@ -479,6 +447,14 @@ I32 base; SvMAGICAL_off(sv); SvMAGIC(sv) = 0; } + else if (SvTYPE(value) >= SVt_PVMG && SvMAGIC(value) && + SvTYPE(value) != SVt_PVGV) + { + SvFLAGS(value) |= (SvFLAGS(value) & + (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT; + SvMAGICAL_off(value); + SvMAGIC(value) = 0; + } SvREFCNT_dec(sv); *(SV**)ptr = value; localizing = 2; @@ -694,6 +670,8 @@ CONTEXT* cx; if (cx->blk_loop.itervar) PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERSAVE = 0x%lx\n", (long)cx->blk_loop.itersave); + PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERLVAL = 0x%lx\n", + (long)cx->blk_loop.iterlval); break; case CXt_SUBST: |