Abstract all the accesses to cop_arybase (apart from ByteLoader)
[p5sagit/p5-mst-13.2.git] / toke.c
diff --git a/toke.c b/toke.c
index d87f7da..f6e21a2 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -36,22 +36,8 @@ static I32 utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen);
 #endif
 
 #ifdef PERL_MAD
-/* XXX these probably need to be made into PL vars */
-static I32 realtokenstart;
-static I32 faketokens = 0;
-static MADPROP *thismad;
-static SV *thistoken;
-static SV *thisopen;
-static SV *thisstuff;
-static SV *thisclose;
-static SV *thiswhite;
-static SV *nextwhite;
-static SV *skipwhite;
-static SV *endwhite;
-static I32 curforce = -1;
-
 #  define CURMAD(slot,sv) if (PL_madskills) { curmad(slot,sv); sv = 0; }
-#  define NEXTVAL_NEXTTOKE PL_nexttoke[curforce].next_val
+#  define NEXTVAL_NEXTTOKE PL_nexttoke[PL_curforce].next_val
 #else
 #  define CURMAD(slot,sv)
 #  define NEXTVAL_NEXTTOKE PL_nextval[PL_nexttoke]
@@ -443,7 +429,8 @@ S_no_op(pTHX_ const char *what, char *s)
                    "\t(Missing semicolon on previous line?)\n");
        else if (PL_oldoldbufptr && isIDFIRST_lazy_if(PL_oldoldbufptr,UTF)) {
            const char *t;
-           for (t = PL_oldoldbufptr; *t && (isALNUM_lazy_if(t,UTF) || *t == ':'); t++) ;
+           for (t = PL_oldoldbufptr; *t && (isALNUM_lazy_if(t,UTF) || *t == ':'); t++)
+               /**/;
            if (t < PL_bufptr && isSPACE(*t))
                Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
                        "\t(Do you need to predeclare %.*s?)\n",
@@ -461,7 +448,7 @@ S_no_op(pTHX_ const char *what, char *s)
 /*
  * S_missingterm
  * Complain about missing quote/regexp/heredoc terminator.
- * If it's called with (char *)NULL then it cauterizes the line buffer.
+ * If it's called with NULL then it cauterizes the line buffer.
  * If we're in a delimited string and the delimiter is a control
  * character, it's reformatted into a two-char sequence like ^C.
  * This is fatal.
@@ -507,13 +494,13 @@ S_missingterm(pTHX_ char *s)
  * Check whether the named feature is enabled.
  */
 STATIC bool
-S_feature_is_enabled(pTHX_ char *name, STRLEN namelen)
+S_feature_is_enabled(pTHX_ const char *name, STRLEN namelen)
 {
     dVAR;
     HV * const hinthv = GvHV(PL_hintgv);
     char he_name[32] = "feature_";
     (void) strncpy(&he_name[8], name, 24);
-    
+
     return (hinthv && hv_exists(hinthv, he_name, 8 + namelen));
 }
 
@@ -614,17 +601,17 @@ Perl_lex_start(pTHX_ SV *line)
        SAVEI32(PL_lasttoke);
     }
     if (PL_madskills) {
-       SAVESPTR(thistoken);
-       SAVESPTR(thiswhite);
-       SAVESPTR(nextwhite);
-       SAVESPTR(thisopen);
-       SAVESPTR(thisclose);
-       SAVESPTR(thisstuff);
-       SAVEVPTR(thismad);
-       SAVEI32(realtokenstart);
-       SAVEI32(faketokens);
-    }
-    SAVEI32(curforce);
+       SAVESPTR(PL_thistoken);
+       SAVESPTR(PL_thiswhite);
+       SAVESPTR(PL_nextwhite);
+       SAVESPTR(PL_thisopen);
+       SAVESPTR(PL_thisclose);
+       SAVESPTR(PL_thisstuff);
+       SAVEVPTR(PL_thismad);
+       SAVEI32(PL_realtokenstart);
+       SAVEI32(PL_faketokens);
+    }
+    SAVEI32(PL_curforce);
 #else
     if (PL_lex_state == LEX_KNOWNEXT) {
        I32 toke = PL_nexttoke;
@@ -725,7 +712,8 @@ S_incline(pTHX_ char *s)
     CopLINE_inc(PL_curcop);
     if (*s++ != '#')
        return;
-    while (SPACE_OR_TAB(*s)) s++;
+    while (SPACE_OR_TAB(*s))
+       s++;
     if (strnEQ(s, "line", 4))
        s += 4;
     else
@@ -734,9 +722,11 @@ S_incline(pTHX_ char *s)
        s++;
     else
        return;
-    while (SPACE_OR_TAB(*s)) s++;
+    while (SPACE_OR_TAB(*s))
+       s++;
     if (!isDIGIT(*s))
        return;
+
     n = s;
     while (isDIGIT(*s))
        s++;
@@ -803,7 +793,7 @@ S_incline(pTHX_ char *s)
 }
 
 #ifdef PERL_MAD
-/* skip space before thistoken */
+/* skip space before PL_thistoken */
 
 STATIC char *
 S_skipspace0(pTHX_ register char *s)
@@ -811,40 +801,40 @@ S_skipspace0(pTHX_ register char *s)
     s = skipspace(s);
     if (!PL_madskills)
        return s;
-    if (skipwhite) {
-       if (!thiswhite)
-           thiswhite = newSVpvn("",0);
-       sv_catsv(thiswhite, skipwhite);
-       sv_free(skipwhite);
-       skipwhite = 0;
-    }
-    realtokenstart = s - SvPVX(PL_linestr);
+    if (PL_skipwhite) {
+       if (!PL_thiswhite)
+           PL_thiswhite = newSVpvn("",0);
+       sv_catsv(PL_thiswhite, PL_skipwhite);
+       sv_free(PL_skipwhite);
+       PL_skipwhite = 0;
+    }
+    PL_realtokenstart = s - SvPVX(PL_linestr);
     return s;
 }
 
