[inseparable changes from patch from perl5.003_12 to perl5.003_13]
[p5sagit/p5-mst-13.2.git] / toke.c
diff --git a/toke.c b/toke.c
index feebded..4c79d7b 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -1255,7 +1255,7 @@ yylex()
        /* Force them to make up their mind on "@foo". */
        if (pit == '@' && lex_state != LEX_NORMAL && !lex_brackets) {
            GV *gv = gv_fetchpv(tokenbuf+1, FALSE, SVt_PVAV);
-           if (!gv || (tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv)) {
+           if (!gv || ((tokenbuf[0] == '@') ? !GvAV(gv) : !GvHV(gv))) {
                char tmpbuf[1024];
                sprintf(tmpbuf, "Literal %s now requires backslash", tokenbuf);
                yyerror(tmpbuf);
@@ -1856,7 +1856,7 @@ yylex()
        case XOPERATOR:
            while (s < bufend && (*s == ' ' || *s == '\t'))
                s++;
-           if (s < bufend && (isALPHA(*s) || *s == '_')) {
+           if (s < bufend && isIDFIRST(*s)) {
                d = scan_word(s, tokenbuf, FALSE, &len);
                while (d < bufend && (*d == ' ' || *d == '\t'))
                    d++;
@@ -2104,6 +2104,10 @@ yylex()
            TERM(THING);
        }
 
+       d = s;
+       if (lex_state == LEX_NORMAL)
+           s = skipspace(s);
+
        if ((expect != XREF || oldoldbufptr == last_lop) && intuit_more(s)) {
            char *t;
            if (*s == '[') {
@@ -2139,9 +2143,8 @@ yylex()
        }
 
        expect = XOPERATOR;
-       if (lex_state == LEX_NORMAL && isSPACE(*s)) {
+       if (lex_state == LEX_NORMAL && isSPACE(*d)) {
            bool islop = (last_lop == oldoldbufptr);
-           s = skipspace(s);
            if (!islop || last_lop_op == OP_GREPSTART)
                expect = XOPERATOR;
            else if (strchr("$@\"'`q", *s))
@@ -2170,6 +2173,8 @@ yylex()
                yyerror("Final @ should be \\@ or @name");
            PREREF('@');
        }
+       if (lex_state == LEX_NORMAL)
+           s = skipspace(s);
        if ((expect != XREF || oldoldbufptr == last_lop) && intuit_more(s)) {
            if (*s == '{')
                tokenbuf[0] = '%';
@@ -2333,12 +2338,29 @@ yylex()
        if (*s == ':' && s[1] == ':' && strNE(tokenbuf, "CORE"))
            goto just_a_word;
 
+       d = s;
+       while (d < bufend && isSPACE(*d))
+               d++;    /* no comments skipped here, or s### is misparsed */
+
+       /* Is this a label? */
+       if (expect == XSTATE && d < bufend && *d == ':' && *(d + 1) != ':') {
+           if (len == 1 && strchr("syq", tokenbuf[0]) ||
+               len == 2 && ((tokenbuf[0] == 't' && tokenbuf[1] == 'r') ||
+                            (tokenbuf[0] == 'q' &&
+                             strchr("qwx", tokenbuf[1]))))
+               ; /* no */
+           else {
+               s = d + 1;
+               yylval.pval = savepv(tokenbuf);
+               CLINE;
+               TOKEN(LABEL);
+           }
+       }
+
+       /* Check for keywords */
        tmp = keyword(tokenbuf, len);
 
        /* Is this a word before a => operator? */
-       d = s;
-       while (d < bufend && (*d == ' ' || *d == '\t'))
-               d++;    /* no comments skipped here, or s### is misparsed */
        if (strnEQ(d,"=>",2)) {
            CLINE;
            if (dowarn && (tmp || perl_get_cv(tokenbuf, FALSE)))
@@ -2378,18 +2400,7 @@ yylex()
                        croak("Bad name after %s::", tokenbuf);
                }
 
-               /* Do special processing at start of statement. */
-
-               if (expect == XSTATE) {
-                   while (isSPACE(*s)) s++;
-                   if (*s == ':') {    /* It's a label. */
-                       yylval.pval = savepv(tokenbuf);
-                       s++;
-                       CLINE;
-                       TOKEN(LABEL);
-                   }
-               }
-               else if (expect == XOPERATOR) {
+               if (expect == XOPERATOR) {
                    if (bufptr == linestart) {
                        curcop->cop_line--;
                        warn(warn_nosemi);
@@ -2842,10 +2853,10 @@ yylex()
            FUN0(OP_GPWENT);
 
        case KEY_getpwnam:
-           FUN1(OP_GPWNAM);
+           UNI(OP_GPWNAM);
 
        case KEY_getpwuid:
-           FUN1(OP_GPWUID);
+           UNI(OP_GPWUID);
 
        case KEY_getpeername:
            UNI(OP_GETPEERNAME);
@@ -2887,10 +2898,10 @@ yylex()
            FUN0(OP_GGRENT);
 
        case KEY_getgrnam:
-           FUN1(OP_GGRNAM);
+           UNI(OP_GGRNAM);
 
        case KEY_getgrgid:
-           FUN1(OP_GGRGID);
+           UNI(OP_GGRGID);
 
        case KEY_getlogin:
            FUN0(OP_GETLOGIN);
@@ -2904,7 +2915,7 @@ yylex()
 
        case KEY_if:
            yylval.ival = curcop->cop_line;
-           OPERATOR(IF);
+           PRETERMBLOCK(IF);
 
        case KEY_index:
            LOP(OP_INDEX,XTERM);
@@ -3218,16 +3229,16 @@ yylex()
            LOP(OP_SETPRIORITY,XTERM);
 
        case KEY_sethostent:
-           FUN1(OP_SHOSTENT);
+           UNI(OP_SHOSTENT);
 
        case KEY_setnetent:
-           FUN1(OP_SNETENT);
+           UNI(OP_SNETENT);
 
        case KEY_setservent:
-           FUN1(OP_SSERVENT);
+           UNI(OP_SSERVENT);
 
        case KEY_setprotoent:
-           FUN1(OP_SPROTOENT);
+           UNI(OP_SPROTOENT);
 
        case KEY_setpwent:
            FUN0(OP_SPWENT);
@@ -3419,11 +3430,11 @@ yylex()
 
        case KEY_until:
            yylval.ival = curcop->cop_line;
-           OPERATOR(UNTIL);
+           PRETERMBLOCK(UNTIL);
 
        case KEY_unless:
            yylval.ival = curcop->cop_line;
-           OPERATOR(UNLESS);
+           PRETERMBLOCK(UNLESS);
 
        case KEY_unlink:
            LOP(OP_UNLINK,XTERM);
@@ -3475,7 +3486,7 @@ yylex()
 
        case KEY_while:
            yylval.ival = curcop->cop_line;
-           OPERATOR(WHILE);
+           PRETERMBLOCK(WHILE);
 
        case KEY_warn:
            hints |= HINT_BLOCK_SCOPE;
@@ -4261,13 +4272,13 @@ I32 ck_uni;
            while (s < send && (*s == ' ' || *s == '\t')) s++;
            *d = *s;
        }
-       if (isALPHA(*d) || *d == '_') {
+       if (isIDFIRST(*d)) {
            d++;
            while (isALNUM(*s) || *s == ':')
                *d++ = *s++;
            *d = '\0';
            while (s < send && (*s == ' ' || *s == '\t')) s++;
-           if ((*s == '[' || *s == '{')) {
+           if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
                if (dowarn && keyword(dest, d - dest)) {
                    char *brack = *s == '[' ? "[...]" : "{...}";
                    warn("Ambiguous use of %c{%s%s} resolved to %c%s%s",
@@ -4336,8 +4347,6 @@ char *start;
     pm = (PMOP*)newPMOP(OP_MATCH, 0);
     if (multi_open == '?')
        pm->op_pmflags |= PMf_ONCE;
-    if (hints & HINT_LOCALE)
-       pm->op_pmflags |= PMf_LOCALE;
     while (*s && strchr("iogmsx", *s))
        pmflag(&pm->op_pmflags,*s++);
     pm->op_pmpermflags = pm->op_pmflags;
@@ -4565,7 +4574,7 @@ register char *s;
     if (!rsfp) {
        d = s;
        while (s < bufend &&
-         (*s != term || memcmp(s,tokenbuf,len) != 0) ) {
+         (*s != term || memNE(s,tokenbuf,len)) ) {
            if (*s++ == '\n')
                curcop->cop_line++;
        }
@@ -4598,7 +4607,7 @@ register char *s;
              (I32)curcop->cop_line,sv);
        }
        bufend = SvPVX(linestr) + SvCUR(linestr);
-       if (*s == term && memcmp(s,tokenbuf,len) == 0) {
+       if (*s == term && memEQ(s,tokenbuf,len)) {
            s = bufend - 1;
            *s = ' ';
            sv_catsv(linestr,herewas);
@@ -4877,7 +4886,7 @@ char *start;
        }
        *d = '\0';
        sv = NEWSV(92,0);
-       NUMERIC_STANDARD();
+       SET_NUMERIC_STANDARD();
        value = atof(tokenbuf);
        tryi32 = I_32(value);
        if (!floatit && (double)tryi32 == value)