In Perl_yylex, make tmp a temporary variable local to the blocks in
Nicholas Clark [Mon, 19 Dec 2005 23:47:26 +0000 (23:47 +0000)]
which it is used.

p4raw-id: //depot/perl@26412

toke.c

diff --git a/toke.c b/toke.c
index b0c6135..18a89bd 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -2425,7 +2425,6 @@ Perl_yylex(pTHX)
 {
     register char *s = PL_bufptr;
     register char *d;
-    register I32 tmp;
     STRLEN len;
     GV *gv = Nullgv;
     GV **gvp = 0;
@@ -2502,6 +2501,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') &&
@@ -3064,6 +3064,7 @@ Perl_yylex(pTHX)
     case '-':
        if (s[1] && isALPHA(s[1]) && !isALNUM(s[2])) {
            I32 ftst = 0;
+           char tmp;
 
            s++;
            PL_bufptr = s;
@@ -3134,49 +3135,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 '*':
@@ -3223,8 +3228,10 @@ Perl_yylex(pTHX)
            Eop(OP_SMARTMATCH);
        }
     case ',':
-       tmp = *s++;
-       OPERATOR(tmp);
+       {
+           const char tmp = *s++;
+           OPERATOR(tmp);
+       }
     case ':':
        if (s[1] == ':') {
            len = 0;
@@ -3247,6 +3254,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;
@@ -3328,24 +3336,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 != ')')) {
-               const 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;
-               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(':');
            }
        got_attrs:
            if (attrs) {
@@ -3365,14 +3379,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)
@@ -3580,8 +3598,7 @@ Perl_yylex(pTHX)
        TOKEN(';');
     case '&':
        s++;
-       tmp = *s++;
-       if (tmp == '&')
+       if (*s++ == '&')
            AOPERATOR(ANDAND);
        s--;
        if (PL_expect == XOPERATOR) {
@@ -3607,47 +3624,50 @@ 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 (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;
+           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) {
            const char *t;
@@ -3666,27 +3686,30 @@ Perl_yylex(pTHX)
        OPERATOR(ASSIGNOP);
     case '!':
        s++;
-       tmp = *s++;
-       if (tmp == '=') {
-            /* was this !=~ where !~ was meant?
-             * warn on m:!=~\s+([/?]|[msy]\W|tr\W): */
-
-            if (*s == '~' && ckWARN(WARN_SYNTAX)) {
-               const char *t = s+1;
-
-                while (t < PL_bufend && isSPACE(*t))
-                    ++t;
-
-                if (*t == '/' || *t == '?' ||
-                    ((*t == 'm' || *t == 's' || *t == 'y') && !isALNUM(t[1])) ||
-                    (*t == 't' && t[1] == 'r' && !isALNUM(t[2])))
-                    Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
-                                "!=~ should be !~");
-            }
-           Eop(OP_NE);
-        }
-       if (tmp == '~')
-           PMop(OP_NOT);
+       {
+           const char tmp = *s++;
+           if (tmp == '=') {
+               /* was this !=~ where !~ was meant?
+                * warn on m:!=~\s+([/?]|[msy]\W|tr\W): */
+
+               if (*s == '~' && ckWARN(WARN_SYNTAX)) {
+                   const char *t = s+1;
+
+                   while (t < PL_bufend && isSPACE(*t))
+                       ++t;
+
+                   if (*t == '/' || *t == '?' ||
+                       ((*t == 'm' || *t == 's' || *t == 'y')
+                        && !isALNUM(t[1])) ||
+                       (*t == 't' && t[1] == 'r' && !isALNUM(t[2])))
+                       Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
+                                   "!=~ should be !~");
+               }
+               Eop(OP_NE);
+           }
+           if (tmp == '~')
+               PMop(OP_NOT);
+       }
        s--;
        OPERATOR('!');
     case '<':
@@ -3700,25 +3723,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);
 
@@ -3766,93 +3793,102 @@ 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)) {
-           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),
-                               "Multidimensional syntax %.*s not supported",
-                               (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))
+           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",
+                                       (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)) {
-           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];
-               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 == '/' && !isSPACE(s[1]) && s[1] != '='
+                        && s[1] != '/')
+                   PL_expect = XTERM;          /* e.g. print $fh /.../
+                                                  XXX except DORDOR operator
+                                               */
+               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 == '/' && !isSPACE(s[1]) && s[1] != '=' && s[1] != '/')
-               PL_expect = XTERM;              /* e.g. print $fh /.../
-                                                XXX except DORDOR operator */
-           else if (*s == '<' && s[1] == '<' && !isSPACE(s[2]) && s[2] != '=')
-               PL_expect = XTERM;              /* print $fh <<"EOF" */
        }
        PL_pending_ident = '$';
        TOKEN('$');
@@ -3897,7 +3933,7 @@ Perl_yylex(pTHX)
        }
      case '?':                 /* may either be conditional or pattern */
         if(PL_expect == XOPERATOR) {
-            tmp = *s++;
+            char tmp = *s++;
             if(tmp == '?') {
                  OPERATOR('?');
             }
@@ -3939,7 +3975,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) {
@@ -4086,6 +4122,7 @@ Perl_yylex(pTHX)
     case 'z': case 'Z':
 
       keylookup: {
+       I32 tmp;
        assert (orig_keyword == 0);
        assert (gv == 0);
        assert (gvp == 0);