This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Win32API::File cleanup
[perl5.git] / scope.c
diff --git a/scope.c b/scope.c
index d52d12d..17b7789 100644 (file)
--- a/scope.c
+++ b/scope.c
@@ -256,11 +256,19 @@ Perl_save_gp(pTHX_ GV *gv, I32 empty)
        GP *gp = Perl_newGP(aTHX_ gv);
 
        if (GvCVu(gv))
-           PL_sub_generation++;        /* taking a method out of circulation */
+            mro_method_changed_in(GvSTASH(gv)); /* taking a method out of circulation ("local")*/
        if (GvIOp(gv) && (IoFLAGS(GvIOp(gv)) & IOf_ARGV)) {
            gp->gp_io = newIO();
            IoFLAGS(gp->gp_io) |= IOf_ARGV|IOf_START;
        }
+#ifdef PERL_DONT_CREATE_GVSV
+       if (gv == PL_errgv) {
+           /* We could scatter this logic everywhere by changing the
+              definition of ERRSV from GvSV() to GvSVn(), but it seems more
+              efficient to do this check once here.  */
+           gp->gp_sv = newSV(0);
+       }
+#endif
        GvGP(gv) = gp;
     }
     else {
@@ -351,6 +359,16 @@ Perl_save_I8(pTHX_ I8 *bytep)
 }
 
 void
+Perl_save_I16(pTHX_ I16 *intp)
+{
+    dVAR;
+    SSCHECK(3);
+    SSPUSHINT(*intp);
+    SSPUSHPTR(intp);
+    SSPUSHINT(SAVEt_I16);
+}
+
+void
 Perl_save_I32(pTHX_ I32 *intp)
 {
     dVAR;
@@ -535,7 +553,7 @@ Perl_save_helem(pTHX_ HV *hv, SV *key, SV **sptr)
     SvGETMAGIC(*sptr);
     SSCHECK(4);
     SSPUSHPTR(SvREFCNT_inc_simple(hv));
-    SSPUSHPTR(SvREFCNT_inc_simple(key));
+    SSPUSHPTR(newSVsv(key));
     SSPUSHPTR(SvREFCNT_inc(*sptr));
     SSPUSHINT(SAVEt_HELEM);
     save_scalar_at(sptr);
@@ -662,15 +680,7 @@ Perl_leave_scope(pTHX_ I32 base)
            av = (AV*)SSPOPPTR;
            gv = (GV*)SSPOPPTR;
            if (GvAV(gv)) {
-               AV * const goner = GvAV(gv);
-               /* FIXME - this is a temporary hack until we work out what
-                  the correct behaviour for magic should be.  */
-               sv_unmagic((SV*)goner, PERL_MAGIC_arylen_p);
-               SvMAGIC_set(av, SvMAGIC(goner));
-               SvFLAGS((SV*)av) |= SvMAGICAL(goner);
-               SvMAGICAL_off(goner);
-               SvMAGIC_set(goner, NULL);
-               SvREFCNT_dec(goner);
+               SvREFCNT_dec(GvAV(gv));
            }
            GvAV(gv) = av;
            if (SvMAGICAL(av)) {
@@ -683,12 +693,7 @@ Perl_leave_scope(pTHX_ I32 base)
            hv = (HV*)SSPOPPTR;
            gv = (GV*)SSPOPPTR;
            if (GvHV(gv)) {
-               HV * const goner = GvHV(gv);
-               SvMAGIC_set(hv, SvMAGIC(goner));
-               SvFLAGS(hv) |= SvMAGICAL(goner);
-               SvMAGICAL_off(goner);
-               SvMAGIC_set(goner, NULL);
-               SvREFCNT_dec(goner);
+               SvREFCNT_dec(GvHV(gv));
            }
            GvHV(gv) = hv;
            if (SvMAGICAL(hv)) {
@@ -739,8 +744,9 @@ Perl_leave_scope(pTHX_ I32 base)
            gv = (GV*)SSPOPPTR;
            gp_free(gv);
            GvGP(gv) = (GP*)ptr;
-           if (GvCVu(gv))
-               PL_sub_generation++;  /* putting a method back into circulation */
+            /* putting a method back into circulation ("local")*/
+           if (GvCVu(gv) && (hv=GvSTASH(gv)) && HvNAME_get(hv))
+                mro_method_changed_in(hv);
            SvREFCNT_dec(gv);
            break;
        case SAVEt_FREESV: