This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate:
[perl5.git] / toke.c
diff --git a/toke.c b/toke.c
index 82d9724..74acca1 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -1,7 +1,7 @@
 /*    toke.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.
@@ -26,9 +26,8 @@
 #define yychar PL_yychar
 #define yylval PL_yylval
 
-static char const ident_too_long[] = "Identifier too long";
-static char const c_without_g[] = "Use of /c modifier is meaningless without /g";
-static char const c_in_subst[] = "Use of /c modifier is meaningless in s///";
+static const char ident_too_long[] = "Identifier too long";
+static const char commaless_variable_list[] = "comma-less variable list";
 
 static void restore_rsfp(pTHX_ void *f);
 #ifndef PERL_NO_UTF16_FILTER
@@ -63,20 +62,25 @@ static I32 utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen);
 
 /* #define LEX_NOTPARSING              11 is done in perl.h. */
 
-#define LEX_NORMAL             10
-#define LEX_INTERPNORMAL        9
-#define LEX_INTERPCASEMOD       8
-#define LEX_INTERPPUSH          7
-#define LEX_INTERPSTART                 6
-#define LEX_INTERPEND           5
-#define LEX_INTERPENDMAYBE      4
-#define LEX_INTERPCONCAT        3
-#define LEX_INTERPCONST                 2
-#define LEX_FORMLINE            1
-#define LEX_KNOWNEXT            0
+#define LEX_NORMAL             10 /* normal code (ie not within "...")     */
+#define LEX_INTERPNORMAL        9 /* code within a string, eg "$foo[$x+1]" */
+#define LEX_INTERPCASEMOD       8 /* expecting a \U, \Q or \E etc          */
+#define LEX_INTERPPUSH          7 /* starting a new sublex parse level     */
+#define LEX_INTERPSTART                 6 /* expecting the start of a $var         */
+
+                                  /* at end of code, eg "$x" followed by:  */
+#define LEX_INTERPEND           5 /* ... eg not one of [, { or ->          */
+#define LEX_INTERPENDMAYBE      4 /* ... eg one of [, { or ->              */
+
+#define LEX_INTERPCONCAT        3 /* expecting anything, eg at start of
+                                       string or after \E, $foo, etc       */
+#define LEX_INTERPCONST                 2 /* NOT USED */
+#define LEX_FORMLINE            1 /* expecting a format line               */
+#define LEX_KNOWNEXT            0 /* next token known; just return it      */
+
 
 #ifdef DEBUGGING
-static char const* lex_state_names[] = {
+static const char* const lex_state_names[] = {
     "KNOWNEXT",
     "FORMLINE",
     "INTERPCONST",
@@ -149,7 +153,7 @@ int yyactlevel = -1;
  */
 
 #ifdef DEBUGGING /* Serve -DT. */
-#   define REPORT(retval) tokereport(s,(int)retval)
+#   define REPORT(retval) tokereport((I32)retval)
 #else
 #   define REPORT(retval) (retval)
 #endif
@@ -178,22 +182,27 @@ int yyactlevel = -1;
 /* This bit of chicanery makes a unary function followed by
  * a parenthesis into a function with one argument, highest precedence.
  */
-#define UNI(f) return(yylval.ival = f, \
-       PL_expect = XTERM, \
-       PL_bufptr = s, \
-       PL_last_uni = PL_oldbufptr, \
-       PL_last_lop_op = f, \
-       REPORT( \
-           (*s == '(' || (s = skipspace(s), *s == '(')  \
-           ? (int)FUNC1 : (int)UNIOP)))
-
-#define UNIBRACK(f) return ( \
-       yylval.ival = f, \
-       PL_bufptr = s, \
-       PL_last_uni = PL_oldbufptr, \
-        REPORT( \
-           (*s == '(' || (s = skipspace(s), *s == '(') \
-       ? (int)FUNC1 : (int)UNIOP)))
+#define UNI(f) { \
+       yylval.ival = f; \
+       PL_expect = XTERM; \
+       PL_bufptr = s; \
+       PL_last_uni = PL_oldbufptr; \
+       PL_last_lop_op = f; \
+       if (*s == '(') \
+           return REPORT( (int)FUNC1 ); \
+       s = skipspace(s); \
+       return REPORT( *s=='(' ? (int)FUNC1 : (int)UNIOP ); \
+       }
+
+#define UNIBRACK(f) { \
+       yylval.ival = f; \
+       PL_bufptr = s; \
+       PL_last_uni = PL_oldbufptr; \
+       if (*s == '(') \
+           return REPORT( (int)FUNC1 ); \
+       s = skipspace(s); \
+       return REPORT( (*s == '(') ? (int)FUNC1 : (int)UNIOP ); \
+       }
 
 /* grandfather return to old style */
 #define OLDLOP(f) return(yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)LSTOP)
@@ -210,7 +219,8 @@ enum token_type {
     TOKENTYPE_GVVAL
 };
 
-static struct debug_tokens { const int token, type; const char *name; } debug_tokens[] =
+static struct debug_tokens { const int token, type; const char *name; }
+  const debug_tokens[] =
 {
     { ADDOP,           TOKENTYPE_OPNUM,        "ADDOP" },
     { ANDAND,          TOKENTYPE_NONE,         "ANDAND" },
@@ -278,13 +288,13 @@ static struct debug_tokens { const int token, type; const char *name; } debug_to
 /* dump the returned token in rv, plus any optional arg in yylval */
 
 STATIC int
-S_tokereport(pTHX_ const char* s, I32 rv)
+S_tokereport(pTHX_ I32 rv)
 {
     if (DEBUG_T_TEST) {
-       const char *name = Nullch;
+       const char *name = NULL;
        enum token_type type = TOKENTYPE_NONE;
-       struct debug_tokens *p;
-       SV* report = newSVpvn("<== ", 4);
+       const struct debug_tokens *p;
+       SV* const report = newSVpvs("<== ");
 
        for (p = debug_tokens; p->token; p++) {
            if (p->token == (int)rv) {
@@ -298,7 +308,7 @@ S_tokereport(pTHX_ const char* s, I32 rv)
        else if ((char)rv > ' ' && (char)rv < '~')
            Perl_sv_catpvf(aTHX_ report, "'%c'", (char)rv);
        else if (!rv)
-           Perl_sv_catpvf(aTHX_ report, "EOF");
+           sv_catpvs(report, "EOF");
        else
            Perl_sv_catpvf(aTHX_ report, "?? %"IVdf, (IV)rv);
        switch (type) {
@@ -316,25 +326,36 @@ S_tokereport(pTHX_ const char* s, I32 rv)
            Perl_sv_catpvf(aTHX_ report, "(pval=\"%s\")", yylval.pval);
            break;
        case TOKENTYPE_OPVAL:
-           if (yylval.opval)
+           if (yylval.opval) {
                Perl_sv_catpvf(aTHX_ report, "(opval=op_%s)",
                                    PL_op_name[yylval.opval->op_type]);
+               if (yylval.opval->op_type == OP_CONST) {
+                   Perl_sv_catpvf(aTHX_ report, " %s",
+                       SvPEEK(cSVOPx_sv(yylval.opval)));
+               }
+
+           }
            else
-               Perl_sv_catpv(aTHX_ report, "(opval=null)");
+               sv_catpvs(report, "(opval=null)");
            break;
        }
-        Perl_sv_catpvf(aTHX_ report, " at line %d [", CopLINE(PL_curcop));
-        if (s - PL_bufptr > 0)
-            sv_catpvn(report, PL_bufptr, s - PL_bufptr);
-        else {
-            if (PL_oldbufptr && *PL_oldbufptr)
-                sv_catpv(report, PL_tokenbuf);
-        }
-        PerlIO_printf(Perl_debug_log, "### %s]\n", SvPV_nolen(report));
+        PerlIO_printf(Perl_debug_log, "### %s\n\n", SvPV_nolen_const(report));
     };
     return (int)rv;
 }
 
+
+/* print the buffer with suitable escapes */
+
+STATIC void
+S_printbuf(pTHX_ const char* fmt, const char* s)
+{
+    SV* const tmp = newSVpvs("");
+    PerlIO_printf(Perl_debug_log, fmt,
+                 pv_display(tmp, (char *)s, strlen(s), 0, 60));
+    SvREFCNT_dec(tmp);
+}
+
 #endif
 
 /*
@@ -374,8 +395,8 @@ S_ao(pTHX_ int toketype)
 STATIC void
 S_no_op(pTHX_ const char *what, char *s)
 {
-    char *oldbp = PL_bufptr;
-    bool is_first = (PL_oldbufptr == PL_linestart);
+    char * const oldbp = PL_bufptr;
+    const bool is_first = (PL_oldbufptr == PL_linestart);
 
     if (!s)
        s = oldbp;
@@ -387,17 +408,17 @@ S_no_op(pTHX_ const char *what, char *s)
            Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
                    "\t(Missing semicolon on previous line?)\n");
        else if (PL_oldoldbufptr && isIDFIRST_lazy_if(PL_oldoldbufptr,UTF)) {
-           char *t;
+           const char *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",
-                   t - PL_oldoldbufptr, PL_oldoldbufptr);
+                   (int)(t - PL_oldoldbufptr), PL_oldoldbufptr);
        }
        else {
            assert(s >= oldbp);
            Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
-                   "\t(Missing operator before %.*s?)\n", s - oldbp, oldbp);
+                   "\t(Missing operator before %.*s?)\n", (int)(s - oldbp), oldbp);
        }
     }
     PL_bufptr = oldbp;
@@ -418,7 +439,7 @@ S_missingterm(pTHX_ char *s)
     char tmpbuf[3];
     char q;
     if (s) {
-       char *nl = strrchr(s,'\n');
+       char * const nl = strrchr(s,'\n');
        if (nl)
            *nl = '\0';
     }
@@ -430,7 +451,7 @@ S_missingterm(pTHX_ char *s)
 #endif
        ) {
        *tmpbuf = '^';
-       tmpbuf[1] = toCTRL(PL_multi_close);
+       tmpbuf[1] = (char)toCTRL(PL_multi_close);
        tmpbuf[2] = '\0';
        s = tmpbuf;
     }
@@ -471,17 +492,6 @@ Perl_deprecate_old(pTHX_ char *s)
 }
 
 /*
- * depcom
- * Deprecate a comma-less variable list.
- */
-
-STATIC void
-S_depcom(pTHX)
-{
-    deprecate_old("comma-less variable list");
-}
-
-/*
  * experimental text filters for win32 carriage-returns, utf16-to-utf8 and
  * utf16-to-utf8-reversed.
  */
@@ -490,8 +500,8 @@ S_depcom(pTHX)
 static void
 strip_return(SV *sv)
 {
-    register char *s = SvPVX(sv);
-    register char *e = s + SvCUR(sv);
+    register const char *s = SvPVX_const(sv);
+    register const char * const e = s + SvCUR(sv);
     /* outer loop optimized to do nothing if there are no CR-LFs */
     while (s < e) {
        if (*s++ == '\r' && *s == '\n') {
@@ -512,7 +522,7 @@ strip_return(SV *sv)
 STATIC I32
 S_cr_textfilter(pTHX_ int idx, SV *sv, int maxlen)
 {
-    I32 count = FILTER_READ(idx+1, sv, maxlen);
+    const I32 count = FILTER_READ(idx+1, sv, maxlen);
     if (count > 0 && !maxlen)
        strip_return(sv);
     return count;
@@ -528,7 +538,7 @@ S_cr_textfilter(pTHX_ int idx, SV *sv, int maxlen)
 void
 Perl_lex_start(pTHX_ SV *line)
 {
-    char *s;
+    const char *s;
     STRLEN len;
 
     SAVEI32(PL_lex_dojoin);
@@ -569,14 +579,14 @@ Perl_lex_start(pTHX_ SV *line)
     PL_lex_defer = 0;
     PL_expect = XSTATE;
     PL_lex_brackets = 0;
-    New(899, PL_lex_brackstack, 120, char);
-    New(899, PL_lex_casestack, 12, char);
+    Newx(PL_lex_brackstack, 120, char);
+    Newx(PL_lex_casestack, 12, char);
     PL_lex_casemods = 0;
     *PL_lex_casestack = '\0';
     PL_lex_dojoin = 0;
     PL_lex_starts = 0;
-    PL_lex_stuff = Nullsv;
-    PL_lex_repl = Nullsv;
+    PL_lex_stuff = NULL;
+    PL_lex_repl = NULL;
     PL_lex_inpat = 0;
     PL_nexttoke = 0;
     PL_lex_inwhat = 0;
@@ -584,16 +594,16 @@ Perl_lex_start(pTHX_ SV *line)
     PL_linestr = line;
     if (SvREADONLY(PL_linestr))
        PL_linestr = sv_2mortal(newSVsv(PL_linestr));
-    s = SvPV(PL_linestr, len);
+    s = SvPV_const(PL_linestr, len);
     if (!len || s[len-1] != ';') {
        if (!(SvFLAGS(PL_linestr) & SVs_TEMP))
            PL_linestr = sv_2mortal(newSVsv(PL_linestr));
-       sv_catpvn(PL_linestr, "\n;", 2);
+       sv_catpvs(PL_linestr, "\n;");
     }
     SvTEMP_off(PL_linestr);
     PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
     PL_bufend = PL_bufptr + SvCUR(PL_linestr);
-    PL_last_lop = PL_last_uni = Nullch;
+    PL_last_lop = PL_last_uni = NULL;
     PL_rsfp = 0;
 }
 
@@ -663,6 +673,43 @@ S_incline(pTHX_ char *s)
     ch = *t;
     *t = '\0';
     if (t - s > 0) {
+#ifndef USE_ITHREADS
+       const char * const cf = CopFILE(PL_curcop);
+       STRLEN tmplen = cf ? strlen(cf) : 0;
+       if (tmplen > 7 && strnEQ(cf, "(eval ", 6)) {
+           /* must copy *{"::_<(eval N)[oldfilename:L]"}
+            * to *{"::_<newfilename"} */
+           char smallbuf[256], smallbuf2[256];
+           char *tmpbuf, *tmpbuf2;
+           GV **gvp, *gv2;
+           STRLEN tmplen2 = strlen(s);
+           if (tmplen + 3 < sizeof smallbuf)
+               tmpbuf = smallbuf;
+           else
+               Newx(tmpbuf, tmplen + 3, char);
+           if (tmplen2 + 3 < sizeof smallbuf2)
+               tmpbuf2 = smallbuf2;
+           else
+               Newx(tmpbuf2, tmplen2 + 3, char);
+           tmpbuf[0] = tmpbuf2[0] = '_';
+           tmpbuf[1] = tmpbuf2[1] = '<';
+           memcpy(tmpbuf + 2, cf, ++tmplen);
+           memcpy(tmpbuf2 + 2, s, ++tmplen2);
+           ++tmplen; ++tmplen2;
+           gvp = (GV**)hv_fetch(PL_defstash, tmpbuf, tmplen, FALSE);
+           if (gvp) {
+               gv2 = *(GV**)hv_fetch(PL_defstash, tmpbuf2, tmplen2, TRUE);
+               if (!isGV(gv2))
+                   gv_init(gv2, PL_defstash, tmpbuf2, tmplen2, FALSE);
+               /* adjust ${"::_<newfilename"} to store the new file name */
+               GvSV(gv2) = newSVpvn(tmpbuf2 + 2, tmplen2 - 2);
+               GvHV(gv2) = (HV*)SvREFCNT_inc(GvHV(*gvp));
+               GvAV(gv2) = (AV*)SvREFCNT_inc(GvAV(*gvp));
+           }
+           if (tmpbuf != smallbuf) Safefree(tmpbuf);
+           if (tmpbuf2 != smallbuf2) Safefree(tmpbuf2);
+       }
+#endif
        CopFILE_free(PL_curcop);
        CopFILE_set(PL_curcop, s);
     }
@@ -716,7 +763,7 @@ S_skipspace(pTHX_ register char *s)
 
        /* try to recharge the buffer */
        if ((s = filter_gets(PL_linestr, PL_rsfp,
-                            (prevlen = SvCUR(PL_linestr)))) == Nullch)
+                            (prevlen = SvCUR(PL_linestr)))) == NULL)
        {
            /* end of file.  Add on the -p or -n magic */
            if (PL_minus_p) {
@@ -735,7 +782,7 @@ S_skipspace(pTHX_ register char *s)
            PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart
                = SvPVX(PL_linestr);
            PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
-           PL_last_lop = PL_last_uni = Nullch;
+           PL_last_lop = PL_last_uni = NULL;
 
            /* Close the filehandle.  Could be from -P preprocessor,
             * STDIN, or a regular file.  If we were reading code from
@@ -750,7 +797,7 @@ S_skipspace(pTHX_ register char *s)
                PerlIO_clearerr(PL_rsfp);
            else
                (void)PerlIO_close(PL_rsfp);
-           PL_rsfp = Nullfp;
+           PL_rsfp = NULL;
            return s;
        }
 
@@ -777,13 +824,13 @@ S_skipspace(pTHX_ register char *s)
         * so store the line into the debugger's array of lines
         */
        if (PERLDB_LINE && PL_curstash != PL_debstash) {
-           SV *sv = NEWSV(85,0);
+           SV * const sv = newSV(0);
 
            sv_upgrade(sv, SVt_PVMG);
            sv_setpvn(sv,PL_bufptr,PL_bufend-PL_bufptr);
             (void)SvIOK_on(sv);
             SvIV_set(sv, 0);
-           av_store(CopFILEAV(PL_curcop),(I32)CopLINE(PL_curcop),sv);
+           av_store(CopFILEAVx(PL_curcop),(I32)CopLINE(PL_curcop),sv);
        }
     }
 }
@@ -810,8 +857,11 @@ S_check_uni(pTHX)
     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)){
-        char ch = *s;
+       const char ch = *s;
         *s = '\0';
         Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
                   "Warning: Use of \"%s\" without parentheses is ambiguous",
@@ -876,6 +926,15 @@ S_force_next(pTHX_ I32 type)
     }
 }
 
+STATIC SV *
+S_newSV_maybe_utf8(pTHX_ const char *start, STRLEN len)
+{
+    SV *sv = newSVpvn(start,len);
+    if (UTF && !IN_BYTES && is_utf8_string((U8*)start, len))
+       SvUTF8_on(sv);
+    return sv;
+}
+
 /*
  * S_force_word
  * When the lexer knows the next thing is a word (for instance, it has
@@ -915,10 +974,10 @@ S_force_word(pTHX_ register char *start, int token, int check_keyword, int allow
                PL_expect = XOPERATOR;
            }
        }
-       PL_nextval[PL_nexttoke].opval = (OP*)newSVOP(OP_CONST,0, newSVpv(PL_tokenbuf,0));
+       PL_nextval[PL_nexttoke].opval
+           = (OP*)newSVOP(OP_CONST,0,
+                          S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
        PL_nextval[PL_nexttoke].opval->op_private |= OPpCONST_BARE;
-       if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
-           SvUTF8_on(((SVOP*)PL_nextval[PL_nexttoke].opval)->op_sv);
        force_next(token);
     }
     return s;
@@ -945,7 +1004,7 @@ S_force_ident(pTHX_ register const char *s, int kind)
            /* XXX see note in pp_entereval() for why we forgo typo
               warnings if the symbol must be introduced in an eval.
               GSAR 96-10-12 */
-           gv_fetchpv(s, PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : TRUE,
+           gv_fetchpv(s, PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : GV_ADD,
                kind == '$' ? SVt_PV :
                kind == '@' ? SVt_PVAV :
                kind == '%' ? SVt_PVHV :
@@ -961,9 +1020,9 @@ Perl_str_to_version(pTHX_ SV *sv)
     NV retval = 0.0;
     NV nshift = 1.0;
     STRLEN len;
-    char *start = SvPVx(sv,len);
-    bool utf = SvUTF8(sv) ? TRUE : FALSE;
-    char *end = start + len;
+    const char *start = SvPV_const(sv,len);
+    const char * const end = start + len;
+    const bool utf = SvUTF8(sv) ? TRUE : FALSE;
     while (start < end) {
        STRLEN skip;
        UV n;
@@ -1054,7 +1113,7 @@ S_tokeq(pTHX_ SV *sv)
        goto finish;
     d = s;
     if ( PL_hints & HINT_NEW_STRING ) {
-       pv = sv_2mortal(newSVpvn(SvPVX(pv), len));
+       pv = sv_2mortal(newSVpvn(SvPVX_const(pv), len));
        if (SvUTF8(sv))
            SvUTF8_on(pv);
     }
@@ -1066,7 +1125,7 @@ S_tokeq(pTHX_ SV *sv)
        *d++ = *s++;
     }
     *d = '\0';
-    SvCUR_set(sv, d - SvPVX(sv));
+    SvCUR_set(sv, d - SvPVX_const(sv));
   finish:
     if ( PL_hints & HINT_NEW_STRING )
        return new_constant(NULL, 0, "q", sv, pv, "q");
@@ -1108,7 +1167,7 @@ S_tokeq(pTHX_ SV *sv)
 STATIC I32
 S_sublex_start(pTHX)
 {
-    register I32 op_type = yylval.ival;
+    register const I32 op_type = yylval.ival;
 
     if (op_type == OP_NULL) {
        yylval.opval = PL_lex_op;
@@ -1121,18 +1180,15 @@ S_sublex_start(pTHX)
        if (SvTYPE(sv) == SVt_PVIV) {
            /* Overloaded constants, nothing fancy: Convert to SVt_PV: */
            STRLEN len;
-           char *p;
-           SV *nsv;
-
-           p = SvPV(sv, len);
-           nsv = newSVpvn(p, len);
+           const char *p = SvPV_const(sv, len);
+           SV * const nsv = newSVpvn(p, len);
            if (SvUTF8(sv))
                SvUTF8_on(nsv);
            SvREFCNT_dec(sv);
            sv = nsv;
        }
        yylval.opval = (OP*)newSVOP(op_type, 0, sv);
-       PL_lex_stuff = Nullsv;
+       PL_lex_stuff = NULL;
        return THING;
     }
 
@@ -1185,18 +1241,18 @@ S_sublex_push(pTHX)
     SAVEGENERICPV(PL_lex_casestack);
 
     PL_linestr = PL_lex_stuff;
-    PL_lex_stuff = Nullsv;
+    PL_lex_stuff = NULL;
 
     PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart
        = SvPVX(PL_linestr);
     PL_bufend += SvCUR(PL_linestr);
-    PL_last_lop = PL_last_uni = Nullch;
+    PL_last_lop = PL_last_uni = NULL;
     SAVEFREESV(PL_linestr);
 
     PL_lex_dojoin = FALSE;
     PL_lex_brackets = 0;
-    New(899, PL_lex_brackstack, 120, char);
-    New(899, PL_lex_casestack, 12, char);
+    Newx(PL_lex_brackstack, 120, char);
+    Newx(PL_lex_casestack, 12, char);
     PL_lex_casemods = 0;
     *PL_lex_casestack = '\0';
     PL_lex_starts = 0;
@@ -1221,7 +1277,7 @@ STATIC I32
 S_sublex_done(pTHX)
 {
     if (!PL_lex_starts++) {
-       SV *sv = newSVpvn("",0);
+       SV * const sv = newSVpvs("");
        if (SvUTF8(PL_linestr))
            SvUTF8_on(sv);
        PL_expect = XOPERATOR;
@@ -1240,7 +1296,7 @@ S_sublex_done(pTHX)
        PL_lex_inpat = 0;
        PL_bufend = PL_bufptr = PL_oldbufptr = PL_oldoldbufptr = PL_linestart = SvPVX(PL_linestr);
        PL_bufend += SvCUR(PL_linestr);
-       PL_last_lop = PL_last_uni = Nullch;
+       PL_last_lop = PL_last_uni = NULL;
        SAVEFREESV(PL_linestr);
        PL_lex_dojoin = FALSE;
        PL_lex_brackets = 0;
@@ -1257,7 +1313,7 @@ S_sublex_done(pTHX)
        }
        else {
            PL_lex_state = LEX_INTERPCONCAT;
-           PL_lex_repl = Nullsv;
+           PL_lex_repl = NULL;
        }
        return ',';
     }
@@ -1348,7 +1404,7 @@ STATIC char *
 S_scan_const(pTHX_ char *start)
 {
     register char *send = PL_bufend;           /* end of the constant */
-    SV *sv = NEWSV(93, send - start);          /* sv for the constant */
+    SV *sv = newSV(send - start);              /* sv for the constant */
     register char *s = start;                  /* start of the constant */
     register char *d = SvPVX(sv);              /* destination for copies */
     bool dorange = FALSE;                      /* are we in a translit range? */
@@ -1356,6 +1412,9 @@ S_scan_const(pTHX_ char *start)
     I32  has_utf8 = FALSE;                     /* Output constant is UTF8 */
     I32  this_utf8 = UTF;                      /* The source string is assumed to be UTF8 */
     UV uv;
+#ifdef EBCDIC
+    UV literal_endpoint = 0;
+#endif
 
     const char *leaveit =      /* set of acceptably-backslashed characters */
        PL_lex_inpat
@@ -1379,7 +1438,7 @@ S_scan_const(pTHX_ char *start)
                I32 max;                        /* last character in range */
 
                if (has_utf8) {
-                   char *c = (char*)utf8_hop((U8*)d, -1);
+                   char * const c = (char*)utf8_hop((U8*)d, -1);
                    char *e = d++;
                    while (e-- > c)
                        *(e + 1) = *e;
@@ -1390,7 +1449,7 @@ S_scan_const(pTHX_ char *start)
                    continue;
                }
 
-               i = d - SvPVX(sv);              /* remember current offset */
+               i = d - SvPVX_const(sv);                /* remember current offset */
                SvGROW(sv, SvLEN(sv) + 256);    /* never more than 256 chars in a range */
                d = SvPVX(sv) + i;              /* refresh d after realloc */
                d -= 2;                         /* eat the first char and the - */
@@ -1405,8 +1464,9 @@ S_scan_const(pTHX_ char *start)
                 }
 
 #ifdef EBCDIC
-               if ((isLOWER(min) && isLOWER(max)) ||
-                   (isUPPER(min) && isUPPER(max))) {
+               if (literal_endpoint == 2 &&
+                   ((isLOWER(min) && isLOWER(max)) ||
+                    (isUPPER(min) && isUPPER(max)))) {
                    if (isLOWER(min)) {
                        for (i = min; i <= max; i++)
                            if (isLOWER(i))
@@ -1425,6 +1485,9 @@ S_scan_const(pTHX_ char *start)
                /* mark the range as done, and continue */
                dorange = FALSE;
                didrange = TRUE;
+#ifdef EBCDIC
+               literal_endpoint = 0;
+#endif
                continue;
            }
 
@@ -1443,6 +1506,9 @@ S_scan_const(pTHX_ char *start)
            }
            else {
                didrange = FALSE;
+#ifdef EBCDIC
+               literal_endpoint = 0;
+#endif
            }
        }
 
@@ -1543,9 +1609,9 @@ S_scan_const(pTHX_ char *start)
                /* FALL THROUGH */
            default:
                {
-                   if (ckWARN(WARN_MISC) &&
-                       isALNUM(*s) &&
-                       *s != '_')
+                   if (isALNUM(*s) &&
+                       *s != '_' &&
+                       ckWARN(WARN_MISC))
                        Perl_warner(aTHX_ packWARN(WARN_MISC),
                               "Unrecognized escape \\%c passed through",
                               *s);
@@ -1568,7 +1634,7 @@ S_scan_const(pTHX_ char *start)
            case 'x':
                ++s;
                if (*s == '{') {
-                   char* e = strchr(s, '}');
+                   char* const e = strchr(s, '}');
                     I32 flags = PERL_SCAN_ALLOW_UNDERSCORES |
                       PERL_SCAN_DISALLOW_PREFIX;
                    STRLEN len;
@@ -1617,15 +1683,15 @@ S_scan_const(pTHX_ char *start)
                            }
                        }
                        if (hicount) {
-                           STRLEN offset = d - SvPVX(sv);
+                           const STRLEN offset = d - SvPVX_const(sv);
                            U8 *src, *dst;
                            d = SvGROW(sv, SvLEN(sv) + hicount + 1) + offset;
                            src = (U8 *)d - 1;
                            dst = src+hicount;
                            d  += hicount;
-                           while (src >= (U8 *)SvPVX(sv)) {
+                           while (src >= (const U8 *)SvPVX_const(sv)) {
                                if (!NATIVE_IS_INVARIANT(*src)) {
-                                   U8 ch = NATIVE_TO_ASCII(*src);
+                                   const U8 ch = NATIVE_TO_ASCII(*src);
                                    *dst-- = (U8)UTF8_EIGHT_BIT_LO(ch);
                                    *dst-- = (U8)UTF8_EIGHT_BIT_HI(ch);
                                }
@@ -1663,7 +1729,7 @@ S_scan_const(pTHX_ char *start)
                    char* e = strchr(s, '}');
                    SV *res;
                    STRLEN len;
-                   char *str;
+                   const char *str;
 
                    if (!e) {
                        yyerror("Missing right brace on \\N{}");
@@ -1681,11 +1747,11 @@ S_scan_const(pTHX_ char *start)
                        goto NUM_ESCAPE_INSERT;
                    }
                    res = newSVpvn(s + 1, e - s - 1);
-                   res = new_constant( Nullch, 0, "charnames",
-                                       res, Nullsv, "\\N{...}" );
+                   res = new_constant( NULL, 0, "charnames",
+                                       res, NULL, "\\N{...}" );
                    if (has_utf8)
                        sv_utf8_upgrade(res);
-                   str = SvPV(res,len);
+                   str = SvPV_const(res,len);
 #ifdef EBCDIC_NEVER_MIND
                    /* charnames uses pack U and that has been
                     * recently changed to do the below uni->native
@@ -1695,19 +1761,19 @@ S_scan_const(pTHX_ char *start)
                     * gets revoked, but the semantics is still
                     * desireable for charnames. --jhi */
                    {
-                        UV uv = utf8_to_uvchr((U8*)str, 0);
+                        UV uv = utf8_to_uvchr((const U8*)str, 0);
 
                         if (uv < 0x100) {
                              U8 tmpbuf[UTF8_MAXBYTES+1], *d;
 
                              d = uvchr_to_utf8(tmpbuf, UNI_TO_NATIVE(uv));
                              sv_setpvn(res, (char *)tmpbuf, d - tmpbuf);
-                             str = SvPV(res, len);
+                             str = SvPV_const(res, len);
                         }
                    }
 #endif
                    if (!has_utf8 && SvUTF8(res)) {
-                       char *ostart = SvPVX(sv);
+                       const char * const ostart = SvPVX_const(sv);
                        SvCUR_set(sv, d - ostart);
                        SvPOK_on(sv);
                        *d = '\0';
@@ -1718,7 +1784,7 @@ S_scan_const(pTHX_ char *start)
                        has_utf8 = TRUE;
                    }
                    if (len > (STRLEN)(e - s + 4)) { /* I _guess_ 4 is \N{} --jhi */
-                       char *odest = SvPVX(sv);
+                       const char * const odest = SvPVX_const(sv);
 
                        SvGROW(sv, (SvLEN(sv) + len - (e - s + 4)));
                        d = SvPVX(sv) + (d - odest);
@@ -1776,18 +1842,22 @@ S_scan_const(pTHX_ char *start)
            s++;
            continue;
        } /* end if (backslash) */
+#ifdef EBCDIC
+       else
+           literal_endpoint++;
+#endif
 
     default_action:
        /* If we started with encoded form, or already know we want it
           and then encode the next character */
        if ((has_utf8 || this_utf8) && !NATIVE_IS_INVARIANT((U8)(*s))) {
            STRLEN len  = 1;
-           UV uv       = (this_utf8) ? utf8n_to_uvchr((U8*)s, send - s, &len, 0) : (UV) ((U8) *s);
-           STRLEN need = UNISKIP(NATIVE_TO_UNI(uv));
+           const UV uv       = (this_utf8) ? utf8n_to_uvchr((U8*)s, send - s, &len, 0) : (UV) ((U8) *s);
+           const STRLEN need = UNISKIP(NATIVE_TO_UNI(uv));
            s += len;
            if (need > len) {
                /* encoded value larger than old, need extra space (NOTE: SvCUR() not set here) */
-               STRLEN off = d - SvPVX(sv);
+               const STRLEN off = d - SvPVX_const(sv);
                d = SvGROW(sv, SvLEN(sv) + (need-len)) + off;
            }
            d = (char*)uvchr_to_utf8((U8*)d, uv);
@@ -1800,7 +1870,7 @@ S_scan_const(pTHX_ char *start)
 
     /* terminate the string and set up the sv */
     *d = '\0';
-    SvCUR_set(sv, d - SvPVX(sv));
+    SvCUR_set(sv, d - SvPVX_const(sv));
     if (SvCUR(sv) >= SvLEN(sv))
        Perl_croak(aTHX_ "panic: constant overflowed allocated space");
 
@@ -1820,15 +1890,14 @@ S_scan_const(pTHX_ char *start)
 
     /* shrink the sv if we allocated more than we used */
     if (SvCUR(sv) + 5 < SvLEN(sv)) {
-       SvLEN_set(sv, SvCUR(sv) + 1);
-       Renew(SvPVX(sv), SvLEN(sv), char);
+       SvPV_shrink_to_cur(sv);
     }
 
     /* return the substring (via yylval) only if we parsed anything */
     if (s > PL_bufptr) {
        if ( PL_hints & ( PL_lex_inpat ? HINT_NEW_RE : HINT_NEW_STRING ) )
            sv = new_constant(start, s - start, (PL_lex_inpat ? "qr" : "q"),
-                             sv, Nullsv,
+                             sv, NULL,
                              ( PL_lex_inwhat == OP_TRANS
                                ? "tr"
                                : ( (PL_lex_inwhat == OP_SUBST && !PL_lex_inpat)
@@ -1900,7 +1969,7 @@ S_intuit_more(pTHX_ register char *s)
        int weight = 2;         /* let's weigh the evidence */
        char seen[256];
        unsigned char un_char = 255, last_un_char;
-       char *send = strchr(s,']');
+       const char * const send = strchr(s,']');
        char tmpbuf[sizeof PL_tokenbuf * 4];
 
        if (!send)              /* has to be an expression */
@@ -1927,7 +1996,8 @@ S_intuit_more(pTHX_ register char *s)
                weight -= seen[un_char] * 10;
                if (isALNUM_lazy_if(s+1,UTF)) {
                    scan_ident(s, send, tmpbuf, sizeof tmpbuf, FALSE);
-                   if ((int)strlen(tmpbuf) > 1 && gv_fetchpv(tmpbuf,FALSE, SVt_PV))
+                   if ((int)strlen(tmpbuf) > 1
+                       && gv_fetchpv(tmpbuf, 0, SVt_PV))
                        weight -= 100;
                    else
                        weight -= 10;
@@ -2016,7 +2086,7 @@ S_intuit_more(pTHX_ register char *s)
  */
 
 STATIC int
-S_intuit_method(pTHX_ char *start, GV *gv)
+S_intuit_method(pTHX_ char *start, GV *gv, CV *cv)
 {
     char *s = start + (*start == '$');
     char tmpbuf[sizeof PL_tokenbuf];
@@ -2024,16 +2094,17 @@ S_intuit_method(pTHX_ char *start, GV *gv)
     GV* indirgv;
 
     if (gv) {
-       CV *cv;
-       if (GvIO(gv))
+       if (SvTYPE(gv) == SVt_PVGV && GvIO(gv))
            return 0;
-       if ((cv = GvCVu(gv))) {
-           char *proto = SvPVX(cv);
-           if (proto) {
-               if (*proto == ';')
-                   proto++;
-               if (*proto == '*')
-                   return 0;
+       if (cv) {
+           if (SvPOK(cv)) {
+               const char *proto = SvPVX_const(cv);
+               if (proto) {
+                   if (*proto == ';')
+                       proto++;
+                   if (*proto == '*')
+                       return 0;
+               }
            }
        } else
            gv = 0;
@@ -2058,7 +2129,7 @@ S_intuit_method(pTHX_ char *start, GV *gv)
            tmpbuf[len] = '\0';
            goto bare_package;
        }
-       indirgv = gv_fetchpv(tmpbuf, FALSE, SVt_PVCV);
+       indirgv = gv_fetchpv(tmpbuf, 0, SVt_PVCV);
        if (indirgv && GvCVu(indirgv))
            return 0;
        /* filehandle or package name makes it a method */
@@ -2090,7 +2161,7 @@ STATIC const char*
 S_incl_perldb(pTHX)
 {
     if (PL_perldb) {
-       const char *pdb = PerlEnv_getenv("PERL5DB");
+       const char * const pdb = PerlEnv_getenv("PERL5DB");
 
        if (pdb)
            return pdb;
@@ -2122,18 +2193,17 @@ SV *
 Perl_filter_add(pTHX_ filter_t funcp, SV *datasv)
 {
     if (!funcp)
-       return Nullsv;
+       return NULL;
 
     if (!PL_rsfp_filters)
        PL_rsfp_filters = newAV();
     if (!datasv)
-       datasv = NEWSV(255,0);
-    if (!SvUPGRADE(datasv, SVt_PVIO))
-        Perl_die(aTHX_ "Can't upgrade filter_add data to SVt_PVIO");
-    IoANY(datasv) = (void *)funcp; /* stash funcp into spare field */
+       datasv = newSV(0);
+    (void)SvUPGRADE(datasv, SVt_PVIO);
+    IoANY(datasv) = FPTR2DPTR(void *, funcp); /* stash funcp into spare field */
     IoFLAGS(datasv) |= IOf_FAKE_DIRP;
     DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_add func %p (%s)\n",
-                         (void*)funcp, SvPV_nolen(datasv)));
+                         IoANY(datasv), SvPV_nolen(datasv)));
     av_unshift(PL_rsfp_filters, 1);
     av_store(PL_rsfp_filters, 0, datasv) ;
     return(datasv);
@@ -2145,12 +2215,15 @@ void
 Perl_filter_del(pTHX_ filter_t funcp)
 {
     SV *datasv;
-    DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_del func %p", (void*)funcp));
+
+#ifdef DEBUGGING
+    DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_del func %p", FPTR2DPTR(XPVIO *, funcp)));
+#endif
     if (!PL_rsfp_filters || AvFILLp(PL_rsfp_filters)<0)
        return;
     /* if filter is on top of stack (usual case) just pop it off */
     datasv = FILTER_DATA(AvFILLp(PL_rsfp_filters));
-    if (IoANY(datasv) == (void *)funcp) {
+    if (IoANY(datasv) == FPTR2DPTR(void *, funcp)) {
        IoFLAGS(datasv) &= ~IOf_FAKE_DIRP;
        IoANY(datasv) = (void *)NULL;
        sv_free(av_pop(PL_rsfp_filters));
@@ -2180,7 +2253,7 @@ Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen)
        if (maxlen) {
            /* Want a block */
            int len ;
-           int old_len = SvCUR(buf_sv) ;
+           const int old_len = SvCUR(buf_sv);
 
            /* ensure buf_sv is large enough */
            SvGROW(buf_sv, (STRLEN)(old_len + maxlen)) ;
@@ -2210,10 +2283,10 @@ Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen)
        return FILTER_READ(idx+1, buf_sv, maxlen); /* recurse */
     }
     /* Get function pointer hidden within datasv       */
-    funcp = (filter_t)IoANY(datasv);
+    funcp = DPTR2FPTR(filter_t, IoANY(datasv));
     DEBUG_P(PerlIO_printf(Perl_debug_log,
                          "filter_read %d: via function %p (%s)\n",
-                         idx, (void*)funcp, SvPV_nolen(datasv)));
+                         idx, datasv, SvPV_nolen_const(datasv)));
     /* Call function. The function is expected to      */
     /* call "FILTER_READ(idx+1, buf_sv)" first.                */
     /* Return: <0:error, =0:eof, >0:not eof            */
@@ -2234,7 +2307,7 @@ S_filter_gets(pTHX_ register SV *sv, register PerlIO *fp, STRLEN append)
         if (FILTER_READ(0, sv, 0) > 0)
             return ( SvPVX(sv) ) ;
         else
-           return Nullch ;
+           return NULL ;
     }
     else
         return (sv_gets(sv, fp, append));
@@ -2250,24 +2323,48 @@ S_find_in_my_stash(pTHX_ const char *pkgname, I32 len)
 
     if (len > 2 &&
         (pkgname[len - 2] == ':' && pkgname[len - 1] == ':') &&
-        (gv = gv_fetchpv(pkgname, FALSE, SVt_PVHV)))
+        (gv = gv_fetchpv(pkgname, 0, SVt_PVHV)))
     {
         return GvHV(gv);                       /* Foo:: */
     }
 
     /* use constant CLASS => 'MyClass' */
-    if ((gv = gv_fetchpv(pkgname, FALSE, SVt_PVCV))) {
+    if ((gv = gv_fetchpv(pkgname, 0, SVt_PVCV))) {
         SV *sv;
         if (GvCV(gv) && (sv = cv_const_sv(GvCV(gv)))) {
-            pkgname = SvPV_nolen(sv);
+            pkgname = SvPV_nolen_const(sv);
         }
     }
 
     return gv_stashpv(pkgname, FALSE);
 }
 
+STATIC char *
+S_tokenize_use(pTHX_ int is_use, char *s) {
+    if (PL_expect != XSTATE)
+       yyerror(Perl_form(aTHX_ "\"%s\" not allowed in expression",
+                   is_use ? "use" : "no"));
+    s = skipspace(s);
+    if (isDIGIT(*s) || (*s == 'v' && isDIGIT(s[1]))) {
+       s = force_version(s, TRUE);
+       if (*s == ';' || (s = skipspace(s), *s == ';')) {
+           PL_nextval[PL_nexttoke].opval = Nullop;
+           force_next(WORD);
+       }
+       else if (*s == 'v') {
+           s = force_word(s,WORD,FALSE,TRUE,FALSE);
+           s = force_version(s, FALSE);
+       }
+    }
+    else {
+       s = force_word(s,WORD,FALSE,TRUE,FALSE);
+       s = force_version(s, FALSE);
+    }
+    yylval.ival = is_use;
+    return s;
+}
 #ifdef DEBUGGING
-    static char const* exp_name[] =
+    static const char* const exp_name[] =
        { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "ATTRBLOCK",
          "ATTRTERM", "TERMBLOCK"
        };
@@ -2327,16 +2424,17 @@ Perl_yylex(pTHX)
 {
     register char *s = PL_bufptr;
     register char *d;
-    register I32 tmp;
     STRLEN len;
-    GV *gv = Nullgv;
-    GV **gvp = 0;
     bool bof = FALSE;
-    I32 orig_keyword = 0;
 
     DEBUG_T( {
-       PerlIO_printf(Perl_debug_log, "### LEX_%s\n",
-                                       lex_state_names[PL_lex_state]);
+       SV* tmp = newSVpvs("");
+       PerlIO_printf(Perl_debug_log, "### %"IVdf":LEX_%s/X%s %s\n",
+           (IV)CopLINE(PL_curcop),
+           lex_state_names[PL_lex_state],
+           exp_name[PL_expect],
+           pv_display(tmp, s, strlen(s), 0, 60));
+       SvREFCNT_dec(tmp);
     } );
     /* check if there's an identifier for us to look at */
     if (PL_pending_ident)
@@ -2360,10 +2458,6 @@ Perl_yylex(pTHX)
            PL_expect = PL_lex_expect;
            PL_lex_defer = LEX_NORMAL;
        }
-       DEBUG_T({ PerlIO_printf(Perl_debug_log,
-              "### Next token after '%s' was known, type %"IVdf"\n", PL_bufptr,
-              (IV)PL_nexttype[PL_nexttoke]); });
-
        return REPORT(PL_nexttype[PL_nexttoke]);
 
     /* interpolated case modifiers like \L \U, including \Q and \E.
@@ -2376,11 +2470,9 @@ Perl_yylex(pTHX)
 #endif
        /* handle \E or end of string */
                if (PL_bufptr == PL_bufend || PL_bufptr[1] == 'E') {
-           char oldmod;
-
            /* if at a \E */
            if (PL_lex_casemods) {
-               oldmod = PL_lex_casestack[--PL_lex_casemods];
+               const char oldmod = PL_lex_casestack[--PL_lex_casemods];
                PL_lex_casestack[PL_lex_casemods] = '\0';
 
                if (PL_bufptr != PL_bufend
@@ -2397,7 +2489,7 @@ Perl_yylex(pTHX)
        }
        else {
            DEBUG_T({ PerlIO_printf(Perl_debug_log,
-              "### Saw case modifier at '%s'\n", PL_bufptr); });
+              "### Saw case modifier\n"); });
            s = PL_bufptr + 1;
            if (s[1] == '\\' && s[2] == 'E') {
                PL_bufptr = s + 3;
@@ -2405,6 +2497,7 @@ Perl_yylex(pTHX)
                return yylex();
            }
            else {
+               I32 tmp;
                if (strnEQ(s, "L\\u", 3) || strnEQ(s, "U\\l", 3))
                    tmp = *s, *s = s[2], s[2] = (char)tmp;      /* misordered... */
                if ((*s == 'L' || *s == 'U') &&
@@ -2450,7 +2543,7 @@ Perl_yylex(pTHX)
        if (PL_bufptr == PL_bufend)
            return REPORT(sublex_done());
        DEBUG_T({ PerlIO_printf(Perl_debug_log,
-              "### Interpolated variable at '%s'\n", PL_bufptr); });
+              "### Interpolated variable\n"); });
        PL_expect = XTERM;
        PL_lex_dojoin = (*PL_bufptr == '@');
        PL_lex_state = LEX_INTERPNORMAL;
@@ -2495,7 +2588,7 @@ Perl_yylex(pTHX)
        {
            if (PL_bufptr != PL_bufend)
                Perl_croak(aTHX_ "Bad evalled substitution pattern");
-           PL_lex_repl = Nullsv;
+           PL_lex_repl = NULL;
        }
        /* FALLTHROUGH */
     case LEX_INTERPCONCAT:
@@ -2547,10 +2640,6 @@ Perl_yylex(pTHX)
     s = PL_bufptr;
     PL_oldoldbufptr = PL_oldbufptr;
     PL_oldbufptr = s;
-    DEBUG_T( {
-       PerlIO_printf(Perl_debug_log, "### Tokener expecting %s at [%s]\n",
-                     exp_name[PL_expect], s);
-    } );
 
   retry:
     switch (*s) {
@@ -2566,10 +2655,9 @@ Perl_yylex(pTHX)
            PL_last_uni = 0;
            PL_last_lop = 0;
            if (PL_lex_brackets) {
-               if (PL_lex_formbrack)
-                   yyerror("Format not terminated");
-                else
-                   yyerror("Missing right curly or square bracket");
+               yyerror(PL_lex_formbrack
+                   ? "Format not terminated"
+                   : "Missing right curly or square bracket");
            }
             DEBUG_T( { PerlIO_printf(Perl_debug_log,
                         "### Tokener got EOF\n");
@@ -2584,21 +2672,21 @@ Perl_yylex(pTHX)
            PL_preambled = TRUE;
            sv_setpv(PL_linestr,incl_perldb());
            if (SvCUR(PL_linestr))
-               sv_catpvn(PL_linestr,";", 1);
+               sv_catpvs(PL_linestr,";");
            if (PL_preambleav){
                while(AvFILLp(PL_preambleav) >= 0) {
                    SV *tmpsv = av_shift(PL_preambleav);
                    sv_catsv(PL_linestr, tmpsv);
-                   sv_catpvn(PL_linestr, ";", 1);
+                   sv_catpvs(PL_linestr, ";");
                    sv_free(tmpsv);
                }
                sv_free((SV*)PL_preambleav);
                PL_preambleav = NULL;
            }
            if (PL_minus_n || PL_minus_p) {
-               sv_catpv(PL_linestr, "LINE: while (<>) {");
+               sv_catpvs(PL_linestr, "LINE: while (<>) {");
                if (PL_minus_l)
-                   sv_catpv(PL_linestr,"chomp;");
+                   sv_catpvs(PL_linestr,"chomp;");
                if (PL_minus_a) {
                    if (PL_minus_F) {
                        if ((*PL_splitstr == '/' || *PL_splitstr == '\''
@@ -2608,11 +2696,8 @@ Perl_yylex(pTHX)
                        else {
                            /* "q\0${splitstr}\0" is legal perl. Yes, even NUL
                               bytes can be used as quoting characters.  :-) */
-                           /* The count here deliberately includes the NUL
-                              that terminates the C string constant.  This
-                              embeds the opening NUL into the string.  */
                            const char *splits = PL_splitstr;
-                           sv_catpvn(PL_linestr, "our @F=split(q", 15);
+                           sv_catpvs(PL_linestr, "our @F=split(q\0");
                            do {
                                /* Need to \ \s  */
                                if (*splits == '\\')
@@ -2622,31 +2707,31 @@ Perl_yylex(pTHX)
                            /* This loop will embed the trailing NUL of
                               PL_linestr as the last thing it does before
                               terminating.  */
-                           sv_catpvn(PL_linestr, ");", 2);
+                           sv_catpvs(PL_linestr, ");");
                        }
                    }
                    else
-                       sv_catpv(PL_linestr,"our @F=split(' ');");
+                       sv_catpvs(PL_linestr,"our @F=split(' ');");
                }
            }
-           sv_catpvn(PL_linestr, "\n", 1);
+           sv_catpvs(PL_linestr, "\n");
            PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
            PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
-           PL_last_lop = PL_last_uni = Nullch;
+           PL_last_lop = PL_last_uni = NULL;
            if (PERLDB_LINE && PL_curstash != PL_debstash) {
-               SV *sv = NEWSV(85,0);
+               SV * const sv = newSV(0);
 
                sv_upgrade(sv, SVt_PVMG);
                sv_setsv(sv,PL_linestr);
                 (void)SvIOK_on(sv);
                 SvIV_set(sv, 0);
-               av_store(CopFILEAV(PL_curcop),(I32)CopLINE(PL_curcop),sv);
+               av_store(CopFILEAVx(PL_curcop),(I32)CopLINE(PL_curcop),sv);
            }
            goto retry;
        }
        do {
            bof = PL_rsfp ? TRUE : FALSE;
-           if ((s = filter_gets(PL_linestr, PL_rsfp, 0)) == Nullch) {
+           if ((s = filter_gets(PL_linestr, PL_rsfp, 0)) == NULL) {
              fake_eof:
                if (PL_rsfp) {
                    if (PL_preprocess && !PL_in_eval)
@@ -2655,7 +2740,7 @@ Perl_yylex(pTHX)
                        PerlIO_clearerr(PL_rsfp);
                    else
                        (void)PerlIO_close(PL_rsfp);
-                   PL_rsfp = Nullfp;
+                   PL_rsfp = NULL;
                    PL_doextract = FALSE;
                }
                if (!PL_in_eval && (PL_minus_n || PL_minus_p)) {
@@ -2663,12 +2748,12 @@ Perl_yylex(pTHX)
                             ? ";}continue{print;}" : ";}");
                    PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
                    PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
-                   PL_last_lop = PL_last_uni = Nullch;
+                   PL_last_lop = PL_last_uni = NULL;
                    PL_minus_n = PL_minus_p = 0;
                    goto retry;
                }
                PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
-               PL_last_lop = PL_last_uni = Nullch;
+               PL_last_lop = PL_last_uni = NULL;
                sv_setpvn(PL_linestr,"",0);
                TOKEN(';');     /* not infinite loop because rsfp is NULL now */
            }
@@ -2713,7 +2798,7 @@ Perl_yylex(pTHX)
                    sv_setpvn(PL_linestr, "", 0);
                    PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
                    PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
-                   PL_last_lop = PL_last_uni = Nullch;
+                   PL_last_lop = PL_last_uni = NULL;
                    PL_doextract = FALSE;
                }
            }
@@ -2721,22 +2806,22 @@ Perl_yylex(pTHX)
        } while (PL_doextract);
        PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = s;
        if (PERLDB_LINE && PL_curstash != PL_debstash) {
-           SV *sv = NEWSV(85,0);
+           SV * const sv = newSV(0);
 
            sv_upgrade(sv, SVt_PVMG);
            sv_setsv(sv,PL_linestr);
             (void)SvIOK_on(sv);
             SvIV_set(sv, 0);
-           av_store(CopFILEAV(PL_curcop),(I32)CopLINE(PL_curcop),sv);
+           av_store(CopFILEAVx(PL_curcop),(I32)CopLINE(PL_curcop),sv);
        }
        PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
-       PL_last_lop = PL_last_uni = Nullch;
+       PL_last_lop = PL_last_uni = NULL;
        if (CopLINE(PL_curcop) == 1) {
            while (s < PL_bufend && isSPACE(*s))
                s++;
            if (*s == ':' && s[1] != ':') /* for csh execing sh scripts */
                s++;
-           d = Nullch;
+           d = NULL;
            if (!PL_in_eval) {
                if (*s == '#' && *(s+1) == '!')
                    d = s + 2;
@@ -2767,7 +2852,8 @@ Perl_yylex(pTHX)
                     * at least, set argv[0] to the basename of the Perl
                     * interpreter. So, having found "#!", we'll set it right.
                     */
-                   SV *x = GvSV(gv_fetchpv("\030", TRUE, SVt_PV)); /* $^X */
+                   SV * const x = GvSV(gv_fetchpvs("\030", GV_ADD|GV_NOTQUAL,
+                                                   SVt_PV)); /* $^X */
                    assert(SvPOK(x) || SvGMAGICAL(x));
                    if (sv_eq(x, CopFILESV(PL_curcop))) {
                        sv_setpvn(x, ipath, ipathend - ipath);
@@ -2776,8 +2862,8 @@ Perl_yylex(pTHX)
                    else {
                        STRLEN blen;
                        STRLEN llen;
-                       char *bstart = SvPV(CopFILESV(PL_curcop),blen);
-                       char *lstart = SvPV(x,llen);
+                       const char *bstart = SvPV_const(CopFILESV(PL_curcop),blen);
+                       const char * const lstart = SvPV_const(x,llen);
                        if (llen < blen) {
                            bstart += blen - llen;
                            if (strnEQ(bstart, lstart, llen) && bstart[-1] == '/') {
@@ -2808,7 +2894,7 @@ Perl_yylex(pTHX)
                            }
                        }
                        if (d < ipath)
-                           d = Nullch;
+                           d = NULL;
                    }
 #endif
                }
@@ -2823,11 +2909,11 @@ Perl_yylex(pTHX)
                 * contains the start of the Perl program.
                 */
                if (d && *s != '#') {
-                   char *c = ipath;
+                   const char *c = ipath;
                    while (*c && !strchr("; \t\r\n\f\v#", *c))
                        c++;
                    if (c < d)
-                       d = Nullch;     /* "perl" not in first word; ignore */
+                       d = NULL;       /* "perl" not in first word; ignore */
                    else
                        *s = '#';       /* Don't try to parse shebang line */
                }
@@ -2840,14 +2926,14 @@ Perl_yylex(pTHX)
                    !instr(s,"indir") &&
                    instr(PL_origargv[0],"perl"))
                {
-                   char **newargv;
+                                   char **newargv;
 
                    *ipathend = '\0';
                    s = ipathend + 1;
                    while (s < PL_bufend && isSPACE(*s))
                        s++;
                    if (s < PL_bufend) {
-                       Newz(899,newargv,PL_origargc+3,char*);
+                       Newxz(newargv,PL_origargc+3,char*);
                        newargv[1] = s;
                        while (s < PL_bufend && !isSPACE(*s))
                            s++;
@@ -2864,18 +2950,18 @@ Perl_yylex(pTHX)
                }
 #endif
                if (d) {
-                   U32 oldpdb = PL_perldb;
-                   bool oldn = PL_minus_n;
-                   bool oldp = PL_minus_p;
-
                    while (*d && !isSPACE(*d)) d++;
                    while (SPACE_OR_TAB(*d)) d++;
 
                    if (*d++ == '-') {
-                       bool switches_done = PL_doswitches;
+                       const bool switches_done = PL_doswitches;
+                       const U32 oldpdb = PL_perldb;
+                       const bool oldn = PL_minus_n;
+                       const bool oldp = PL_minus_p;
+
                        do {
                            if (*d == 'M' || *d == 'm') {
-                               char *m = d;
+                               const char * const m = d;
                                while (*d && !isSPACE(*d)) d++;
                                Perl_croak(aTHX_ "Too late for \"-%.*s\" option",
                                      (int)(d - m), m);
@@ -2898,20 +2984,12 @@ Perl_yylex(pTHX)
                            sv_setpvn(PL_linestr, "", 0);
                            PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = SvPVX(PL_linestr);
                            PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
-                           PL_last_lop = PL_last_uni = Nullch;
+                           PL_last_lop = PL_last_uni = NULL;
                            PL_preambled = FALSE;
                            if (PERLDB_LINE)
                                (void)gv_fetchfile(PL_origfilename);
                            goto retry;
                        }
-                       if (PL_doswitches && !switches_done) {
-                           int argc = PL_origargc;
-                           char **argv = PL_origargv;
-                           do {
-                               argc--,argv++;
-                           } while (argc && argv[0][0] == '-' && argv[0][1]);
-                           init_argv_symbols(argc,argv);
-                       }
                    }
                }
            }
@@ -2964,6 +3042,7 @@ Perl_yylex(pTHX)
     case '-':
        if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
            I32 ftst = 0;
+           char tmp;
 
            s++;
            PL_bufptr = s;
@@ -2974,8 +3053,8 @@ Perl_yylex(pTHX)
 
            if (strnEQ(s,"=>",2)) {
                s = force_word(PL_bufptr,WORD,FALSE,FALSE,FALSE);
-                DEBUG_T( { PerlIO_printf(Perl_debug_log,
-                            "### Saw unary minus before =>, forcing word '%s'\n", s);
+                DEBUG_T( { S_printbuf(aTHX_
+                       "### Saw unary minus before =>, forcing word %s\n", s);
                 } );
                OPERATOR('-');          /* unary minus */
            }
@@ -3006,7 +3085,7 @@ Perl_yylex(pTHX)
            case 'T': ftst = OP_FTTEXT;         break;
            case 'B': ftst = OP_FTBINARY;       break;
            case 'M': case 'A': case 'C':
-               gv_fetchpv("\024",TRUE, SVt_PV);
+               gv_fetchpvs("\024", GV_ADD|GV_NOTQUAL, SVt_PV);
                switch (tmp) {
                case 'M': ftst = OP_FTMTIME;    break;
                case 'A': ftst = OP_FTATIME;    break;
@@ -3020,7 +3099,7 @@ Perl_yylex(pTHX)
            if (ftst) {
                PL_last_lop_op = (OPCODE)ftst;
                DEBUG_T( { PerlIO_printf(Perl_debug_log,
-                        "### Saw file test %c\n", (int)ftst);
+                        "### Saw file test %c\n", (int)tmp);
                } );
                FTST(ftst);
            }
@@ -3034,49 +3113,53 @@ Perl_yylex(pTHX)
                s = --PL_bufptr;
            }
        }
-       tmp = *s++;
-       if (*s == tmp) {
-           s++;
+       {
+           const char tmp = *s++;
+           if (*s == tmp) {
+               s++;
+               if (PL_expect == XOPERATOR)
+                   TERM(POSTDEC);
+               else
+                   OPERATOR(PREDEC);
+           }
+           else if (*s == '>') {
+               s++;
+               s = skipspace(s);
+               if (isIDFIRST_lazy_if(s,UTF)) {
+                   s = force_word(s,METHOD,FALSE,TRUE,FALSE);
+                   TOKEN(ARROW);
+               }
+               else if (*s == '$')
+                   OPERATOR(ARROW);
+               else
+                   TERM(ARROW);
+           }
            if (PL_expect == XOPERATOR)
-               TERM(POSTDEC);
-           else
-               OPERATOR(PREDEC);
-       }
-       else if (*s == '>') {
-           s++;
-           s = skipspace(s);
-           if (isIDFIRST_lazy_if(s,UTF)) {
-               s = force_word(s,METHOD,FALSE,TRUE,FALSE);
-               TOKEN(ARROW);
+               Aop(OP_SUBTRACT);
+           else {
+               if (isSPACE(*s) || !isSPACE(*PL_bufptr))
+                   check_uni();
+               OPERATOR('-');          /* unary minus */
            }
-           else if (*s == '$')
-               OPERATOR(ARROW);
-           else
-               TERM(ARROW);
-       }
-       if (PL_expect == XOPERATOR)
-           Aop(OP_SUBTRACT);
-       else {
-           if (isSPACE(*s) || !isSPACE(*PL_bufptr))
-               check_uni();
-           OPERATOR('-');              /* unary minus */
        }
 
     case '+':
-       tmp = *s++;
-       if (*s == tmp) {
-           s++;
+       {
+           const char tmp = *s++;
+           if (*s == tmp) {
+               s++;
+               if (PL_expect == XOPERATOR)
+                   TERM(POSTINC);
+               else
+                   OPERATOR(PREINC);
+           }
            if (PL_expect == XOPERATOR)
-               TERM(POSTINC);
-           else
-               OPERATOR(PREINC);
-       }
-       if (PL_expect == XOPERATOR)
-           Aop(OP_ADD);
-       else {
-           if (isSPACE(*s) || !isSPACE(*PL_bufptr))
-               check_uni();
-           OPERATOR('+');
+               Aop(OP_ADD);
+           else {
+               if (isSPACE(*s) || !isSPACE(*PL_bufptr))
+                   check_uni();
+               OPERATOR('+');
+           }
        }
 
     case '*':
@@ -3116,12 +3199,14 @@ Perl_yylex(pTHX)
        /* FALL THROUGH */
     case '~':
     case ',':
-       tmp = *s++;
-       OPERATOR(tmp);
+       {
+           const char tmp = *s++;
+           OPERATOR(tmp);
+       }
     case ':':
        if (s[1] == ':') {
            len = 0;
-           goto just_a_word;
+           goto just_a_word_zero_gv;
        }
        s++;
        switch (PL_expect) {
@@ -3140,6 +3225,7 @@ Perl_yylex(pTHX)
            s = skipspace(s);
            attrs = Nullop;
            while (isIDFIRST_lazy_if(s,UTF)) {
+               I32 tmp;
                d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
                if (isLOWER(*s) && (tmp = keyword(PL_tokenbuf, len))) {
                    if (tmp < 0) tmp = -tmp;
@@ -3175,7 +3261,7 @@ Perl_yylex(pTHX)
                    attrs = append_elem(OP_LIST, attrs,
                                        newSVOP(OP_CONST, 0, sv));
                    SvREFCNT_dec(PL_lex_stuff);
-                   PL_lex_stuff = Nullsv;
+                   PL_lex_stuff = NULL;
                }
                else {
                    if (len == 6 && strnEQ(s, "unique", len)) {
@@ -3218,26 +3304,30 @@ Perl_yylex(pTHX)
                else if (s == d)
                    break;      /* require real whitespace or :'s */
            }
-           tmp = (PL_expect == XOPERATOR ? '=' : '{'); /*'}(' for vi */
-           if (*s != ';' && *s != '}' && *s != tmp && (tmp != '=' || *s != ')')) {
-               char q = ((*s == '\'') ? '"' : '\'');
-               /* If here for an expression, and parsed no attrs, back off. */
-               if (tmp == '=' && !attrs) {
-                   s = PL_bufptr;
-                   break;
+           {
+               const char tmp
+                   = (PL_expect == XOPERATOR ? '=' : '{'); /*'}(' for vi */
+               if (*s != ';' && *s != '}' && *s != tmp
+                   && (tmp != '=' || *s != ')')) {
+                   const char q = ((*s == '\'') ? '"' : '\'');
+                   /* If here for an expression, and parsed no attrs, back
+                      off. */
+                   if (tmp == '=' && !attrs) {
+                       s = PL_bufptr;
+                       break;
+                   }
+                   /* MUST advance bufptr here to avoid bogus "at end of line"
+                      context messages from yyerror().
+                   */
+                   PL_bufptr = s;
+                   yyerror( *s
+                            ? Perl_form(aTHX_ "Invalid separator character "
+                                        "%c%c%c in attribute list", q, *s, q)
+                            : "Unterminated attribute list" );
+                   if (attrs)
+                       op_free(attrs);
+                   OPERATOR(':');
                }
-               /* MUST advance bufptr here to avoid bogus "at end of line"
-                  context messages from yyerror().
-                */
-               PL_bufptr = s;
-               if (!*s)
-                   yyerror("Unterminated attribute list");
-               else
-                   yyerror(Perl_form(aTHX_ "Invalid separator character %c%c%c in attribute list",
-                                     q, *s, q));
-               if (attrs)
-                   op_free(attrs);
-               OPERATOR(':');
            }
        got_attrs:
            if (attrs) {
@@ -3257,14 +3347,18 @@ Perl_yylex(pTHX)
        TOKEN('(');
     case ';':
        CLINE;
-       tmp = *s++;
-       OPERATOR(tmp);
+       {
+           const char tmp = *s++;
+           OPERATOR(tmp);
+       }
     case ')':
-       tmp = *s++;
-       s = skipspace(s);
-       if (*s == '{')
-           PREBLOCK(tmp);
-       TERM(tmp);
+       {
+           const char tmp = *s++;
+           s = skipspace(s);
+           if (*s == '{')
+               PREBLOCK(tmp);
+           TERM(tmp);
+       }
     case ']':
        s++;
        if (PL_lex_brackets <= 0)
@@ -3312,7 +3406,7 @@ Perl_yylex(pTHX)
                while (d < PL_bufend && SPACE_OR_TAB(*d))
                    d++;
                if (*d == '}') {
-                   char minus = (PL_tokenbuf[0] == '-');
+                   const char minus = (PL_tokenbuf[0] == '-');
                    s = force_word(s + minus, WORD, FALSE, TRUE, FALSE);
                    if (minus)
                        force_next('-');
@@ -3330,7 +3424,7 @@ Perl_yylex(pTHX)
            PL_expect = XSTATE;
            break;
        default: {
-               char *t;
+               const char *t;
                if (PL_oldoldbufptr == PL_last_lop)
                    PL_lex_brackstack[PL_lex_brackets++] = XTERM;
                else
@@ -3353,7 +3447,7 @@ Perl_yylex(pTHX)
                 * eval"") we have to resolve the ambiguity.  This code
                 * covers the case where the first term in the curlies is a
                 * quoted string.  Most other cases need to be explicitly
-                * disambiguated by prepending a `+' before the opening
+                * disambiguated by prepending a "+" before the opening
                 * curly in order to force resolution as an anon hash.
                 *
                 * XXX should probably propagate the outer expectation
@@ -3376,7 +3470,7 @@ Perl_yylex(pTHX)
                                && !isALNUM(*t))))
                    {
                        /* skip q//-like construct */
-                       char *tmps;
+                       const char *tmps;
                        char open, close, term;
                        I32 brackets = 1;
 
@@ -3472,13 +3566,12 @@ Perl_yylex(pTHX)
        TOKEN(';');
     case '&':
        s++;
-       tmp = *s++;
-       if (tmp == '&')
+       if (*s++ == '&')
            AOPERATOR(ANDAND);
        s--;
        if (PL_expect == XOPERATOR) {
-           if (ckWARN(WARN_SEMICOLON)
-               && isIDFIRST_lazy_if(s,UTF) && PL_bufptr == PL_linestart)
+           if (PL_bufptr == PL_linestart && ckWARN(WARN_SEMICOLON)
+               && isIDFIRST_lazy_if(s,UTF))
            {
                CopLINE_dec(PL_curcop);
                Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), PL_warn_nosemi);
@@ -3499,50 +3592,53 @@ Perl_yylex(pTHX)
 
     case '|':
        s++;
-       tmp = *s++;
-       if (tmp == '|')
+       if (*s++ == '|')
            AOPERATOR(OROR);
        s--;
        BOop(OP_BIT_OR);
     case '=':
        s++;
-       tmp = *s++;
-       if (tmp == '=')
-           Eop(OP_EQ);
-       if (tmp == '>')
-           OPERATOR(',');
-       if (tmp == '~')
-           PMop(OP_MATCH);
-       if (ckWARN(WARN_SYNTAX) && tmp && isSPACE(*s) && strchr("+-*/%.^&|<",tmp))
-           Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Reversed %c= operator",(int)tmp);
-       s--;
-       if (PL_expect == XSTATE && isALPHA(tmp) &&
-               (s == PL_linestart+1 || s[-2] == '\n') )
        {
-           if (PL_in_eval && !PL_rsfp) {
-               d = PL_bufend;
-               while (s < d) {
-                   if (*s++ == '\n') {
-                       incline(s);
-                       if (strnEQ(s,"=cut",4)) {
-                           s = strchr(s,'\n');
-                           if (s)
-                               s++;
-                           else
-                               s = d;
-                           incline(s);
-                           goto retry;
+           const char tmp = *s++;
+           if (tmp == '=')
+               Eop(OP_EQ);
+           if (tmp == '>')
+               OPERATOR(',');
+           if (tmp == '~')
+               PMop(OP_MATCH);
+           if (tmp && isSPACE(*s) && ckWARN(WARN_SYNTAX)
+               && strchr("+-*/%.^&|<",tmp))
+               Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
+                           "Reversed %c= operator",(int)tmp);
+           s--;
+           if (PL_expect == XSTATE && isALPHA(tmp) &&
+               (s == PL_linestart+1 || s[-2] == '\n') )
+               {
+                   if (PL_in_eval && !PL_rsfp) {
+                       d = PL_bufend;
+                       while (s < d) {
+                           if (*s++ == '\n') {
+                               incline(s);
+                               if (strnEQ(s,"=cut",4)) {
+                                   s = strchr(s,'\n');
+                                   if (s)
+                                       s++;
+                                   else
+                                       s = d;
+                                   incline(s);
+                                   goto retry;
+                               }
+                           }
                        }
+                       goto retry;
                    }
+                   s = PL_bufend;
+                   PL_doextract = TRUE;
+                   goto retry;
                }
-               goto retry;
-           }
-           s = PL_bufend;
-           PL_doextract = TRUE;
-           goto retry;
        }
        if (PL_lex_brackets < PL_lex_formbrack) {
-           char *t;
+           const char *t;
 #ifdef PERL_STRICT_CR
            for (t = s; SPACE_OR_TAB(*t); t++) ;
 #else
@@ -3558,11 +3654,13 @@ Perl_yylex(pTHX)
        OPERATOR(ASSIGNOP);
     case '!':
        s++;
-       tmp = *s++;
-       if (tmp == '=')
-           Eop(OP_NE);
-       if (tmp == '~')
-           PMop(OP_NOT);
+       {
+           const char tmp = *s++;
+           if (tmp == '=')
+               Eop(OP_NE);
+           if (tmp == '~')
+               PMop(OP_NOT);
+       }
        s--;
        OPERATOR('!');
     case '<':
@@ -3576,25 +3674,29 @@ Perl_yylex(pTHX)
            TERM(sublex_start());
        }
        s++;
-       tmp = *s++;
-       if (tmp == '<')
-           SHop(OP_LEFT_SHIFT);
-       if (tmp == '=') {
-           tmp = *s++;
-           if (tmp == '>')
-               Eop(OP_NCMP);
-           s--;
-           Rop(OP_LE);
+       {
+           char tmp = *s++;
+           if (tmp == '<')
+               SHop(OP_LEFT_SHIFT);
+           if (tmp == '=') {
+               tmp = *s++;
+               if (tmp == '>')
+                   Eop(OP_NCMP);
+               s--;
+               Rop(OP_LE);
+           }
        }
        s--;
        Rop(OP_LT);
     case '>':
        s++;
-       tmp = *s++;
-       if (tmp == '>')
-           SHop(OP_RIGHT_SHIFT);
-       if (tmp == '=')
-           Rop(OP_GE);
+       {
+           const char tmp = *s++;
+           if (tmp == '>')
+               SHop(OP_RIGHT_SHIFT);
+           if (tmp == '=')
+               Rop(OP_GE);
+       }
        s--;
        Rop(OP_GT);
 
@@ -3604,7 +3706,7 @@ Perl_yylex(pTHX)
        if (PL_expect == XOPERATOR) {
            if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
                PL_expect = XTERM;
-               depcom();
+               deprecate_old((char *)commaless_variable_list);
                return REPORT(','); /* grandfather non-comma-format format */
            }
        }
@@ -3642,89 +3744,97 @@ Perl_yylex(pTHX)
        }
 
        d = s;
-       tmp = (I32)*s;
-       if (PL_lex_state == LEX_NORMAL)
-           s = skipspace(s);
+       {
+           const char tmp = *s;
+           if (PL_lex_state == LEX_NORMAL)
+               s = skipspace(s);
 
-       if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
-           char *t;
-           if (*s == '[') {
-               PL_tokenbuf[0] = '@';
-               if (ckWARN(WARN_SYNTAX)) {
-                   for(t = s + 1;
-                       isSPACE(*t) || isALNUM_lazy_if(t,UTF) || *t == '$';
-                       t++) ;
-                   if (*t++ == ',') {
-                       PL_bufptr = skipspace(PL_bufptr);
-                       while (t < PL_bufend && *t != ']')
-                           t++;
-                       Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
-                               "Multidimensional syntax %.*s not supported",
-                               (t - PL_bufptr) + 1, PL_bufptr);
-                   }
-               }
-           }
-           else if (*s == '{') {
-               PL_tokenbuf[0] = '%';
-               if (ckWARN(WARN_SYNTAX) && strEQ(PL_tokenbuf+1, "SIG") &&
-                   (t = strchr(s, '}')) && (t = strchr(t, '=')))
-               {
-                   char tmpbuf[sizeof PL_tokenbuf];
-                   STRLEN len;
-                   for (t++; isSPACE(*t); t++) ;
-                   if (isIDFIRST_lazy_if(t,UTF)) {
-                       t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE, &len);
-                       for (; isSPACE(*t); t++) ;
-                       if (*t == ';' && get_cv(tmpbuf, FALSE))
+           if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop)
+               && intuit_more(s)) {
+               if (*s == '[') {
+                   PL_tokenbuf[0] = '@';
+                   if (ckWARN(WARN_SYNTAX)) {
+                       char *t;
+                       for(t = s + 1;
+                           isSPACE(*t) || isALNUM_lazy_if(t,UTF) || *t == '$';
+                           t++) ;
+                       if (*t++ == ',') {
+                           PL_bufptr = skipspace(PL_bufptr);
+                           while (t < PL_bufend && *t != ']')
+                               t++;
                            Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
-                               "You need to quote \"%s\"", tmpbuf);
+                                       "Multidimensional syntax %.*s not supported",
+                                   (int)((t - PL_bufptr) + 1), PL_bufptr);
+                       }
                    }
                }
+               else if (*s == '{') {
+                   char *t;
+                   PL_tokenbuf[0] = '%';
+                   if (strEQ(PL_tokenbuf+1, "SIG")  && ckWARN(WARN_SYNTAX)
+                       && (t = strchr(s, '}')) && (t = strchr(t, '=')))
+                       {
+                           char tmpbuf[sizeof PL_tokenbuf];
+                           for (t++; isSPACE(*t); t++) ;
+                           if (isIDFIRST_lazy_if(t,UTF)) {
+                               STRLEN len;
+                               t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE,
+                                             &len);
+                               for (; isSPACE(*t); t++) ;
+                               if (*t == ';' && get_cv(tmpbuf, FALSE))
+                                   Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
+                                               "You need to quote \"%s\"",
+                                               tmpbuf);
+                           }
+                       }
+               }
            }
-       }
 
-       PL_expect = XOPERATOR;
-       if (PL_lex_state == LEX_NORMAL && isSPACE((char)tmp)) {
-           bool islop = (PL_last_lop == PL_oldoldbufptr);
-           if (!islop || PL_last_lop_op == OP_GREPSTART)
-               PL_expect = XOPERATOR;
-           else if (strchr("$@\"'`q", *s))
-               PL_expect = XTERM;              /* e.g. print $fh "foo" */
-           else if (strchr("&*<%", *s) && isIDFIRST_lazy_if(s+1,UTF))
-               PL_expect = XTERM;              /* e.g. print $fh &sub */
-           else if (isIDFIRST_lazy_if(s,UTF)) {
-               char tmpbuf[sizeof PL_tokenbuf];
-               scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
-               if ((tmp = keyword(tmpbuf, len))) {
-                   /* binary operators exclude handle interpretations */
-                   switch (tmp) {
-                   case -KEY_x:
-                   case -KEY_eq:
-                   case -KEY_ne:
-                   case -KEY_gt:
-                   case -KEY_lt:
-                   case -KEY_ge:
-                   case -KEY_le:
-                   case -KEY_cmp:
-                       break;
-                   default:
-                       PL_expect = XTERM;      /* e.g. print $fh length() */
-                       break;
+           PL_expect = XOPERATOR;
+           if (PL_lex_state == LEX_NORMAL && isSPACE((char)tmp)) {
+               const bool islop = (PL_last_lop == PL_oldoldbufptr);
+               if (!islop || PL_last_lop_op == OP_GREPSTART)
+                   PL_expect = XOPERATOR;
+               else if (strchr("$@\"'`q", *s))
+                   PL_expect = XTERM;          /* e.g. print $fh "foo" */
+               else if (strchr("&*<%", *s) && isIDFIRST_lazy_if(s+1,UTF))
+                   PL_expect = XTERM;          /* e.g. print $fh &sub */
+               else if (isIDFIRST_lazy_if(s,UTF)) {
+                   char tmpbuf[sizeof PL_tokenbuf];
+                   int t2;
+                   scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
+                   if ((t2 = keyword(tmpbuf, len))) {
+                       /* binary operators exclude handle interpretations */
+                       switch (t2) {
+                       case -KEY_x:
+                       case -KEY_eq:
+                       case -KEY_ne:
+                       case -KEY_gt:
+                       case -KEY_lt:
+                       case -KEY_ge:
+                       case -KEY_le:
+                       case -KEY_cmp:
+                           break;
+                       default:
+                           PL_expect = XTERM;  /* e.g. print $fh length() */
+                           break;
+                       }
+                   }
+                   else {
+                       PL_expect = XTERM;      /* e.g. print $fh subr() */
                    }
                }
-               else {
-                   PL_expect = XTERM;          /* e.g. print $fh subr() */
-               }
+               else if (isDIGIT(*s))
+                   PL_expect = XTERM;          /* e.g. print $fh 3 */
+               else if (*s == '.' && isDIGIT(s[1]))
+                   PL_expect = XTERM;          /* e.g. print $fh .3 */
+               else if ((*s == '?' || *s == '-' || *s == '+')
+                        && !isSPACE(s[1]) && s[1] != '=')
+                   PL_expect = XTERM;          /* e.g. print $fh -1 */
+               else if (*s == '<' && s[1] == '<' && !isSPACE(s[2])
+                        && s[2] != '=')
+                   PL_expect = XTERM;          /* print $fh <<"EOF" */
            }
-           else if (isDIGIT(*s))
-               PL_expect = XTERM;              /* e.g. print $fh 3 */
-           else if (*s == '.' && isDIGIT(s[1]))
-               PL_expect = XTERM;              /* e.g. print $fh .3 */
-           else if ((*s == '?' || *s == '-' || *s == '+')
-                    && !isSPACE(s[1]) && s[1] != '=')
-               PL_expect = XTERM;              /* e.g. print $fh -1 */
-           else if (*s == '<' && s[1] == '<' && !isSPACE(s[2]) && s[2] != '=')
-               PL_expect = XTERM;              /* print $fh <<"EOF" */
        }
        PL_pending_ident = '$';
        TOKEN('$');
@@ -3744,9 +3854,9 @@ Perl_yylex(pTHX)
                PL_tokenbuf[0] = '%';
 
            /* Warn about @ where they meant $. */
-           if (ckWARN(WARN_SYNTAX)) {
-               if (*s == '[' || *s == '{') {
-                   char *t = s + 1;
+           if (*s == '[' || *s == '{') {
+               if (ckWARN(WARN_SYNTAX)) {
+                   const char *t = s + 1;
                    while (*t && (isALNUM_lazy_if(t,UTF) || strchr(" \t$#+-'\"", *t)))
                        t++;
                    if (*t == '}' || *t == ']') {
@@ -3754,7 +3864,8 @@ Perl_yylex(pTHX)
                        PL_bufptr = skipspace(PL_bufptr);
                        Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
                            "Scalar value %.*s better written as $%.*s",
-                           t-PL_bufptr, PL_bufptr, t-PL_bufptr-1, PL_bufptr+1);
+                           (int)(t-PL_bufptr), PL_bufptr,
+                           (int)(t-PL_bufptr-1), PL_bufptr+1);
                    }
                }
            }
@@ -3774,10 +3885,12 @@ Perl_yylex(pTHX)
            s = scan_pat(s,OP_MATCH);
            TERM(sublex_start());
        }
-       tmp = *s++;
-       if (tmp == '/')
-           Mop(OP_DIVIDE);
-       OPERATOR(tmp);
+       {
+           char tmp = *s++;
+           if (tmp == '/')
+               Mop(OP_DIVIDE);
+           OPERATOR(tmp);
+       }
 
     case '.':
        if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack
@@ -3793,7 +3906,7 @@ Perl_yylex(pTHX)
            goto rightbracket;
        }
        if (PL_expect == XOPERATOR || !isDIGIT(s[1])) {
-           tmp = *s++;
+           char tmp = *s++;
            if (*s == tmp) {
                s++;
                if (*s == tmp) {
@@ -3812,22 +3925,18 @@ Perl_yylex(pTHX)
     case '0': case '1': case '2': case '3': case '4':
     case '5': case '6': case '7': case '8': case '9':
        s = scan_num(s, &yylval);
-        DEBUG_T( { PerlIO_printf(Perl_debug_log,
-                    "### Saw number before '%s'\n", s);
-        } );
+       DEBUG_T( { S_printbuf(aTHX_ "### Saw number in %s\n", s); } );
        if (PL_expect == XOPERATOR)
            no_op("Number",s);
        TERM(THING);
 
     case '\'':
        s = scan_str(s,FALSE,FALSE);
-        DEBUG_T( { PerlIO_printf(Perl_debug_log,
-                    "### Saw string before '%s'\n", s);
-        } );
+       DEBUG_T( { S_printbuf(aTHX_ "### Saw string before %s\n", s); } );
        if (PL_expect == XOPERATOR) {
            if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
                PL_expect = XTERM;
-               depcom();
+               deprecate_old((char *)commaless_variable_list);
                return REPORT(','); /* grandfather non-comma-format format */
            }
            else
@@ -3840,13 +3949,11 @@ Perl_yylex(pTHX)
 
     case '"':
        s = scan_str(s,FALSE,FALSE);
-        DEBUG_T( { PerlIO_printf(Perl_debug_log,
-                    "### Saw string before '%s'\n", s);
-        } );
+       DEBUG_T( { S_printbuf(aTHX_ "### Saw string before %s\n", s); } );
        if (PL_expect == XOPERATOR) {
            if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
                PL_expect = XTERM;
-               depcom();
+               deprecate_old((char *)commaless_variable_list);
                return REPORT(','); /* grandfather non-comma-format format */
            }
            else
@@ -3855,6 +3962,8 @@ Perl_yylex(pTHX)
        if (!s)
            missingterm((char*)0);
        yylval.ival = OP_CONST;
+       /* FIXME. I think that this can be const if char *d is replaced by
+          more localised variables.  */
        for (d = SvPV(PL_lex_stuff, len); len; len--, d++) {
            if (*d == '$' || *d == '@' || *d == '\\' || !UTF8_IS_INVARIANT((U8)*d)) {
                yylval.ival = OP_STRINGIFY;
@@ -3865,9 +3974,7 @@ Perl_yylex(pTHX)
 
     case '`':
        s = scan_str(s,FALSE,FALSE);
-        DEBUG_T( { PerlIO_printf(Perl_debug_log,
-                    "### Saw backtick string before '%s'\n", s);
-        } );
+       DEBUG_T( { S_printbuf(aTHX_ "### Saw backtick string before %s\n", s); } );
        if (PL_expect == XOPERATOR)
            no_op("Backticks",s);
        if (!s)
@@ -3878,7 +3985,7 @@ Perl_yylex(pTHX)
 
     case '\\':
        s++;
-       if (ckWARN(WARN_SYNTAX) && PL_lex_inwhat && isDIGIT(*s))
+       if (PL_lex_inwhat && isDIGIT(*s) && ckWARN(WARN_SYNTAX))
            Perl_warner(aTHX_ packWARN(WARN_SYNTAX),"Can't use \\%c to mean $%c in expression",
                        *s, *s);
        if (PL_expect == XOPERATOR)
@@ -3887,9 +3994,7 @@ Perl_yylex(pTHX)
 
     case 'v':
        if (isDIGIT(s[1]) && PL_expect != XOPERATOR) {
-           char *start = s;
-           start++;
-           start++;
+           char *start = s + 2;
            while (isDIGIT(*start) || *start == '_')
                start++;
            if (*start == '.' && isDIGIT(start[1])) {
@@ -3898,10 +4003,10 @@ Perl_yylex(pTHX)
            }
            /* avoid v123abc() or $h{v1}, allow C<print v10;> */
            else if (!isALPHA(*start) && (PL_expect == XTERM || PL_expect == XREF || PL_expect == XSTATE)) {
-               char c = *start;
+               const char c = *start;
                GV *gv;
                *start = '\0';
-               gv = gv_fetchpv(s, FALSE, SVt_PVCV);
+               gv = gv_fetchpv(s, 0, SVt_PVCV);
                *start = c;
                if (!gv) {
                    s = scan_num(s, &yylval);
@@ -3946,9 +4051,10 @@ Perl_yylex(pTHX)
     case 'z': case 'Z':
 
       keylookup: {
-       orig_keyword = 0;
-       gv = Nullgv;
-       gvp = 0;
+       I32 tmp;
+       I32 orig_keyword = 0;
+       GV *gv = NULL;
+       GV **gvp = NULL;
 
        PL_bufptr = s;
        s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
@@ -3982,19 +4088,19 @@ Perl_yylex(pTHX)
        /* Is this a word before a => operator? */
        if (*d == '=' && d[1] == '>') {
            CLINE;
-           yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(PL_tokenbuf,0));
+           yylval.opval
+               = (OP*)newSVOP(OP_CONST, 0,
+                              S_newSV_maybe_utf8(aTHX_ PL_tokenbuf, len));
            yylval.opval->op_private = OPpCONST_BARE;
-           if (UTF && !IN_BYTES && is_utf8_string((U8*)PL_tokenbuf, len))
-             SvUTF8_on(((SVOP*)yylval.opval)->op_sv);
            TERM(WORD);
        }
 
        if (tmp < 0) {                  /* second-class keyword? */
-           GV *ogv = Nullgv;   /* override (winner) */
-           GV *hgv = Nullgv;   /* hidden (loser) */
+           GV *ogv = NULL;     /* override (winner) */
+           GV *hgv = NULL;     /* hidden (loser) */
            if (PL_expect != XOPERATOR && (*s != ':' || s[1] != ':')) {
                CV *cv;
-               if ((gv = gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVCV)) &&
+               if ((gv = gv_fetchpv(PL_tokenbuf, 0, SVt_PVCV)) &&
                    (cv = GvCVu(gv)))
                {
                    if (GvIMPORTED_CV(gv))
@@ -4017,7 +4123,7 @@ Perl_yylex(pTHX)
            else if (gv && !gvp
                     && -tmp==KEY_lock  /* XXX generalizable kludge */
                     && GvCVu(gv)
-                    && !hv_fetch(GvHVn(PL_incgv), "Thread.pm", 9, FALSE))
+                    && !hv_fetchs(GvHVn(PL_incgv), "Thread.pm", FALSE))
            {
                tmp = 0;                /* any sub overrides "weak" keyword */
            }
@@ -4027,10 +4133,10 @@ Perl_yylex(pTHX)
                    Perl_warner(aTHX_ packWARN(WARN_MISC),
                            "dump() better written as CORE::dump()");
                }
-               gv = Nullgv;
+               gv = NULL;
                gvp = 0;
-               if (ckWARN(WARN_AMBIGUOUS) && hgv
-                   && tmp != KEY_x && tmp != KEY_CORE) /* never ambiguous */
+               if (hgv && tmp != KEY_x && tmp != KEY_CORE
+                       && ckWARN(WARN_AMBIGUOUS))      /* never ambiguous */
                    Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
                        "Ambiguous call resolved as CORE::%s(), %s",
                         GvENAME(hgv), "qualify as such or use &");
@@ -4041,10 +4147,21 @@ Perl_yylex(pTHX)
        switch (tmp) {
 
        default:                        /* not a keyword */
+           /* Trade off - by using this evil construction we can pull the
+              variable gv into the block labelled keylookup. If not, then
+              we have to give it function scope so that the goto from the
+              earlier ':' case doesn't bypass the initialisation.  */
+           if (0) {
+           just_a_word_zero_gv:
+               gv = NULL;
+               gvp = NULL;
+               orig_keyword = 0;
+           }
          just_a_word: {
                SV *sv;
                int pkgname = 0;
-               char lastchar = (PL_bufptr == PL_oldoldbufptr ? 0 : PL_bufptr[-1]);
+               const char lastchar = (PL_bufptr == PL_oldoldbufptr ? 0 : PL_bufptr[-1]);
+               CV *cv;
 
                /* Get the rest if it looks like a package qualifier */
 
@@ -4076,25 +4193,32 @@ Perl_yylex(pTHX)
                if (len > 2 &&
                    PL_tokenbuf[len - 2] == ':' && PL_tokenbuf[len - 1] == ':')
                {
-                   if (ckWARN(WARN_BAREWORD) && ! gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVHV))
+                   if (ckWARN(WARN_BAREWORD)
+                       && ! gv_fetchpv(PL_tokenbuf, 0, SVt_PVHV))
                        Perl_warner(aTHX_ packWARN(WARN_BAREWORD),
                            "Bareword \"%s\" refers to nonexistent package",
                             PL_tokenbuf);
                    len -= 2;
                    PL_tokenbuf[len] = '\0';
-                   gv = Nullgv;
+                   gv = NULL;
                    gvp = 0;
                }
                else {
+                   if (!gv) {
+                       /* Mustn't actually add anything to a symbol table.
+                          But also don't want to "initialise" any placeholder
+                          constants that might already be there into full
+                          blown PVGVs with attached PVCV.  */
+                       gv = gv_fetchpv(PL_tokenbuf, GV_NOADD_NOINIT,
+                                       SVt_PVCV);
+                   }
                    len = 0;
-                   if (!gv)
-                       gv = gv_fetchpv(PL_tokenbuf, FALSE, SVt_PVCV);
                }
 
                /* if we saw a global override before, get the right name */
 
                if (gvp) {
-                   sv = newSVpvn("CORE::GLOBAL::",14);
+                   sv = newSVpvs("CORE::GLOBAL::");
                    sv_catpv(sv,PL_tokenbuf);
                }
                else {
@@ -4111,7 +4235,7 @@ Perl_yylex(pTHX)
                yylval.opval->op_private = OPpCONST_BARE;
                /* UTF-8 package name? */
                if (UTF && !IN_BYTES &&
-                   is_utf8_string((U8*)SvPVX(sv), SvCUR(sv)))
+                   is_utf8_string((U8*)SvPVX_const(sv), SvCUR(sv)))
                    SvUTF8_on(sv);
 
                /* And if "Foo::", then that's what it certainly is. */
@@ -4119,6 +4243,20 @@ Perl_yylex(pTHX)
                if (len)
                    goto safe_bareword;
 
+               /* Do the explicit type check so that we don't need to force
+                  the initialisation of the symbol table to have a real GV.
+                  Beware - gv may not really be a PVGV, cv may not really be
+                  a PVCV, (because of the space optimisations that gv_init
+                  understands) But they're true if for this symbol there is
+                  respectively a typeglob and a subroutine.
+               */
+               cv = gv ? ((SvTYPE(gv) == SVt_PVGV)
+                   /* Real typeglob, so get the real subroutine: */
+                          ? GvCVu(gv)
+                   /* A proxy for a subroutine in this package? */
+                          : SvOK(gv) ? (CV *) gv : NULL)
+                   : NULL;
+
                /* See if it's the indirect object for a list operator. */
 
                if (PL_oldoldbufptr &&
@@ -4136,14 +4274,15 @@ Perl_yylex(pTHX)
 
                    /* Two barewords in a row may indicate method call. */
 
-                   if ((isIDFIRST_lazy_if(s,UTF) || *s == '$') && (tmp=intuit_method(s,gv)))
+                   if ((isIDFIRST_lazy_if(s,UTF) || *s == '$') &&
+                       (tmp = intuit_method(s, gv, cv)))
                        return REPORT(tmp);
 
                    /* If not a declared subroutine, it's an indirect object. */
                    /* (But it's an indir obj regardless for sort.) */
 
                    if ( !immediate_paren && (PL_last_lop_op == OP_SORT ||
-                         ((!gv || !GvCVu(gv)) &&
+                         ((!gv || !cv) &&
                         (PL_last_lop_op != OP_MAPSTART &&
                         PL_last_lop_op != OP_GREPSTART))))
                    {
@@ -4167,9 +4306,9 @@ Perl_yylex(pTHX)
                /* If followed by a paren, it's certainly a subroutine. */
                if (*s == '(') {
                    CLINE;
-                   if (gv && GvCVu(gv)) {
+                   if (cv) {
                        for (d = s + 1; SPACE_OR_TAB(*d); d++) ;
-                       if (*d == ')' && (sv = cv_const_sv(GvCV(gv)))) {
+                       if (*d == ')' && (sv = gv_const_sv(gv))) {
                            s = d + 1;
                            goto its_constant;
                        }
@@ -4183,7 +4322,7 @@ Perl_yylex(pTHX)
 
                /* If followed by var or block, call it a method (unless sub) */
 
-               if ((*s == '$' || *s == '{') && (!gv || !GvCVu(gv))) {
+               if ((*s == '$' || *s == '{') && (!gv || !cv)) {
                    PL_last_lop = PL_oldbufptr;
                    PL_last_lop_op = OP_METHOD;
                    PREBLOCK(METHOD);
@@ -4193,28 +4332,34 @@ Perl_yylex(pTHX)
 
                if (!orig_keyword
                        && (isIDFIRST_lazy_if(s,UTF) || *s == '$')
-                       && (tmp = intuit_method(s,gv)))
+                       && (tmp = intuit_method(s, gv, cv)))
                    return REPORT(tmp);
 
                /* Not a method, so call it a subroutine (if defined) */
 
-               if (gv && GvCVu(gv)) {
-                   CV* cv;
+               if (cv) {
                    if (lastchar == '-' && ckWARN_d(WARN_AMBIGUOUS))
                        Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
                                "Ambiguous use of -%s resolved as -&%s()",
                                PL_tokenbuf, PL_tokenbuf);
                    /* Check for a constant sub */
-                   cv = GvCV(gv);
-                   if ((sv = cv_const_sv(cv))) {
+                   if ((sv = gv_const_sv(gv))) {
                  its_constant:
                        SvREFCNT_dec(((SVOP*)yylval.opval)->op_sv);
-                       ((SVOP*)yylval.opval)->op_sv = SvREFCNT_inc(sv);
+                       ((SVOP*)yylval.opval)->op_sv = SvREFCNT_inc_simple(sv);
                        yylval.opval->op_private = 0;
                        TOKEN(WORD);
                    }
 
                    /* Resolve to GV now. */
+                   if (SvTYPE(gv) != SVt_PVGV) {
+                       gv = gv_fetchpv(PL_tokenbuf, 0, SVt_PVCV);
+                       assert (SvTYPE(gv) == SVt_PVGV);
+                       /* cv must have been some sort of placeholder, so
+                          now needs replacing with a real code reference.  */
+                       cv = GvCV(gv);
+                   }
+
                    op_free(yylval.opval);
                    yylval.opval = newCVREF(0, newGVOP(OP_GV, 0, gv));
                    yylval.opval->op_private |= OPpENTERSUB_NOPAREN;
@@ -4223,7 +4368,7 @@ Perl_yylex(pTHX)
                    /* Is there a prototype? */
                    if (SvPOK(cv)) {
                        STRLEN len;
-                       char *proto = SvPV((SV*)cv, len);
+                       const char *proto = SvPV_const((SV*)cv, len);
                        if (!len)
                            TERM(FUNC0SUB);
                        if (*proto == '$' && proto[1] == '\0')
@@ -4248,8 +4393,8 @@ Perl_yylex(pTHX)
                    yylval.opval->op_private |= OPpCONST_STRICT;
                else {
                bareword:
-                   if (ckWARN(WARN_RESERVED)) {
-                       if (lastchar != '-') {
+                   if (lastchar != '-') {
+                       if (ckWARN(WARN_RESERVED)) {
                            for (d = PL_tokenbuf; *d && isLOWER(*d); d++) ;
                            if (!*d && !gv_stashpv(PL_tokenbuf,FALSE))
                                Perl_warner(aTHX_ packWARN(WARN_RESERVED), PL_warn_reserved,
@@ -4284,27 +4429,26 @@ Perl_yylex(pTHX)
        case KEY___PACKAGE__:
            yylval.opval = (OP*)newSVOP(OP_CONST, 0,
                                        (PL_curstash
-                                        ? newSVpv(HvNAME(PL_curstash), 0)
+                                        ? newSVpv(HvNAME_get(PL_curstash), 0)
                                         : &PL_sv_undef));
            TERM(THING);
 
        case KEY___DATA__:
        case KEY___END__: {
            GV *gv;
-
-           /*SUPPRESS 560*/
            if (PL_rsfp && (!PL_in_eval || PL_tokenbuf[2] == 'D')) {
                const char *pname = "main";
                if (PL_tokenbuf[2] == 'D')
-                   pname = HvNAME(PL_curstash ? PL_curstash : PL_defstash);
-               gv = gv_fetchpv(Perl_form(aTHX_ "%s::DATA", pname), TRUE, SVt_PVIO);
+                   pname = HvNAME_get(PL_curstash ? PL_curstash : PL_defstash);
+               gv = gv_fetchpv(Perl_form(aTHX_ "%s::DATA", pname), GV_ADD,
+                               SVt_PVIO);
                GvMULTI_on(gv);
                if (!GvIO(gv))
                    GvIOp(gv) = newIO();
                IoIFP(GvIOp(gv)) = PL_rsfp;
 #if defined(HAS_FCNTL) && defined(F_SETFD)
                {
-                   int fd = PerlIO_fileno(PL_rsfp);
+                   const int fd = PerlIO_fileno(PL_rsfp);
                    fcntl(fd,F_SETFD,fd >= 3);
                }
 #endif
@@ -4369,7 +4513,7 @@ Perl_yylex(pTHX)
                    }
                }
 #endif
-               PL_rsfp = Nullfp;
+               PL_rsfp = NULL;
            }
            goto fake_eof;
        }
@@ -4395,6 +4539,9 @@ Perl_yylex(pTHX)
                    Perl_croak(aTHX_ "CORE::%s is not a keyword", PL_tokenbuf);
                if (tmp < 0)
                    tmp = -tmp;
+               else if (tmp == KEY_require || tmp == KEY_do)
+                   /* that's a way to remember we saw "CORE::" */
+                   orig_keyword = tmp;
                goto reserved_word;
            }
            goto just_a_word;
@@ -4430,7 +4577,8 @@ Perl_yylex(pTHX)
            PREBLOCK(CONTINUE);
 
        case KEY_chdir:
-           (void)gv_fetchpv("ENV",TRUE, SVt_PVHV);     /* may use HOME */
+           /* may use HOME */
+           (void)gv_fetchpvs("ENV", GV_ADD|GV_NOTQUAL, SVt_PVHV);
            UNI(OP_CHDIR);
 
        case KEY_close:
@@ -4478,6 +4626,12 @@ Perl_yylex(pTHX)
                PRETERMBLOCK(DO);
            if (*s != '\'')
                s = force_word(s,WORD,TRUE,TRUE,FALSE);
+           if (orig_keyword == KEY_do) {
+               orig_keyword = 0;
+               yylval.ival = 1;
+           }
+           else
+               yylval.ival = 0;
            OPERATOR(DO);
 
        case KEY_die:
@@ -4491,7 +4645,7 @@ Perl_yylex(pTHX)
            UNI(OP_DELETE);
 
        case KEY_dbmopen:
-           gv_fetchpv("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
+           gv_fetchpvs("AnyDBM_File::ISA", GV_ADDMULTI, SVt_PVAV);
            LOP(OP_DBMOPEN,XTERM);
 
        case KEY_dbmclose:
@@ -4789,7 +4943,11 @@ Perl_yylex(pTHX)
                if (!PL_in_my_stash) {
                    char tmpbuf[1024];
                    PL_bufptr = s;
+#ifdef USE_SNPRINTF
+                   snprintf(tmpbuf, sizeof(tmpbuf), "No such class %.1000s", PL_tokenbuf);
+#else
                    sprintf(tmpbuf, "No such class %.1000s", PL_tokenbuf);
+#endif /* #ifdef USE_SNPRINTF */
                    yyerror(tmpbuf);
                }
            }
@@ -4804,11 +4962,7 @@ Perl_yylex(pTHX)
            Eop(OP_SNE);
 
        case KEY_no:
-           if (PL_expect != XSTATE)
-               yyerror("\"no\" not allowed in expression");
-           s = force_word(s,WORD,FALSE,TRUE,FALSE);
-           s = force_version(s, FALSE);
-           yylval.ival = 0;
+           s = tokenize_use(0, s);
            OPERATOR(USE);
 
        case KEY_not:
@@ -4820,16 +4974,17 @@ Perl_yylex(pTHX)
        case KEY_open:
            s = skipspace(s);
            if (isIDFIRST_lazy_if(s,UTF)) {
-               char *t;
+               const char *t;
                for (d = s; isALNUM_lazy_if(d,UTF); d++) ;
                for (t=d; *t && isSPACE(*t); t++) ;
                if ( *t && strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE)
                    /* [perl #16184] */
                    && !(t[0] == '=' && t[1] == '>')
                ) {
+                   int len = (int)(d-s);
                    Perl_warner(aTHX_ packWARN(WARN_PRECEDENCE),
                           "Precedence problem: open %.*s should be open(%.*s)",
-                           d - s, s, d - s, s);
+                           len, s, len, s);
                }
            }
            LOP(OP_OPEN,XTERM);
@@ -4891,6 +5046,7 @@ Perl_yylex(pTHX)
            s = scan_str(s,FALSE,FALSE);
            if (!s)
                missingterm((char*)0);
+           PL_expect = XOPERATOR;
            force_next(')');
            if (SvCUR(PL_lex_stuff)) {
                OP *words = Nullop;
@@ -4900,7 +5056,7 @@ Perl_yylex(pTHX)
                    SV *sv;
                    for (; isSPACE(*d) && len; --len, ++d) ;
                    if (len) {
-                       char *b = d;
+                       const char *b = d;
                        if (!warned && ckWARN(WARN_QW)) {
                            for (; !isSPACE(*d) && len; --len, ++d) {
                                if (*d == ',') {
@@ -4932,7 +5088,7 @@ Perl_yylex(pTHX)
            }
            if (PL_lex_stuff) {
                SvREFCNT_dec(PL_lex_stuff);
-               PL_lex_stuff = Nullsv;
+               PL_lex_stuff = NULL;
            }
            PL_expect = XTERM;
            TOKEN('(');
@@ -4976,7 +5132,18 @@ Perl_yylex(pTHX)
                else if (*s == '<')
                    yyerror("<> should be quotes");
            }
-           UNI(OP_REQUIRE);
+           if (orig_keyword == KEY_require) {
+               orig_keyword = 0;
+               yylval.ival = 1;
+           }
+           else 
+               yylval.ival = 0;
+           PL_expect = XTERM;
+           PL_bufptr = s;
+           PL_last_uni = PL_oldbufptr;
+           PL_last_lop_op = OP_REQUIRE;
+           s = skipspace(s);
+           return REPORT( (int)REQUIRE );
 
        case KEY_reset:
            UNI(OP_RESET);
@@ -5158,7 +5325,7 @@ Perl_yylex(pTHX)
                SSize_t tboffset = 0;
                expectation attrful;
                bool have_name, have_proto, bad_proto;
-               int key = tmp;
+               const int key = tmp;
 
                s = skipspace(s);
 
@@ -5174,7 +5341,7 @@ Perl_yylex(pTHX)
                        sv_setpv(PL_subname, tmpbuf);
                    else {
                        sv_setsv(PL_subname,PL_curstname);
-                       sv_catpvn(PL_subname,"::",2);
+                       sv_catpvs(PL_subname,"::");
                        sv_catpvn(PL_subname,tmpbuf,len);
                    }
                    s = skipspace(d);
@@ -5241,7 +5408,7 @@ Perl_yylex(pTHX)
                if (have_proto) {
                    PL_nextval[PL_nexttoke].opval =
                        (OP*)newSVOP(OP_CONST, 0, PL_lex_stuff);
-                   PL_lex_stuff = Nullsv;
+                   PL_lex_stuff = NULL;
                    force_next(THING);
                }
                if (!have_name) {
@@ -5339,25 +5506,7 @@ Perl_yylex(pTHX)
            LOP(OP_UNSHIFT,XTERM);
 
        case KEY_use:
-           if (PL_expect != XSTATE)
-               yyerror("\"use\" not allowed in expression");
-           s = skipspace(s);
-           if (isDIGIT(*s) || (*s == 'v' && isDIGIT(s[1]))) {
-               s = force_version(s, TRUE);
-               if (*s == ';' || (s = skipspace(s), *s == ';')) {
-                   PL_nextval[PL_nexttoke].opval = Nullop;
-                   force_next(WORD);
-               }
-               else if (*s == 'v') {
-                   s = force_word(s,WORD,FALSE,TRUE,FALSE);
-                   s = force_version(s, FALSE);
-               }
-           }
-           else {
-               s = force_word(s,WORD,FALSE,TRUE,FALSE);
-               s = force_version(s, FALSE);
-           }
-           yylval.ival = 1;
+           s = tokenize_use(1, s);
            OPERATOR(USE);
 
        case KEY_values:
@@ -5389,10 +5538,11 @@ Perl_yylex(pTHX)
            char ctl_l[2];
            ctl_l[0] = toCTRL('L');
            ctl_l[1] = '\0';
-           gv_fetchpv(ctl_l,TRUE, SVt_PV);
+           gv_fetchpvn_flags(ctl_l, 1, GV_ADD|GV_NOTQUAL, SVt_PV);
        }
 #else
-           gv_fetchpv("\f",TRUE, SVt_PV);      /* Make sure $^L is defined */
+           /* Make sure $^L is defined */
+           gv_fetchpvs("\f", GV_ADD|GV_NOTQUAL, SVt_PV);
 #endif
            UNI(OP_ENTERWRITE);
 
@@ -5426,7 +5576,7 @@ S_pending_ident(pTHX)
     PL_pending_ident = 0;
 
     DEBUG_T({ PerlIO_printf(Perl_debug_log,
-          "### Tokener saw identifier '%s'\n", PL_tokenbuf); });
+          "### Pending identifier '%s'\n", PL_tokenbuf); });
 
     /* if we're in a my(), we can't allow dynamics here.
        $foo'bar has already been turned into $foo::bar, so
@@ -5482,12 +5632,13 @@ S_pending_ident(pTHX)
             /* might be an "our" variable" */
             if (PAD_COMPNAME_FLAGS(tmp) & SVpad_OUR) {
                 /* build ops for a bareword */
-                SV *sym = newSVpv(HvNAME(PAD_COMPNAME_OURSTASH(tmp)), 0);
-                sv_catpvn(sym, "::", 2);
+                SV * const sym
+                 = newSVpv(HvNAME_get(PAD_COMPNAME_OURSTASH(tmp)), 0);
+                sv_catpvs(sym, "::");
                 sv_catpv(sym, PL_tokenbuf+1);
                 yylval.opval = (OP*)newSVOP(OP_CONST, 0, sym);
                 yylval.opval->op_private = OPpCONST_ENTERED;
-                gv_fetchpv(SvPVX(sym),
+                gv_fetchsv(sym,
                     (PL_in_eval
                         ? (GV_ADDMULTI | GV_ADDINEVAL)
                         : GV_ADDMULTI
@@ -5527,7 +5678,7 @@ S_pending_ident(pTHX)
        table.
     */
     if (pit == '@' && PL_lex_state != LEX_NORMAL && !PL_lex_brackets) {
-        GV *gv = gv_fetchpv(PL_tokenbuf+1, FALSE, SVt_PVAV);
+        GV *gv = gv_fetchpv(PL_tokenbuf+1, 0, SVt_PVAV);
         if ((!gv || ((PL_tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)))
              && ckWARN(WARN_AMBIGUOUS))
         {
@@ -8843,9 +8994,9 @@ unknown:
 }
 
 STATIC void
-S_checkcomma(pTHX_ register char *s, char *name, const char *what)
+S_checkcomma(pTHX_ register char *s, const char *name, const char *what)
 {
-    char *w;
+    const char *w;
 
     if (*s == ' ' && s[1] == '(') {    /* XXX gotta be a better way */
        if (ckWARN(WARN_SYNTAX)) {
@@ -8877,8 +9028,8 @@ S_checkcomma(pTHX_ register char *s, char *name, const char *what)
            s++;
        if (*s == ',') {
            int kw;
-           *s = '\0';
-           kw = keyword(w, s - w) || get_cv(w, FALSE) != 0;
+           *s = '\0'; /* XXX If we didn't do this, we could const a lot of toke.c */
+           kw = keyword((char *)w, s - w) || get_cv(w, FALSE) != 0;
            *s = ',';
            if (kw)
                return;
@@ -8897,11 +9048,11 @@ S_new_constant(pTHX_ const char *s, STRLEN len, const char *key, SV *sv, SV *pv,
               const char *type)
 {
     dSP;
-    HV *table = GvHV(PL_hintgv);                /* ^H */
+    HV * const table = GvHV(PL_hintgv);                 /* ^H */
     SV *res;
     SV **cvp;
     SV *cv, *typesv;
-    const char *why1, *why2, *why3;
+    const char *why1 = "", *why2 = "", *why3 = "";
 
     if (!table || !(PL_hints & HINT_LOCALIZE_HH)) {
        SV *msg;
@@ -8923,7 +9074,7 @@ S_new_constant(pTHX_ const char *s, STRLEN len, const char *key, SV *sv, SV *pv,
        msg = Perl_newSVpvf(aTHX_ "Constant(%s): %s%s%s",
                            (type ? type: "undef"), why1, why2, why3);
     msgdone:
-       yyerror(SvPVX(msg));
+       yyerror((char *)SvPVX_const(msg));
        SvREFCNT_dec(msg);
        return sv;
     }
@@ -8961,15 +9112,14 @@ S_new_constant(pTHX_ const char *s, STRLEN len, const char *key, SV *sv, SV *pv,
 
     /* Check the eval first */
     if (!PL_in_eval && SvTRUE(ERRSV)) {
-       STRLEN n_a;
-       sv_catpv(ERRSV, "Propagated");
-       yyerror(SvPV(ERRSV, n_a)); /* Duplicates the message inside eval */
+       sv_catpvs(ERRSV, "Propagated");
+       yyerror((char *)SvPV_nolen_const(ERRSV)); /* Duplicates the message inside eval */
        (void)POPs;
-       res = SvREFCNT_inc(sv);
+       res = SvREFCNT_inc_simple(sv);
     }
     else {
        res = POPs;
-       (void)SvREFCNT_inc(res);
+       SvREFCNT_inc_simple_void(res);
     }
 
     PUTBACK ;
@@ -8988,11 +9138,14 @@ S_new_constant(pTHX_ const char *s, STRLEN len, const char *key, SV *sv, SV *pv,
     return res;
 }
 
+/* Returns a NUL terminated string, with the length of the string written to
+   *slp
+   */
 STATIC char *
 S_scan_word(pTHX_ register char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
 {
     register char *d = dest;
-    register char *e = d + destlen - 3;  /* two-character token, ending NUL */
+    register char * const e = d + destlen - 3;  /* two-character token, ending NUL */
     for (;;) {
        if (d >= e)
            Perl_croak(aTHX_ ident_too_long);
@@ -9026,17 +9179,15 @@ S_scan_word(pTHX_ register char *s, char *dest, STRLEN destlen, int allow_packag
 }
 
 STATIC char *
-S_scan_ident(pTHX_ register char *s, register char *send, char *dest, STRLEN destlen, I32 ck_uni)
+S_scan_ident(pTHX_ register char *s, register const char *send, char *dest, STRLEN destlen, I32 ck_uni)
 {
-    register char *d;
-    register char *e;
-    char *bracket = 0;
+    char *bracket = NULL;
     char funny = *s++;
+    register char *d = dest;
+    register char * const e = d + destlen + 3;    /* two-character token, ending NUL */
 
     if (isSPACE(*s))
        s = skipspace(s);
-    d = dest;
-    e = d + destlen - 3;       /* two-character token, ending NUL */
     if (isDIGIT(*s)) {
        while (isDIGIT(*s)) {
            if (d >= e)
@@ -9101,7 +9252,7 @@ S_scan_ident(pTHX_ register char *s, register char *send, char *dest, STRLEN des
     if (bracket) {
        if (isSPACE(s[-1])) {
            while (s < send) {
-               char ch = *s++;
+               const char ch = *s++;
                if (!SPACE_OR_TAB(ch)) {
                    *d = ch;
                    break;
@@ -9111,15 +9262,15 @@ S_scan_ident(pTHX_ register char *s, register char *send, char *dest, STRLEN des
        if (isIDFIRST_lazy_if(d,UTF)) {
            d++;
            if (UTF) {
-               e = s;
-               while ((e < send && isALNUM_lazy_if(e,UTF)) || *e == ':') {
-                   e += UTF8SKIP(e);
-                   while (e < send && UTF8_IS_CONTINUED(*e) && is_utf8_mark((U8*)e))
-                       e += UTF8SKIP(e);
+               char *end = s;
+               while ((end < send && isALNUM_lazy_if(end,UTF)) || *end == ':') {
+                   end += UTF8SKIP(end);
+                   while (end < send && UTF8_IS_CONTINUED(*end) && is_utf8_mark((U8*)end))
+                       end += UTF8SKIP(end);
                }
-               Copy(s, d, e - s, char);
-               d += e - s;
-               s = e;
+               Copy(s, d, end - s, char);
+               d += end - s;
+               s = end;
            }
            else {
                while ((isALNUM(*s) || *s == ':') && d < e)
@@ -9205,28 +9356,26 @@ STATIC char *
 S_scan_pat(pTHX_ char *start, I32 type)
 {
     PMOP *pm;
-    char *s;
+    char *s = scan_str(start,FALSE,FALSE);
+    const char * const valid_flags = (type == OP_QR) ? "iomsx" : "iogcmsx";
 
-    s = scan_str(start,FALSE,FALSE);
-    if (!s)
-       Perl_croak(aTHX_ "Search pattern not terminated");
+    if (!s) {
+       const char * const delimiter = skipspace(start);
+       Perl_croak(aTHX_ *delimiter == '?'
+                  ? "Search pattern not terminated or ternary operator parsed as search pattern"
+                  : "Search pattern not terminated" );
+    }
 
     pm = (PMOP*)newPMOP(type, 0);
     if (PL_multi_open == '?')
        pm->op_pmflags |= PMf_ONCE;
-    if(type == OP_QR) {
-       while (*s && strchr("iomsx", *s))
-           pmflag(&pm->op_pmflags,*s++);
-    }
-    else {
-       while (*s && strchr("iogcmsx", *s))
-           pmflag(&pm->op_pmflags,*s++);
-    }
+    while (*s && strchr(valid_flags, *s))
+       pmflag(&pm->op_pmflags,*s++);
     /* issue a warning if /c is specified,but /g is not */
-    if (ckWARN(WARN_REGEXP) &&
-        (pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL))
+    if ((pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL)
+           && ckWARN(WARN_REGEXP))
     {
-        Perl_warner(aTHX_ packWARN(WARN_REGEXP), c_without_g);
+        Perl_warner(aTHX_ packWARN(WARN_REGEXP), "Use of /c modifier is meaningless without /g" );
     }
 
     pm->op_pmpermflags = pm->op_pmflags;
@@ -9259,7 +9408,7 @@ S_scan_subst(pTHX_ char *start)
     if (!s) {
        if (PL_lex_stuff) {
            SvREFCNT_dec(PL_lex_stuff);
-           PL_lex_stuff = Nullsv;
+           PL_lex_stuff = NULL;
        }
        Perl_croak(aTHX_ "Substitution replacement not terminated");
     }
@@ -9277,24 +9426,22 @@ S_scan_subst(pTHX_ char *start)
            break;
     }
 
-    /* /c is not meaningful with s/// */
-    if (ckWARN(WARN_REGEXP) && (pm->op_pmflags & PMf_CONTINUE))
-    {
-        Perl_warner(aTHX_ packWARN(WARN_REGEXP), c_in_subst);
+    if ((pm->op_pmflags & PMf_CONTINUE) && ckWARN(WARN_REGEXP)) {
+        Perl_warner(aTHX_ packWARN(WARN_REGEXP), "Use of /c modifier is meaningless in s///" );
     }
 
     if (es) {
-       SV *repl;
+       SV * const repl = newSVpvs("");
+
        PL_sublex_info.super_bufptr = s;
        PL_sublex_info.super_bufend = PL_bufend;
        PL_multi_end = 0;
        pm->op_pmflags |= PMf_EVAL;
-       repl = newSVpvn("",0);
        while (es-- > 0)
            sv_catpv(repl, es ? "eval " : "do ");
-       sv_catpvn(repl, "{ ", 2);
+       sv_catpvs(repl, "{ ");
        sv_catsv(repl, PL_lex_repl);
-       sv_catpvn(repl, " };", 2);
+       sv_catpvs(repl, " }");
        SvEVALED_on(repl);
        SvREFCNT_dec(PL_lex_repl);
        PL_lex_repl = repl;
@@ -9328,7 +9475,7 @@ S_scan_trans(pTHX_ char *start)
     if (!s) {
        if (PL_lex_stuff) {
            SvREFCNT_dec(PL_lex_stuff);
-           PL_lex_stuff = Nullsv;
+           PL_lex_stuff = NULL;
        }
        Perl_croak(aTHX_ "Transliteration replacement not terminated");
     }
@@ -9352,7 +9499,7 @@ S_scan_trans(pTHX_ char *start)
     }
   no_more:
 
-    New(803, tbl, complement&&!del?258:256, short);
+    Newx(tbl, complement&&!del?258:256, short);
     o = newPVOP(OP_TRANS, 0, (char*)tbl);
     o->op_private = del|squash|complement|
       (DO_UTF8(PL_lex_stuff)? OPpTRANS_FROM_UTF : 0)|
@@ -9371,12 +9518,11 @@ S_scan_heredoc(pTHX_ register char *s)
     I32 len;
     SV *tmpstr;
     char term;
-    const char newline[] = "\n";
     const char *found_newline;
     register char *d;
     register char *e;
     char *peek;
-    int outer = (PL_rsfp && !(PL_lex_inwhat == OP_SCALAR));
+    const int outer = (PL_rsfp && !(PL_lex_inwhat == OP_SCALAR));
 
     s += 2;
     d = PL_tokenbuf;
@@ -9412,7 +9558,7 @@ S_scan_heredoc(pTHX_ register char *s)
 #ifndef PERL_STRICT_CR
     d = strchr(s, '\r');
     if (d) {
-       char *olds = s;
+       char * const olds = s;
        s = d;
        while (s < PL_bufend) {
            if (*s == '\r') {
@@ -9429,11 +9575,11 @@ S_scan_heredoc(pTHX_ register char *s)
        }
        *d = '\0';
        PL_bufend = d;
-       SvCUR_set(PL_linestr, PL_bufend - SvPVX(PL_linestr));
+       SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
        s = olds;
     }
 #endif
-    if ( outer || !(found_newline = ninstr(s,PL_bufend,newline,newline+1)) ) {
+    if ( outer || !(found_newline = memchr(s, '\n', PL_bufend - s)) ) {
         herewas = newSVpvn(s,PL_bufend-s);
     }
     else {
@@ -9442,7 +9588,7 @@ S_scan_heredoc(pTHX_ register char *s)
     }
     s += SvCUR(herewas);
 
-    tmpstr = NEWSV(87,79);
+    tmpstr = newSV(79);
     sv_upgrade(tmpstr, SVt_PVIV);
     if (term == '\'') {
        op_type = OP_CONST;
@@ -9458,9 +9604,9 @@ S_scan_heredoc(pTHX_ register char *s)
     PL_multi_open = PL_multi_close = '<';
     term = *PL_tokenbuf;
     if (PL_lex_inwhat == OP_SUBST && PL_in_eval && !PL_rsfp) {
-       char *bufptr = PL_sublex_info.super_bufptr;
-       char *bufend = PL_sublex_info.super_bufend;
-       char *olds = s - SvCUR(herewas);
+       char * const bufptr = PL_sublex_info.super_bufptr;
+       char * const bufend = PL_sublex_info.super_bufend;
+       char * const olds = s - SvCUR(herewas);
        s = strchr(bufptr, '\n');
        if (!s)
            s = bufend;
@@ -9478,7 +9624,7 @@ S_scan_heredoc(pTHX_ register char *s)
        sv_setpvn(tmpstr,d+1,s-d);
        s += len - 1;
        sv_catpvn(herewas,s,bufend-s);
-       Copy(SvPVX(herewas),bufptr,SvCUR(herewas) + 1,char);
+       Copy(SvPVX_const(herewas),bufptr,SvCUR(herewas) + 1,char);
 
        s = olds;
        goto retval;
@@ -9502,7 +9648,7 @@ S_scan_heredoc(pTHX_ register char *s)
        sv_setsv(PL_linestr,herewas);
        PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = s = PL_linestart = SvPVX(PL_linestr);
        PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
-       PL_last_lop = PL_last_uni = Nullch;
+       PL_last_lop = PL_last_uni = NULL;
     }
     else
        sv_setpvn(tmpstr,"",0);   /* avoid "uninitialized" warning */
@@ -9514,7 +9660,7 @@ S_scan_heredoc(pTHX_ register char *s)
        }
        CopLINE_inc(PL_curcop);
        PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
-       PL_last_lop = PL_last_uni = Nullch;
+       PL_last_lop = PL_last_uni = NULL;
 #ifndef PERL_STRICT_CR
        if (PL_bufend - PL_linestart >= 2) {
            if ((PL_bufend[-2] == '\r' && PL_bufend[-1] == '\n') ||
@@ -9522,7 +9668,7 @@ S_scan_heredoc(pTHX_ register char *s)
            {
                PL_bufend[-2] = '\n';
                PL_bufend--;
-               SvCUR_set(PL_linestr, PL_bufend - SvPVX(PL_linestr));
+               SvCUR_set(PL_linestr, PL_bufend - SvPVX_const(PL_linestr));
            }
            else if (PL_bufend[-1] == '\r')
                PL_bufend[-1] = '\n';
@@ -9531,16 +9677,16 @@ S_scan_heredoc(pTHX_ register char *s)
            PL_bufend[-1] = '\n';
 #endif
        if (PERLDB_LINE && PL_curstash != PL_debstash) {
-           SV *sv = NEWSV(88,0);
+           SV * const sv = newSV(0);
 
            sv_upgrade(sv, SVt_PVMG);
            sv_setsv(sv,PL_linestr);
             (void)SvIOK_on(sv);
             SvIV_set(sv, 0);
-           av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop),sv);
+           av_store(CopFILEAVx(PL_curcop), (I32)CopLINE(PL_curcop),sv);
        }
        if (*s == term && memEQ(s,PL_tokenbuf,len)) {
-           STRLEN off = PL_bufend - 1 - SvPVX(PL_linestr);
+           STRLEN off = PL_bufend - 1 - SvPVX_const(PL_linestr);
            *(SvPVX(PL_linestr) + off ) = ' ';
            sv_catsv(PL_linestr,herewas);
            PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
@@ -9555,12 +9701,11 @@ S_scan_heredoc(pTHX_ register char *s)
 retval:
     PL_multi_end = CopLINE(PL_curcop);
     if (SvCUR(tmpstr) + 5 < SvLEN(tmpstr)) {
-       SvLEN_set(tmpstr, SvCUR(tmpstr) + 1);
-       Renew(SvPVX(tmpstr), SvLEN(tmpstr), char);
+       SvPV_shrink_to_cur(tmpstr);
     }
     SvREFCNT_dec(herewas);
     if (!IN_BYTES) {
-       if (UTF && is_utf8_string((U8*)SvPVX(tmpstr), SvCUR(tmpstr)))
+       if (UTF && is_utf8_string((U8*)SvPVX_const(tmpstr), SvCUR(tmpstr)))
            SvUTF8_on(tmpstr);
        else if (PL_encoding)
            sv_recode_to_utf8(tmpstr, PL_encoding);
@@ -9590,17 +9735,16 @@ STATIC char *
 S_scan_inputsymbol(pTHX_ char *start)
 {
     register char *s = start;          /* current position in buffer */
-    register char *d;
-    register char *e;
     char *end;
     I32 len;
 
-    d = PL_tokenbuf;                   /* start of temp holding space */
-    e = PL_tokenbuf + sizeof PL_tokenbuf;      /* end of temp holding space */
+    char *d = PL_tokenbuf;                                     /* start of temp holding space */
+    const char * const e = PL_tokenbuf + sizeof PL_tokenbuf;   /* end of temp holding space */
+
     end = strchr(s, '\n');
     if (!end)
        end = PL_bufend;
-    s = delimcpy(d, e, s + 1, end, '>', &len); /* extract until > */
+    s = delimcpy(d, (char *)e, s + 1, end, '>', &len); /* extract until > */
 
     /* die if we didn't have space for the contents of the <>,
        or if it didn't end, or if we see a newline
@@ -9642,7 +9786,7 @@ S_scan_inputsymbol(pTHX_ char *start)
     }
     else {
        bool readline_overriden = FALSE;
-       GV *gv_readline = Nullgv;
+       GV *gv_readline;
        GV **gvp;
        /* we're in a filehandle read situation */
        d = PL_tokenbuf;
@@ -9652,10 +9796,11 @@ S_scan_inputsymbol(pTHX_ char *start)
            Copy("ARGV",d,5,char);
 
        /* Check whether readline() is overriden */
-       if (((gv_readline = gv_fetchpv("readline", FALSE, SVt_PVCV))
+       gv_readline = gv_fetchpvs("readline", GV_NOTQUAL, SVt_PVCV);
+       if ((gv_readline
                && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline))
                ||
-               ((gvp = (GV**)hv_fetch(PL_globalstash, "readline", 8, FALSE))
+               ((gvp = (GV**)hv_fetchs(PL_globalstash, "readline", FALSE))
                && (gv_readline = *gvp) != (GV*)&PL_sv_undef
                && GvCVu(gv_readline) && GvIMPORTED_CV(gv_readline)))
            readline_overriden = TRUE;
@@ -9671,15 +9816,15 @@ S_scan_inputsymbol(pTHX_ char *start)
            */
            if ((tmp = pad_findmy(d)) != NOT_IN_PAD) {
                if (PAD_COMPNAME_FLAGS(tmp) & SVpad_OUR) {
-                   SV *sym = sv_2mortal(
-                           newSVpv(HvNAME(PAD_COMPNAME_OURSTASH(tmp)),0));
-                   sv_catpvn(sym, "::", 2);
+                   SV * const sym = sv_2mortal(
+                           newSVpv(HvNAME_get(PAD_COMPNAME_OURSTASH(tmp)),0));
+                   sv_catpvs(sym, "::");
                    sv_catpv(sym, d+1);
                    d = SvPVX(sym);
                    goto intro_sym;
                }
                else {
-                   OP *o = newOP(OP_PADSV, 0);
+                   OP * const o = newOP(OP_PADSV, 0);
                    o->op_targ = tmp;
                    PL_lex_op = readline_overriden
                        ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
@@ -9715,7 +9860,7 @@ intro_sym:
        /* If it's none of the above, it must be a literal filehandle
           (<Foo::BAR> or <FOO>) so build a simple readline OP */
        else {
-           GV *gv = gv_fetchpv(d,TRUE, SVt_PVIO);
+           GV * const gv = gv_fetchpv(d, GV_ADD, SVt_PVIO);
            PL_lex_op = readline_overriden
                ? (OP*)newUNOP(OP_ENTERSUB, OPf_STACKED,
                        append_elem(OP_LIST,
@@ -9818,9 +9963,9 @@ S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
 
     PL_multi_close = term;
 
-    /* create a new SV to hold the contents.  87 is leak category, I'm
-       assuming.  79 is the SV's initial length.  What a random number. */
-    sv = NEWSV(87,79);
+    /* create a new SV to hold the contents.  79 is the SV's initial length.
+       What a random number. */
+    sv = newSV(79);
     sv_upgrade(sv, SVt_PVIV);
     SvIV_set(sv, termcode);
     (void)SvPOK_only(sv);              /* validate pointer */
@@ -9834,11 +9979,11 @@ S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
            bool cont = TRUE;
 
            while (cont) {
-               int offset = s - SvPVX(PL_linestr);
-               bool found = sv_cat_decode(sv, PL_encoding, PL_linestr,
+               int offset = s - SvPVX_const(PL_linestr);
+               const bool found = sv_cat_decode(sv, PL_encoding, PL_linestr,
                                           &offset, (char*)termstr, termlen);
-               char *ns = SvPVX(PL_linestr) + offset;
-               char *svlast = SvEND(sv) - 1;
+               const char * const ns = SvPVX_const(PL_linestr) + offset;
+               char * const svlast = SvEND(sv) - 1;
 
                for (; s < ns; s++) {
                    if (*s == '\n' && !PL_rsfp)
@@ -9849,8 +9994,8 @@ S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
                else {
                    /* handle quoted delimiters */
                    if (SvCUR(sv) > 1 && *(svlast-1) == '\\') {
-                       char *t;
-                       for (t = svlast-2; t >= SvPVX(sv) && *t == '\\';)
+                       const char *t;
+                       for (t = svlast-2; t >= SvPVX_const(sv) && *t == '\\';)
                            t--;
                        if ((svlast-1 - t) % 2) {
                            if (!keep_quoted) {
@@ -9865,10 +10010,11 @@ S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
                        cont = FALSE;
                    }
                    else {
-                       char *t, *w;
+                       const char *t;
+                       char *w;
                        if (!last)
                            last = SvPVX(sv);
-                       for (w = t = last; t < svlast; w++, t++) {
+                       for (t = w = last; t < svlast; w++, t++) {
                            /* At here, all closes are "was quoted" one,
                               so we don't check PL_multi_close. */
                            if (*t == '\\') {
@@ -9885,7 +10031,7 @@ S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
                        if (w < t) {
                            *w++ = term;
                            *w = '\0';
-                           SvCUR_set(sv, w - SvPVX(sv));
+                           SvCUR_set(sv, w - SvPVX_const(sv));
                        }
                        last = w;
                        if (--brackets <= 0)
@@ -9963,7 +10109,7 @@ S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
        }
        /* terminate the copied string and update the sv's end-of-string */
        *to = '\0';
-       SvCUR_set(sv, to - SvPVX(sv));
+       SvCUR_set(sv, to - SvPVX_const(sv));
 
        /*
         * this next chunk reads more into the buffer if we're not done yet
@@ -9973,18 +10119,18 @@ S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
            break;              /* handle case where we are done yet :-) */
 
 #ifndef PERL_STRICT_CR
-       if (to - SvPVX(sv) >= 2) {
+       if (to - SvPVX_const(sv) >= 2) {
            if ((to[-2] == '\r' && to[-1] == '\n') ||
                (to[-2] == '\n' && to[-1] == '\r'))
            {
                to[-2] = '\n';
                to--;
-               SvCUR_set(sv, to - SvPVX(sv));
+               SvCUR_set(sv, to - SvPVX_const(sv));
            }
            else if (to[-1] == '\r')
                to[-1] = '\n';
        }
-       else if (to - SvPVX(sv) == 1 && to[-1] == '\r')
+       else if (to - SvPVX_const(sv) == 1 && to[-1] == '\r')
            to[-1] = '\n';
 #endif
        
@@ -9996,25 +10142,25 @@ S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
         !(PL_oldoldbufptr = PL_oldbufptr = s = PL_linestart = filter_gets(PL_linestr, PL_rsfp, 0))) {
            sv_free(sv);
            CopLINE_set(PL_curcop, (line_t)PL_multi_start);
-           return Nullch;
+           return NULL;
        }
        /* we read a line, so increment our line counter */
        CopLINE_inc(PL_curcop);
 
        /* update debugger info */
        if (PERLDB_LINE && PL_curstash != PL_debstash) {
-           SV *sv = NEWSV(88,0);
+           SV * const sv = newSV(0);
 
            sv_upgrade(sv, SVt_PVMG);
            sv_setsv(sv,PL_linestr);
             (void)SvIOK_on(sv);
             SvIV_set(sv, 0);
-           av_store(CopFILEAV(PL_curcop), (I32)CopLINE(PL_curcop), sv);
+           av_store(CopFILEAVx(PL_curcop), (I32)CopLINE(PL_curcop), sv);
        }
 
        /* having changed the buffer, we must update PL_bufend */
        PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
-       PL_last_lop = PL_last_uni = Nullch;
+       PL_last_lop = PL_last_uni = NULL;
     }
 
     /* at this point, we have successfully read the delimited string */
@@ -10032,7 +10178,7 @@ S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
     /* if we allocated too much space, give some back */
     if (SvCUR(sv) + 5 < SvLEN(sv)) {
        SvLEN_set(sv, SvCUR(sv) + 1);
-       Renew(SvPVX(sv), SvLEN(sv), char);
+       SvPV_renew(sv, SvLEN(sv));
     }
 
     /* decide whether this is the first or second quoted string we've read
@@ -10075,9 +10221,9 @@ Perl_scan_num(pTHX_ char *start, YYSTYPE* lvalp)
     register char *d;                  /* destination in temp buffer */
     register char *e;                  /* end of temp buffer */
     NV nv;                             /* number read, as a double */
-    SV *sv = Nullsv;                   /* place to put the converted number */
+    SV *sv = NULL;                     /* place to put the converted number */
     bool floatit;                      /* boolean: int or float? */
-    const char *lastub = 0;            /* position of last underbar */
+    const char *lastub = NULL;         /* position of last underbar */
     static char const number_too_long[] = "Number too long";
 
     /* We use the first character to decide what type of number this is */
@@ -10105,16 +10251,17 @@ Perl_scan_num(pTHX_ char *start, YYSTYPE* lvalp)
            I32 shift;
            bool overflowed = FALSE;
            bool just_zero  = TRUE;     /* just plain 0 or binary number? */
-           static NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
-           static char const* bases[5] = { "", "binary", "", "octal",
-                                     "hexadecimal" };
-           static char const* Bases[5] = { "", "Binary", "", "Octal",
-                                     "Hexadecimal" };
-           static char const *maxima[5] = { "",
-                                      "0b11111111111111111111111111111111",
-                                      "",
-                                      "037777777777",
-                                      "0xffffffff" };
+           static const NV nvshift[5] = { 1.0, 2.0, 4.0, 8.0, 16.0 };
+           static const char* const bases[5] =
+             { "", "binary", "", "octal", "hexadecimal" };
+           static const char* const Bases[5] =
+             { "", "Binary", "", "Octal", "Hexadecimal" };
+           static const char* const maxima[5] =
+             { "",
+               "0b11111111111111111111111111111111",
+               "",
+               "037777777777",
+               "0xffffffff" };
            const char *base, *Base, *max;
 
            /* check for hex */
@@ -10161,7 +10308,7 @@ Perl_scan_num(pTHX_ char *start, YYSTYPE* lvalp)
 
                /* _ are ignored -- but warned about if consecutive */
                case '_':
-                   if (ckWARN(WARN_SYNTAX) && lastub && s == lastub + 1)
+                   if (lastub && s == lastub + 1 && ckWARN(WARN_SYNTAX))
                        Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
                                    "Misplaced _ in number");
                    lastub = s++;
@@ -10239,9 +10386,9 @@ Perl_scan_num(pTHX_ char *start, YYSTYPE* lvalp)
                    Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Misplaced _ in number");
            }
 
-           sv = NEWSV(92,0);
+           sv = newSV(0);
            if (overflowed) {
-               if (ckWARN(WARN_PORTABLE) && n > 4294967295.0)
+               if (n > 4294967295.0 && ckWARN(WARN_PORTABLE))
                    Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
                                "%s number > %s non-portable",
                                Base, max);
@@ -10249,7 +10396,7 @@ Perl_scan_num(pTHX_ char *start, YYSTYPE* lvalp)
            }
            else {
 #if UVSIZE > 4
-               if (ckWARN(WARN_PORTABLE) && u > 0xffffffff)
+               if (u > 0xffffffff && ckWARN(WARN_PORTABLE))
                    Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
                                "%s number > %s non-portable",
                                Base, max);
@@ -10258,9 +10405,9 @@ Perl_scan_num(pTHX_ char *start, YYSTYPE* lvalp)
            }
            if (just_zero && (PL_hints & HINT_NEW_INTEGER))
                sv = new_constant(start, s - start, "integer",
-                                 sv, Nullsv, NULL);
+                                 sv, NULL, NULL);
            else if (PL_hints & HINT_NEW_BINARY)
-               sv = new_constant(start, s - start, "binary", sv, Nullsv, NULL);
+               sv = new_constant(start, s - start, "binary", sv, NULL, NULL);
        }
        break;
 
@@ -10281,7 +10428,7 @@ Perl_scan_num(pTHX_ char *start, YYSTYPE* lvalp)
               if -w is on
            */
            if (*s == '_') {
-               if (ckWARN(WARN_SYNTAX) && lastub && s == lastub + 1)
+               if (lastub && s == lastub + 1 && ckWARN(WARN_SYNTAX))
                    Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
                                "Misplaced _ in number");
                lastub = s++;
@@ -10323,7 +10470,7 @@ Perl_scan_num(pTHX_ char *start, YYSTYPE* lvalp)
                if (d >= e)
                    Perl_croak(aTHX_ number_too_long);
                if (*s == '_') {
-                  if (ckWARN(WARN_SYNTAX) && lastub && s == lastub + 1)
+                  if (lastub && s == lastub + 1 && ckWARN(WARN_SYNTAX))
                       Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
                                   "Misplaced _ in number");
                   lastub = s;
@@ -10380,9 +10527,9 @@ Perl_scan_num(pTHX_ char *start, YYSTYPE* lvalp)
                    *d++ = *s++;
                }
                else {
-                  if (ckWARN(WARN_SYNTAX) &&
-                      ((lastub && s == lastub + 1) ||
-                       (!isDIGIT(s[1]) && s[1] != '_')))
+                  if (((lastub && s == lastub + 1) ||
+                       (!isDIGIT(s[1]) && s[1] != '_'))
+                   && ckWARN(WARN_SYNTAX))
                       Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
                                   "Misplaced _ in number");
                   lastub = s++;
@@ -10392,7 +10539,7 @@ Perl_scan_num(pTHX_ char *start, YYSTYPE* lvalp)
 
 
        /* make an sv from the string */
-       sv = NEWSV(92,0);
+       sv = newSV(0);
 
        /*
            We try to do an integer conversion first if no characters
@@ -10401,7 +10548,7 @@ Perl_scan_num(pTHX_ char *start, YYSTYPE* lvalp)
 
        if (!floatit) {
            UV uv;
-            int flags = grok_number (PL_tokenbuf, d - PL_tokenbuf, &uv);
+           const int flags = grok_number (PL_tokenbuf, d - PL_tokenbuf, &uv);
 
             if (flags == IS_NUMBER_IN_UV) {
               if (uv <= IV_MAX)
@@ -10427,14 +10574,14 @@ Perl_scan_num(pTHX_ char *start, YYSTYPE* lvalp)
                       (PL_hints & HINT_NEW_INTEGER) )
            sv = new_constant(PL_tokenbuf, d - PL_tokenbuf,
                              (floatit ? "float" : "integer"),
-                             sv, Nullsv, NULL);
+                             sv, NULL, NULL);
        break;
 
     /* if it starts with a v, it could be a v-string */
     case 'v':
 vstring:
-               sv = NEWSV(92,5); /* preallocate storage space */
-               s = scan_vstring(s,sv);
+               sv = newSV(5); /* preallocate storage space */
+               s = scan_vstring((char *)s,sv);
                DEBUG_T( { PerlIO_printf(Perl_debug_log,
                  "### Saw v-string before '%s'\n", s);
                } ); 
@@ -10456,13 +10603,12 @@ S_scan_formline(pTHX_ register char *s)
 {
     register char *eol;
     register char *t;
-    SV *stuff = newSVpvn("",0);
+    SV * const stuff = newSVpvs("");
     bool needargs = FALSE;
     bool eofmt = FALSE;
 
     while (!needargs) {
        if (*s == '.') {
-           /*SUPPRESS 530*/
 #ifdef PERL_STRICT_CR
            for (t = s+1;SPACE_OR_TAB(*t); t++) ;
 #else
@@ -10503,12 +10649,12 @@ S_scan_formline(pTHX_ register char *s)
            else
              break;
        }
-       s = eol;
+       s = (char*)eol;
        if (PL_rsfp) {
            s = filter_gets(PL_linestr, PL_rsfp, 0);
            PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = SvPVX(PL_linestr);
            PL_bufend = PL_bufptr + SvCUR(PL_linestr);
-           PL_last_lop = PL_last_uni = Nullch;
+           PL_last_lop = PL_last_uni = NULL;
            if (!s) {
                s = PL_bufptr;
                break;
@@ -10527,7 +10673,7 @@ S_scan_formline(pTHX_ register char *s)
        else
            PL_lex_state = LEX_FORMLINE;
        if (!IN_BYTES) {
-           if (UTF && is_utf8_string((U8*)SvPVX(stuff), SvCUR(stuff)))
+           if (UTF && is_utf8_string((U8*)SvPVX_const(stuff), SvCUR(stuff)))
                SvUTF8_on(stuff);
            else if (PL_encoding)
                sv_recode_to_utf8(stuff, PL_encoding);
@@ -10558,8 +10704,8 @@ S_set_csh(pTHX)
 I32
 Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
 {
-    I32 oldsavestack_ix = PL_savestack_ix;
-    CV* outsidecv = PL_compcv;
+    const I32 oldsavestack_ix = PL_savestack_ix;
+    CV* const outsidecv = PL_compcv;
 
     if (PL_compcv) {
        assert(SvTYPE(PL_compcv) == SVt_PVCV);
@@ -10568,13 +10714,13 @@ Perl_start_subparse(pTHX_ I32 is_format, U32 flags)
     save_item(PL_subname);
     SAVESPTR(PL_compcv);
 
-    PL_compcv = (CV*)NEWSV(1104,0);
+    PL_compcv = (CV*)newSV(0);
     sv_upgrade((SV *)PL_compcv, is_format ? SVt_PVFM : SVt_PVCV);
     CvFLAGS(PL_compcv) |= flags;
 
     PL_subline = CopLINE(PL_curcop);
     CvPADLIST(PL_compcv) = pad_new(padnew_SAVE|padnew_SAVESUB);
-    CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc(outsidecv);
+    CvOUTSIDE(PL_compcv) = (CV*)SvREFCNT_inc_simple(outsidecv);
     CvOUTSIDE_SEQ(PL_compcv) = PL_cop_seqmax;
 #ifdef USE_5005THREADS
     CvOWNER(PL_compcv) = 0;
@@ -10607,8 +10753,9 @@ Perl_yyerror(pTHX_ char *s)
 
     if (!yychar || (yychar == ';' && !PL_rsfp))
        where = "at EOF";
-    else if (PL_bufptr > PL_oldoldbufptr && PL_bufptr - PL_oldoldbufptr < 200 &&
-      PL_oldoldbufptr != PL_oldbufptr && PL_oldbufptr != PL_bufptr) {
+    else if (PL_oldoldbufptr && PL_bufptr > PL_oldoldbufptr &&
+      PL_bufptr - PL_oldoldbufptr < 200 && PL_oldoldbufptr != PL_oldbufptr &&
+      PL_oldbufptr != PL_bufptr) {
        /*
                Only for NetWare:
                The code below is removed for NetWare because it abends/crashes on NetWare
@@ -10623,8 +10770,8 @@ Perl_yyerror(pTHX_ char *s)
        context = PL_oldoldbufptr;
        contlen = PL_bufptr - PL_oldoldbufptr;
     }
-    else if (PL_bufptr > PL_oldbufptr && PL_bufptr - PL_oldbufptr < 200 &&
-      PL_oldbufptr != PL_bufptr) {
+    else if (PL_oldbufptr && PL_bufptr > PL_oldbufptr &&
+      PL_bufptr - PL_oldbufptr < 200 && PL_oldbufptr != PL_bufptr) {
        /*
                Only for NetWare:
                The code below is removed for NetWare because it abends/crashes on NetWare
@@ -10656,14 +10803,14 @@ Perl_yyerror(pTHX_ char *s)
            where = "within string";
     }
     else {
-       SV *where_sv = sv_2mortal(newSVpvn("next char ", 10));
+       SV * const where_sv = sv_2mortal(newSVpvs("next char "));
        if (yychar < 32)
            Perl_sv_catpvf(aTHX_ where_sv, "^%c", toCTRL(yychar));
        else if (isPRINT_LC(yychar))
            Perl_sv_catpvf(aTHX_ where_sv, "%c", yychar);
        else
            Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255);
-       where = SvPVX(where_sv);
+       where = SvPVX_const(where_sv);
     }
     msg = sv_2mortal(newSVpv(s, 0));
     Perl_sv_catpvf(aTHX_ msg, " at %s line %"IVdf", ",
@@ -10691,7 +10838,7 @@ Perl_yyerror(pTHX_ char *s)
             OutCopFILE(PL_curcop));
     }
     PL_in_my = 0;
-    PL_in_my_stash = Nullhv;
+    PL_in_my_stash = NULL;
     return 0;
 }
 #ifdef __SC__
@@ -10701,8 +10848,7 @@ Perl_yyerror(pTHX_ char *s)
 STATIC char*
 S_swallow_bom(pTHX_ U8 *s)
 {
-    STRLEN slen;
-    slen = SvCUR(PL_linestr);
+    const STRLEN slen = SvCUR(PL_linestr);
     switch (s[0]) {
     case 0xFF:
        if (s[1] == 0xFE) {
@@ -10718,7 +10864,7 @@ S_swallow_bom(pTHX_ U8 *s)
                I32 newlen;
 
                filter_add(utf16rev_textfilter, NULL);
-               New(898, news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
+               Newx(news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
                utf16_to_utf8_reversed(s, news,
                                       PL_bufend - (char*)s - 1,
                                       &newlen);
@@ -10744,7 +10890,7 @@ S_swallow_bom(pTHX_ U8 *s)
                I32 newlen;
 
                filter_add(utf16_textfilter, NULL);
-               New(898, news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
+               Newx(news, (PL_bufend - (char*)s) * 3 / 2 + 1, U8);
                utf16_to_utf8(s, news,
                              PL_bufend - (char*)s,
                              &newlen);
@@ -10801,7 +10947,7 @@ S_swallow_bom(pTHX_ U8 *s)
 static void
 restore_rsfp(pTHX_ void *f)
 {
-    PerlIO *fp = (PerlIO*)f;
+    PerlIO * const fp = (PerlIO*)f;
 
     if (PL_rsfp == PerlIO_stdin())
        PerlIO_clearerr(PL_rsfp);
@@ -10814,17 +10960,17 @@ restore_rsfp(pTHX_ void *f)
 static I32
 utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
 {
-    STRLEN old = SvCUR(sv);
-    I32 count = FILTER_READ(idx+1, sv, maxlen);
+    const STRLEN old = SvCUR(sv);
+    const I32 count = FILTER_READ(idx+1, sv, maxlen);
     DEBUG_P(PerlIO_printf(Perl_debug_log,
                          "utf16_textfilter(%p): %d %d (%d)\n",
                          utf16_textfilter, idx, maxlen, (int) count));
     if (count) {
        U8* tmps;
        I32 newlen;
-       New(898, tmps, SvCUR(sv) * 3 / 2 + 1, U8);
-       Copy(SvPVX(sv), tmps, old, char);
-       utf16_to_utf8((U8*)SvPVX(sv) + old, tmps + old,
+       Newx(tmps, SvCUR(sv) * 3 / 2 + 1, U8);
+       Copy(SvPVX_const(sv), tmps, old, char);
+       utf16_to_utf8((U8*)SvPVX_const(sv) + old, tmps + old,
                      SvCUR(sv) - old, &newlen);
        sv_usepvn(sv, (char*)tmps, (STRLEN)newlen + old);
     }
@@ -10835,17 +10981,17 @@ utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
 static I32
 utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen)
 {
-    STRLEN old = SvCUR(sv);
-    I32 count = FILTER_READ(idx+1, sv, maxlen);
+    const STRLEN old = SvCUR(sv);
+    const I32 count = FILTER_READ(idx+1, sv, maxlen);
     DEBUG_P(PerlIO_printf(Perl_debug_log,
                          "utf16rev_textfilter(%p): %d %d (%d)\n",
                          utf16rev_textfilter, idx, maxlen, (int) count));
     if (count) {
        U8* tmps;
        I32 newlen;
-       New(898, tmps, SvCUR(sv) * 3 / 2 + 1, U8);
-       Copy(SvPVX(sv), tmps, old, char);
-       utf16_to_utf8((U8*)SvPVX(sv) + old, tmps + old,
+       Newx(tmps, SvCUR(sv) * 3 / 2 + 1, U8);
+       Copy(SvPVX_const(sv), tmps, old, char);
+       utf16_to_utf8((U8*)SvPVX_const(sv) + old, tmps + old,
                      SvCUR(sv) - old, &newlen);
        sv_usepvn(sv, (char*)tmps, (STRLEN)newlen + old);
     }
@@ -10860,7 +11006,7 @@ vstring, as well as updating the passed in sv.
 
 Function must be called like
 
-       sv = NEWSV(92,5);
+       sv = newSV(5);
        s = scan_vstring(s,sv);
 
 The sv should already be large enough to store the vstring
@@ -10889,16 +11035,15 @@ Perl_scan_vstring(pTHX_ char *s, SV *sv)
     }
 
     if (!isALPHA(*pos)) {
-       UV rev;
        U8 tmpbuf[UTF8_MAXBYTES+1];
-       U8 *tmpend;
 
        if (*s == 'v') s++;  /* get past 'v' */
 
        sv_setpvn(sv, "", 0);
 
        for (;;) {
-           rev = 0;
+           U8 *tmpend;
+           UV rev = 0;
            {
                /* this is atoi() that tolerates underscores */
                const char *end = pos;
@@ -10925,9 +11070,9 @@ Perl_scan_vstring(pTHX_ char *s, SV *sv)
            if (!UNI_IS_INVARIANT(NATIVE_TO_UNI(rev)))
                 SvUTF8_on(sv);
            if (pos + 1 < PL_bufend && *pos == '.' && isDIGIT(pos[1]))
-                s = ++pos;
+                s = (char *)++pos;
            else {
-                s = pos;
+                s = (char *)pos;
                 break;
            }
            while (pos < PL_bufend && (isDIGIT(*pos) || *pos == '_'))
@@ -10940,3 +11085,12 @@ Perl_scan_vstring(pTHX_ char *s, SV *sv)
     return (char *)s;
 }
 
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */