summaryrefslogtreecommitdiff
path: root/scope.c
diff options
context:
space:
mode:
authorMalcolm Beattie <mbeattie@sable.ox.ac.uk>1997-10-16 11:09:25 +0000
committerMalcolm Beattie <mbeattie@sable.ox.ac.uk>1997-10-16 11:09:25 +0000
commitd58bf5aa3d3631a46847733b1ff1985b30140228 (patch)
tree406c095d697ae0ae82bbf187e5c65151bd41232a /scope.c
parentc7848ba184fac8eca4125f4296d6e09fee2c1846 (diff)
parent50e27ac33704d6fb34d4be7cfb426b2097b27505 (diff)
downloadperl-d58bf5aa3d3631a46847733b1ff1985b30140228.tar.gz
Merge maint-5.004 branch (5.004_04) with mainline.
p4raw-id: //depot/perl@137
Diffstat (limited to 'scope.c')
-rw-r--r--scope.c77
1 files changed, 68 insertions, 9 deletions
diff --git a/scope.c b/scope.c
index 7628196b9d..3fc1a0e959 100644
--- a/scope.c
+++ b/scope.c
@@ -178,7 +178,12 @@ GV *gv;
I32 empty;
{
dTHR;
- SSCHECK(3);
+ SSCHECK(6);
+ SSPUSHIV((IV)SvLEN(gv));
+ SvLEN(gv) = 0; /* forget that anything was allocated here */
+ SSPUSHIV((IV)SvCUR(gv));
+ SSPUSHPTR(SvPVX(gv));
+ SvPOK_off(gv);
SSPUSHPTR(SvREFCNT_inc(gv));
SSPUSHPTR(GvGP(gv));
SSPUSHINT(SAVEt_GP);
@@ -202,13 +207,25 @@ save_ary(gv)
GV *gv;
{
dTHR;
+ AV *oav, *av;
+
SSCHECK(3);
SSPUSHPTR(gv);
- SSPUSHPTR(GvAVn(gv));
+ SSPUSHPTR(oav = GvAVn(gv));
SSPUSHINT(SAVEt_AV);
GvAV(gv) = Null(AV*);
- return GvAVn(gv);
+ av = GvAVn(gv);
+ if (SvMAGIC(oav)) {
+ SvMAGIC(av) = SvMAGIC(oav);
+ SvFLAGS(av) |= SvMAGICAL(oav);
+ SvMAGICAL_off(oav);
+ SvMAGIC(oav) = 0;
+ localizing = 1;
+ SvSETMAGIC((SV*)av);
+ localizing = 0;
+ }
+ return av;
}
HV *
@@ -216,13 +233,25 @@ save_hash(gv)
GV *gv;
{
dTHR;
+ HV *ohv, *hv;
+
SSCHECK(3);
SSPUSHPTR(gv);
- SSPUSHPTR(GvHVn(gv));
+ SSPUSHPTR(ohv = GvHVn(gv));
SSPUSHINT(SAVEt_HV);
GvHV(gv) = Null(HV*);
- return GvHVn(gv);
+ hv = GvHVn(gv);
+ if (SvMAGIC(ohv)) {
+ SvMAGIC(hv) = SvMAGIC(ohv);
+ SvFLAGS(hv) |= SvMAGICAL(ohv);
+ SvMAGICAL_off(ohv);
+ SvMAGIC(ohv) = 0;
+ localizing = 1;
+ SvSETMAGIC((SV*)hv);
+ localizing = 0;
+ }
+ return hv;
}
void
@@ -506,14 +535,38 @@ I32 base;
case SAVEt_AV: /* array reference */
av = (AV*)SSPOPPTR;
gv = (GV*)SSPOPPTR;
- SvREFCNT_dec(GvAV(gv));
+ if (GvAV(gv)) {
+ AV *goner = GvAV(gv);
+ SvMAGIC(av) = SvMAGIC(goner);
+ SvFLAGS(av) |= SvMAGICAL(goner);
+ SvMAGICAL_off(goner);
+ SvMAGIC(goner) = 0;
+ SvREFCNT_dec(goner);
+ }
GvAV(gv) = av;
+ if (SvMAGICAL(av)) {
+ localizing = 2;
+ SvSETMAGIC((SV*)av);
+ localizing = 0;
+ }
break;
case SAVEt_HV: /* hash reference */
hv = (HV*)SSPOPPTR;
gv = (GV*)SSPOPPTR;
- SvREFCNT_dec(GvHV(gv));
+ if (GvHV(gv)) {
+ HV *goner = GvHV(gv);
+ SvMAGIC(hv) = SvMAGIC(goner);
+ SvFLAGS(hv) |= SvMAGICAL(goner);
+ SvMAGICAL_off(goner);
+ SvMAGIC(goner) = 0;
+ SvREFCNT_dec(goner);
+ }
GvHV(gv) = hv;
+ if (SvMAGICAL(hv)) {
+ localizing = 2;
+ SvSETMAGIC((SV*)hv);
+ localizing = 0;
+ }
break;
case SAVEt_INT: /* int reference */
ptr = SSPOPPTR;
@@ -555,11 +608,17 @@ I32 base;
gv = (GV*)SSPOPPTR;
(void)sv_clear((SV*)gv);
break;
- case SAVEt_GP: /* scalar reference */
+ case SAVEt_GP: /* scalar reference */
ptr = SSPOPPTR;
gv = (GV*)SSPOPPTR;
gp_free(gv);
GvGP(gv) = (GP*)ptr;
+ if (SvPOK(gv) && SvLEN(gv) > 0) {
+ Safefree(SvPVX(gv));
+ }
+ SvPVX(gv) = (char *)SSPOPPTR;
+ SvCUR(gv) = (STRLEN)SSPOPIV;
+ SvLEN(gv) = (STRLEN)SSPOPIV;
SvREFCNT_dec(gv);
break;
case SAVEt_FREESV:
@@ -662,7 +721,7 @@ cx_dump(cx)
CONTEXT* cx;
{
dTHR;
- PerlIO_printf(Perl_debug_log, "CX %d = %s\n", cx - cxstack, block_type[cx->cx_type]);
+ PerlIO_printf(Perl_debug_log, "CX %ld = %s\n", (long)(cx - cxstack), block_type[cx->cx_type]);
if (cx->cx_type != CXt_SUBST) {
PerlIO_printf(Perl_debug_log, "BLK_OLDSP = %ld\n", (long)cx->blk_oldsp);
PerlIO_printf(Perl_debug_log, "BLK_OLDCOP = 0x%lx\n", (long)cx->blk_oldcop);