-/* skip space after thistoken */
+/* skip space after PL_thistoken */
 
 STATIC char *
 S_skipspace1(pTHX_ register char *s)
 {
-    char *start = s;
+    const char *start = s;
     I32 startoff = start - SvPVX(PL_linestr);
 
     s = skipspace(s);
     if (!PL_madskills)
        return s;
     start = SvPVX(PL_linestr) + startoff;
-    if (!thistoken && realtokenstart >= 0) {
-       char *tstart = SvPVX(PL_linestr) + realtokenstart;
-       thistoken = newSVpvn(tstart, start - tstart);
-    }
-    realtokenstart = -1;
-    if (skipwhite) {
-       if (!nextwhite)
-           nextwhite = newSVpvn("",0);
-       sv_catsv(nextwhite, skipwhite);
-       sv_free(skipwhite);
-       skipwhite = 0;
+    if (!PL_thistoken && PL_realtokenstart >= 0) {
+       const char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
+       PL_thistoken = newSVpvn(tstart, start - tstart);
+    }
+    PL_realtokenstart = -1;
+    if (PL_skipwhite) {
+       if (!PL_nextwhite)
+           PL_nextwhite = newSVpvn("",0);
+       sv_catsv(PL_nextwhite, PL_skipwhite);
+       sv_free(PL_skipwhite);
+       PL_skipwhite = 0;
     }
     return s;
 }
@@ -860,17 +850,17 @@ S_skipspace2(pTHX_ register char *s, SV **svp)
     if (!PL_madskills || !svp)
        return s;
     start = SvPVX(PL_linestr) + startoff;
-    if (!thistoken && realtokenstart >= 0) {
-       char *tstart = SvPVX(PL_linestr) + realtokenstart;
-       thistoken = newSVpvn(tstart, start - tstart);
-       realtokenstart = -1;
+    if (!PL_thistoken && PL_realtokenstart >= 0) {
+       char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
+       PL_thistoken = newSVpvn(tstart, start - tstart);
+       PL_realtokenstart = -1;
     }
-    if (skipwhite) {
+    if (PL_skipwhite) {
        if (!*svp)
            *svp = newSVpvn("",0);
-       sv_setsv(*svp, skipwhite);
-       sv_free(skipwhite);
-       skipwhite = 0;
+       sv_setsv(*svp, PL_skipwhite);
+       sv_free(PL_skipwhite);
+       PL_skipwhite = 0;
     }
     
     return s;
@@ -891,9 +881,9 @@ S_skipspace(pTHX_ register char *s)
     int curoff;
     int startoff = s - SvPVX(PL_linestr);
 
-    if (skipwhite) {
-       sv_free(skipwhite);
-       skipwhite = 0;
+    if (PL_skipwhite) {
+       sv_free(PL_skipwhite);
+       PL_skipwhite = 0;
     }
 #endif
 
@@ -950,9 +940,9 @@ S_skipspace(pTHX_ register char *s)
        {
 #ifdef PERL_MAD
            if (PL_madskills && curoff != startoff) {
-               if (!skipwhite)
-                   skipwhite = newSVpvn("",0);
-               sv_catpvn(skipwhite, SvPVX(PL_linestr) + startoff,
+               if (!PL_skipwhite)
+                   PL_skipwhite = newSVpvn("",0);
+               sv_catpvn(PL_skipwhite, SvPVX(PL_linestr) + startoff,
                                        curoff - startoff);
            }
 
@@ -965,7 +955,7 @@ S_skipspace(pTHX_ register char *s)
 #endif
 
            /* end of file.  Add on the -p or -n magic */
-           /* XXX these shouldn't really be added here, can't set faketokens */
+           /* XXX these shouldn't really be added here, can't set PL_faketokens */
            if (PL_minus_p) {
 #ifdef PERL_MAD
                sv_catpv(PL_linestr,
@@ -1054,11 +1044,11 @@ S_skipspace(pTHX_ register char *s)
 #ifdef PERL_MAD
   done:
     if (PL_madskills) {
-       if (!skipwhite)
-           skipwhite = newSVpvn("",0);
+       if (!PL_skipwhite)
+           PL_skipwhite = newSVpvn("",0);
        curoff = s - SvPVX(PL_linestr);
        if (curoff - startoff)
-           sv_catpvn(skipwhite, SvPVX(PL_linestr) + startoff,
+           sv_catpvn(PL_skipwhite, SvPVX(PL_linestr) + startoff,
                                curoff - startoff);
     }
     return s;
@@ -1078,26 +1068,22 @@ STATIC void
 S_check_uni(pTHX)
 {
     dVAR;
-    char *s;
-    char *t;
+    const char *s;
+    const char *t;
 
     if (PL_oldoldbufptr != PL_last_uni)
        return;
     while (isSPACE(*PL_last_uni))
        PL_last_uni++;
-    for (s = PL_last_uni; isALNUM_lazy_if(s,UTF) || *s == '-'; s++) ;
+    for (s = PL_last_uni; isALNUM_lazy_if(s,UTF) || *s == '-'; s++)
+       /**/;
     if ((t = strchr(s, '(')) && t < PL_bufptr)
        return;
 
-    /* XXX Things like this are just so nasty.  We shouldn't be modifying
-    source code, even if we realquick set it back. */
     if (ckWARN_d(WARN_AMBIGUOUS)){
-       const char ch = *s;
-        *s = '\0';
         Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
-                  "Warning: Use of \"%s\" without parentheses is ambiguous",
-                  PL_last_uni);
-        *s = ch;
+                  "Warning: Use of \"%.*s\" without parentheses is ambiguous",
+                  (int)(s - PL_last_uni), PL_last_uni);
     }
 }
 
@@ -1155,22 +1141,22 @@ S_start_force(pTHX_ int where)
 {
     int i;
 
-    if (where < 0)     /* so people can duplicate start_force(curforce) */
+    if (where < 0)     /* so people can duplicate start_force(PL_curforce) */
        where = PL_lasttoke;
-    assert(curforce < 0 || curforce == where);
-    if (curforce != where) {
+    assert(PL_curforce < 0 || PL_curforce == where);
+    if (PL_curforce != where) {
        for (i = PL_lasttoke; i > where; --i) {
            PL_nexttoke[i] = PL_nexttoke[i-1];
        }
        PL_lasttoke++;
     }
-    if (curforce < 0)  /* in case of duplicate start_force() */
+    if (PL_curforce < 0)       /* in case of duplicate start_force() */
        Zero(&PL_nexttoke[where], 1, NEXTTOKE);
-    curforce = where;
-    if (nextwhite) {
+    PL_curforce = where;
+    if (PL_nextwhite) {
        if (PL_madskills)
            curmad('^', newSVpvn("",0));
-       CURMAD('_', nextwhite);
+       CURMAD('_', PL_nextwhite);
     }
 }
 
@@ -1181,12 +1167,12 @@ S_curmad(pTHX_ char slot, SV *sv)
 
     if (!sv)
        return;
-    if (curforce < 0)
-       where = &thismad;
+    if (PL_curforce < 0)
+       where = &PL_thismad;
     else
-       where = &PL_nexttoke[curforce].next_mad;
+       where = &PL_nexttoke[PL_curforce].next_mad;
 
-    if (faketokens)
+    if (PL_faketokens)
        sv_setpvn(sv, "", 0);
     else {
        if (!IN_BYTES) {
@@ -1208,8 +1194,8 @@ S_curmad(pTHX_ char slot, SV *sv)
        addmad(newMADsv(slot, sv), where, 0);
 }
 #else
-#  define start_force(where)
-#  define curmad(slot, sv)
+#  define start_force(where)    /*EMPTY*/
+#  define curmad(slot, sv)      /*EMPTY*/
 #endif
 
 /*
@@ -1226,14 +1212,14 @@ S_force_next(pTHX_ I32 type)
 {
     dVAR;
 #ifdef PERL_MAD
-    if (curforce < 0)
+    if (PL_curforce < 0)
        start_force(PL_lasttoke);
-    PL_nexttoke[curforce].next_type = type;
+    PL_nexttoke[PL_curforce].next_type = type;
     if (PL_lex_state != LEX_KNOWNEXT)
        PL_lex_defer = PL_lex_state;
     PL_lex_state = LEX_KNOWNEXT;
     PL_lex_expect = PL_expect;
-    curforce = -1;
+    PL_curforce = -1;
 #else
     PL_nexttype[PL_nexttoke] = type;
     PL_nexttoke++;
@@ -1287,7 +1273,7 @@ S_force_word(pTHX_ register char *start, int token, int check_keyword, int allow
        s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, allow_pack, &len);
        if (check_keyword && keyword(PL_tokenbuf, len))
            return start;
-       start_force(curforce);
+       start_force(PL_curforce);
        if (PL_madskills)
            curmad('X', newSVpvn(start,s-start));
        if (token == METHOD) {
@@ -1323,7 +1309,7 @@ S_force_ident(pTHX_ register const char *s, int kind)
     if (s && *s) {
        const STRLEN len = strlen(s);
        OP* const o = (OP*)newSVOP(OP_CONST, 0, newSVpvn(s, len));
-       start_force(curforce);
+       start_force(PL_curforce);
        NEXTVAL_NEXTTOKE.opval = o;
        force_next(WORD);
        if (kind) {
@@ -1396,7 +1382,7 @@ S_force_version(pTHX_ char *s, int guessing)
            d++;
 #ifdef PERL_MAD
        if (PL_madskills) {
-           start_force(curforce);
+           start_force(PL_curforce);
            curmad('X', newSVpvn(s,d-s));
        }
 #endif
@@ -1414,8 +1400,8 @@ S_force_version(pTHX_ char *s, int guessing)
        else if (guessing) {
 #ifdef PERL_MAD
            if (PL_madskills) {
-               sv_free(nextwhite);     /* let next token collect whitespace */
-               nextwhite = 0;
+               sv_free(PL_nextwhite);  /* let next token collect whitespace */
+               PL_nextwhite = 0;
                s = SvPVX(PL_linestr) + startoff;
            }
 #endif
@@ -1425,13 +1411,13 @@ S_force_version(pTHX_ char *s, int guessing)
 
 #ifdef PERL_MAD
     if (PL_madskills && !version) {
-       sv_free(nextwhite);     /* let next token collect whitespace */
-       nextwhite = 0;
+       sv_free(PL_nextwhite);  /* let next token collect whitespace */
+       PL_nextwhite = 0;
        s = SvPVX(PL_linestr) + startoff;
     }
 #endif
     /* NOTE: The parser sees the package name and the VERSION swapped */
-    start_force(curforce);
+    start_force(PL_curforce);
     NEXTVAL_NEXTTOKE.opval = version;
     force_next(WORD);
 
@@ -1682,16 +1668,16 @@ S_sublex_done(pTHX)
     else {
 #ifdef PERL_MAD
        if (PL_madskills) {
-           if (thiswhite) {
-               if (!endwhite)
-                   endwhite = newSVpvn("",0);
-               sv_catsv(endwhite, thiswhite);
-               thiswhite = 0;
-           }
-           if (thistoken)
-               sv_setpvn(thistoken,"",0);
+           if (PL_thiswhite) {
+               if (!PL_endwhite)
+                   PL_endwhite = newSVpvn("",0);
+               sv_catsv(PL_endwhite, PL_thiswhite);
+               PL_thiswhite = 0;
+           }
+           if (PL_thistoken)
+               sv_setpvn(PL_thistoken,"",0);
            else
-               realtokenstart = -1;
+               PL_realtokenstart = -1;
        }
 #endif
        LEAVE;
@@ -1793,7 +1779,7 @@ S_scan_const(pTHX_ char *start)
     UV literal_endpoint = 0;
 #endif
 
-    const char *leaveit =      /* set of acceptably-backslashed characters */
+    const char * const leaveit = /* set of acceptably-backslashed characters */
        PL_lex_inpat
            ? "\\.^$@AGZdDwWsSbBpPXC+*?|()-nrtfeaxz0123456789[{]} \t\n\r\f\v#"
            : "";
@@ -2533,7 +2519,7 @@ S_intuit_method(pTHX_ char *start, GV *gv, CV *cv)
            if ((PL_bufend - s) >= 2 && *s == '=' && *(s+1) == '>')
                return 0;       /* no assumptions -- "=>" quotes bearword */
       bare_package:
-           start_force(curforce);
+           start_force(PL_curforce);
            NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0,
                                                   newSVpvn(tmpbuf,len));
            NEXTVAL_NEXTTOKE.opval->op_private = OPpCONST_BARE;
@@ -2760,83 +2746,83 @@ Perl_madlex(pTHX)
     int optype;
     char *s = PL_bufptr;
 
-    /* make sure thiswhite is initialized */
-    thiswhite = 0;
-    thismad = 0;
+    /* make sure PL_thiswhite is initialized */
+    PL_thiswhite = 0;
+    PL_thismad = 0;
 
-    /* just do what yylex would do on pending identifier; leave thiswhite alone */
+    /* just do what yylex would do on pending identifier; leave PL_thiswhite alone */
     if (PL_pending_ident)
         return S_pending_ident(aTHX);
 
     /* previous token ate up our whitespace? */
-    if (!PL_lasttoke && nextwhite) {
-       thiswhite = nextwhite;
-       nextwhite = 0;
+    if (!PL_lasttoke && PL_nextwhite) {
+       PL_thiswhite = PL_nextwhite;
+       PL_nextwhite = 0;
     }
 
     /* isolate the token, and figure out where it is without whitespace */
-    realtokenstart = -1;
-    thistoken = 0;
+    PL_realtokenstart = -1;
+    PL_thistoken = 0;
     optype = yylex();
     s = PL_bufptr;
-    assert(curforce < 0);
+    assert(PL_curforce < 0);
 
-    if (!thismad || thismad->mad_key == '^') { /* not forced already? */
-       if (!thistoken) {
-           if (realtokenstart < 0 || !CopLINE(PL_curcop))
-               thistoken = newSVpvn("",0);
+    if (!PL_thismad || PL_thismad->mad_key == '^') {   /* not forced already? */
+       if (!PL_thistoken) {
+           if (PL_realtokenstart < 0 || !CopLINE(PL_curcop))
+               PL_thistoken = newSVpvn("",0);
            else {
-               char *tstart = SvPVX(PL_linestr) + realtokenstart;
-               thistoken = newSVpvn(tstart, s - tstart);
+               char *tstart = SvPVX(PL_linestr) + PL_realtokenstart;
+               PL_thistoken = newSVpvn(tstart, s - tstart);
            }
        }
-       if (thismad)    /* install head */
-           CURMAD('X', thistoken);
+       if (PL_thismad) /* install head */
+           CURMAD('X', PL_thistoken);
     }
 
     /* last whitespace of a sublex? */
-    if (optype == ')' && endwhite) {
-       CURMAD('X', endwhite);
+    if (optype == ')' && PL_endwhite) {
+       CURMAD('X', PL_endwhite);
     }
 
-    if (!thismad) {
+    if (!PL_thismad) {
 
        /* if no whitespace and we're at EOF, bail.  Otherwise fake EOF below. */
-       if (!thiswhite && !endwhite && !optype) {
-           sv_free(thistoken);
-           thistoken = 0;
+       if (!PL_thiswhite && !PL_endwhite && !optype) {
+           sv_free(PL_thistoken);
+           PL_thistoken = 0;
            return 0;
        }
 
        /* put off final whitespace till peg */
        if (optype == ';' && !PL_rsfp) {
-           nextwhite = thiswhite;
-           thiswhite = 0;
+           PL_nextwhite = PL_thiswhite;
+           PL_thiswhite = 0;
        }
-       else if (thisopen) {
-           CURMAD('q', thisopen);
-           if (thistoken)
-               sv_free(thistoken);
-           thistoken = 0;
+       else if (PL_thisopen) {
+           CURMAD('q', PL_thisopen);
+           if (PL_thistoken)
+               sv_free(PL_thistoken);
+           PL_thistoken = 0;
        }
        else {
            /* Store actual token text as madprop X */
-           CURMAD('X', thistoken);
+           CURMAD('X', PL_thistoken);
        }
 
-       if (thiswhite) {
+       if (PL_thiswhite) {
            /* add preceding whitespace as madprop _ */
-           CURMAD('_', thiswhite);
+           CURMAD('_', PL_thiswhite);
        }
 
-       if (thisstuff) {
+       if (PL_thisstuff) {
            /* add quoted material as madprop = */
-           CURMAD('=', thisstuff);
+           CURMAD('=', PL_thisstuff);
        }
 
-       if (thisclose) {
+       if (PL_thisclose) {
            /* add terminating quote as madprop Q */
-           CURMAD('Q', thisclose);
+           CURMAD('Q', PL_thisclose);
        }
     }
 
@@ -2855,22 +2841,22 @@ Perl_madlex(pTHX)
     case UNIOPSUB:
     case LSTOPSUB:
        if (yylval.opval)
-           append_madprops(thismad, yylval.opval, 0);
-       thismad = 0;
+           append_madprops(PL_thismad, yylval.opval, 0);
+       PL_thismad = 0;
        return optype;
 
     /* fake EOF */
     case 0:
        optype = PEG;
-       if (endwhite) {
-           addmad(newMADsv('p', endwhite), &thismad, 0);
-           endwhite = 0;
+       if (PL_endwhite) {
+           addmad(newMADsv('p', PL_endwhite), &PL_thismad, 0);
+           PL_endwhite = 0;
        }
        break;
 
     case ']':
     case '}':
-       if (faketokens)
+       if (PL_faketokens)
            break;
        /* remember any fake bracket that lexer is about to discard */ 
        if (PL_lex_brackets == 1 &&
@@ -2880,9 +2866,9 @@ Perl_madlex(pTHX)
            while (s < PL_bufend && (*s == ' ' || *s == '\t'))
                s++;
            if (*s == '}') {
-               thiswhite = newSVpvn(PL_bufptr, ++s - PL_bufptr);
-               addmad(newMADsv('#', thiswhite), &thismad, 0);
-               thiswhite = 0;
+               PL_thiswhite = newSVpvn(PL_bufptr, ++s - PL_bufptr);
+               addmad(newMADsv('#', PL_thiswhite), &PL_thismad, 0);
+               PL_thiswhite = 0;
                PL_bufptr = s - 1;
                break;  /* don't bother looking for trailing comment */
            }
@@ -2895,7 +2881,7 @@ Perl_madlex(pTHX)
 
     /* attach a trailing comment to its statement instead of next token */
     case ';':
-       if (faketokens)
+       if (PL_faketokens)
            break;
        if (PL_bufptr > PL_oldbufptr && PL_bufptr[-1] == optype) {
            s = PL_bufptr;
@@ -2906,9 +2892,9 @@ Perl_madlex(pTHX)
                    s++;
                if (s < PL_bufend)
                    s++;
-               thiswhite = newSVpvn(PL_bufptr, s - PL_bufptr);
-               addmad(newMADsv('#', thiswhite), &thismad, 0);
-               thiswhite = 0;
+               PL_thiswhite = newSVpvn(PL_bufptr, s - PL_bufptr);
+               addmad(newMADsv('#', PL_thiswhite), &PL_thismad, 0);
+               PL_thiswhite = 0;
                PL_bufptr = s;
            }
        }
@@ -2925,8 +2911,8 @@ Perl_madlex(pTHX)
     }
 
     /* Create new token struct.  Note: opvals return early above. */
-    yylval.tkval = newTOKEN(optype, yylval, thismad);
-    thismad = 0;
+    yylval.tkval = newTOKEN(optype, yylval, PL_thismad);
+    PL_thismad = 0;
     return optype;
 }
 #endif
@@ -2941,7 +2927,7 @@ S_tokenize_use(pTHX_ int is_use, char *s) {
     if (isDIGIT(*s) || (*s == 'v' && isDIGIT(s[1]))) {
        s = force_version(s, TRUE);
        if (*s == ';' || (s = SKIPSPACE1(s), *s == ';')) {
-           start_force(curforce);
+           start_force(PL_curforce);
            NEXTVAL_NEXTTOKE.opval = NULL;
            force_next(WORD);
        }
@@ -3030,13 +3016,13 @@ Perl_yylex(pTHX)
        PL_lasttoke--;
        yylval = PL_nexttoke[PL_lasttoke].next_val;
        if (PL_madskills) {
-           thismad = PL_nexttoke[PL_lasttoke].next_mad;
+           PL_thismad = PL_nexttoke[PL_lasttoke].next_mad;
            PL_nexttoke[PL_lasttoke].next_mad = 0;
-           if (thismad && thismad->mad_key == '_') {
-               thiswhite = (SV*)thismad->mad_val;
-               thismad->mad_val = 0;
-               mad_free(thismad);
-               thismad = 0;
+           if (PL_thismad && PL_thismad->mad_key == '_') {
+               PL_thiswhite = (SV*)PL_thismad->mad_val;
+               PL_thismad->mad_val = 0;
+               mad_free(PL_thismad);
+               PL_thismad = 0;
            }
        }
        if (!PL_lasttoke) {
@@ -3083,7 +3069,7 @@ Perl_yylex(pTHX)
                    PL_lex_state = LEX_INTERPCONCAT;
 #ifdef PERL_MAD
                    if (PL_madskills)
-                       thistoken = newSVpvn("\\E",2);
+                       PL_thistoken = newSVpvn("\\E",2);
 #endif
                }
                return REPORT(')');
@@ -3091,9 +3077,9 @@ Perl_yylex(pTHX)
 #ifdef PERL_MAD
            while (PL_bufptr != PL_bufend &&
              PL_bufptr[0] == '\\' && PL_bufptr[1] == 'E') {
-               if (!thiswhite)
-                   thiswhite = newSVpvn("",0);
-               sv_catpvn(thiswhite, PL_bufptr, 2);
+               if (!PL_thiswhite)
+                   PL_thiswhite = newSVpvn("",0);
+               sv_catpvn(PL_thiswhite, PL_bufptr, 2);
                PL_bufptr += 2;
            }
 #else
@@ -3109,9 +3095,9 @@ Perl_yylex(pTHX)
            s = PL_bufptr + 1;
            if (s[1] == '\\' && s[2] == 'E') {
 #ifdef PERL_MAD
-               if (!thiswhite)
-                   thiswhite = newSVpvn("",0);
-               sv_catpvn(thiswhite, PL_bufptr, 4);
+               if (!PL_thiswhite)
+                   PL_thiswhite = newSVpvn("",0);
+               sv_catpvn(PL_thiswhite, PL_bufptr, 4);
 #endif
                PL_bufptr = s + 3;
                PL_lex_state = LEX_INTERPCONCAT;
@@ -3132,10 +3118,10 @@ Perl_yylex(pTHX)
                PL_lex_casestack[PL_lex_casemods++] = *s;
                PL_lex_casestack[PL_lex_casemods] = '\0';
                PL_lex_state = LEX_INTERPCONCAT;
-               start_force(curforce);
+               start_force(PL_curforce);
                NEXTVAL_NEXTTOKE.ival = 0;
                force_next('(');
-               start_force(curforce);
+               start_force(PL_curforce);
                if (*s == 'l')
                    NEXTVAL_NEXTTOKE.ival = OP_LCFIRST;
                else if (*s == 'u')
@@ -3149,7 +3135,7 @@ Perl_yylex(pTHX)
                else
                    Perl_croak(aTHX_ "panic: yylex");
                if (PL_madskills) {
-                   SV* tmpsv = newSVpvn("",0);
+                   SV* const tmpsv = newSVpvn("",0);
                    Perl_sv_catpvf(aTHX_ tmpsv, "\\%c", *s);
                    curmad('_', tmpsv);
                }
@@ -3161,9 +3147,9 @@ Perl_yylex(pTHX)
                PL_lex_starts = 0;
 #ifdef PERL_MAD
                if (PL_madskills) {
-                   if (thistoken)
-                       sv_free(thistoken);
-                   thistoken = newSVpvn("",0);
+                   if (PL_thistoken)
+                       sv_free(PL_thistoken);
+                   PL_thistoken = newSVpvn("",0);
                }
 #endif
                /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
@@ -3188,18 +3174,18 @@ Perl_yylex(pTHX)
        PL_lex_dojoin = (*PL_bufptr == '@');
        PL_lex_state = LEX_INTERPNORMAL;
        if (PL_lex_dojoin) {
-           start_force(curforce);
+           start_force(PL_curforce);
            NEXTVAL_NEXTTOKE.ival = 0;
            force_next(',');
-           start_force(curforce);
+           start_force(PL_curforce);
            force_ident("\"", '$');
-           start_force(curforce);
+           start_force(PL_curforce);
            NEXTVAL_NEXTTOKE.ival = 0;
            force_next('$');
-           start_force(curforce);
+           start_force(PL_curforce);
            NEXTVAL_NEXTTOKE.ival = 0;
            force_next('(');
-           start_force(curforce);
+           start_force(PL_curforce);
            NEXTVAL_NEXTTOKE.ival = OP_JOIN;    /* emulate join($", ...) */
            force_next(FUNC);
        }
@@ -3207,9 +3193,9 @@ Perl_yylex(pTHX)
            s = PL_bufptr;
 #ifdef PERL_MAD
            if (PL_madskills) {
-               if (thistoken)
-                   sv_free(thistoken);
-               thistoken = newSVpvn("",0);
+               if (PL_thistoken)
+                   sv_free(PL_thistoken);
+               PL_thistoken = newSVpvn("",0);
            }
 #endif
            /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
@@ -3233,9 +3219,9 @@ Perl_yylex(pTHX)
            PL_lex_state = LEX_INTERPCONCAT;
 #ifdef PERL_MAD
            if (PL_madskills) {
-               if (thistoken)
-                   sv_free(thistoken);
-               thistoken = newSVpvn("",0);
+               if (PL_thistoken)
+                   sv_free(PL_thistoken);
+               PL_thistoken = newSVpvn("",0);
            }
 #endif
            return REPORT(')');
@@ -3274,7 +3260,7 @@ Perl_yylex(pTHX)
        }
 
        if (s != PL_bufptr) {
-           start_force(curforce);
+           start_force(PL_curforce);
            if (PL_madskills) {
                curmad('X', newSVpvn(PL_bufptr,s-PL_bufptr));
            }
@@ -3284,9 +3270,9 @@ Perl_yylex(pTHX)
            if (PL_lex_starts++) {
 #ifdef PERL_MAD
                if (PL_madskills) {
-                   if (thistoken)
-                       sv_free(thistoken);
-                   thistoken = newSVpvn("",0);
+                   if (PL_thistoken)
+                       sv_free(PL_thistoken);
+                   PL_thistoken = newSVpvn("",0);
                }
 #endif
                /* commas only at base level: /$a\Ub$c/ => ($a,uc(b.$c)) */
@@ -3316,11 +3302,11 @@ Perl_yylex(pTHX)
 
   retry:
 #ifdef PERL_MAD
-    if (thistoken) {
-       sv_free(thistoken);
-       thistoken = 0;
+    if (PL_thistoken) {
+       sv_free(PL_thistoken);
+       PL_thistoken = 0;
     }
-    realtokenstart = s - SvPVX(PL_linestr);    /* assume but undo on ws */
+    PL_realtokenstart = s - SvPVX(PL_linestr); /* assume but undo on ws */
 #endif
     switch (*s) {
     default:
@@ -3333,7 +3319,7 @@ Perl_yylex(pTHX)
     case 0:
 #ifdef PERL_MAD
        if (PL_madskills)
-           faketokens = 0;
+           PL_faketokens = 0;
 #endif
        if (!PL_rsfp) {
            PL_last_uni = 0;
@@ -3356,7 +3342,7 @@ Perl_yylex(pTHX)
            PL_preambled = TRUE;
 #ifdef PERL_MAD
            if (PL_madskills)
-               faketokens = 1;
+               PL_faketokens = 1;
 #endif
            sv_setpv(PL_linestr,incl_perldb());
            if (SvCUR(PL_linestr))
@@ -3424,7 +3410,7 @@ Perl_yylex(pTHX)
            if ((s = filter_gets(PL_linestr, PL_rsfp, 0)) == NULL) {
              fake_eof:
 #ifdef PERL_MAD
-               realtokenstart = -1;
+               PL_realtokenstart = -1;
 #endif
                if (PL_rsfp) {
                    if (PL_preprocess && !PL_in_eval)
@@ -3439,7 +3425,7 @@ Perl_yylex(pTHX)
                if (!PL_in_eval && (PL_minus_n || PL_minus_p)) {
 #ifdef PERL_MAD
                    if (PL_madskills)
-                       faketokens = 1;
+                       PL_faketokens = 1;
 #endif
                    sv_setpv(PL_linestr,PL_minus_p
                             ? ";}continue{print;}" : ";}");
@@ -3493,7 +3479,7 @@ Perl_yylex(pTHX)
                /* Incest with pod. */
 #ifdef PERL_MAD
                if (PL_madskills)
-                   sv_catsv(thiswhite, PL_linestr);
+                   sv_catsv(PL_thiswhite, PL_linestr);
 #endif
                if (*s == '=' && strnEQ(s, "=cut", 4)) {
                    sv_setpvn(PL_linestr, "", 0);
@@ -3524,7 +3510,7 @@ Perl_yylex(pTHX)
                s++;
 #ifdef PERL_MAD
            if (PL_madskills)
-               thiswhite = newSVpvn(PL_linestart, s - PL_linestart);
+               PL_thiswhite = newSVpvn(PL_linestart, s - PL_linestart);
 #endif
            d = NULL;
            if (!PL_in_eval) {
@@ -3668,7 +3654,8 @@ Perl_yylex(pTHX)
                        do {
                            if (*d == 'M' || *d == 'm' || *d == 'C') {
                                const char * const m = d;
-                               while (*d && !isSPACE(*d)) d++;
+                               while (*d && !isSPACE(*d))
+                                   d++;
                                Perl_croak(aTHX_ "Too late for \"-%.*s\" option",
                                      (int)(d - m), m);
                            }
@@ -3717,7 +3704,7 @@ Perl_yylex(pTHX)
     case '\312':
 #endif
 #ifdef PERL_MAD
-       realtokenstart = -1;
+       PL_realtokenstart = -1;
        s = SKIPSPACE0(s);
 #else
        s++;
@@ -3726,9 +3713,9 @@ Perl_yylex(pTHX)
     case '#':
     case '\n':
 #ifdef PERL_MAD
-       realtokenstart = -1;
+       PL_realtokenstart = -1;
        if (PL_madskills)
-           faketokens = 0;
+           PL_faketokens = 0;
 #endif
        if (PL_lex_state != LEX_NORMAL || (PL_in_eval && !PL_rsfp)) {
            if (*s == '#' && s == PL_linestart && PL_in_eval && !PL_rsfp) {
@@ -3751,7 +3738,7 @@ Perl_yylex(pTHX)
                  Perl_croak(aTHX_ "panic: input overflow");
 #ifdef PERL_MAD
                if (PL_madskills)
-                   thiswhite = newSVpvn(s, d - s);
+                   PL_thiswhite = newSVpvn(s, d - s);
 #endif
                s = d;
                incline(s);
@@ -3766,7 +3753,7 @@ Perl_yylex(pTHX)
 #ifdef PERL_MAD
            if (PL_madskills && CopLINE(PL_curcop) >= 1 && !PL_lex_formbrack) {
                if (CopLINE(PL_curcop) == 1 && s[0] == '#' && s[1] == '!') {
-                   faketokens = 0;
+                   PL_faketokens = 0;
                    s = SKIPSPACE0(s);
                    TOKEN(PEG); /* make sure any #! line is accessible */
                }
@@ -3782,13 +3769,13 @@ Perl_yylex(pTHX)
                    else if (d > PL_bufend) /* Found by Ilya: feed random input to Perl. */
                      Perl_croak(aTHX_ "panic: input overflow");
                    if (PL_madskills && CopLINE(PL_curcop) >= 1) {
-                       if (!thiswhite)
-                           thiswhite = newSVpvn("",0);
+                       if (!PL_thiswhite)
+                           PL_thiswhite = newSVpvn("",0);
                        if (CopLINE(PL_curcop) == 1) {
-                           sv_setpvn(thiswhite, "", 0);
-                           faketokens = 0;
+                           sv_setpvn(PL_thiswhite, "", 0);
+                           PL_faketokens = 0;
                        }
-                       sv_catpvn(thiswhite, s, d - s);
+                       sv_catpvn(PL_thiswhite, s, d - s);
                    }
                    s = d;
 /*             }
@@ -4041,12 +4028,14 @@ Perl_yylex(pTHX)
                }
                else {
                    if (len == 6 && strnEQ(s, "unique", len)) {
-                       if (PL_in_my == KEY_our)
+                       if (PL_in_my == KEY_our) {
 #ifdef USE_ITHREADS
                            GvUNIQUE_on(cGVOPx_gv(yylval.opval));
 #else
-                           /*EMPTY*/;    /* skip to avoid loading attributes.pm */
+                           /* skip to avoid loading attributes.pm */
 #endif
+                           deprecate(":unique");
+                       }
                        else
                            Perl_croak(aTHX_ "The 'unique' attribute may only be applied to 'our' variables");
                    }
@@ -4110,14 +4099,14 @@ Perl_yylex(pTHX)
            }
        got_attrs:
            if (attrs) {
-               start_force(curforce);
+               start_force(PL_curforce);
                NEXTVAL_NEXTTOKE.opval = attrs;
-               CURMAD('_', nextwhite);
+               CURMAD('_', PL_nextwhite);
                force_next(THING);
            }
 #ifdef PERL_MAD
            if (PL_madskills) {
-               thistoken = newSVpvn(SvPVX(PL_linestr) + stuffstart,
+               PL_thistoken = newSVpvn(SvPVX(PL_linestr) + stuffstart,
                                     (s - SvPVX(PL_linestr)) - stuffstart);
            }
 #endif
@@ -4338,9 +4327,9 @@ Perl_yylex(pTHX)
                    PL_bufptr = s;
 #if 0
                    if (PL_madskills) {
-                       if (!thiswhite)
-                           thiswhite = newSVpvn("",0);
-                       sv_catpvn(thiswhite,"}",1);
+                       if (!PL_thiswhite)
+                           PL_thiswhite = newSVpvn("",0);
+                       sv_catpvn(PL_thiswhite,"}",1);
                    }
 #endif
                    return yylex();     /* ignore fake brackets */
@@ -4356,15 +4345,15 @@ Perl_yylex(pTHX)
            PL_bufptr = s;
            return yylex();             /* ignore fake brackets */
        }
-       start_force(curforce);
+       start_force(PL_curforce);
        if (PL_madskills) {
            curmad('X', newSVpvn(s-1,1));
-           CURMAD('_', thiswhite);
+           CURMAD('_', PL_thiswhite);
        }
        force_next('}');
 #ifdef PERL_MAD
-       if (!thistoken)
-           thistoken = newSVpvn("",0);
+       if (!PL_thistoken)
+           PL_thistoken = newSVpvn("",0);
 #endif
        TOKEN(';');
     case '&':
@@ -4437,9 +4426,9 @@ Perl_yylex(pTHX)
                    }
 #ifdef PERL_MAD
                    if (PL_madskills) {
-                       if (!thiswhite)
-                           thiswhite = newSVpvn("",0);
-                       sv_catpvn(thiswhite, PL_linestart,
+                       if (!PL_thiswhite)
+                           PL_thiswhite = newSVpvn("",0);
+                       sv_catpvn(PL_thiswhite, PL_linestart,
                                  PL_bufend - PL_linestart);
                    }
 #endif
@@ -4522,7 +4511,7 @@ Perl_yylex(pTHX)
            const char tmp = *s++;
            if (tmp == '>')
                SHop(OP_RIGHT_SHIFT);
-           if (tmp == '=')
+           else if (tmp == '=')
                Rop(OP_GE);
        }
        s--;
@@ -4566,7 +4555,7 @@ Perl_yylex(pTHX)
        /* This kludge not intended to be bulletproof. */
        if (PL_tokenbuf[1] == '[' && !PL_tokenbuf[2]) {
            yylval.opval = newSVOP(OP_CONST, 0,
-                                  newSViv(PL_compiling.cop_arybase));
+                                  newSViv(CopARYBASE_get(&PL_compiling)));
            yylval.opval->op_private = OPpCONST_ARYBASE;
            TERM(THING);
        }
@@ -4792,7 +4781,7 @@ Perl_yylex(pTHX)
                no_op("String",s);
        }
        if (!s)
-           missingterm((char*)0);
+           missingterm(NULL);
        yylval.ival = OP_CONST;
        TERM(sublex_start());
 
@@ -4809,7 +4798,7 @@ Perl_yylex(pTHX)
                no_op("String",s);
        }
        if (!s)
-           missingterm((char*)0);
+           missingterm(NULL);
        yylval.ival = OP_CONST;
        /* FIXME. I think that this can be const if char *d is replaced by
           more localised variables.  */
@@ -4827,7 +4816,7 @@ Perl_yylex(pTHX)
        if (PL_expect == XOPERATOR)
            no_op("Backticks",s);
        if (!s)
-           missingterm((char*)0);
+           missingterm(NULL);
        yylval.ival = OP_BACKTICK;
        set_csh();
        TERM(sublex_start());
@@ -4854,6 +4843,7 @@ Perl_yylex(pTHX)
            else if (!isALPHA(*start) && (PL_expect == XTERM
                        || PL_expect == XREF || PL_expect == XSTATE
                        || PL_expect == XTERMORDORDOR)) {
+               /* XXX Use gv_fetchpvn rather than stomping on a const string */
                const char c = *start;
                GV *gv;
                *start = '\0';
@@ -5014,7 +5004,7 @@ Perl_yylex(pTHX)
                const char lastchar = (PL_bufptr == PL_oldoldbufptr ? 0 : PL_bufptr[-1]);
                CV *cv;
 #ifdef PERL_MAD
-               SV *nextnextwhite = 0;
+               SV *nextPL_nextwhite = 0;
 #endif
 
 
@@ -5083,10 +5073,10 @@ Perl_yylex(pTHX)
                    sv = newSVpv(PL_tokenbuf,len);
                }
 #ifdef PERL_MAD
-               if (PL_madskills && !thistoken) {
-                   char *start = SvPVX(PL_linestr) + realtokenstart;
-                   thistoken = newSVpv(start,s - start);
-                   realtokenstart = s - SvPVX(PL_linestr);
+               if (PL_madskills && !PL_thistoken) {
+                   char *start = SvPVX(PL_linestr) + PL_realtokenstart;
+                   PL_thistoken = newSVpv(start,s - start);
+                   PL_realtokenstart = s - SvPVX(PL_linestr);
                }
 #endif
 
@@ -5132,9 +5122,9 @@ Perl_yylex(pTHX)
                    bool immediate_paren = *s == '(';
 
                    /* (Now we can afford to cross potential line boundary.) */
-                   s = SKIPSPACE2(s,nextnextwhite);
+                   s = SKIPSPACE2(s,nextPL_nextwhite);
 #ifdef PERL_MAD
-                   nextwhite = nextnextwhite;  /* assume no & deception */
+                   PL_nextwhite = nextPL_nextwhite;    /* assume no & deception */
 #endif
 
                    /* Two barewords in a row may indicate method call. */
@@ -5164,8 +5154,8 @@ Perl_yylex(pTHX)
                PL_expect = XOPERATOR;
 #ifdef PERL_MAD
                if (isSPACE(*s))
-                   s = SKIPSPACE2(s,nextnextwhite);
-               nextwhite = nextnextwhite;
+                   s = SKIPSPACE2(s,nextPL_nextwhite);
+               PL_nextwhite = nextPL_nextwhite;
 #else
                s = skipspace(s);
 #endif
@@ -5188,11 +5178,11 @@ Perl_yylex(pTHX)
                            s = d + 1;
 #ifdef PERL_MAD
                            if (PL_madskills) {
-                               char *par = SvPVX(PL_linestr) + realtokenstart; 
-                               sv_catpvn(thistoken, par, s - par);
-                               if (nextwhite) {
-                                   sv_free(nextwhite);
-                                   nextwhite = 0;
+                               char *par = SvPVX(PL_linestr) + PL_realtokenstart; 
+                               sv_catpvn(PL_thistoken, par, s - par);
+                               if (PL_nextwhite) {
+                                   sv_free(PL_nextwhite);
+                                   PL_nextwhite = 0;
                                }
                            }
 #endif
@@ -5201,18 +5191,18 @@ Perl_yylex(pTHX)
                    }
 #ifdef PERL_MAD
                    if (PL_madskills) {
-                       nextwhite = thiswhite;
-                       thiswhite = 0;
+                       PL_nextwhite = PL_thiswhite;
+                       PL_thiswhite = 0;
                    }
-                   start_force(curforce);
+                   start_force(PL_curforce);
 #endif
                    NEXTVAL_NEXTTOKE.opval = yylval.opval;
                    PL_expect = XOPERATOR;
 #ifdef PERL_MAD
                    if (PL_madskills) {
-                       nextwhite = nextnextwhite;
-                       curmad('X', thistoken);
-                       thistoken = newSVpvn("",0);
+                       PL_nextwhite = nextPL_nextwhite;
+                       curmad('X', PL_thistoken);
+                       PL_thistoken = newSVpvn("",0);
                    }
 #endif
                    force_next(WORD);
@@ -5288,16 +5278,16 @@ Perl_yylex(pTHX)
 #ifdef PERL_MAD
                    {
                        if (PL_madskills) {
-                           nextwhite = thiswhite;
-                           thiswhite = 0;
+                           PL_nextwhite = PL_thiswhite;
+                           PL_thiswhite = 0;
                        }
-                       start_force(curforce);
+                       start_force(PL_curforce);
                        NEXTVAL_NEXTTOKE.opval = yylval.opval;
                        PL_expect = XTERM;
                        if (PL_madskills) {
-                           nextwhite = nextnextwhite;
-                           curmad('X', thistoken);
-                           thistoken = newSVpvn("",0);
+                           PL_nextwhite = nextPL_nextwhite;
+                           curmad('X', PL_thistoken);
+                           PL_thistoken = newSVpvn("",0);
                        }
                        force_next(WORD);
                        TOKEN(NOAMP);
@@ -5330,14 +5320,14 @@ Perl_yylex(pTHX)
                        yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
                        PL_last_lop = PL_oldbufptr;
                        PL_last_lop_op = OP_ENTERSUB;
-                       nextwhite = thiswhite;
-                       thiswhite = 0;
-                       start_force(curforce);
+                       PL_nextwhite = PL_thiswhite;
+                       PL_thiswhite = 0;
+                       start_force(PL_curforce);
                        NEXTVAL_NEXTTOKE.opval = yylval.opval;
                        PL_expect = XTERM;
-                       nextwhite = nextnextwhite;
-                       curmad('X', thistoken);
-                       thistoken = newSVpvn("",0);
+                       PL_nextwhite = nextPL_nextwhite;
+                       curmad('X', PL_thistoken);
+                       PL_thistoken = newSVpvn("",0);
                        force_next(WORD);
                        TOKEN(NOAMP);
                    }
@@ -5477,17 +5467,17 @@ Perl_yylex(pTHX)
 #endif
 #ifdef PERL_MAD
                if (PL_madskills) {
-                   if (realtokenstart >= 0) {
-                       char *tstart = SvPVX(PL_linestr) + realtokenstart;
-                       if (!endwhite)
-                           endwhite = newSVpvn("",0);
-                       sv_catsv(endwhite, thiswhite);
-                       thiswhite = 0;
-                       sv_catpvn(endwhite, tstart, PL_bufend - tstart);
-                       realtokenstart = -1;
+                   if (PL_realtokenstart >= 0) {
+                       char *tstart = SvPVX(PL_linestr) + PL_realtokenstart;
+                       if (!PL_endwhite)
+                           PL_endwhite = newSVpvn("",0);
+                       sv_catsv(PL_endwhite, PL_thiswhite);
+                       PL_thiswhite = 0;
+                       sv_catpvn(PL_endwhite, tstart, PL_bufend - tstart);
+                       PL_realtokenstart = -1;
                    }
-                   while ((s = filter_gets(endwhite, PL_rsfp,
-                                SvCUR(endwhite))) != Nullch) ;
+                   while ((s = filter_gets(PL_endwhite, PL_rsfp,
+                                SvCUR(PL_endwhite))) != Nullch) ;
                }
 #endif
                PL_rsfp = NULL;
@@ -5967,9 +5957,9 @@ Perl_yylex(pTHX)
                }
 #ifdef PERL_MAD
                if (PL_madskills) {     /* just add type to declarator token */
-                   sv_catsv(thistoken, nextwhite);
-                   nextwhite = 0;
-                   sv_catpvn(thistoken, start, s - start);
+                   sv_catsv(PL_thistoken, PL_nextwhite);
+                   PL_nextwhite = 0;
+                   sv_catpvn(PL_thistoken, start, s - start);
                }
 #endif
            }
@@ -6057,7 +6047,7 @@ Perl_yylex(pTHX)
        case KEY_q:
            s = scan_str(s,!!PL_madskills,FALSE);
            if (!s)
-               missingterm((char*)0);
+               missingterm(NULL);
            yylval.ival = OP_CONST;
            TERM(sublex_start());
 
@@ -6067,7 +6057,7 @@ Perl_yylex(pTHX)
        case KEY_qw:
            s = scan_str(s,!!PL_madskills,FALSE);
            if (!s)
-               missingterm((char*)0);
+               missingterm(NULL);
            PL_expect = XOPERATOR;
            force_next(')');
            if (SvCUR(PL_lex_stuff)) {
@@ -6075,9 +6065,10 @@ Perl_yylex(pTHX)
                int warned = 0;
                d = SvPV_force(PL_lex_stuff, len);
                while (len) {
-                   SV *sv;
-                   for (; isSPACE(*d) && len; --len, ++d) ;
+                   for (; isSPACE(*d) && len; --len, ++d)
+                       /**/;
                    if (len) {
+                       SV *sv;
                        const char *b = d;
                        if (!warned && ckWARN(WARN_QW)) {
                            for (; !isSPACE(*d) && len; --len, ++d) {
@@ -6094,7 +6085,8 @@ Perl_yylex(pTHX)
                            }
                        }
                        else {
-                           for (; !isSPACE(*d) && len; --len, ++d) ;
+                           for (; !isSPACE(*d) && len; --len, ++d)
+                               /**/;
                        }
                        sv = newSVpvn(b, d-b);
                        if (DO_UTF8(PL_lex_stuff))
@@ -6104,7 +6096,7 @@ Perl_yylex(pTHX)
                    }
                }
                if (words) {
-                   start_force(curforce);
+                   start_force(PL_curforce);
                    NEXTVAL_NEXTTOKE.opval = words;
                    force_next(THING);
                }
@@ -6119,7 +6111,7 @@ Perl_yylex(pTHX)
        case KEY_qq:
            s = scan_str(s,!!PL_madskills,FALSE);
            if (!s)
-               missingterm((char*)0);
+               missingterm(NULL);
            yylval.ival = OP_STRINGIFY;
            if (SvIVX(PL_lex_stuff) == '\'')
                SvIV_set(PL_lex_stuff, 0);      /* qq'$foo' should intepolate */
@@ -6132,7 +6124,7 @@ Perl_yylex(pTHX)
        case KEY_qx:
            s = scan_str(s,!!PL_madskills,FALSE);
            if (!s)
-               missingterm((char*)0);
+               missingterm(NULL);
            yylval.ival = OP_BACKTICK;
            set_csh();
            TERM(sublex_start());
@@ -6357,9 +6349,9 @@ Perl_yylex(pTHX)
 #ifdef PERL_MAD
                SV *tmpwhite = 0;
 
-               char *tstart = SvPVX(PL_linestr) + realtokenstart;
+               char *tstart = SvPVX(PL_linestr) + PL_realtokenstart;
                SV *subtoken = newSVpvn(tstart, s - tstart);
-               thistoken = 0;
+               PL_thistoken = 0;
 
                d = s;
                s = SKIPSPACE2(s,tmpwhite);
@@ -6418,7 +6410,7 @@ Perl_yylex(pTHX)
                    if (*s == '=')
                        PL_lex_formbrack = PL_lex_brackets + 1;
 #ifdef PERL_MAD
-                   thistoken = subtoken;
+                   PL_thistoken = subtoken;
                    s = d;
 #else
                    if (have_name)
@@ -6456,10 +6448,10 @@ Perl_yylex(pTHX)
 
 #ifdef PERL_MAD
                    start_force(0);
-                   CURMAD('q', thisopen);
+                   CURMAD('q', PL_thisopen);
                    CURMAD('_', tmpwhite);
-                   CURMAD('=', thisstuff);
-                   CURMAD('Q', thisclose);
+                   CURMAD('=', PL_thisstuff);
+                   CURMAD('Q', PL_thisclose);
                    NEXTVAL_NEXTTOKE.opval =
                        (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
                    PL_lex_stuff = Nullsv;
@@ -6491,7 +6483,7 @@ Perl_yylex(pTHX)
                }
                force_next(0);
 
-               thistoken = subtoken;
+               PL_thistoken = subtoken;
 #else
                if (have_proto) {
                    NEXTVAL_NEXTTOKE.opval =
@@ -6671,7 +6663,7 @@ S_pending_ident(pTHX)
     char pit = PL_pending_ident;
     PL_pending_ident = 0;
 
-    /* realtokenstart = realtokenend = PL_bufptr - SvPVX(PL_linestr); */
+    /* PL_realtokenstart = realtokenend = PL_bufptr - SvPVX(PL_linestr); */
     DEBUG_T({ PerlIO_printf(Perl_debug_log,
           "### Pending identifier '%s'\n", PL_tokenbuf); });
 
@@ -10172,22 +10164,22 @@ unknown:
 }
 
 STATIC void
-S_checkcomma(pTHX_ register char *s, const char *name, const char *what)
+S_checkcomma(pTHX_ const char *s, const char *name, const char *what)
 {
     dVAR;
-    const char *w;
 
     if (*s == ' ' && s[1] == '(') {    /* XXX gotta be a better way */
        if (ckWARN(WARN_SYNTAX)) {
            int level = 1;
+           const char *w;
            for (w = s+2; *w && level; w++) {
                if (*w == '(')
                    ++level;
                else if (*w == ')')
                    --level;
            }
-           if (*w)
-               for (; *w && isSPACE(*w); w++) ;
+           while (isSPACE(*w))
+               ++w;
            if (!*w || !strchr(";|})]oaiuw!=", *w))     /* an advisory hack only... */
                Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
                            "%s (...) interpreted as function",name);
@@ -10200,17 +10192,18 @@ S_checkcomma(pTHX_ register char *s, const char *name, const char *what)
     while (s < PL_bufend && isSPACE(*s))
        s++;
     if (isIDFIRST_lazy_if(s,UTF)) {
-       w = s++;
+       const char * const w = s++;
        while (isALNUM_lazy_if(s,UTF))
            s++;
        while (s < PL_bufend && isSPACE(*s))
            s++;
        if (*s == ',') {
-           I32 kw;
-           *s = '\0'; /* XXX If we didn't do this, we could const a lot of toke.c */
-           kw = keyword(w, s - w) || get_cv(w, FALSE) != 0;
-           *s = ',';
-           if (kw)
+           GV* gv;
+           if (keyword(w, s - w))
+               return;
+
+           gv = gv_fetchpvn_flags(w, s - w, 0, SVt_PVCV);
+           if (gv && GvCVu(gv))
                return;
            Perl_croak(aTHX_ "No comma allowed after %s", what);
        }
@@ -10604,11 +10597,11 @@ S_scan_subst(pTHX_ char *start)
        s--;
 #ifdef PERL_MAD
     if (PL_madskills) {
-       CURMAD('q', thisopen);
-       CURMAD('_', thiswhite);
-       CURMAD('E', thisstuff);
-       CURMAD('Q', thisclose);
-       realtokenstart = s - SvPVX(PL_linestr);
+       CURMAD('q', PL_thisopen);
+       CURMAD('_', PL_thiswhite);
+       CURMAD('E', PL_thisstuff);
+       CURMAD('Q', PL_thisclose);
+       PL_realtokenstart = s - SvPVX(PL_linestr);
     }
 #endif
 
@@ -10627,9 +10620,9 @@ S_scan_subst(pTHX_ char *start)
 
 #ifdef PERL_MAD
     if (PL_madskills) {
-       CURMAD('z', thisopen);
-       CURMAD('R', thisstuff);
-       CURMAD('Z', thisclose);
+       CURMAD('z', PL_thisopen);
+       CURMAD('R', PL_thisstuff);
+       CURMAD('Z', PL_thisclose);
     }
     modstart = s;
 #endif
@@ -10649,8 +10642,8 @@ S_scan_subst(pTHX_ char *start)
     if (PL_madskills) {
        if (modstart != s)
            curmad('m', newSVpvn(modstart, s - modstart));
-       append_madprops(thismad, (OP*)pm, 0);
-       thismad = 0;
+       append_madprops(PL_thismad, (OP*)pm, 0);
+       PL_thismad = 0;
     }
 #endif
     if ((pm->op_pmflags & PMf_CONTINUE) && ckWARN(WARN_REGEXP)) {
@@ -10704,11 +10697,11 @@ S_scan_trans(pTHX_ char *start)
        s--;
 #ifdef PERL_MAD
     if (PL_madskills) {
-       CURMAD('q', thisopen);
-       CURMAD('_', thiswhite);
-       CURMAD('E', thisstuff);
-       CURMAD('Q', thisclose);
-       realtokenstart = s - SvPVX(PL_linestr);
+       CURMAD('q', PL_thisopen);
+       CURMAD('_', PL_thiswhite);
+       CURMAD('E', PL_thisstuff);
+       CURMAD('Q', PL_thisclose);
+       PL_realtokenstart = s - SvPVX(PL_linestr);
     }
 #endif
 
@@ -10721,9 +10714,9 @@ S_scan_trans(pTHX_ char *start)
        Perl_croak(aTHX_ "Transliteration replacement not terminated");
     }
     if (PL_madskills) {
-       CURMAD('z', thisopen);
-       CURMAD('R', thisstuff);
-       CURMAD('Z', thisclose);
+       CURMAD('z', PL_thisopen);
+       CURMAD('R', PL_thisstuff);
+       CURMAD('Z', PL_thisclose);
     }
 
     complement = del = squash = 0;
@@ -10762,8 +10755,8 @@ S_scan_trans(pTHX_ char *start)
     if (PL_madskills) {
        if (modstart != s)
            curmad('m', newSVpvn(modstart, s - modstart));
-       append_madprops(thismad, o, 0);
-       thismad = 0;
+       append_madprops(PL_thismad, o, 0);
+       PL_thismad = 0;
     }
 #endif
 
@@ -10788,7 +10781,7 @@ S_scan_heredoc(pTHX_ register char *s)
     I32 stuffstart = s - SvPVX(PL_linestr);
     char *tstart;
  
-    realtokenstart = -1;
+    PL_realtokenstart = -1;
 #endif
 
     s += 2;
@@ -10826,9 +10819,9 @@ S_scan_heredoc(pTHX_ register char *s)
 #ifdef PERL_MAD
     if (PL_madskills) {
        tstart = PL_tokenbuf + !outer;
-       thisclose = newSVpvn(tstart, len - !outer);
+       PL_thisclose = newSVpvn(tstart, len - !outer);
        tstart = SvPVX(PL_linestr) + stuffstart;
-       thisopen = newSVpvn(tstart, s - tstart);
+       PL_thisopen = newSVpvn(tstart, s - tstart);
        stuffstart = s - SvPVX(PL_linestr);
     }
 #endif
@@ -10873,10 +10866,10 @@ S_scan_heredoc(pTHX_ register char *s)
 #ifdef PERL_MAD
     if (PL_madskills) {
        tstart = SvPVX(PL_linestr) + stuffstart;
-       if (thisstuff)
-           sv_catpvn(thisstuff, tstart, s - tstart);
+       if (PL_thisstuff)
+           sv_catpvn(PL_thisstuff, tstart, s - tstart);
        else
-           thisstuff = newSVpvn(tstart, s - tstart);
+           PL_thisstuff = newSVpvn(tstart, s - tstart);
     }
 #endif
     s += SvCUR(herewas);
@@ -10943,10 +10936,10 @@ S_scan_heredoc(pTHX_ register char *s)
        sv_setpvn(tmpstr,d+1,s-d);
 #ifdef PERL_MAD
        if (PL_madskills) {
-           if (thisstuff)
-               sv_catpvn(thisstuff, d + 1, s - d);
+           if (PL_thisstuff)
+               sv_catpvn(PL_thisstuff, d + 1, s - d);
            else
-               thisstuff = newSVpvn(d + 1, s - d);
+               PL_thisstuff = newSVpvn(d + 1, s - d);
            stuffstart = s - SvPVX(PL_linestr);
        }
 #endif
@@ -10965,10 +10958,10 @@ S_scan_heredoc(pTHX_ register char *s)
 #ifdef PERL_MAD
        if (PL_madskills) {
            tstart = SvPVX(PL_linestr) + stuffstart;
-           if (thisstuff)
-               sv_catpvn(thisstuff, tstart, PL_bufend - tstart);
+           if (PL_thisstuff)
+               sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart);
            else
-               thisstuff = newSVpvn(tstart, PL_bufend - tstart);
+               PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart);
        }
 #endif
        if (!outer ||
@@ -11267,9 +11260,9 @@ S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
     }
 
 #ifdef PERL_MAD
-    if (realtokenstart >= 0) {
-       stuffstart = realtokenstart;
-       realtokenstart = -1;
+    if (PL_realtokenstart >= 0) {
+       stuffstart = PL_realtokenstart;
+       PL_realtokenstart = -1;
     }
     else
        stuffstart = start - SvPVX(PL_linestr);
@@ -11313,8 +11306,8 @@ S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
     s += termlen;
 #ifdef PERL_MAD
     tstart = SvPVX(PL_linestr) + stuffstart;
-    if (!thisopen && !keep_delims) {
-       thisopen = newSVpvn(tstart, s - tstart);
+    if (!PL_thisopen && !keep_delims) {
+       PL_thisopen = newSVpvn(tstart, s - tstart);
        stuffstart = s - SvPVX(PL_linestr);
     }
 #endif
@@ -11485,10 +11478,10 @@ S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
 #ifdef PERL_MAD
        if (PL_madskills) {
            char *tstart = SvPVX(PL_linestr) + stuffstart;
-           if (thisstuff)
-               sv_catpvn(thisstuff, tstart, PL_bufend - tstart);
+           if (PL_thisstuff)
+               sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart);
            else
-               thisstuff = newSVpvn(tstart, PL_bufend - tstart);
+               PL_thisstuff = newSVpvn(tstart, PL_bufend - tstart);
        }
 #endif
        if (!PL_rsfp ||
@@ -11525,12 +11518,12 @@ S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
 #ifdef PERL_MAD
        if (PL_madskills) {
            char *tstart = SvPVX(PL_linestr) + stuffstart;
-           if (thisstuff)
-               sv_catpvn(thisstuff, tstart, s - tstart);
+           if (PL_thisstuff)
+               sv_catpvn(PL_thisstuff, tstart, s - tstart);
            else
-               thisstuff = newSVpvn(tstart, s - tstart);
-           if (!thisclose && !keep_delims)
-               thisclose = newSVpvn(s,termlen);
+               PL_thisstuff = newSVpvn(tstart, s - tstart);
+           if (!PL_thisclose && !keep_delims)
+               PL_thisclose = newSVpvn(s,termlen);
        }
 #endif
 
@@ -11542,12 +11535,12 @@ S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
     else {
        if (PL_madskills) {
            char *tstart = SvPVX(PL_linestr) + stuffstart;
-           if (thisstuff)
-               sv_catpvn(thisstuff, tstart, s - tstart - termlen);
+           if (PL_thisstuff)
+               sv_catpvn(PL_thisstuff, tstart, s - tstart - termlen);
            else
-               thisstuff = newSVpvn(tstart, s - tstart - termlen);
-           if (!thisclose && !keep_delims)
-               thisclose = newSVpvn(s - termlen,termlen);
+               PL_thisstuff = newSVpvn(tstart, s - tstart - termlen);
+           if (!PL_thisclose && !keep_delims)
+               PL_thisclose = newSVpvn(s - termlen,termlen);
        }
     }
 #endif
@@ -11991,8 +11984,8 @@ S_scan_formline(pTHX_ register char *s)
     SV* savewhite;
     
     if (PL_madskills) {
-       savewhite = thiswhite;
-       thiswhite = 0;
+       savewhite = PL_thiswhite;
+       PL_thiswhite = 0;
     }
 #endif
 
@@ -12042,10 +12035,10 @@ S_scan_formline(pTHX_ register char *s)
        if (PL_rsfp) {
 #ifdef PERL_MAD
            if (PL_madskills) {
-               if (thistoken)
-                   sv_catpvn(thistoken, tokenstart, PL_bufend - tokenstart);
+               if (PL_thistoken)
+                   sv_catpvn(PL_thistoken, tokenstart, PL_bufend - tokenstart);
                else
-                   thistoken = newSVpvn(tokenstart, PL_bufend - tokenstart);
+                   PL_thistoken = newSVpvn(tokenstart, PL_bufend - tokenstart);
            }
 #endif
            s = filter_gets(PL_linestr, PL_rsfp, 0);
@@ -12068,7 +12061,7 @@ S_scan_formline(pTHX_ register char *s)
        PL_expect = XTERM;
        if (needargs) {
            PL_lex_state = LEX_NORMAL;
-           start_force(curforce);
+           start_force(PL_curforce);
            NEXTVAL_NEXTTOKE.ival = 0;
            force_next(',');
        }
@@ -12080,10 +12073,10 @@ S_scan_formline(pTHX_ register char *s)
            else if (PL_encoding)
                sv_recode_to_utf8(stuff, PL_encoding);
        }
-       start_force(curforce);
+       start_force(PL_curforce);
        NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0, stuff);
        force_next(THING);
-       start_force(curforce);
+       start_force(PL_curforce);
        NEXTVAL_NEXTTOKE.ival = OP_FORMLINE;
        force_next(LSTOP);
     }
@@ -12095,11 +12088,11 @@ S_scan_formline(pTHX_ register char *s)
     }
 #ifdef PERL_MAD
     if (PL_madskills) {
-       if (thistoken)
-           sv_catpvn(thistoken, tokenstart, s - tokenstart);
+       if (PL_thistoken)
+           sv_catpvn(PL_thistoken, tokenstart, s - tokenstart);
        else
-           thistoken = newSVpvn(tokenstart, s - tokenstart);
-       thiswhite = savewhite;
+           PL_thistoken = newSVpvn(tokenstart, s - tokenstart);
+       PL_thiswhite = savewhite;
     }
 #endif
     return s;
@@ -12462,22 +12455,20 @@ Perl_scan_vstring(pTHX_ const char *s, SV *sv)
     if (!isALPHA(*pos)) {
        U8 tmpbuf[UTF8_MAXBYTES+1];
 
-       if (*s == 'v') s++;  /* get past 'v' */
+       if (*s == 'v')
+           s++;  /* get past 'v' */
 
        sv_setpvn(sv, "", 0);
 
        for (;;) {
+           /* this is atoi() that tolerates underscores */
            U8 *tmpend;
            UV rev = 0;
-           {
-               /* this is atoi() that tolerates underscores */
-               const char *end = pos;
-               UV mult = 1;
-               while (--end >= s) {
-                   UV orev;
-                   if (*end == '_')
-                       continue;
-                   orev = rev;
+           const char *end = pos;
+           UV mult = 1;
+           while (--end >= s) {
+               if (*end != '_') {
+                   const UV orev = rev;
                    rev += (*end - '0') * mult;
                    mult *= 10;
                    if (orev > rev && ckWARN_d(WARN_OVERFLOW))