document svt_copy, svt_dup and svt_local vtable slots
[p5sagit/p5-mst-13.2.git] / pp_ctl.c
index 2f563ef..05b34bf 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -1,7 +1,7 @@
 /*    pp_ctl.c
  *
  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
- *    2000, 2001, 2002, 2003, 2004, 2005, by Larry Wall and others
+ *    2000, 2001, 2002, 2003, 2004, 2005, 2006, by Larry Wall and others
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
@@ -40,6 +40,7 @@
 
 PP(pp_wantarray)
 {
+    dVAR;
     dSP;
     I32 cxix;
     EXTEND(SP, 1);
@@ -60,6 +61,7 @@ PP(pp_wantarray)
 
 PP(pp_regcreset)
 {
+    dVAR;
     /* XXXX Should store the old value to allow for tie/overload - and
        restore in regcomp, where marked with XXXX. */
     PL_reginterp_cnt = 0;
@@ -69,6 +71,7 @@ PP(pp_regcreset)
 
 PP(pp_regcomp)
 {
+    dVAR;
     dSP;
     register PMOP *pm = (PMOP*)cLOGOP->op_other;
     SV *tmpstr;
@@ -180,6 +183,7 @@ PP(pp_regcomp)
 
 PP(pp_substcont)
 {
+    dVAR;
     dSP;
     register PERL_CONTEXT *cx = &cxstack[cxstack_ix];
     register PMOP * const pm = (PMOP*) cLOGOP->op_other;
@@ -188,7 +192,7 @@ PP(pp_substcont)
     register char *m = cx->sb_m;
     char *orig = cx->sb_orig;
     register REGEXP * const rx = cx->sb_rx;
-    SV *nsv = Nullsv;
+    SV *nsv = NULL;
     REGEXP *old = PM_GETRE(pm);
     if(old != rx) {
        if(old)
@@ -280,7 +284,7 @@ PP(pp_substcont)
        if (SvTYPE(sv) < SVt_PVMG)
            SvUPGRADE(sv, SVt_PVMG);
        if (!(mg = mg_find(sv, PERL_MAGIC_regex_global))) {
-           sv_magic(sv, Nullsv, PERL_MAGIC_regex_global, Nullch, 0);
+           sv_magic(sv, NULL, PERL_MAGIC_regex_global, NULL, 0);
            mg = mg_find(sv, PERL_MAGIC_regex_global);
        }
        i = m - orig;
@@ -314,12 +318,12 @@ Perl_rxres_save(pTHX_ void **rsp, REGEXP *rx)
        *rsp = (void*)p;
     }
 
-    *p++ = PTR2UV(RX_MATCH_COPIED(rx) ? rx->subbeg : Nullch);
+    *p++ = PTR2UV(RX_MATCH_COPIED(rx) ? rx->subbeg : NULL);
     RX_MATCH_COPIED_off(rx);
 
 #ifdef PERL_OLD_COPY_ON_WRITE
     *p++ = PTR2UV(rx->saved_copy);
-    rx->saved_copy = Nullsv;
+    rx->saved_copy = NULL;
 #endif
 
     *p++ = rx->nparens;
@@ -385,20 +389,20 @@ Perl_rxres_free(pTHX_ void **rsp)
 
 PP(pp_formline)
 {
-    dSP; dMARK; dORIGMARK;
+    dVAR; dSP; dMARK; dORIGMARK;
     register SV * const tmpForm = *++MARK;
     register U32 *fpc;
     register char *t;
     const char *f;
     register I32 arg;
-    register SV *sv = Nullsv;
-    const char *item = Nullch;
+    register SV *sv = NULL;
+    const char *item = NULL;
     I32 itemsize  = 0;
     I32 fieldsize = 0;
     I32 lines = 0;
-    bool chopspace = (strchr(PL_chopset, ' ') != Nullch);
-    const char *chophere = Nullch;
-    char *linemark = Nullch;
+    bool chopspace = (strchr(PL_chopset, ' ') != NULL);
+    const char *chophere = NULL;
+    char *linemark = NULL;
     NV value;
     bool gotsome = FALSE;
     STRLEN len;
@@ -406,8 +410,8 @@ PP(pp_formline)
                        ? (SvCUR(tmpForm) * (IN_BYTES ? 1 : 3) + 1) : 0;
     bool item_is_utf8 = FALSE;
     bool targ_is_utf8 = FALSE;
-    SV * nsv = Nullsv;
-    OP * parseres = 0;
+    SV * nsv = NULL;
+    OP * parseres = NULL;
     const char *fmt;
     bool oneline;
 
@@ -1047,6 +1051,7 @@ PP(pp_mapwhile)
 
 PP(pp_range)
 {
+    dVAR;
     if (GIMME == G_ARRAY)
        return NORMAL;
     if (SvTRUEx(PAD_SV(PL_op->op_targ)))
@@ -1057,6 +1062,7 @@ PP(pp_range)
 
 PP(pp_flip)
 {
+    dVAR;
     dSP;
 
     if (GIMME == G_ARRAY) {
@@ -1111,7 +1117,7 @@ PP(pp_flip)
 
 PP(pp_flop)
 {
-    dSP;
+    dVAR; dSP;
 
     if (GIMME == G_ARRAY) {
        dPOPPOPssrl;
@@ -1176,7 +1182,7 @@ PP(pp_flop)
 
        if (flop) {
            sv_setiv(PAD_SV(((UNOP*)cUNOP->op_first)->op_first->op_targ), 0);
-           sv_catpvn(targ, "E0", 2);
+           sv_catpvs(targ, "E0");
        }
        SETs(targ);
     }
@@ -1201,6 +1207,7 @@ static const char * const context_name[] = {
 STATIC I32
 S_dopoptolabel(pTHX_ const char *label)
 {
+    dVAR;
     register I32 i;
 
     for (i = cxstack_ix; i >= 0; i--) {
@@ -1237,6 +1244,7 @@ S_dopoptolabel(pTHX_ const char *label)
 I32
 Perl_dowantarray(pTHX)
 {
+    dVAR;
     const I32 gimme = block_gimme();
     return (gimme == G_VOID) ? G_SCALAR : gimme;
 }
@@ -1244,6 +1252,7 @@ Perl_dowantarray(pTHX)
 I32
 Perl_block_gimme(pTHX)
 {
+    dVAR;
     const I32 cxix = dopoptosub(cxstack_ix);
     if (cxix < 0)
        return G_VOID;
@@ -1265,6 +1274,7 @@ Perl_block_gimme(pTHX)
 I32
 Perl_is_lvalue_sub(pTHX)
 {
+    dVAR;
     const I32 cxix = dopoptosub(cxstack_ix);
     assert(cxix >= 0);  /* We should only be called from inside subs */
 
@@ -1277,12 +1287,14 @@ Perl_is_lvalue_sub(pTHX)
 STATIC I32
 S_dopoptosub(pTHX_ I32 startingblock)
 {
+    dVAR;
     return dopoptosub_at(cxstack, startingblock);
 }
 
 STATIC I32
 S_dopoptosub_at(pTHX_ const PERL_CONTEXT *cxstk, I32 startingblock)
 {
+    dVAR;
     I32 i;
     for (i = startingblock; i >= 0; i--) {
        register const PERL_CONTEXT * const cx = &cxstk[i];
@@ -1302,6 +1314,7 @@ S_dopoptosub_at(pTHX_ const PERL_CONTEXT *cxstk, I32 startingblock)
 STATIC I32
 S_dopoptoeval(pTHX_ I32 startingblock)
 {
+    dVAR;
     I32 i;
     for (i = startingblock; i >= 0; i--) {
        register const PERL_CONTEXT *cx = &cxstack[i];
@@ -1319,6 +1332,7 @@ S_dopoptoeval(pTHX_ I32 startingblock)
 STATIC I32
 S_dopoptoloop(pTHX_ I32 startingblock)
 {
+    dVAR;
     I32 i;
     for (i = startingblock; i >= 0; i--) {
        register const PERL_CONTEXT * const cx = &cxstack[i];
@@ -1345,6 +1359,7 @@ S_dopoptoloop(pTHX_ I32 startingblock)
 STATIC I32
 S_dopoptogiven(pTHX_ I32 startingblock)
 {
+    dVAR;
     I32 i;
     for (i = startingblock; i >= 0; i--) {
        register const PERL_CONTEXT *cx = &cxstack[i];
@@ -1367,6 +1382,7 @@ S_dopoptogiven(pTHX_ I32 startingblock)
 STATIC I32
 S_dopoptowhen(pTHX_ I32 startingblock)
 {
+    dVAR;
     I32 i;
     for (i = startingblock; i >= 0; i--) {
        register const PERL_CONTEXT *cx = &cxstack[i];
@@ -1384,6 +1400,7 @@ S_dopoptowhen(pTHX_ I32 startingblock)
 void
 Perl_dounwind(pTHX_ I32 cxix)
 {
+    dVAR;
     I32 optype;
 
     while (cxstack_ix > cxix) {
@@ -1420,6 +1437,7 @@ Perl_dounwind(pTHX_ I32 cxix)
 void
 Perl_qerror(pTHX_ SV *err)
 {
+    dVAR;
     if (PL_in_eval)
        sv_catsv(ERRSV, err);
     else if (PL_errors)
@@ -1442,7 +1460,7 @@ Perl_die_where(pTHX_ const char *message, STRLEN msglen)
            if (PL_in_eval & EVAL_KEEPERR) {
                 static const char prefix[] = "\t(in cleanup) ";
                SV * const err = ERRSV;
-                const char *e = Nullch;
+               const char *e = NULL;
                if (!SvPOK(err))
                    sv_setpvn(err,"",0);
                else if (SvCUR(err) >= sizeof(prefix)+msglen-1) {
@@ -1450,7 +1468,7 @@ Perl_die_where(pTHX_ const char *message, STRLEN msglen)
                    e = SvPV_const(err, len);
                    e += len - msglen;
                    if (*e != *message || strNE(e,message))
-                       e = Nullch;
+                       e = NULL;
                }
                if (!e) {
                    SvGROW(err, SvCUR(err)+sizeof(prefix)+msglen);
@@ -1527,7 +1545,7 @@ Perl_die_where(pTHX_ const char *message, STRLEN msglen)
 
 PP(pp_xor)
 {
-    dSP; dPOPTOPssrl;
+    dVAR; dSP; dPOPTOPssrl;
     if (SvTRUE(left) != SvTRUE(right))
        RETSETYES;
     else
@@ -1536,6 +1554,7 @@ PP(pp_xor)
 
 PP(pp_caller)
 {
+    dVAR;
     dSP;
     register I32 cxix = dopoptosub(cxstack_ix);
     register const PERL_CONTEXT *cx;
@@ -1609,17 +1628,17 @@ PP(pp_caller)
        /* So is ccstack[dbcxix]. */
        if (isGV(cvgv)) {
            SV * const sv = NEWSV(49, 0);
-           gv_efullname3(sv, cvgv, Nullch);
+           gv_efullname3(sv, cvgv, NULL);
            PUSHs(sv_2mortal(sv));
            PUSHs(sv_2mortal(newSViv((I32)cx->blk_sub.hasargs)));
        }
        else {
-           PUSHs(sv_2mortal(newSVpvn("(unknown)",9)));
+           PUSHs(sv_2mortal(newSVpvs("(unknown)")));
            PUSHs(sv_2mortal(newSViv((I32)cx->blk_sub.hasargs)));
        }
     }
     else {
-       PUSHs(sv_2mortal(newSVpvn("(eval)",6)));
+       PUSHs(sv_2mortal(newSVpvs("(eval)")));
        PUSHs(sv_2mortal(newSViv(0)));
     }
     gimme = (I32)cx->blk_gimme;
@@ -1700,6 +1719,7 @@ PP(pp_caller)
 
 PP(pp_reset)
 {
+    dVAR;
     dSP;
     const char * const tmps = (MAXARG < 1) ? "" : POPpconstx;
     sv_reset(tmps, CopSTASH(PL_curcop));
@@ -2033,7 +2053,7 @@ PP(pp_return)
        POPSUB(cx,sv);  /* release CV and @_ ... */
     }
     else
-       sv = Nullsv;
+       sv = NULL;
     PL_curpm = newpm;  /* ... and pop $1 et al */
 
     LEAVESUB(sv);
@@ -2054,7 +2074,7 @@ PP(pp_last)
     SV **newsp;
     PMOP *newpm;
     SV **mark;
-    SV *sv = Nullsv;
+    SV *sv = NULL;
 
 
     if (PL_op->op_flags & OPf_SPECIAL) {
@@ -2203,6 +2223,7 @@ PP(pp_redo)
 STATIC OP *
 S_dofindlabel(pTHX_ OP *o, const char *label, OP **opstack, OP **oplimit)
 {
+    dVAR;
     OP **ops = opstack;
     static const char too_deep[] = "Target of goto is too deeply nested";
 
@@ -2250,12 +2271,12 @@ S_dofindlabel(pTHX_ OP *o, const char *label, OP **opstack, OP **oplimit)
 PP(pp_goto)
 {
     dVAR; dSP;
-    OP *retop = 0;
+    OP *retop = NULL;
     I32 ix;
     register PERL_CONTEXT *cx;
 #define GOTO_DEPTH 64
     OP *enterops[GOTO_DEPTH];
-    const char *label = 0;
+    const char *label = NULL;
     const bool do_dump = (PL_op->op_type == OP_DUMP);
     static const char must_have_label[] = "goto must have label";
 
@@ -2286,7 +2307,7 @@ PP(pp_goto)
                    if (autogv && (cv = GvCV(autogv)))
                        goto retry;
                    tmpstr = sv_newmortal();
-                   gv_efullname3(tmpstr, gv, Nullch);
+                   gv_efullname3(tmpstr, gv, NULL);
                    DIE(aTHX_ "Goto undefined subroutine &%"SVf"",tmpstr);
                }
                DIE(aTHX_ "Goto undefined subroutine");
@@ -2462,7 +2483,7 @@ PP(pp_goto)
                        (void)SvIOK_on(sv);
                        SvIV_set(sv, PTR2IV(cv)); /* Do it the quickest way */
                    } else {
-                       gv_efullname3(sv, CvGV(cv), Nullch);
+                       gv_efullname3(sv, CvGV(cv), NULL);
                    }
                    if (  PERLDB_GOTO
                          && (gotocv = get_cv("DB::goto", FALSE)) ) {
@@ -2488,10 +2509,10 @@ PP(pp_goto)
        label = cPVOP->op_pv;
 
     if (label && *label) {
-       OP *gotoprobe = 0;
+       OP *gotoprobe = NULL;
        bool leaving_eval = FALSE;
        bool in_block = FALSE;
-        PERL_CONTEXT *last_eval_cx = 0;
+       PERL_CONTEXT *last_eval_cx = NULL;
 
        /* find label */
 
@@ -2607,6 +2628,7 @@ PP(pp_goto)
 
 PP(pp_exit)
 {
+    dVAR;
     dSP;
     I32 anum;
 
@@ -2626,46 +2648,6 @@ PP(pp_exit)
     RETURN;
 }
 
-#ifdef NOTYET
-PP(pp_nswitch)
-{
-    dSP;
-    const NV value = SvNVx(GvSV(cCOP->cop_gv));
-    register I32 match = I_32(value);
-
-    if (value < 0.0) {
-       if (((NV)match) > value)
-           --match;            /* was fractional--truncate other way */
-    }
-    match -= cCOP->uop.scop.scop_offset;
-    if (match < 0)
-       match = 0;
-    else if (match > cCOP->uop.scop.scop_max)
-       match = cCOP->uop.scop.scop_max;
-    PL_op = cCOP->uop.scop.scop_next[match];
-    RETURNOP(PL_op);
-}
-
-PP(pp_cswitch)
-{
-    dSP;
-    register I32 match;
-
-    if (PL_multiline)
-       PL_op = PL_op->op_next;                 /* can't assume anything */
-    else {
-       match = *(SvPVx_nolen_const(GvSV(cCOP->cop_gv))) & 255;
-       match -= cCOP->uop.scop.scop_offset;
-       if (match < 0)
-           match = 0;
-       else if (match > cCOP->uop.scop.scop_max)
-           match = cCOP->uop.scop.scop_max;
-       PL_op = cCOP->uop.scop.scop_next[match];
-    }
-    RETURNOP(PL_op);
-}
-#endif
-
 /* Eval. */
 
 STATIC void
@@ -2695,6 +2677,7 @@ S_save_lines(pTHX_ AV *array, SV *sv)
 STATIC void
 S_docatch_body(pTHX)
 {
+    dVAR;
     CALLRUNOPS(aTHX);
     return;
 }
@@ -2702,6 +2685,7 @@ S_docatch_body(pTHX)
 STATIC OP *
 S_docatch(pTHX_ OP *o)
 {
+    dVAR;
     int ret;
     OP * const oldop = PL_op;
     dJMPENV;
@@ -2859,6 +2843,7 @@ than in the scope of the debugger itself).
 CV*
 Perl_find_runcv(pTHX_ U32 *db_seqp)
 {
+    dVAR;
     PERL_SI     *si;
 
     if (db_seqp)
@@ -3031,8 +3016,7 @@ STATIC PerlIO *
 S_check_type_and_open(pTHX_ const char *name, const char *mode)
 {
     Stat_t st;
-    int st_rc;
-    st_rc = PerlLIO_stat(name, &st);
+    const int st_rc = PerlLIO_stat(name, &st);
     if (st_rc < 0) {
        return Nullfp;
     }
@@ -3087,15 +3071,15 @@ PP(pp_require)
     SV *sv;
     const char *name;
     STRLEN len;
-    const char *tryname = Nullch;
-    SV *namesv = Nullsv;
+    const char *tryname = NULL;
+    SV *namesv = NULL;
     const I32 gimme = GIMME_V;
-    PerlIO *tryrsfp = 0;
     int filter_has_file = 0;
-    GV *filter_child_proc = 0;
-    SV *filter_state = 0;
-    SV *filter_sub = 0;
-    SV *hook_sv = 0;
+    PerlIO *tryrsfp = NULL;
+    GV *filter_child_proc = NULL;
+    SV *filter_state = NULL;
+    SV *filter_sub = NULL;
+    SV *hook_sv = NULL;
     SV *encoding;
     OP *op;
 
@@ -3157,7 +3141,7 @@ PP(pp_require)
        I32 i;
 #ifdef VMS
        char *unixname;
-       if ((unixname = tounixspec(name, Nullch)) != Nullch)
+       if ((unixname = tounixspec(name, NULL)) != NULL)
 #endif
        {
            namesv = NEWSV(806, 0);
@@ -3177,7 +3161,7 @@ PP(pp_require)
                    Perl_sv_setpvf(aTHX_ namesv, "/loader/0x%"UVxf"/%s",
                                   PTR2UV(SvRV(dirsv)), name);
                    tryname = SvPVX_const(namesv);
-                   tryrsfp = 0;
+                   tryrsfp = NULL;
 
                    ENTER;
                    SAVETMPS;
@@ -3244,9 +3228,8 @@ PP(pp_require)
                                (void)SvREFCNT_inc(filter_state);
                            }
 
-                           if (tryrsfp == 0) {
-                               tryrsfp = PerlIO_open("/dev/null",
-                                                     PERL_SCRIPT_MODE);
+                           if (!tryrsfp) {
+                               tryrsfp = PerlIO_open("/dev/null", PERL_SCRIPT_MODE);
                            }
                        }
                        SP--;
@@ -3264,15 +3247,15 @@ PP(pp_require)
                    filter_has_file = 0;
                    if (filter_child_proc) {
                        SvREFCNT_dec(filter_child_proc);
-                       filter_child_proc = 0;
+                       filter_child_proc = NULL;
                    }
                    if (filter_state) {
                        SvREFCNT_dec(filter_state);
-                       filter_state = 0;
+                       filter_state = NULL;
                    }
                    if (filter_sub) {
                        SvREFCNT_dec(filter_sub);
-                       filter_sub = 0;
+                       filter_sub = NULL;
                    }
                }
                else {
@@ -3294,7 +3277,7 @@ PP(pp_require)
 #else
 #  ifdef VMS
                    char *unixdir;
-                   if ((unixdir = tounixpath(dir, Nullch)) == Nullch)
+                   if ((unixdir = tounixpath(dir, NULL)) == NULL)
                        continue;
                    sv_setpv(namesv, unixdir);
                    sv_catpv(namesv, unixname);
@@ -3336,29 +3319,28 @@ PP(pp_require)
        if (PL_op->op_type == OP_REQUIRE) {
            const char *msgstr = name;
            if(errno == EMFILE) {
-               SV * const msg = sv_2mortal(newSVpv(msgstr,0));
-               sv_catpv(msg, ":  "); 
-               sv_catpv(msg, Strerror(errno));
+               SV * const msg
+                   = sv_2mortal(Perl_newSVpvf(aTHX_ "%s:   %s", msgstr,
+                                              Strerror(errno)));
                msgstr = SvPV_nolen_const(msg);
            } else {
                if (namesv) {                   /* did we lookup @INC? */
-                   SV * const msg = sv_2mortal(newSVpv(msgstr,0));
-                   SV * const dirmsgsv = NEWSV(0, 0);
                    AV * const ar = GvAVn(PL_incgv);
                    I32 i;
-                   sv_catpvn(msg, " in @INC", 8);
-                   if (instr(SvPVX_const(msg), ".h "))
-                       sv_catpv(msg, " (change .h to .ph maybe?)");
-                   if (instr(SvPVX_const(msg), ".ph "))
-                       sv_catpv(msg, " (did you run h2ph?)");
-                   sv_catpv(msg, " (@INC contains:");
+                   SV * const msg = sv_2mortal(Perl_newSVpvf(aTHX_ 
+                       "%s in @INC%s%s (@INC contains:",
+                       msgstr,
+                       (instr(msgstr, ".h ")
+                        ? " (change .h to .ph maybe?)" : ""),
+                       (instr(msgstr, ".ph ")
+                        ? " (did you run h2ph?)" : "")
+                                                             ));
+                   
                    for (i = 0; i <= AvFILL(ar); i++) {
-                       const char *dir = SvPVx_nolen_const(*av_fetch(ar, i, TRUE));
-                       Perl_sv_setpvf(aTHX_ dirmsgsv, " %s", dir);
-                       sv_catsv(msg, dirmsgsv);
+                       sv_catpvs(msg, " ");
+                       sv_catsv(msg, *av_fetch(ar, i, TRUE));
                    }
-                   sv_catpvn(msg, ")", 1);
-                   SvREFCNT_dec(dirmsgsv);
+                   sv_catpvs(msg, ")");
                    msgstr = SvPV_nolen_const(msg);
                }    
            }
@@ -3383,7 +3365,7 @@ PP(pp_require)
 
     ENTER;
     SAVETMPS;
-    lex_start(sv_2mortal(newSVpvn("",0)));
+    lex_start(sv_2mortal(newSVpvs("")));
     SAVEGENERICSV(PL_rsfp_filters);
     PL_rsfp_filters = NULL;
 
@@ -3400,10 +3382,10 @@ PP(pp_require)
     else
         PL_compiling.cop_warnings = pWARN_STD ;
     SAVESPTR(PL_compiling.cop_io);
-    PL_compiling.cop_io = Nullsv;
+    PL_compiling.cop_io = NULL;
 
     if (filter_sub || filter_child_proc) {
-       SV * const datasv = filter_add(S_run_user_filter, Nullsv);
+       SV * const datasv = filter_add(S_run_user_filter, NULL);
        IoLINES(datasv) = filter_has_file;
        IoFMT_GV(datasv) = (GV *)filter_child_proc;
        IoTOP_GV(datasv) = (GV *)filter_state;
@@ -3422,7 +3404,7 @@ PP(pp_require)
 
     /* Store and reset encoding. */
     encoding = PL_encoding;
-    PL_encoding = Nullsv;
+    PL_encoding = NULL;
 
     op = DOCATCH(doeval(gimme, NULL, Nullcv, PL_curcop->cop_seq));
 
@@ -3446,7 +3428,7 @@ PP(pp_entereval)
     OP *ret;
     CV* runcv;
     U32 seq;
-    HV *saved_hh = 0;
+    HV *saved_hh = NULL;
     
     if (PL_op->op_private & OPpEVAL_HAS_HH) {
        saved_hh = (HV*) SvREFCNT_inc(POPs);
@@ -3616,7 +3598,6 @@ PP(pp_entertry)
 PP(pp_leavetry)
 {
     dVAR; dSP;
-    register SV **mark;
     SV **newsp;
     PMOP *newpm;
     I32 gimme;
@@ -3631,6 +3612,7 @@ PP(pp_leavetry)
     if (gimme == G_VOID)
        SP = newsp;
     else if (gimme == G_SCALAR) {
+       register SV **mark;
        MARK = newsp + 1;
        if (MARK <= SP) {
            if (SvFLAGS(TOPs) & (SVs_PADTMP|SVs_TEMP))
@@ -3646,6 +3628,7 @@ PP(pp_leavetry)
     }
     else {
        /* in case LEAVE wipes old return values */
+       register SV **mark;
        for (mark = newsp + 1; mark <= SP; mark++) {
            if (!(SvFLAGS(*mark) & (SVs_PADTMP|SVs_TEMP))) {
                *mark = sv_mortalcopy(*mark);
@@ -3670,7 +3653,7 @@ PP(pp_entergiven)
     SAVETMPS;
 
     if (PL_op->op_targ == 0) {
-       SV **defsv_p = &GvSV(PL_defgv);
+       SV ** const defsv_p = &GvSV(PL_defgv);
        *defsv_p = newSVsv(POPs);
        SAVECLEARSV(*defsv_p);
     }
@@ -3711,6 +3694,7 @@ STATIC
 PMOP *
 S_make_matcher(pTHX_ regexp *re)
 {
+    dVAR;
     PMOP *matcher = (PMOP *) newPMOP(OP_MATCH, OPf_WANT_SCALAR | OPf_STACKED);
     PM_SETRE(matcher, ReREFCNT_inc(re));
     
@@ -3724,6 +3708,7 @@ STATIC
 bool
 S_matcher_matches_sv(pTHX_ PMOP *matcher, SV *sv)
 {
+    dVAR;
     dSP;
     
     PL_op = (OP *) matcher;
@@ -3738,6 +3723,7 @@ STATIC
 void
 S_destroy_matcher(pTHX_ PMOP *matcher)
 {
+    dVAR;
     PERL_UNUSED_ARG(matcher);
     FREETMPS;
     LEAVE;
@@ -3790,6 +3776,7 @@ STATIC
 OP *
 S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other)
 {
+    dVAR;
     dSP;
     
     SV *e = TOPs;      /* e is for 'expression' */
@@ -3831,10 +3818,10 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other)
        
 
 #   define SM_SEEN_THIS(sv) hv_exists_ent(seen_this, \
-       sv_2mortal(newSViv((IV) sv)), 0)
+       sv_2mortal(newSViv(PTR2IV(sv))), 0)
 
 #   define SM_SEEN_OTHER(sv) hv_exists_ent(seen_other, \
-       sv_2mortal(newSViv((IV) sv)), 0)
+       sv_2mortal(newSViv(PTR2IV(sv))), 0)
 
     tryAMAGICbinSET(smart, 0);
     
@@ -3894,7 +3881,7 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other)
                tied = TRUE;
            }
            else if (SvTIED_mg((SV *) other_hv, PERL_MAGIC_tied)) {
-               HV * temp = other_hv;
+               HV * const temp = other_hv;
                other_hv = (HV *) this;
                this  = (SV *) temp;
                tied = TRUE;
@@ -3910,7 +3897,7 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other)
            (void) hv_iterinit((HV *) this);
            while ( (he = hv_iternext((HV *) this)) ) {
                I32 key_len;
-               char *key = hv_iterkey(he, &key_len);
+               char * const key = hv_iterkey(he, &key_len);
                
                ++ this_key_count;
                
@@ -3934,15 +3921,15 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other)
                RETPUSHYES;
        }
        else if (SM_OTHER_REF(PVAV)) {
-           AV *other_av = (AV *) SvRV(other);
-           I32 other_len = av_len(other_av) + 1;
+           AV * const other_av = (AV *) SvRV(other);
+           const I32 other_len = av_len(other_av) + 1;
            I32 i;
            
            if (HvUSEDKEYS((HV *) this) != other_len)
                RETPUSHNO;
            
            for(i = 0; i < other_len; ++i) {
-               SV **svp = av_fetch(other_av, i, FALSE);
+               SV ** const svp = av_fetch(other_av, i, FALSE);
                char *key;
                STRLEN key_len;
 
@@ -3956,7 +3943,7 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other)
            RETPUSHYES;
        }
        else if (SM_OTHER_REGEX) {
-           PMOP *matcher = make_matcher(other_regex);
+           PMOP * const matcher = make_matcher(other_regex);
            HE *he;
 
            (void) hv_iterinit((HV *) this);
@@ -3984,7 +3971,7 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other)
                RETPUSHNO;
            else {
                I32 i;
-               I32 other_len = av_len(other_av);
+               const I32 other_len = av_len(other_av);
 
                if (Nullhv == seen_this) {
                    seen_this = newHV();
@@ -3995,9 +3982,9 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other)
                    (void) sv_2mortal((SV *) seen_other);
                }
                for(i = 0; i <= other_len; ++i) {
-                   SV **this_elem = av_fetch((AV *)this, i, FALSE);
-                   SV **other_elem = av_fetch(other_av, i, FALSE);
-                   
+                   SV * const * const this_elem = av_fetch((AV *)this, i, FALSE);
+                   SV * const * const other_elem = av_fetch(other_av, i, FALSE);
+
                    if (!this_elem || !other_elem) {
                        if (this_elem || other_elem)
                            RETPUSHNO;
@@ -4010,10 +3997,10 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other)
                    }
                    else {
                        hv_store_ent(seen_this,
-                           sv_2mortal(newSViv((IV) *this_elem)),
+                           sv_2mortal(newSViv(PTR2IV(*this_elem))),
                            &PL_sv_undef, 0);
                        hv_store_ent(seen_other,
-                           sv_2mortal(newSViv((IV) *other_elem)),
+                           sv_2mortal(newSViv(PTR2IV(*other_elem))),
                            &PL_sv_undef, 0);
                        PUSHs(*this_elem);
                        PUSHs(*other_elem);
@@ -4030,12 +4017,12 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other)
            }
        }
        else if (SM_OTHER_REGEX) {
-           PMOP *matcher = make_matcher(other_regex);
+           PMOP * const matcher = make_matcher(other_regex);
+           const I32 this_len = av_len((AV *) this);
            I32 i;
-           I32 this_len = av_len((AV *) this);
 
            for(i = 0; i <= this_len; ++i) {
-               SV ** svp = av_fetch((AV *)this, i, FALSE);
+               SV * const * const svp = av_fetch((AV *)this, i, FALSE);
                if (svp && matcher_matches_sv(matcher, *svp)) {
                    destroy_matcher(matcher);
                    RETPUSHYES;
@@ -4048,7 +4035,7 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other)
            I32 i;
 
            for(i = 0; i <= AvFILL((AV *) this); ++i) {
-               SV ** svp = av_fetch((AV *)this, i, FALSE);
+               SV * const * const svp = av_fetch((AV *)this, i, FALSE);
                if (!svp)
                    continue;
                
@@ -4066,11 +4053,11 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other)
            RETPUSHNO;
        }
        else if (SvPOK(other)) {
+           const I32 this_len = av_len((AV *) this);
            I32 i;
-           I32 this_len = av_len((AV *) this);
 
            for(i = 0; i <= this_len; ++i) {
-               SV ** svp = av_fetch((AV *)this, i, FALSE);
+               SV * const * const svp = av_fetch((AV *)this, i, FALSE);
                if (!svp)
                    continue;
                
@@ -4092,7 +4079,7 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other)
            RETPUSHNO;
     }
     else if (SM_REGEX) {
-       PMOP *matcher = make_matcher(this_regex);
+       PMOP * const matcher = make_matcher(this_regex);
 
        PUTBACK;
        PUSHs(matcher_matches_sv(matcher, other)
@@ -4269,15 +4256,15 @@ S_doparseform(pTHX_ SV *sv)
 {
     STRLEN len;
     register char *s = SvPV_force(sv, len);
-    register char *send = s + len;
-    register char *base = Nullch;
+    register char * const send = s + len;
+    register char *base = NULL;
     register I32 skipspaces = 0;
     bool noblank   = FALSE;
     bool repeat    = FALSE;
     bool postspace = FALSE;
     U32 *fops;
     register U32 *fpc;
-    U32 *linepc = 0;
+    U32 *linepc = NULL;
     register I32 arg;
     bool ischop;
     bool unchopnum = FALSE;
@@ -4292,7 +4279,7 @@ S_doparseform(pTHX_ SV *sv)
            maxops += 10;
     }
     s = base;
-    base = Nullch;
+    base = NULL;
 
     Newx(fops, maxops, U32);
     fpc = fops;
@@ -4473,7 +4460,7 @@ S_doparseform(pTHX_ SV *sv)
     }
     Copy(fops, s, arg, U32);
     Safefree(fops);
-    sv_magic(sv, Nullsv, PERL_MAGIC_fm, Nullch, 0);
+    sv_magic(sv, NULL, PERL_MAGIC_fm, NULL, 0);
     SvCOMPILED_on(sv);
 
     if (unchopnum && repeat)