Add tests for all the other types that %^H serialisation is supposed
[p5sagit/p5-mst-13.2.git] / scope.c
diff --git a/scope.c b/scope.c
index cec853e..ebea9e1 100644 (file)
--- a/scope.c
+++ b/scope.c
@@ -226,8 +226,8 @@ Perl_save_generic_pvref(pTHX_ char **str)
 {
     dVAR;
     SSCHECK(3);
-    SSPUSHPTR(str);
     SSPUSHPTR(*str);
+    SSPUSHPTR(str);
     SSPUSHINT(SAVEt_GENERIC_PVREF);
 }
 
@@ -643,8 +643,8 @@ Perl_leave_scope(pTHX_ I32 base)
                SvREFCNT_dec(av);
            break;
        case SAVEt_GENERIC_PVREF:               /* generic pv */
-           str = (char*)SSPOPPTR;
            ptr = SSPOPPTR;
+           str = (char*)SSPOPPTR;
            if (*(char**)ptr != str) {
                Safefree(*(char**)ptr);
                *(char**)ptr = str;
@@ -764,6 +764,10 @@ Perl_leave_scope(pTHX_ I32 base)
            ptr = SSPOPPTR;
            Safefree(ptr);
            break;
+       case SAVEt_FREESHAREDPV:
+           ptr = SSPOPPTR;
+           PerlMemShared_free(ptr);
+           break;
        case SAVEt_CLEARSV:
            ptr = (void*)&PL_curpad[SSPOPLONG];
            sv = *(SV**)ptr;
@@ -984,6 +988,17 @@ Perl_leave_scope(pTHX_ I32 base)
            i = SSPOPINT;
            CopARYBASE_set((COP *)ptr, i);
            break;
+       case SAVEt_COP_WARNINGS:
+           {
+               COP *const cop = SSPOPPTR;
+               ptr = SSPOPPTR;
+
+               if (!specialWARN(cop->cop_warnings))
+                   PerlMemShared_free(cop->cop_warnings);
+
+               cop->cop_warnings = ptr;
+           }
+           break;
        case SAVEt_RE_STATE:
            {
                const struct re_save_state *const state