Teach regex optimiser how to handle (?=) and (?<=) properly.
[p5sagit/p5-mst-13.2.git] / scope.c
diff --git a/scope.c b/scope.c
index d7e4d5e..6365f2d 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);
 }
 
@@ -267,9 +267,7 @@ Perl_save_gp(pTHX_ GV *gv, I32 empty)
     SSPUSHINT(SAVEt_GP);
 
     if (empty) {
-       register GP *gp;
-
-       Newxz(gp, 1, GP);
+       GP *gp = Perl_newGP(aTHX_ gv);
 
        if (GvCVu(gv))
            PL_sub_generation++;        /* taking a method out of circulation */
@@ -277,15 +275,7 @@ Perl_save_gp(pTHX_ GV *gv, I32 empty)
            gp->gp_io = newIO();
            IoFLAGS(gp->gp_io) |= IOf_ARGV|IOf_START;
        }
-       GvGP(gv) = gp_ref(gp);
-#ifndef PERL_DONT_CREATE_GVSV
-       GvSV(gv) = newSV(0);
-#endif
-       GvLINE(gv) = CopLINE(PL_curcop);
-       /* XXX Ideally this cast would be replaced with a change to const char*
-          in the struct.  */
-       GvFILE(gv) = CopFILE(PL_curcop) ? CopFILE(PL_curcop) : (char *) "";
-       GvEGV(gv) = gv;
+       GvGP(gv) = gp;
     }
     else {
        gp_ref(GvGP(gv));
@@ -643,8 +633,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;
@@ -845,9 +835,9 @@ Perl_leave_scope(pTHX_ I32 base)
            value = (SV*)SSPOPPTR;
            i = SSPOPINT;
            av = (AV*)SSPOPPTR;
+           ptr = av_fetch(av,i,1);
            if (!AvREAL(av) && AvREIFY(av)) /* undo reify guard */
                SvREFCNT_dec(value);
-           ptr = av_fetch(av,i,1);
            if (ptr) {
                sv = *(SV**)ptr;
                if (sv && sv != &PL_sv_undef) {
@@ -888,8 +878,8 @@ Perl_leave_scope(pTHX_ I32 base)
                GvHV(PL_hintgv) = NULL;
            }
            *(I32*)&PL_hints = (I32)SSPOPINT;
-           Perl_refcounted_he_free(aTHX_ PL_compiling.cop_hints);
-           PL_compiling.cop_hints = (struct refcounted_he *) SSPOPPTR;
+           Perl_refcounted_he_free(aTHX_ PL_compiling.cop_hints_hash);
+           PL_compiling.cop_hints_hash = (struct refcounted_he *) SSPOPPTR;
            if (PL_hints & HINT_LOCALIZE_HH) {
                SvREFCNT_dec((SV*)GvHV(PL_hintgv));
                GvHV(PL_hintgv) = (HV*)SSPOPPTR;
@@ -984,6 +974,14 @@ Perl_leave_scope(pTHX_ I32 base)
            i = SSPOPINT;
            CopARYBASE_set((COP *)ptr, i);
            break;
+       case SAVEt_COMPILE_WARNINGS:
+           ptr = SSPOPPTR;
+
+           if (!specialWARN(PL_compiling.cop_warnings))
+               PerlMemShared_free(PL_compiling.cop_warnings);
+
+           PL_compiling.cop_warnings = (STRLEN*)ptr;
+           break;
        case SAVEt_RE_STATE:
            {
                const struct re_save_state *const state
@@ -992,49 +990,13 @@ Perl_leave_scope(pTHX_ I32 base)
                     - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
                PL_savestack_ix -= SAVESTACK_ALLOC_FOR_RE_SAVE_STATE;
 
-               PL_reg_flags = state->re_state_reg_flags;
-               PL_bostr = state->re_state_bostr;
-               PL_reginput = state->re_state_reginput;
-               PL_regbol = state->re_state_regbol;
-               PL_regeol = state->re_state_regeol;
-               PL_regstartp = state->re_state_regstartp;
-               PL_regendp = state->re_state_regendp;
-               PL_reglastparen = state->re_state_reglastparen;
-               PL_reglastcloseparen = state->re_state_reglastcloseparen;
-               PL_regtill = state->re_state_regtill;
                if (PL_reg_start_tmp != state->re_state_reg_start_tmp) {
                    Safefree(PL_reg_start_tmp);
-                   PL_reg_start_tmp = state->re_state_reg_start_tmp;
                }
-               PL_reg_start_tmpl = state->re_state_reg_start_tmpl;
-               PL_reg_eval_set = state->re_state_reg_eval_set;
-               PL_regnarrate = state->re_state_regnarrate;
-               PL_regindent = state->re_state_regindent;
-               PL_reg_call_cc = state->re_state_reg_call_cc;
-               PL_reg_re = state->re_state_reg_re;
-               PL_reg_ganch = state->re_state_reg_ganch;
-               PL_reg_sv = state->re_state_reg_sv;
-               PL_reg_match_utf8 = state->re_state_reg_match_utf8;
-               PL_reg_magic = state->re_state_reg_magic;
-               PL_reg_oldpos = state->re_state_reg_oldpos;
-               PL_reg_oldcurpm = state->re_state_reg_oldcurpm;
-               PL_reg_curpm = state->re_state_reg_curpm;
-               PL_reg_oldsaved = state->re_state_reg_oldsaved;
-               PL_reg_oldsavedlen = state->re_state_reg_oldsavedlen;
-               PL_reg_maxiter = state->re_state_reg_maxiter;
-               PL_reg_leftiter = state->re_state_reg_leftiter;
                if (PL_reg_poscache != state->re_state_reg_poscache) {
                    Safefree(PL_reg_poscache);
-                   PL_reg_poscache = state->re_state_reg_poscache;
                }
-               PL_reg_poscache_size = state->re_state_reg_poscache_size;
-               PL_regsize = state->re_state_regsize;
-#ifdef DEBUGGING
-               PL_reg_starttry = state->re_state_reg_starttry;
-#endif
-#ifdef PERL_OLD_COPY_ON_WRITE
-               PL_nrs = state->re_state_nrs;
-#endif
+               Copy(state, &PL_reg_state, 1, struct re_save_state);
            }
            break;
        default:
@@ -1071,7 +1033,7 @@ Perl_cx_dump(pTHX_ PERL_CONTEXT *cx)
        PerlIO_printf(Perl_debug_log, "BLK_SUB.DFOUTGV = 0x%"UVxf"\n",
                PTR2UV(cx->blk_sub.dfoutgv));
        PerlIO_printf(Perl_debug_log, "BLK_SUB.HASARGS = %d\n",
-               (int)cx->blk_sub.hasargs);
+               (int)CX_SUB_HASARGS_GET(cx));
        PerlIO_printf(Perl_debug_log, "BLK_SUB.RETOP = 0x%"UVxf"\n",
                PTR2UV(cx->blk_sub.retop));
        break;
@@ -1081,9 +1043,9 @@ Perl_cx_dump(pTHX_ PERL_CONTEXT *cx)
        PerlIO_printf(Perl_debug_log, "BLK_SUB.OLDDEPTH = %ld\n",
                (long)cx->blk_sub.olddepth);
        PerlIO_printf(Perl_debug_log, "BLK_SUB.HASARGS = %d\n",
-               (int)cx->blk_sub.hasargs);
+               (int)CX_SUB_HASARGS_GET(cx));
        PerlIO_printf(Perl_debug_log, "BLK_SUB.LVAL = %d\n",
-               (int)cx->blk_sub.lval);
+               (int)CX_SUB_LVAL(cx));
        PerlIO_printf(Perl_debug_log, "BLK_SUB.RETOP = 0x%"UVxf"\n",
                PTR2UV(cx->blk_sub.retop));
        break;