X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/81c14aa2230ca380c2f424e69ac8f9dc0bb4ae23..d6fb8979903e0b021272dee1efd5383d286d1ba0:/toke.c?ds=sidebyside diff --git a/toke.c b/toke.c index 12359e0..8dadf61 100644 --- a/toke.c +++ b/toke.c @@ -48,6 +48,8 @@ Individual members of C have their own documentation. /* XXX temporary backwards compatibility */ #define PL_lex_brackets (PL_parser->lex_brackets) +#define PL_lex_allbrackets (PL_parser->lex_allbrackets) +#define PL_lex_fakeeof (PL_parser->lex_fakeeof) #define PL_lex_brackstack (PL_parser->lex_brackstack) #define PL_lex_casemods (PL_parser->lex_casemods) #define PL_lex_casestack (PL_parser->lex_casestack) @@ -293,7 +295,15 @@ static const char* const lex_state_names[] = { } /* grandfather return to old style */ -#define OLDLOP(f) return(pl_yylval.ival=f,PL_expect = XTERM,PL_bufptr = s,(int)LSTOP) +#define OLDLOP(f) \ + do { \ + if (!PL_lex_allbrackets && PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC) \ + PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC; \ + pl_yylval.ival = (f); \ + PL_expect = XTERM; \ + PL_bufptr = s; \ + return (int)LSTOP; \ + } while(0) #ifdef DEBUGGING @@ -578,18 +588,11 @@ S_missingterm(pTHX_ char *s) Perl_croak(aTHX_ "Can't find string terminator %c%s%c anywhere before EOF",q,s,q); } -#define FEATURE_IS_ENABLED(name) \ - ((0 != (PL_hints & HINT_LOCALIZE_HH)) \ - && S_feature_is_enabled(aTHX_ STR_WITH_LEN(name))) -/* The longest string we pass in. */ -#define MAX_FEATURE_LEN (sizeof("unicode_strings")-1) - /* - * S_feature_is_enabled * Check whether the named feature is enabled. */ -STATIC bool -S_feature_is_enabled(pTHX_ const char *const name, STRLEN namelen) +bool +Perl_feature_is_enabled(pTHX_ const char *const name, STRLEN namelen) { dVAR; HV * const hinthv = GvHV(PL_hintgv); @@ -597,7 +600,8 @@ S_feature_is_enabled(pTHX_ const char *const name, STRLEN namelen) PERL_ARGS_ASSERT_FEATURE_IS_ENABLED; - assert(namelen <= MAX_FEATURE_LEN); + if (namelen > MAX_FEATURE_LEN) + return FALSE; memcpy(&he_name[8], name, namelen); return (hinthv && hv_exists(hinthv, he_name, 8 + namelen)); @@ -1822,18 +1826,22 @@ S_lop(pTHX_ I32 f, int x, char *s) PL_last_lop_op = (OPCODE)f; #ifdef PERL_MAD if (PL_lasttoke) - return REPORT(LSTOP); + goto lstop; #else if (PL_nexttoke) - return REPORT(LSTOP); + goto lstop; #endif if (*s == '(') return REPORT(FUNC); s = PEEKSPACE(s); if (*s == '(') return REPORT(FUNC); - else + else { + lstop: + if (!PL_lex_allbrackets && PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC) + PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC; return REPORT(LSTOP); + } } #ifdef PERL_MAD @@ -1954,8 +1962,12 @@ Perl_yyunlex(pTHX) start_force(-1); NEXTVAL_NEXTTOKE = PL_parser->yylval; if (yyc == '{'/*}*/ || yyc == HASHBRACK || yyc == '['/*]*/) { + PL_lex_allbrackets--; PL_lex_brackets--; - yyc |= (1<<24) | (PL_lex_brackstack[PL_lex_brackets] << 16); + yyc |= (3<<24) | (PL_lex_brackstack[PL_lex_brackets] << 16); + } else if (yyc == '('/*)*/) { + PL_lex_allbrackets--; + yyc |= (2<<24); } force_next(yyc); } @@ -2379,6 +2391,8 @@ S_sublex_push(pTHX) PL_lex_state = PL_sublex_info.super_state; SAVEBOOL(PL_lex_dojoin); SAVEI32(PL_lex_brackets); + SAVEI32(PL_lex_allbrackets); + SAVEI8(PL_lex_fakeeof); SAVEI32(PL_lex_casemods); SAVEI32(PL_lex_starts); SAVEI8(PL_lex_state); @@ -2407,6 +2421,8 @@ S_sublex_push(pTHX) PL_lex_dojoin = FALSE; PL_lex_brackets = 0; + PL_lex_allbrackets = 0; + PL_lex_fakeeof = LEX_FAKEEOF_NEVER; Newx(PL_lex_brackstack, 120, char); Newx(PL_lex_casestack, 12, char); PL_lex_casemods = 0; @@ -2459,6 +2475,8 @@ S_sublex_done(pTHX) SAVEFREESV(PL_linestr); PL_lex_dojoin = FALSE; PL_lex_brackets = 0; + PL_lex_allbrackets = 0; + PL_lex_fakeeof = LEX_FAKEEOF_NEVER; PL_lex_casemods = 0; *PL_lex_casestack = '\0'; PL_lex_starts = 0; @@ -2810,7 +2828,7 @@ S_scan_const(pTHX_ char *start) /* likewise skip #-initiated comments in //x patterns */ else if (*s == '#' && PL_lex_inpat && - ((PMOP*)PL_lex_inpat)->op_pmflags & PMf_EXTENDED) { + ((PMOP*)PL_lex_inpat)->op_pmflags & RXf_PMf_EXTENDED) { while (s+1 < send && *s != '\n') *d++ = NATIVE_TO_NEED(has_utf8,*s++); } @@ -3069,7 +3087,9 @@ S_scan_const(pTHX_ char *start) * utf8 now, we save a whole pass in the regular expression * compiler. Once that code is changed so Unicode * semantics doesn't necessarily have to be in utf8, this - * block should be removed */ + * block should be removed. However, the code that parses + * the output of this would have to be changed to not + * necessarily expect utf8 */ if (!has_utf8) { SvCUR_set(sv, d - SvPVX_const(sv)); SvPOK_on(sv); @@ -3343,7 +3363,7 @@ S_scan_const(pTHX_ char *start) case 'c': s++; if (s < send) { - *d++ = grok_bslash_c(*s++, 1); + *d++ = grok_bslash_c(*s++, has_utf8, 1); } else { yyerror("Missing control char name in \\c"); @@ -3723,7 +3743,7 @@ S_intuit_method(pTHX_ char *start, GV *gv, CV *cv) #endif s = PEEKSPACE(s); if ((PL_bufend - s) >= 2 && *s == '=' && *(s+1) == '>') - return 0; /* no assumptions -- "=>" quotes bearword */ + return 0; /* no assumptions -- "=>" quotes bareword */ bare_package: start_force(PL_curforce); NEXTVAL_NEXTTOKE.opval = (OP*)newSVOP(OP_CONST, 0, @@ -3942,7 +3962,7 @@ S_find_in_my_stash(pTHX_ const char *pkgname, STRLEN len) /* * S_readpipe_override - * Check whether readpipe() is overriden, and generates the appropriate + * Check whether readpipe() is overridden, and generates the appropriate * optree, provided sublex_start() is called afterwards. */ STATIC void @@ -4303,10 +4323,17 @@ Perl_yylex(pTHX) #else next_type = PL_nexttype[PL_nexttoke]; #endif - if (next_type & (1<<24)) { - if (PL_lex_brackets > 100) - Renew(PL_lex_brackstack, PL_lex_brackets + 10, char); - PL_lex_brackstack[PL_lex_brackets++] = (next_type >> 16) & 0xff; + if (next_type & (7<<24)) { + if (next_type & (1<<24)) { + if (PL_lex_brackets > 100) + Renew(PL_lex_brackstack, PL_lex_brackets + 10, char); + PL_lex_brackstack[PL_lex_brackets++] = + (next_type >> 16) & 0xff; + } + if (next_type & (2<<24)) + PL_lex_allbrackets++; + if (next_type & (4<<24)) + PL_lex_allbrackets--; next_type &= 0xffff; } #ifdef PERL_MAD @@ -4341,6 +4368,7 @@ Perl_yylex(pTHX) PL_thistoken = newSVpvs("\\E"); #endif } + PL_lex_allbrackets--; return REPORT(')'); } #ifdef PERL_MAD @@ -4380,6 +4408,7 @@ Perl_yylex(pTHX) if ((*s == 'L' || *s == 'U') && (strchr(PL_lex_casestack, 'L') || strchr(PL_lex_casestack, 'U'))) { PL_lex_casestack[--PL_lex_casemods] = '\0'; + PL_lex_allbrackets--; return REPORT(')'); } if (PL_lex_casemods > 10) @@ -4389,7 +4418,7 @@ Perl_yylex(pTHX) PL_lex_state = LEX_INTERPCONCAT; start_force(PL_curforce); NEXTVAL_NEXTTOKE.ival = 0; - force_next('('); + force_next((2<<24)|'('); start_force(PL_curforce); if (*s == 'l') NEXTVAL_NEXTTOKE.ival = OP_LCFIRST; @@ -4455,7 +4484,7 @@ Perl_yylex(pTHX) force_next('$'); start_force(PL_curforce); NEXTVAL_NEXTTOKE.ival = 0; - force_next('('); + force_next((2<<24)|'('); start_force(PL_curforce); NEXTVAL_NEXTTOKE.ival = OP_JOIN; /* emulate join($", ...) */ force_next(FUNC); @@ -4495,6 +4524,7 @@ Perl_yylex(pTHX) PL_thistoken = newSVpvs(""); } #endif + PL_lex_allbrackets--; return REPORT(')'); } if (PL_lex_inwhat == OP_SUBST && PL_linestr == PL_lex_repl @@ -5133,8 +5163,14 @@ Perl_yylex(pTHX) else TERM(ARROW); } - if (PL_expect == XOPERATOR) + if (PL_expect == XOPERATOR) { + if (*s == '=' && !PL_lex_allbrackets && + PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN) { + s--; + TOKEN(0); + } Aop(OP_SUBTRACT); + } else { if (isSPACE(*s) || !isSPACE(*PL_bufptr)) check_uni(); @@ -5152,8 +5188,14 @@ Perl_yylex(pTHX) else OPERATOR(PREINC); } - if (PL_expect == XOPERATOR) + if (PL_expect == XOPERATOR) { + if (*s == '=' && !PL_lex_allbrackets && + PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN) { + s--; + TOKEN(0); + } Aop(OP_ADD); + } else { if (isSPACE(*s) || !isSPACE(*PL_bufptr)) check_uni(); @@ -5173,12 +5215,25 @@ Perl_yylex(pTHX) s++; if (*s == '*') { s++; + if (*s == '=' && !PL_lex_allbrackets && + PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN) { + s -= 2; + TOKEN(0); + } PWop(OP_POW); } + if (*s == '=' && !PL_lex_allbrackets && + PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN) { + s--; + TOKEN(0); + } Mop(OP_MULTIPLY); case '%': if (PL_expect == XOPERATOR) { + if (s[1] == '=' && !PL_lex_allbrackets && + PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN) + TOKEN(0); ++s; Mop(OP_MODULO); } @@ -5192,12 +5247,16 @@ Perl_yylex(pTHX) TERM('%'); case '^': + if (!PL_lex_allbrackets && PL_lex_fakeeof >= + (s[1] == '=' ? LEX_FAKEEOF_ASSIGN : LEX_FAKEEOF_BITWISE)) + TOKEN(0); s++; BOop(OP_BIT_XOR); case '[': if (PL_lex_brackets > 100) Renew(PL_lex_brackstack, PL_lex_brackets + 10, char); PL_lex_brackstack[PL_lex_brackets++] = 0; + PL_lex_allbrackets++; { const char tmp = *s++; OPERATOR(tmp); @@ -5206,14 +5265,18 @@ Perl_yylex(pTHX) if (s[1] == '~' && (PL_expect == XOPERATOR || PL_expect == XTERMORDORDOR)) { + if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) + TOKEN(0); s += 2; Eop(OP_SMARTMATCH); } + s++; + OPERATOR('~'); case ',': - { - const char tmp = *s++; - OPERATOR(tmp); - } + if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMMA) + TOKEN(0); + s++; + OPERATOR(','); case ':': if (s[1] == ':') { len = 0; @@ -5374,6 +5437,11 @@ Perl_yylex(pTHX) #endif TOKEN(COLONATTR); } + if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_CLOSING) { + s--; + TOKEN(0); + } + PL_lex_allbrackets--; OPERATOR(':'); case '(': s++; @@ -5382,21 +5450,23 @@ Perl_yylex(pTHX) else PL_expect = XTERM; s = SKIPSPACE1(s); + PL_lex_allbrackets++; TOKEN('('); case ';': + if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR) + TOKEN(0); CLINE; - { - const char tmp = *s++; - OPERATOR(tmp); - } + s++; + OPERATOR(';'); case ')': - { - const char tmp = *s++; - s = SKIPSPACE1(s); - if (*s == '{') - PREBLOCK(tmp); - TERM(tmp); - } + if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_CLOSING) + TOKEN(0); + s++; + PL_lex_allbrackets--; + s = SKIPSPACE1(s); + if (*s == '{') + PREBLOCK(')'); + TERM(')'); case ']': if (PL_lex_brackets && PL_lex_brackstack[PL_lex_brackets-1] == XFAKEEOF) TOKEN(0); @@ -5405,6 +5475,7 @@ Perl_yylex(pTHX) yyerror("Unmatched right square bracket"); else --PL_lex_brackets; + PL_lex_allbrackets--; if (PL_lex_state == LEX_INTERPNORMAL) { if (PL_lex_brackets == 0) { if (*s == '-' && s[1] == '>') @@ -5430,6 +5501,7 @@ Perl_yylex(pTHX) PL_lex_brackstack[PL_lex_brackets++] = XTERM; else PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR; + PL_lex_allbrackets++; OPERATOR(HASHBRACK); case XOPERATOR: while (s < PL_bufend && SPACE_OR_TAB(*s)) @@ -5458,11 +5530,13 @@ Perl_yylex(pTHX) case XATTRBLOCK: case XBLOCK: PL_lex_brackstack[PL_lex_brackets++] = XSTATE; + PL_lex_allbrackets++; PL_expect = XSTATE; break; case XATTRTERM: case XTERMBLOCK: PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR; + PL_lex_allbrackets++; PL_expect = XSTATE; break; default: { @@ -5471,6 +5545,7 @@ Perl_yylex(pTHX) PL_lex_brackstack[PL_lex_brackets++] = XTERM; else PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR; + PL_lex_allbrackets++; s = SKIPSPACE1(s); if (*s == '}') { if (PL_expect == XREF && PL_lex_state == LEX_INTERPNORMAL) { @@ -5585,6 +5660,7 @@ Perl_yylex(pTHX) yyerror("Unmatched right curly bracket"); else PL_expect = (expectation)PL_lex_brackstack[--PL_lex_brackets]; + PL_lex_allbrackets--; if (PL_lex_brackets < PL_lex_formbrack && PL_lex_state != LEX_INTERPNORMAL) PL_lex_formbrack = 0; if (PL_lex_state == LEX_INTERPNORMAL) { @@ -5626,8 +5702,14 @@ Perl_yylex(pTHX) TOKEN(';'); case '&': s++; - if (*s++ == '&') + if (*s++ == '&') { + if (!PL_lex_allbrackets && PL_lex_fakeeof >= + (*s == '=' ? LEX_FAKEEOF_ASSIGN : LEX_FAKEEOF_LOGIC)) { + s -= 2; + TOKEN(0); + } AOPERATOR(ANDAND); + } s--; if (PL_expect == XOPERATOR) { if (PL_bufptr == PL_linestart && ckWARN(WARN_SEMICOLON) @@ -5637,6 +5719,11 @@ Perl_yylex(pTHX) Perl_warner(aTHX_ packWARN(WARN_SEMICOLON), "%s", PL_warn_nosemi); CopLINE_inc(PL_curcop); } + if (!PL_lex_allbrackets && PL_lex_fakeeof >= + (*s == '=' ? LEX_FAKEEOF_ASSIGN : LEX_FAKEEOF_BITWISE)) { + s--; + TOKEN(0); + } BAop(OP_BIT_AND); } @@ -5652,18 +5739,41 @@ Perl_yylex(pTHX) case '|': s++; - if (*s++ == '|') + if (*s++ == '|') { + if (!PL_lex_allbrackets && PL_lex_fakeeof >= + (*s == '=' ? LEX_FAKEEOF_ASSIGN : LEX_FAKEEOF_LOGIC)) { + s -= 2; + TOKEN(0); + } AOPERATOR(OROR); + } s--; + if (!PL_lex_allbrackets && PL_lex_fakeeof >= + (*s == '=' ? LEX_FAKEEOF_ASSIGN : LEX_FAKEEOF_BITWISE)) { + s--; + TOKEN(0); + } BOop(OP_BIT_OR); case '=': s++; { const char tmp = *s++; - if (tmp == '=') + if (tmp == '=') { + if (!PL_lex_allbrackets && + PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) { + s -= 2; + TOKEN(0); + } Eop(OP_EQ); - if (tmp == '>') + } + if (tmp == '>') { + if (!PL_lex_allbrackets && + PL_lex_fakeeof >= LEX_FAKEEOF_COMMA) { + s -= 2; + TOKEN(0); + } OPERATOR(','); + } if (tmp == '~') PMop(OP_MATCH); if (tmp && isSPACE(*s) && ckWARN(WARN_SYNTAX) @@ -5719,6 +5829,10 @@ Perl_yylex(pTHX) goto leftbracket; } } + if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN) { + s--; + TOKEN(0); + } pl_yylval.ival = 0; OPERATOR(ASSIGNOP); case '!': @@ -5742,6 +5856,11 @@ Perl_yylex(pTHX) Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "!=~ should be !~"); } + if (!PL_lex_allbrackets && + PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) { + s -= 2; + TOKEN(0); + } Eop(OP_NE); } if (tmp == '~') @@ -5762,28 +5881,65 @@ Perl_yylex(pTHX) s++; { char tmp = *s++; - if (tmp == '<') + if (tmp == '<') { + if (*s == '=' && !PL_lex_allbrackets && + PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN) { + s -= 2; + TOKEN(0); + } SHop(OP_LEFT_SHIFT); + } if (tmp == '=') { tmp = *s++; - if (tmp == '>') + if (tmp == '>') { + if (!PL_lex_allbrackets && + PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) { + s -= 3; + TOKEN(0); + } Eop(OP_NCMP); + } s--; + if (!PL_lex_allbrackets && + PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) { + s -= 2; + TOKEN(0); + } Rop(OP_LE); } } s--; + if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) { + s--; + TOKEN(0); + } Rop(OP_LT); case '>': s++; { const char tmp = *s++; - if (tmp == '>') + if (tmp == '>') { + if (*s == '=' && !PL_lex_allbrackets && + PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN) { + s -= 2; + TOKEN(0); + } SHop(OP_RIGHT_SHIFT); - else if (tmp == '=') + } + else if (tmp == '=') { + if (!PL_lex_allbrackets && + PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) { + s -= 2; + TOKEN(0); + } Rop(OP_GE); + } } s--; + if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) { + s--; + TOKEN(0); + } Rop(OP_GT); case '$': @@ -5967,6 +6123,9 @@ Perl_yylex(pTHX) case '/': /* may be division, defined-or, or pattern */ if (PL_expect == XTERMORDORDOR && s[1] == '/') { + if (!PL_lex_allbrackets && PL_lex_fakeeof >= + (s[2] == '=' ? LEX_FAKEEOF_ASSIGN : LEX_FAKEEOF_LOGIC)) + TOKEN(0); s += 2; AOPERATOR(DORDOR); } @@ -5974,16 +6133,33 @@ Perl_yylex(pTHX) if (PL_expect == XOPERATOR) { char tmp = *s++; if(tmp == '?') { + if (!PL_lex_allbrackets && + PL_lex_fakeeof >= LEX_FAKEEOF_IFELSE) { + s--; + TOKEN(0); + } + PL_lex_allbrackets++; OPERATOR('?'); } else { tmp = *s++; if(tmp == '/') { /* A // operator. */ + if (!PL_lex_allbrackets && PL_lex_fakeeof >= + (*s == '=' ? LEX_FAKEEOF_ASSIGN : + LEX_FAKEEOF_LOGIC)) { + s -= 2; + TOKEN(0); + } AOPERATOR(DORDOR); } else { s--; + if (*s == '=' && !PL_lex_allbrackets && + PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN) { + s--; + TOKEN(0); + } Mop(OP_DIVIDE); } } @@ -6022,6 +6198,11 @@ Perl_yylex(pTHX) if (PL_expect == XOPERATOR || !isDIGIT(s[1])) { char tmp = *s++; if (*s == tmp) { + if (!PL_lex_allbrackets && + PL_lex_fakeeof >= LEX_FAKEEOF_RANGE) { + s--; + TOKEN(0); + } s++; if (*s == tmp) { s++; @@ -6031,6 +6212,11 @@ Perl_yylex(pTHX) pl_yylval.ival = 0; OPERATOR(DOTDOT); } + if (*s == '=' && !PL_lex_allbrackets && + PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN) { + s--; + TOKEN(0); + } Aop(OP_CONCAT); } /* FALL THROUGH */ @@ -6322,7 +6508,7 @@ Perl_yylex(pTHX) } /* Look for a subroutine with this name in current package, - unless name is "Foo::", in which case Foo is a bearword + unless name is "Foo::", in which case Foo is a bareword (and a package name). */ if (len > 2 && !PL_madskills && @@ -6408,6 +6594,9 @@ Perl_yylex(pTHX) if ((isIDFIRST_lazy_if(s,UTF) || *s == '$') && (tmp = intuit_method(s, gv, cv))) { op_free(rv2cv_op); + if (tmp == METHOD && !PL_lex_allbrackets && + PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC) + PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC; return REPORT(tmp); } @@ -6488,6 +6677,9 @@ Perl_yylex(pTHX) op_free(rv2cv_op); PL_last_lop = PL_oldbufptr; PL_last_lop_op = OP_METHOD; + if (!PL_lex_allbrackets && + PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC) + PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC; PREBLOCK(METHOD); } @@ -6497,6 +6689,9 @@ Perl_yylex(pTHX) && (isIDFIRST_lazy_if(s,UTF) || *s == '$') && (tmp = intuit_method(s, gv, cv))) { op_free(rv2cv_op); + if (tmp == METHOD && !PL_lex_allbrackets && + PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC) + PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC; return REPORT(tmp); } @@ -6560,6 +6755,9 @@ Perl_yylex(pTHX) sv_setpvs(PL_subname, "__ANON__"); else sv_setpvs(PL_subname, "__ANON__::__ANON__"); + if (!PL_lex_allbrackets && + PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC) + PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC; PREBLOCK(LSTOPSUB); } } @@ -6578,6 +6776,9 @@ Perl_yylex(pTHX) PL_thistoken = newSVpvs(""); } force_next(WORD); + if (!PL_lex_allbrackets && + PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC) + PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC; TOKEN(NOAMP); } } @@ -6617,12 +6818,18 @@ Perl_yylex(pTHX) curmad('X', PL_thistoken); PL_thistoken = newSVpvs(""); force_next(WORD); + if (!PL_lex_allbrackets && + PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC) + PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC; TOKEN(NOAMP); } #else NEXTVAL_NEXTTOKE.opval = pl_yylval.opval; PL_expect = XTERM; force_next(WORD); + if (!PL_lex_allbrackets && + PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC) + PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC; TOKEN(NOAMP); #endif } @@ -6824,6 +7031,8 @@ Perl_yylex(pTHX) LOP(OP_ACCEPT,XTERM); case KEY_and: + if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_LOWLOGIC) + return REPORT(0); OPERATOR(ANDOP); case KEY_atan2: @@ -6876,6 +7085,8 @@ Perl_yylex(pTHX) UNI(OP_CLOSEDIR); case KEY_cmp: + if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) + return REPORT(0); Eop(OP_SCMP); case KEY_caller: @@ -6960,6 +7171,8 @@ Perl_yylex(pTHX) OPERATOR(ELSIF); case KEY_eq: + if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) + return REPORT(0); Eop(OP_SEQ); case KEY_exists: @@ -7013,6 +7226,8 @@ Perl_yylex(pTHX) case KEY_for: case KEY_foreach: + if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR) + return REPORT(0); pl_yylval.ival = CopLINE(PL_curcop); s = SKIPSPACE1(s); if (PL_expect == XSTATE && isIDFIRST_lazy_if(s,UTF)) { @@ -7057,9 +7272,13 @@ Perl_yylex(pTHX) LOP(OP_FLOCK,XTERM); case KEY_gt: + if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) + return REPORT(0); Rop(OP_SGT); case KEY_ge: + if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) + return REPORT(0); Rop(OP_SGE); case KEY_grep: @@ -7161,6 +7380,8 @@ Perl_yylex(pTHX) UNI(OP_HEX); case KEY_if: + if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR) + return REPORT(0); pl_yylval.ival = CopLINE(PL_curcop); OPERATOR(IF); @@ -7200,9 +7421,13 @@ Perl_yylex(pTHX) UNI(OP_LENGTH); case KEY_lt: + if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) + return REPORT(0); Rop(OP_SLT); case KEY_le: + if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) + return REPORT(0); Rop(OP_SLE); case KEY_localtime: @@ -7280,6 +7505,8 @@ Perl_yylex(pTHX) LOOPX(OP_NEXT); case KEY_ne: + if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) + return REPORT(0); Eop(OP_SNE); case KEY_no: @@ -7289,8 +7516,12 @@ Perl_yylex(pTHX) case KEY_not: if (*s == '(' || (s = SKIPSPACE1(s), *s == '(')) FUN1(OP_NOT); - else + else { + if (!PL_lex_allbrackets && + PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC) + PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC; OPERATOR(NOTOP); + } case KEY_open: s = SKIPSPACE1(s); @@ -7313,6 +7544,8 @@ Perl_yylex(pTHX) LOP(OP_OPEN,XTERM); case KEY_or: + if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_LOWLOGIC) + return REPORT(0); pl_yylval.ival = OP_OR; OPERATOR(OROP); @@ -7424,7 +7657,7 @@ Perl_yylex(pTHX) missingterm(NULL); pl_yylval.ival = OP_STRINGIFY; if (SvIVX(PL_lex_stuff) == '\'') - SvIV_set(PL_lex_stuff, 0); /* qq'$foo' should intepolate */ + SvIV_set(PL_lex_stuff, 0); /* qq'$foo' should interpolate */ TERM(sublex_start()); case KEY_qr: @@ -7911,10 +8144,14 @@ Perl_yylex(pTHX) UNI(OP_UNTIE); case KEY_until: + if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR) + return REPORT(0); pl_yylval.ival = CopLINE(PL_curcop); OPERATOR(UNTIL); case KEY_unless: + if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR) + return REPORT(0); pl_yylval.ival = CopLINE(PL_curcop); OPERATOR(UNLESS); @@ -7947,10 +8184,14 @@ Perl_yylex(pTHX) LOP(OP_VEC,XTERM); case KEY_when: + if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR) + return REPORT(0); pl_yylval.ival = CopLINE(PL_curcop); OPERATOR(WHEN); case KEY_while: + if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR) + return REPORT(0); pl_yylval.ival = CopLINE(PL_curcop); OPERATOR(WHILE); @@ -7982,12 +8223,18 @@ Perl_yylex(pTHX) UNI(OP_ENTERWRITE); case KEY_x: - if (PL_expect == XOPERATOR) + if (PL_expect == XOPERATOR) { + if (*s == '=' && !PL_lex_allbrackets && + PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN) + return REPORT(0); Mop(OP_REPEAT); + } check_uni(); goto just_a_word; case KEY_xor: + if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_LOWLOGIC) + return REPORT(0); pl_yylval.ival = OP_XOR; OPERATOR(OROP); @@ -8137,3399 +8384,6 @@ S_pending_ident(pTHX) return WORD; } -/* - * The following code was generated by perl_keyword.pl. - */ - -I32 -Perl_keyword (pTHX_ const char *name, I32 len, bool all_keywords) -{ - dVAR; - - PERL_ARGS_ASSERT_KEYWORD; - - switch (len) - { - case 1: /* 5 tokens of length 1 */ - switch (name[0]) - { - case 'm': - { /* m */ - return KEY_m; - } - - case 'q': - { /* q */ - return KEY_q; - } - - case 's': - { /* s */ - return KEY_s; - } - - case 'x': - { /* x */ - return -KEY_x; - } - - case 'y': - { /* y */ - return KEY_y; - } - - default: - goto unknown; - } - - case 2: /* 18 tokens of length 2 */ - switch (name[0]) - { - case 'd': - if (name[1] == 'o') - { /* do */ - return KEY_do; - } - - goto unknown; - - case 'e': - if (name[1] == 'q') - { /* eq */ - return -KEY_eq; - } - - goto unknown; - - case 'g': - switch (name[1]) - { - case 'e': - { /* ge */ - return -KEY_ge; - } - - case 't': - { /* gt */ - return -KEY_gt; - } - - default: - goto unknown; - } - - case 'i': - if (name[1] == 'f') - { /* if */ - return KEY_if; - } - - goto unknown; - - case 'l': - switch (name[1]) - { - case 'c': - { /* lc */ - return -KEY_lc; - } - - case 'e': - { /* le */ - return -KEY_le; - } - - case 't': - { /* lt */ - return -KEY_lt; - } - - default: - goto unknown; - } - - case 'm': - if (name[1] == 'y') - { /* my */ - return KEY_my; - } - - goto unknown; - - case 'n': - switch (name[1]) - { - case 'e': - { /* ne */ - return -KEY_ne; - } - - case 'o': - { /* no */ - return KEY_no; - } - - default: - goto unknown; - } - - case 'o': - if (name[1] == 'r') - { /* or */ - return -KEY_or; - } - - goto unknown; - - case 'q': - switch (name[1]) - { - case 'q': - { /* qq */ - return KEY_qq; - } - - case 'r': - { /* qr */ - return KEY_qr; - } - - case 'w': - { /* qw */ - return KEY_qw; - } - - case 'x': - { /* qx */ - return KEY_qx; - } - - default: - goto unknown; - } - - case 't': - if (name[1] == 'r') - { /* tr */ - return KEY_tr; - } - - goto unknown; - - case 'u': - if (name[1] == 'c') - { /* uc */ - return -KEY_uc; - } - - goto unknown; - - default: - goto unknown; - } - - case 3: /* 29 tokens of length 3 */ - switch (name[0]) - { - case 'E': - if (name[1] == 'N' && - name[2] == 'D') - { /* END */ - return KEY_END; - } - - goto unknown; - - case 'a': - switch (name[1]) - { - case 'b': - if (name[2] == 's') - { /* abs */ - return -KEY_abs; - } - - goto unknown; - - case 'n': - if (name[2] == 'd') - { /* and */ - return -KEY_and; - } - - goto unknown; - - default: - goto unknown; - } - - case 'c': - switch (name[1]) - { - case 'h': - if (name[2] == 'r') - { /* chr */ - return -KEY_chr; - } - - goto unknown; - - case 'm': - if (name[2] == 'p') - { /* cmp */ - return -KEY_cmp; - } - - goto unknown; - - case 'o': - if (name[2] == 's') - { /* cos */ - return -KEY_cos; - } - - goto unknown; - - default: - goto unknown; - } - - case 'd': - if (name[1] == 'i' && - name[2] == 'e') - { /* die */ - return -KEY_die; - } - - goto unknown; - - case 'e': - switch (name[1]) - { - case 'o': - if (name[2] == 'f') - { /* eof */ - return -KEY_eof; - } - - goto unknown; - - case 'x': - if (name[2] == 'p') - { /* exp */ - return -KEY_exp; - } - - goto unknown; - - default: - goto unknown; - } - - case 'f': - if (name[1] == 'o' && - name[2] == 'r') - { /* for */ - return KEY_for; - } - - goto unknown; - - case 'h': - if (name[1] == 'e' && - name[2] == 'x') - { /* hex */ - return -KEY_hex; - } - - goto unknown; - - case 'i': - if (name[1] == 'n' && - name[2] == 't') - { /* int */ - return -KEY_int; - } - - goto unknown; - - case 'l': - if (name[1] == 'o' && - name[2] == 'g') - { /* log */ - return -KEY_log; - } - - goto unknown; - - case 'm': - if (name[1] == 'a' && - name[2] == 'p') - { /* map */ - return KEY_map; - } - - goto unknown; - - case 'n': - if (name[1] == 'o' && - name[2] == 't') - { /* not */ - return -KEY_not; - } - - goto unknown; - - case 'o': - switch (name[1]) - { - case 'c': - if (name[2] == 't') - { /* oct */ - return -KEY_oct; - } - - goto unknown; - - case 'r': - if (name[2] == 'd') - { /* ord */ - return -KEY_ord; - } - - goto unknown; - - case 'u': - if (name[2] == 'r') - { /* our */ - return KEY_our; - } - - goto unknown; - - default: - goto unknown; - } - - case 'p': - if (name[1] == 'o') - { - switch (name[2]) - { - case 'p': - { /* pop */ - return -KEY_pop; - } - - case 's': - { /* pos */ - return KEY_pos; - } - - default: - goto unknown; - } - } - - goto unknown; - - case 'r': - if (name[1] == 'e' && - name[2] == 'f') - { /* ref */ - return -KEY_ref; - } - - goto unknown; - - case 's': - switch (name[1]) - { - case 'a': - if (name[2] == 'y') - { /* say */ - return (all_keywords || FEATURE_IS_ENABLED("say") ? KEY_say : 0); - } - - goto unknown; - - case 'i': - if (name[2] == 'n') - { /* sin */ - return -KEY_sin; - } - - goto unknown; - - case 'u': - if (name[2] == 'b') - { /* sub */ - return KEY_sub; - } - - goto unknown; - - default: - goto unknown; - } - - case 't': - if (name[1] == 'i' && - name[2] == 'e') - { /* tie */ - return -KEY_tie; - } - - goto unknown; - - case 'u': - if (name[1] == 's' && - name[2] == 'e') - { /* use */ - return KEY_use; - } - - goto unknown; - - case 'v': - if (name[1] == 'e' && - name[2] == 'c') - { /* vec */ - return -KEY_vec; - } - - goto unknown; - - case 'x': - if (name[1] == 'o' && - name[2] == 'r') - { /* xor */ - return -KEY_xor; - } - - goto unknown; - - default: - goto unknown; - } - - case 4: /* 41 tokens of length 4 */ - switch (name[0]) - { - case 'C': - if (name[1] == 'O' && - name[2] == 'R' && - name[3] == 'E') - { /* CORE */ - return -KEY_CORE; - } - - goto unknown; - - case 'I': - if (name[1] == 'N' && - name[2] == 'I' && - name[3] == 'T') - { /* INIT */ - return KEY_INIT; - } - - goto unknown; - - case 'b': - if (name[1] == 'i' && - name[2] == 'n' && - name[3] == 'd') - { /* bind */ - return -KEY_bind; - } - - goto unknown; - - case 'c': - if (name[1] == 'h' && - name[2] == 'o' && - name[3] == 'p') - { /* chop */ - return -KEY_chop; - } - - goto unknown; - - case 'd': - if (name[1] == 'u' && - name[2] == 'm' && - name[3] == 'p') - { /* dump */ - return -KEY_dump; - } - - goto unknown; - - case 'e': - switch (name[1]) - { - case 'a': - if (name[2] == 'c' && - name[3] == 'h') - { /* each */ - return -KEY_each; - } - - goto unknown; - - case 'l': - if (name[2] == 's' && - name[3] == 'e') - { /* else */ - return KEY_else; - } - - goto unknown; - - case 'v': - if (name[2] == 'a' && - name[3] == 'l') - { /* eval */ - return KEY_eval; - } - - goto unknown; - - case 'x': - switch (name[2]) - { - case 'e': - if (name[3] == 'c') - { /* exec */ - return -KEY_exec; - } - - goto unknown; - - case 'i': - if (name[3] == 't') - { /* exit */ - return -KEY_exit; - } - - goto unknown; - - default: - goto unknown; - } - - default: - goto unknown; - } - - case 'f': - if (name[1] == 'o' && - name[2] == 'r' && - name[3] == 'k') - { /* fork */ - return -KEY_fork; - } - - goto unknown; - - case 'g': - switch (name[1]) - { - case 'e': - if (name[2] == 't' && - name[3] == 'c') - { /* getc */ - return -KEY_getc; - } - - goto unknown; - - case 'l': - if (name[2] == 'o' && - name[3] == 'b') - { /* glob */ - return KEY_glob; - } - - goto unknown; - - case 'o': - if (name[2] == 't' && - name[3] == 'o') - { /* goto */ - return KEY_goto; - } - - goto unknown; - - case 'r': - if (name[2] == 'e' && - name[3] == 'p') - { /* grep */ - return KEY_grep; - } - - goto unknown; - - default: - goto unknown; - } - - case 'j': - if (name[1] == 'o' && - name[2] == 'i' && - name[3] == 'n') - { /* join */ - return -KEY_join; - } - - goto unknown; - - case 'k': - switch (name[1]) - { - case 'e': - if (name[2] == 'y' && - name[3] == 's') - { /* keys */ - return -KEY_keys; - } - - goto unknown; - - case 'i': - if (name[2] == 'l' && - name[3] == 'l') - { /* kill */ - return -KEY_kill; - } - - goto unknown; - - default: - goto unknown; - } - - case 'l': - switch (name[1]) - { - case 'a': - if (name[2] == 's' && - name[3] == 't') - { /* last */ - return KEY_last; - } - - goto unknown; - - case 'i': - if (name[2] == 'n' && - name[3] == 'k') - { /* link */ - return -KEY_link; - } - - goto unknown; - - case 'o': - if (name[2] == 'c' && - name[3] == 'k') - { /* lock */ - return -KEY_lock; - } - - goto unknown; - - default: - goto unknown; - } - - case 'n': - if (name[1] == 'e' && - name[2] == 'x' && - name[3] == 't') - { /* next */ - return KEY_next; - } - - goto unknown; - - case 'o': - if (name[1] == 'p' && - name[2] == 'e' && - name[3] == 'n') - { /* open */ - return -KEY_open; - } - - goto unknown; - - case 'p': - switch (name[1]) - { - case 'a': - if (name[2] == 'c' && - name[3] == 'k') - { /* pack */ - return -KEY_pack; - } - - goto unknown; - - case 'i': - if (name[2] == 'p' && - name[3] == 'e') - { /* pipe */ - return -KEY_pipe; - } - - goto unknown; - - case 'u': - if (name[2] == 's' && - name[3] == 'h') - { /* push */ - return -KEY_push; - } - - goto unknown; - - default: - goto unknown; - } - - case 'r': - switch (name[1]) - { - case 'a': - if (name[2] == 'n' && - name[3] == 'd') - { /* rand */ - return -KEY_rand; - } - - goto unknown; - - case 'e': - switch (name[2]) - { - case 'a': - if (name[3] == 'd') - { /* read */ - return -KEY_read; - } - - goto unknown; - - case 'c': - if (name[3] == 'v') - { /* recv */ - return -KEY_recv; - } - - goto unknown; - - case 'd': - if (name[3] == 'o') - { /* redo */ - return KEY_redo; - } - - goto unknown; - - default: - goto unknown; - } - - default: - goto unknown; - } - - case 's': - switch (name[1]) - { - case 'e': - switch (name[2]) - { - case 'e': - if (name[3] == 'k') - { /* seek */ - return -KEY_seek; - } - - goto unknown; - - case 'n': - if (name[3] == 'd') - { /* send */ - return -KEY_send; - } - - goto unknown; - - default: - goto unknown; - } - - case 'o': - if (name[2] == 'r' && - name[3] == 't') - { /* sort */ - return KEY_sort; - } - - goto unknown; - - case 'q': - if (name[2] == 'r' && - name[3] == 't') - { /* sqrt */ - return -KEY_sqrt; - } - - goto unknown; - - case 't': - if (name[2] == 'a' && - name[3] == 't') - { /* stat */ - return -KEY_stat; - } - - goto unknown; - - default: - goto unknown; - } - - case 't': - switch (name[1]) - { - case 'e': - if (name[2] == 'l' && - name[3] == 'l') - { /* tell */ - return -KEY_tell; - } - - goto unknown; - - case 'i': - switch (name[2]) - { - case 'e': - if (name[3] == 'd') - { /* tied */ - return -KEY_tied; - } - - goto unknown; - - case 'm': - if (name[3] == 'e') - { /* time */ - return -KEY_time; - } - - goto unknown; - - default: - goto unknown; - } - - default: - goto unknown; - } - - case 'w': - switch (name[1]) - { - case 'a': - switch (name[2]) - { - case 'i': - if (name[3] == 't') - { /* wait */ - return -KEY_wait; - } - - goto unknown; - - case 'r': - if (name[3] == 'n') - { /* warn */ - return -KEY_warn; - } - - goto unknown; - - default: - goto unknown; - } - - case 'h': - if (name[2] == 'e' && - name[3] == 'n') - { /* when */ - return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_when : 0); - } - - goto unknown; - - default: - goto unknown; - } - - default: - goto unknown; - } - - case 5: /* 39 tokens of length 5 */ - switch (name[0]) - { - case 'B': - if (name[1] == 'E' && - name[2] == 'G' && - name[3] == 'I' && - name[4] == 'N') - { /* BEGIN */ - return KEY_BEGIN; - } - - goto unknown; - - case 'C': - if (name[1] == 'H' && - name[2] == 'E' && - name[3] == 'C' && - name[4] == 'K') - { /* CHECK */ - return KEY_CHECK; - } - - goto unknown; - - case 'a': - switch (name[1]) - { - case 'l': - if (name[2] == 'a' && - name[3] == 'r' && - name[4] == 'm') - { /* alarm */ - return -KEY_alarm; - } - - goto unknown; - - case 't': - if (name[2] == 'a' && - name[3] == 'n' && - name[4] == '2') - { /* atan2 */ - return -KEY_atan2; - } - - goto unknown; - - default: - goto unknown; - } - - case 'b': - switch (name[1]) - { - case 'l': - if (name[2] == 'e' && - name[3] == 's' && - name[4] == 's') - { /* bless */ - return -KEY_bless; - } - - goto unknown; - - case 'r': - if (name[2] == 'e' && - name[3] == 'a' && - name[4] == 'k') - { /* break */ - return (all_keywords || FEATURE_IS_ENABLED("switch") ? -KEY_break : 0); - } - - goto unknown; - - default: - goto unknown; - } - - case 'c': - switch (name[1]) - { - case 'h': - switch (name[2]) - { - case 'd': - if (name[3] == 'i' && - name[4] == 'r') - { /* chdir */ - return -KEY_chdir; - } - - goto unknown; - - case 'm': - if (name[3] == 'o' && - name[4] == 'd') - { /* chmod */ - return -KEY_chmod; - } - - goto unknown; - - case 'o': - switch (name[3]) - { - case 'm': - if (name[4] == 'p') - { /* chomp */ - return -KEY_chomp; - } - - goto unknown; - - case 'w': - if (name[4] == 'n') - { /* chown */ - return -KEY_chown; - } - - goto unknown; - - default: - goto unknown; - } - - default: - goto unknown; - } - - case 'l': - if (name[2] == 'o' && - name[3] == 's' && - name[4] == 'e') - { /* close */ - return -KEY_close; - } - - goto unknown; - - case 'r': - if (name[2] == 'y' && - name[3] == 'p' && - name[4] == 't') - { /* crypt */ - return -KEY_crypt; - } - - goto unknown; - - default: - goto unknown; - } - - case 'e': - if (name[1] == 'l' && - name[2] == 's' && - name[3] == 'i' && - name[4] == 'f') - { /* elsif */ - return KEY_elsif; - } - - goto unknown; - - case 'f': - switch (name[1]) - { - case 'c': - if (name[2] == 'n' && - name[3] == 't' && - name[4] == 'l') - { /* fcntl */ - return -KEY_fcntl; - } - - goto unknown; - - case 'l': - if (name[2] == 'o' && - name[3] == 'c' && - name[4] == 'k') - { /* flock */ - return -KEY_flock; - } - - goto unknown; - - default: - goto unknown; - } - - case 'g': - if (name[1] == 'i' && - name[2] == 'v' && - name[3] == 'e' && - name[4] == 'n') - { /* given */ - return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_given : 0); - } - - goto unknown; - - case 'i': - switch (name[1]) - { - case 'n': - if (name[2] == 'd' && - name[3] == 'e' && - name[4] == 'x') - { /* index */ - return -KEY_index; - } - - goto unknown; - - case 'o': - if (name[2] == 'c' && - name[3] == 't' && - name[4] == 'l') - { /* ioctl */ - return -KEY_ioctl; - } - - goto unknown; - - default: - goto unknown; - } - - case 'l': - switch (name[1]) - { - case 'o': - if (name[2] == 'c' && - name[3] == 'a' && - name[4] == 'l') - { /* local */ - return KEY_local; - } - - goto unknown; - - case 's': - if (name[2] == 't' && - name[3] == 'a' && - name[4] == 't') - { /* lstat */ - return -KEY_lstat; - } - - goto unknown; - - default: - goto unknown; - } - - case 'm': - if (name[1] == 'k' && - name[2] == 'd' && - name[3] == 'i' && - name[4] == 'r') - { /* mkdir */ - return -KEY_mkdir; - } - - goto unknown; - - case 'p': - if (name[1] == 'r' && - name[2] == 'i' && - name[3] == 'n' && - name[4] == 't') - { /* print */ - return KEY_print; - } - - goto unknown; - - case 'r': - switch (name[1]) - { - case 'e': - if (name[2] == 's' && - name[3] == 'e' && - name[4] == 't') - { /* reset */ - return -KEY_reset; - } - - goto unknown; - - case 'm': - if (name[2] == 'd' && - name[3] == 'i' && - name[4] == 'r') - { /* rmdir */ - return -KEY_rmdir; - } - - goto unknown; - - default: - goto unknown; - } - - case 's': - switch (name[1]) - { - case 'e': - if (name[2] == 'm' && - name[3] == 'o' && - name[4] == 'p') - { /* semop */ - return -KEY_semop; - } - - goto unknown; - - case 'h': - if (name[2] == 'i' && - name[3] == 'f' && - name[4] == 't') - { /* shift */ - return -KEY_shift; - } - - goto unknown; - - case 'l': - if (name[2] == 'e' && - name[3] == 'e' && - name[4] == 'p') - { /* sleep */ - return -KEY_sleep; - } - - goto unknown; - - case 'p': - if (name[2] == 'l' && - name[3] == 'i' && - name[4] == 't') - { /* split */ - return KEY_split; - } - - goto unknown; - - case 'r': - if (name[2] == 'a' && - name[3] == 'n' && - name[4] == 'd') - { /* srand */ - return -KEY_srand; - } - - goto unknown; - - case 't': - switch (name[2]) - { - case 'a': - if (name[3] == 't' && - name[4] == 'e') - { /* state */ - return (all_keywords || FEATURE_IS_ENABLED("state") ? KEY_state : 0); - } - - goto unknown; - - case 'u': - if (name[3] == 'd' && - name[4] == 'y') - { /* study */ - return KEY_study; - } - - goto unknown; - - default: - goto unknown; - } - - default: - goto unknown; - } - - case 't': - if (name[1] == 'i' && - name[2] == 'm' && - name[3] == 'e' && - name[4] == 's') - { /* times */ - return -KEY_times; - } - - goto unknown; - - case 'u': - switch (name[1]) - { - case 'm': - if (name[2] == 'a' && - name[3] == 's' && - name[4] == 'k') - { /* umask */ - return -KEY_umask; - } - - goto unknown; - - case 'n': - switch (name[2]) - { - case 'd': - if (name[3] == 'e' && - name[4] == 'f') - { /* undef */ - return KEY_undef; - } - - goto unknown; - - case 't': - if (name[3] == 'i') - { - switch (name[4]) - { - case 'e': - { /* untie */ - return -KEY_untie; - } - - case 'l': - { /* until */ - return KEY_until; - } - - default: - goto unknown; - } - } - - goto unknown; - - default: - goto unknown; - } - - case 't': - if (name[2] == 'i' && - name[3] == 'm' && - name[4] == 'e') - { /* utime */ - return -KEY_utime; - } - - goto unknown; - - default: - goto unknown; - } - - case 'w': - switch (name[1]) - { - case 'h': - if (name[2] == 'i' && - name[3] == 'l' && - name[4] == 'e') - { /* while */ - return KEY_while; - } - - goto unknown; - - case 'r': - if (name[2] == 'i' && - name[3] == 't' && - name[4] == 'e') - { /* write */ - return -KEY_write; - } - - goto unknown; - - default: - goto unknown; - } - - default: - goto unknown; - } - - case 6: /* 33 tokens of length 6 */ - switch (name[0]) - { - case 'a': - if (name[1] == 'c' && - name[2] == 'c' && - name[3] == 'e' && - name[4] == 'p' && - name[5] == 't') - { /* accept */ - return -KEY_accept; - } - - goto unknown; - - case 'c': - switch (name[1]) - { - case 'a': - if (name[2] == 'l' && - name[3] == 'l' && - name[4] == 'e' && - name[5] == 'r') - { /* caller */ - return -KEY_caller; - } - - goto unknown; - - case 'h': - if (name[2] == 'r' && - name[3] == 'o' && - name[4] == 'o' && - name[5] == 't') - { /* chroot */ - return -KEY_chroot; - } - - goto unknown; - - default: - goto unknown; - } - - case 'd': - if (name[1] == 'e' && - name[2] == 'l' && - name[3] == 'e' && - name[4] == 't' && - name[5] == 'e') - { /* delete */ - return KEY_delete; - } - - goto unknown; - - case 'e': - switch (name[1]) - { - case 'l': - if (name[2] == 's' && - name[3] == 'e' && - name[4] == 'i' && - name[5] == 'f') - { /* elseif */ - Perl_ck_warner_d(aTHX_ packWARN(WARN_SYNTAX), "elseif should be elsif"); - } - - goto unknown; - - case 'x': - if (name[2] == 'i' && - name[3] == 's' && - name[4] == 't' && - name[5] == 's') - { /* exists */ - return KEY_exists; - } - - goto unknown; - - default: - goto unknown; - } - - case 'f': - switch (name[1]) - { - case 'i': - if (name[2] == 'l' && - name[3] == 'e' && - name[4] == 'n' && - name[5] == 'o') - { /* fileno */ - return -KEY_fileno; - } - - goto unknown; - - case 'o': - if (name[2] == 'r' && - name[3] == 'm' && - name[4] == 'a' && - name[5] == 't') - { /* format */ - return KEY_format; - } - - goto unknown; - - default: - goto unknown; - } - - case 'g': - if (name[1] == 'm' && - name[2] == 't' && - name[3] == 'i' && - name[4] == 'm' && - name[5] == 'e') - { /* gmtime */ - return -KEY_gmtime; - } - - goto unknown; - - case 'l': - switch (name[1]) - { - case 'e': - if (name[2] == 'n' && - name[3] == 'g' && - name[4] == 't' && - name[5] == 'h') - { /* length */ - return -KEY_length; - } - - goto unknown; - - case 'i': - if (name[2] == 's' && - name[3] == 't' && - name[4] == 'e' && - name[5] == 'n') - { /* listen */ - return -KEY_listen; - } - - goto unknown; - - default: - goto unknown; - } - - case 'm': - if (name[1] == 's' && - name[2] == 'g') - { - switch (name[3]) - { - case 'c': - if (name[4] == 't' && - name[5] == 'l') - { /* msgctl */ - return -KEY_msgctl; - } - - goto unknown; - - case 'g': - if (name[4] == 'e' && - name[5] == 't') - { /* msgget */ - return -KEY_msgget; - } - - goto unknown; - - case 'r': - if (name[4] == 'c' && - name[5] == 'v') - { /* msgrcv */ - return -KEY_msgrcv; - } - - goto unknown; - - case 's': - if (name[4] == 'n' && - name[5] == 'd') - { /* msgsnd */ - return -KEY_msgsnd; - } - - goto unknown; - - default: - goto unknown; - } - } - - goto unknown; - - case 'p': - if (name[1] == 'r' && - name[2] == 'i' && - name[3] == 'n' && - name[4] == 't' && - name[5] == 'f') - { /* printf */ - return KEY_printf; - } - - goto unknown; - - case 'r': - switch (name[1]) - { - case 'e': - switch (name[2]) - { - case 'n': - if (name[3] == 'a' && - name[4] == 'm' && - name[5] == 'e') - { /* rename */ - return -KEY_rename; - } - - goto unknown; - - case 't': - if (name[3] == 'u' && - name[4] == 'r' && - name[5] == 'n') - { /* return */ - return KEY_return; - } - - goto unknown; - - default: - goto unknown; - } - - case 'i': - if (name[2] == 'n' && - name[3] == 'd' && - name[4] == 'e' && - name[5] == 'x') - { /* rindex */ - return -KEY_rindex; - } - - goto unknown; - - default: - goto unknown; - } - - case 's': - switch (name[1]) - { - case 'c': - if (name[2] == 'a' && - name[3] == 'l' && - name[4] == 'a' && - name[5] == 'r') - { /* scalar */ - return KEY_scalar; - } - - goto unknown; - - case 'e': - switch (name[2]) - { - case 'l': - if (name[3] == 'e' && - name[4] == 'c' && - name[5] == 't') - { /* select */ - return -KEY_select; - } - - goto unknown; - - case 'm': - switch (name[3]) - { - case 'c': - if (name[4] == 't' && - name[5] == 'l') - { /* semctl */ - return -KEY_semctl; - } - - goto unknown; - - case 'g': - if (name[4] == 'e' && - name[5] == 't') - { /* semget */ - return -KEY_semget; - } - - goto unknown; - - default: - goto unknown; - } - - default: - goto unknown; - } - - case 'h': - if (name[2] == 'm') - { - switch (name[3]) - { - case 'c': - if (name[4] == 't' && - name[5] == 'l') - { /* shmctl */ - return -KEY_shmctl; - } - - goto unknown; - - case 'g': - if (name[4] == 'e' && - name[5] == 't') - { /* shmget */ - return -KEY_shmget; - } - - goto unknown; - - default: - goto unknown; - } - } - - goto unknown; - - case 'o': - if (name[2] == 'c' && - name[3] == 'k' && - name[4] == 'e' && - name[5] == 't') - { /* socket */ - return -KEY_socket; - } - - goto unknown; - - case 'p': - if (name[2] == 'l' && - name[3] == 'i' && - name[4] == 'c' && - name[5] == 'e') - { /* splice */ - return -KEY_splice; - } - - goto unknown; - - case 'u': - if (name[2] == 'b' && - name[3] == 's' && - name[4] == 't' && - name[5] == 'r') - { /* substr */ - return -KEY_substr; - } - - goto unknown; - - case 'y': - if (name[2] == 's' && - name[3] == 't' && - name[4] == 'e' && - name[5] == 'm') - { /* system */ - return -KEY_system; - } - - goto unknown; - - default: - goto unknown; - } - - case 'u': - if (name[1] == 'n') - { - switch (name[2]) - { - case 'l': - switch (name[3]) - { - case 'e': - if (name[4] == 's' && - name[5] == 's') - { /* unless */ - return KEY_unless; - } - - goto unknown; - - case 'i': - if (name[4] == 'n' && - name[5] == 'k') - { /* unlink */ - return -KEY_unlink; - } - - goto unknown; - - default: - goto unknown; - } - - case 'p': - if (name[3] == 'a' && - name[4] == 'c' && - name[5] == 'k') - { /* unpack */ - return -KEY_unpack; - } - - goto unknown; - - default: - goto unknown; - } - } - - goto unknown; - - case 'v': - if (name[1] == 'a' && - name[2] == 'l' && - name[3] == 'u' && - name[4] == 'e' && - name[5] == 's') - { /* values */ - return -KEY_values; - } - - goto unknown; - - default: - goto unknown; - } - - case 7: /* 29 tokens of length 7 */ - switch (name[0]) - { - case 'D': - if (name[1] == 'E' && - name[2] == 'S' && - name[3] == 'T' && - name[4] == 'R' && - name[5] == 'O' && - name[6] == 'Y') - { /* DESTROY */ - return KEY_DESTROY; - } - - goto unknown; - - case '_': - if (name[1] == '_' && - name[2] == 'E' && - name[3] == 'N' && - name[4] == 'D' && - name[5] == '_' && - name[6] == '_') - { /* __END__ */ - return KEY___END__; - } - - goto unknown; - - case 'b': - if (name[1] == 'i' && - name[2] == 'n' && - name[3] == 'm' && - name[4] == 'o' && - name[5] == 'd' && - name[6] == 'e') - { /* binmode */ - return -KEY_binmode; - } - - goto unknown; - - case 'c': - if (name[1] == 'o' && - name[2] == 'n' && - name[3] == 'n' && - name[4] == 'e' && - name[5] == 'c' && - name[6] == 't') - { /* connect */ - return -KEY_connect; - } - - goto unknown; - - case 'd': - switch (name[1]) - { - case 'b': - if (name[2] == 'm' && - name[3] == 'o' && - name[4] == 'p' && - name[5] == 'e' && - name[6] == 'n') - { /* dbmopen */ - return -KEY_dbmopen; - } - - goto unknown; - - case 'e': - if (name[2] == 'f') - { - switch (name[3]) - { - case 'a': - if (name[4] == 'u' && - name[5] == 'l' && - name[6] == 't') - { /* default */ - return (all_keywords || FEATURE_IS_ENABLED("switch") ? KEY_default : 0); - } - - goto unknown; - - case 'i': - if (name[4] == 'n' && - name[5] == 'e' && - name[6] == 'd') - { /* defined */ - return KEY_defined; - } - - goto unknown; - - default: - goto unknown; - } - } - - goto unknown; - - default: - goto unknown; - } - - case 'f': - if (name[1] == 'o' && - name[2] == 'r' && - name[3] == 'e' && - name[4] == 'a' && - name[5] == 'c' && - name[6] == 'h') - { /* foreach */ - return KEY_foreach; - } - - goto unknown; - - case 'g': - if (name[1] == 'e' && - name[2] == 't' && - name[3] == 'p') - { - switch (name[4]) - { - case 'g': - if (name[5] == 'r' && - name[6] == 'p') - { /* getpgrp */ - return -KEY_getpgrp; - } - - goto unknown; - - case 'p': - if (name[5] == 'i' && - name[6] == 'd') - { /* getppid */ - return -KEY_getppid; - } - - goto unknown; - - default: - goto unknown; - } - } - - goto unknown; - - case 'l': - if (name[1] == 'c' && - name[2] == 'f' && - name[3] == 'i' && - name[4] == 'r' && - name[5] == 's' && - name[6] == 't') - { /* lcfirst */ - return -KEY_lcfirst; - } - - goto unknown; - - case 'o': - if (name[1] == 'p' && - name[2] == 'e' && - name[3] == 'n' && - name[4] == 'd' && - name[5] == 'i' && - name[6] == 'r') - { /* opendir */ - return -KEY_opendir; - } - - goto unknown; - - case 'p': - if (name[1] == 'a' && - name[2] == 'c' && - name[3] == 'k' && - name[4] == 'a' && - name[5] == 'g' && - name[6] == 'e') - { /* package */ - return KEY_package; - } - - goto unknown; - - case 'r': - if (name[1] == 'e') - { - switch (name[2]) - { - case 'a': - if (name[3] == 'd' && - name[4] == 'd' && - name[5] == 'i' && - name[6] == 'r') - { /* readdir */ - return -KEY_readdir; - } - - goto unknown; - - case 'q': - if (name[3] == 'u' && - name[4] == 'i' && - name[5] == 'r' && - name[6] == 'e') - { /* require */ - return KEY_require; - } - - goto unknown; - - case 'v': - if (name[3] == 'e' && - name[4] == 'r' && - name[5] == 's' && - name[6] == 'e') - { /* reverse */ - return -KEY_reverse; - } - - goto unknown; - - default: - goto unknown; - } - } - - goto unknown; - - case 's': - switch (name[1]) - { - case 'e': - switch (name[2]) - { - case 'e': - if (name[3] == 'k' && - name[4] == 'd' && - name[5] == 'i' && - name[6] == 'r') - { /* seekdir */ - return -KEY_seekdir; - } - - goto unknown; - - case 't': - if (name[3] == 'p' && - name[4] == 'g' && - name[5] == 'r' && - name[6] == 'p') - { /* setpgrp */ - return -KEY_setpgrp; - } - - goto unknown; - - default: - goto unknown; - } - - case 'h': - if (name[2] == 'm' && - name[3] == 'r' && - name[4] == 'e' && - name[5] == 'a' && - name[6] == 'd') - { /* shmread */ - return -KEY_shmread; - } - - goto unknown; - - case 'p': - if (name[2] == 'r' && - name[3] == 'i' && - name[4] == 'n' && - name[5] == 't' && - name[6] == 'f') - { /* sprintf */ - return -KEY_sprintf; - } - - goto unknown; - - case 'y': - switch (name[2]) - { - case 'm': - if (name[3] == 'l' && - name[4] == 'i' && - name[5] == 'n' && - name[6] == 'k') - { /* symlink */ - return -KEY_symlink; - } - - goto unknown; - - case 's': - switch (name[3]) - { - case 'c': - if (name[4] == 'a' && - name[5] == 'l' && - name[6] == 'l') - { /* syscall */ - return -KEY_syscall; - } - - goto unknown; - - case 'o': - if (name[4] == 'p' && - name[5] == 'e' && - name[6] == 'n') - { /* sysopen */ - return -KEY_sysopen; - } - - goto unknown; - - case 'r': - if (name[4] == 'e' && - name[5] == 'a' && - name[6] == 'd') - { /* sysread */ - return -KEY_sysread; - } - - goto unknown; - - case 's': - if (name[4] == 'e' && - name[5] == 'e' && - name[6] == 'k') - { /* sysseek */ - return -KEY_sysseek; - } - - goto unknown; - - default: - goto unknown; - } - - default: - goto unknown; - } - - default: - goto unknown; - } - - case 't': - if (name[1] == 'e' && - name[2] == 'l' && - name[3] == 'l' && - name[4] == 'd' && - name[5] == 'i' && - name[6] == 'r') - { /* telldir */ - return -KEY_telldir; - } - - goto unknown; - - case 'u': - switch (name[1]) - { - case 'c': - if (name[2] == 'f' && - name[3] == 'i' && - name[4] == 'r' && - name[5] == 's' && - name[6] == 't') - { /* ucfirst */ - return -KEY_ucfirst; - } - - goto unknown; - - case 'n': - if (name[2] == 's' && - name[3] == 'h' && - name[4] == 'i' && - name[5] == 'f' && - name[6] == 't') - { /* unshift */ - return -KEY_unshift; - } - - goto unknown; - - default: - goto unknown; - } - - case 'w': - if (name[1] == 'a' && - name[2] == 'i' && - name[3] == 't' && - name[4] == 'p' && - name[5] == 'i' && - name[6] == 'd') - { /* waitpid */ - return -KEY_waitpid; - } - - goto unknown; - - default: - goto unknown; - } - - case 8: /* 26 tokens of length 8 */ - switch (name[0]) - { - case 'A': - if (name[1] == 'U' && - name[2] == 'T' && - name[3] == 'O' && - name[4] == 'L' && - name[5] == 'O' && - name[6] == 'A' && - name[7] == 'D') - { /* AUTOLOAD */ - return KEY_AUTOLOAD; - } - - goto unknown; - - case '_': - if (name[1] == '_') - { - switch (name[2]) - { - case 'D': - if (name[3] == 'A' && - name[4] == 'T' && - name[5] == 'A' && - name[6] == '_' && - name[7] == '_') - { /* __DATA__ */ - return KEY___DATA__; - } - - goto unknown; - - case 'F': - if (name[3] == 'I' && - name[4] == 'L' && - name[5] == 'E' && - name[6] == '_' && - name[7] == '_') - { /* __FILE__ */ - return -KEY___FILE__; - } - - goto unknown; - - case 'L': - if (name[3] == 'I' && - name[4] == 'N' && - name[5] == 'E' && - name[6] == '_' && - name[7] == '_') - { /* __LINE__ */ - return -KEY___LINE__; - } - - goto unknown; - - default: - goto unknown; - } - } - - goto unknown; - - case 'c': - switch (name[1]) - { - case 'l': - if (name[2] == 'o' && - name[3] == 's' && - name[4] == 'e' && - name[5] == 'd' && - name[6] == 'i' && - name[7] == 'r') - { /* closedir */ - return -KEY_closedir; - } - - goto unknown; - - case 'o': - if (name[2] == 'n' && - name[3] == 't' && - name[4] == 'i' && - name[5] == 'n' && - name[6] == 'u' && - name[7] == 'e') - { /* continue */ - return -KEY_continue; - } - - goto unknown; - - default: - goto unknown; - } - - case 'd': - if (name[1] == 'b' && - name[2] == 'm' && - name[3] == 'c' && - name[4] == 'l' && - name[5] == 'o' && - name[6] == 's' && - name[7] == 'e') - { /* dbmclose */ - return -KEY_dbmclose; - } - - goto unknown; - - case 'e': - if (name[1] == 'n' && - name[2] == 'd') - { - switch (name[3]) - { - case 'g': - if (name[4] == 'r' && - name[5] == 'e' && - name[6] == 'n' && - name[7] == 't') - { /* endgrent */ - return -KEY_endgrent; - } - - goto unknown; - - case 'p': - if (name[4] == 'w' && - name[5] == 'e' && - name[6] == 'n' && - name[7] == 't') - { /* endpwent */ - return -KEY_endpwent; - } - - goto unknown; - - default: - goto unknown; - } - } - - goto unknown; - - case 'f': - if (name[1] == 'o' && - name[2] == 'r' && - name[3] == 'm' && - name[4] == 'l' && - name[5] == 'i' && - name[6] == 'n' && - name[7] == 'e') - { /* formline */ - return -KEY_formline; - } - - goto unknown; - - case 'g': - if (name[1] == 'e' && - name[2] == 't') - { - switch (name[3]) - { - case 'g': - if (name[4] == 'r') - { - switch (name[5]) - { - case 'e': - if (name[6] == 'n' && - name[7] == 't') - { /* getgrent */ - return -KEY_getgrent; - } - - goto unknown; - - case 'g': - if (name[6] == 'i' && - name[7] == 'd') - { /* getgrgid */ - return -KEY_getgrgid; - } - - goto unknown; - - case 'n': - if (name[6] == 'a' && - name[7] == 'm') - { /* getgrnam */ - return -KEY_getgrnam; - } - - goto unknown; - - default: - goto unknown; - } - } - - goto unknown; - - case 'l': - if (name[4] == 'o' && - name[5] == 'g' && - name[6] == 'i' && - name[7] == 'n') - { /* getlogin */ - return -KEY_getlogin; - } - - goto unknown; - - case 'p': - if (name[4] == 'w') - { - switch (name[5]) - { - case 'e': - if (name[6] == 'n' && - name[7] == 't') - { /* getpwent */ - return -KEY_getpwent; - } - - goto unknown; - - case 'n': - if (name[6] == 'a' && - name[7] == 'm') - { /* getpwnam */ - return -KEY_getpwnam; - } - - goto unknown; - - case 'u': - if (name[6] == 'i' && - name[7] == 'd') - { /* getpwuid */ - return -KEY_getpwuid; - } - - goto unknown; - - default: - goto unknown; - } - } - - goto unknown; - - default: - goto unknown; - } - } - - goto unknown; - - case 'r': - if (name[1] == 'e' && - name[2] == 'a' && - name[3] == 'd') - { - switch (name[4]) - { - case 'l': - if (name[5] == 'i' && - name[6] == 'n') - { - switch (name[7]) - { - case 'e': - { /* readline */ - return -KEY_readline; - } - - case 'k': - { /* readlink */ - return -KEY_readlink; - } - - default: - goto unknown; - } - } - - goto unknown; - - case 'p': - if (name[5] == 'i' && - name[6] == 'p' && - name[7] == 'e') - { /* readpipe */ - return -KEY_readpipe; - } - - goto unknown; - - default: - goto unknown; - } - } - - goto unknown; - - case 's': - switch (name[1]) - { - case 'e': - if (name[2] == 't') - { - switch (name[3]) - { - case 'g': - if (name[4] == 'r' && - name[5] == 'e' && - name[6] == 'n' && - name[7] == 't') - { /* setgrent */ - return -KEY_setgrent; - } - - goto unknown; - - case 'p': - if (name[4] == 'w' && - name[5] == 'e' && - name[6] == 'n' && - name[7] == 't') - { /* setpwent */ - return -KEY_setpwent; - } - - goto unknown; - - default: - goto unknown; - } - } - - goto unknown; - - case 'h': - switch (name[2]) - { - case 'm': - if (name[3] == 'w' && - name[4] == 'r' && - name[5] == 'i' && - name[6] == 't' && - name[7] == 'e') - { /* shmwrite */ - return -KEY_shmwrite; - } - - goto unknown; - - case 'u': - if (name[3] == 't' && - name[4] == 'd' && - name[5] == 'o' && - name[6] == 'w' && - name[7] == 'n') - { /* shutdown */ - return -KEY_shutdown; - } - - goto unknown; - - default: - goto unknown; - } - - case 'y': - if (name[2] == 's' && - name[3] == 'w' && - name[4] == 'r' && - name[5] == 'i' && - name[6] == 't' && - name[7] == 'e') - { /* syswrite */ - return -KEY_syswrite; - } - - goto unknown; - - default: - goto unknown; - } - - case 't': - if (name[1] == 'r' && - name[2] == 'u' && - name[3] == 'n' && - name[4] == 'c' && - name[5] == 'a' && - name[6] == 't' && - name[7] == 'e') - { /* truncate */ - return -KEY_truncate; - } - - goto unknown; - - default: - goto unknown; - } - - case 9: /* 9 tokens of length 9 */ - switch (name[0]) - { - case 'U': - if (name[1] == 'N' && - name[2] == 'I' && - name[3] == 'T' && - name[4] == 'C' && - name[5] == 'H' && - name[6] == 'E' && - name[7] == 'C' && - name[8] == 'K') - { /* UNITCHECK */ - return KEY_UNITCHECK; - } - - goto unknown; - - case 'e': - if (name[1] == 'n' && - name[2] == 'd' && - name[3] == 'n' && - name[4] == 'e' && - name[5] == 't' && - name[6] == 'e' && - name[7] == 'n' && - name[8] == 't') - { /* endnetent */ - return -KEY_endnetent; - } - - goto unknown; - - case 'g': - if (name[1] == 'e' && - name[2] == 't' && - name[3] == 'n' && - name[4] == 'e' && - name[5] == 't' && - name[6] == 'e' && - name[7] == 'n' && - name[8] == 't') - { /* getnetent */ - return -KEY_getnetent; - } - - goto unknown; - - case 'l': - if (name[1] == 'o' && - name[2] == 'c' && - name[3] == 'a' && - name[4] == 'l' && - name[5] == 't' && - name[6] == 'i' && - name[7] == 'm' && - name[8] == 'e') - { /* localtime */ - return -KEY_localtime; - } - - goto unknown; - - case 'p': - if (name[1] == 'r' && - name[2] == 'o' && - name[3] == 't' && - name[4] == 'o' && - name[5] == 't' && - name[6] == 'y' && - name[7] == 'p' && - name[8] == 'e') - { /* prototype */ - return KEY_prototype; - } - - goto unknown; - - case 'q': - if (name[1] == 'u' && - name[2] == 'o' && - name[3] == 't' && - name[4] == 'e' && - name[5] == 'm' && - name[6] == 'e' && - name[7] == 't' && - name[8] == 'a') - { /* quotemeta */ - return -KEY_quotemeta; - } - - goto unknown; - - case 'r': - if (name[1] == 'e' && - name[2] == 'w' && - name[3] == 'i' && - name[4] == 'n' && - name[5] == 'd' && - name[6] == 'd' && - name[7] == 'i' && - name[8] == 'r') - { /* rewinddir */ - return -KEY_rewinddir; - } - - goto unknown; - - case 's': - if (name[1] == 'e' && - name[2] == 't' && - name[3] == 'n' && - name[4] == 'e' && - name[5] == 't' && - name[6] == 'e' && - name[7] == 'n' && - name[8] == 't') - { /* setnetent */ - return -KEY_setnetent; - } - - goto unknown; - - case 'w': - if (name[1] == 'a' && - name[2] == 'n' && - name[3] == 't' && - name[4] == 'a' && - name[5] == 'r' && - name[6] == 'r' && - name[7] == 'a' && - name[8] == 'y') - { /* wantarray */ - return -KEY_wantarray; - } - - goto unknown; - - default: - goto unknown; - } - - case 10: /* 9 tokens of length 10 */ - switch (name[0]) - { - case 'e': - if (name[1] == 'n' && - name[2] == 'd') - { - switch (name[3]) - { - case 'h': - if (name[4] == 'o' && - name[5] == 's' && - name[6] == 't' && - name[7] == 'e' && - name[8] == 'n' && - name[9] == 't') - { /* endhostent */ - return -KEY_endhostent; - } - - goto unknown; - - case 's': - if (name[4] == 'e' && - name[5] == 'r' && - name[6] == 'v' && - name[7] == 'e' && - name[8] == 'n' && - name[9] == 't') - { /* endservent */ - return -KEY_endservent; - } - - goto unknown; - - default: - goto unknown; - } - } - - goto unknown; - - case 'g': - if (name[1] == 'e' && - name[2] == 't') - { - switch (name[3]) - { - case 'h': - if (name[4] == 'o' && - name[5] == 's' && - name[6] == 't' && - name[7] == 'e' && - name[8] == 'n' && - name[9] == 't') - { /* gethostent */ - return -KEY_gethostent; - } - - goto unknown; - - case 's': - switch (name[4]) - { - case 'e': - if (name[5] == 'r' && - name[6] == 'v' && - name[7] == 'e' && - name[8] == 'n' && - name[9] == 't') - { /* getservent */ - return -KEY_getservent; - } - - goto unknown; - - case 'o': - if (name[5] == 'c' && - name[6] == 'k' && - name[7] == 'o' && - name[8] == 'p' && - name[9] == 't') - { /* getsockopt */ - return -KEY_getsockopt; - } - - goto unknown; - - default: - goto unknown; - } - - default: - goto unknown; - } - } - - goto unknown; - - case 's': - switch (name[1]) - { - case 'e': - if (name[2] == 't') - { - switch (name[3]) - { - case 'h': - if (name[4] == 'o' && - name[5] == 's' && - name[6] == 't' && - name[7] == 'e' && - name[8] == 'n' && - name[9] == 't') - { /* sethostent */ - return -KEY_sethostent; - } - - goto unknown; - - case 's': - switch (name[4]) - { - case 'e': - if (name[5] == 'r' && - name[6] == 'v' && - name[7] == 'e' && - name[8] == 'n' && - name[9] == 't') - { /* setservent */ - return -KEY_setservent; - } - - goto unknown; - - case 'o': - if (name[5] == 'c' && - name[6] == 'k' && - name[7] == 'o' && - name[8] == 'p' && - name[9] == 't') - { /* setsockopt */ - return -KEY_setsockopt; - } - - goto unknown; - - default: - goto unknown; - } - - default: - goto unknown; - } - } - - goto unknown; - - case 'o': - if (name[2] == 'c' && - name[3] == 'k' && - name[4] == 'e' && - name[5] == 't' && - name[6] == 'p' && - name[7] == 'a' && - name[8] == 'i' && - name[9] == 'r') - { /* socketpair */ - return -KEY_socketpair; - } - - goto unknown; - - default: - goto unknown; - } - - default: - goto unknown; - } - - case 11: /* 8 tokens of length 11 */ - switch (name[0]) - { - case '_': - if (name[1] == '_' && - name[2] == 'P' && - name[3] == 'A' && - name[4] == 'C' && - name[5] == 'K' && - name[6] == 'A' && - name[7] == 'G' && - name[8] == 'E' && - name[9] == '_' && - name[10] == '_') - { /* __PACKAGE__ */ - return -KEY___PACKAGE__; - } - - goto unknown; - - case 'e': - if (name[1] == 'n' && - name[2] == 'd' && - name[3] == 'p' && - name[4] == 'r' && - name[5] == 'o' && - name[6] == 't' && - name[7] == 'o' && - name[8] == 'e' && - name[9] == 'n' && - name[10] == 't') - { /* endprotoent */ - return -KEY_endprotoent; - } - - goto unknown; - - case 'g': - if (name[1] == 'e' && - name[2] == 't') - { - switch (name[3]) - { - case 'p': - switch (name[4]) - { - case 'e': - if (name[5] == 'e' && - name[6] == 'r' && - name[7] == 'n' && - name[8] == 'a' && - name[9] == 'm' && - name[10] == 'e') - { /* getpeername */ - return -KEY_getpeername; - } - - goto unknown; - - case 'r': - switch (name[5]) - { - case 'i': - if (name[6] == 'o' && - name[7] == 'r' && - name[8] == 'i' && - name[9] == 't' && - name[10] == 'y') - { /* getpriority */ - return -KEY_getpriority; - } - - goto unknown; - - case 'o': - if (name[6] == 't' && - name[7] == 'o' && - name[8] == 'e' && - name[9] == 'n' && - name[10] == 't') - { /* getprotoent */ - return -KEY_getprotoent; - } - - goto unknown; - - default: - goto unknown; - } - - default: - goto unknown; - } - - case 's': - if (name[4] == 'o' && - name[5] == 'c' && - name[6] == 'k' && - name[7] == 'n' && - name[8] == 'a' && - name[9] == 'm' && - name[10] == 'e') - { /* getsockname */ - return -KEY_getsockname; - } - - goto unknown; - - default: - goto unknown; - } - } - - goto unknown; - - case 's': - if (name[1] == 'e' && - name[2] == 't' && - name[3] == 'p' && - name[4] == 'r') - { - switch (name[5]) - { - case 'i': - if (name[6] == 'o' && - name[7] == 'r' && - name[8] == 'i' && - name[9] == 't' && - name[10] == 'y') - { /* setpriority */ - return -KEY_setpriority; - } - - goto unknown; - - case 'o': - if (name[6] == 't' && - name[7] == 'o' && - name[8] == 'e' && - name[9] == 'n' && - name[10] == 't') - { /* setprotoent */ - return -KEY_setprotoent; - } - - goto unknown; - - default: - goto unknown; - } - } - - goto unknown; - - default: - goto unknown; - } - - case 12: /* 2 tokens of length 12 */ - if (name[0] == 'g' && - name[1] == 'e' && - name[2] == 't' && - name[3] == 'n' && - name[4] == 'e' && - name[5] == 't' && - name[6] == 'b' && - name[7] == 'y') - { - switch (name[8]) - { - case 'a': - if (name[9] == 'd' && - name[10] == 'd' && - name[11] == 'r') - { /* getnetbyaddr */ - return -KEY_getnetbyaddr; - } - - goto unknown; - - case 'n': - if (name[9] == 'a' && - name[10] == 'm' && - name[11] == 'e') - { /* getnetbyname */ - return -KEY_getnetbyname; - } - - goto unknown; - - default: - goto unknown; - } - } - - goto unknown; - - case 13: /* 4 tokens of length 13 */ - if (name[0] == 'g' && - name[1] == 'e' && - name[2] == 't') - { - switch (name[3]) - { - case 'h': - if (name[4] == 'o' && - name[5] == 's' && - name[6] == 't' && - name[7] == 'b' && - name[8] == 'y') - { - switch (name[9]) - { - case 'a': - if (name[10] == 'd' && - name[11] == 'd' && - name[12] == 'r') - { /* gethostbyaddr */ - return -KEY_gethostbyaddr; - } - - goto unknown; - - case 'n': - if (name[10] == 'a' && - name[11] == 'm' && - name[12] == 'e') - { /* gethostbyname */ - return -KEY_gethostbyname; - } - - goto unknown; - - default: - goto unknown; - } - } - - goto unknown; - - case 's': - if (name[4] == 'e' && - name[5] == 'r' && - name[6] == 'v' && - name[7] == 'b' && - name[8] == 'y') - { - switch (name[9]) - { - case 'n': - if (name[10] == 'a' && - name[11] == 'm' && - name[12] == 'e') - { /* getservbyname */ - return -KEY_getservbyname; - } - - goto unknown; - - case 'p': - if (name[10] == 'o' && - name[11] == 'r' && - name[12] == 't') - { /* getservbyport */ - return -KEY_getservbyport; - } - - goto unknown; - - default: - goto unknown; - } - } - - goto unknown; - - default: - goto unknown; - } - } - - goto unknown; - - case 14: /* 1 tokens of length 14 */ - if (name[0] == 'g' && - name[1] == 'e' && - name[2] == 't' && - name[3] == 'p' && - name[4] == 'r' && - name[5] == 'o' && - name[6] == 't' && - name[7] == 'o' && - name[8] == 'b' && - name[9] == 'y' && - name[10] == 'n' && - name[11] == 'a' && - name[12] == 'm' && - name[13] == 'e') - { /* getprotobyname */ - return -KEY_getprotobyname; - } - - goto unknown; - - case 16: /* 1 tokens of length 16 */ - if (name[0] == 'g' && - name[1] == 'e' && - name[2] == 't' && - name[3] == 'p' && - name[4] == 'r' && - name[5] == 'o' && - name[6] == 't' && - name[7] == 'o' && - name[8] == 'b' && - name[9] == 'y' && - name[10] == 'n' && - name[11] == 'u' && - name[12] == 'm' && - name[13] == 'b' && - name[14] == 'e' && - name[15] == 'r') - { /* getprotobynumber */ - return -KEY_getprotobynumber; - } - - goto unknown; - - default: - goto unknown; - } - -unknown: - return 0; -} - STATIC void S_checkcomma(pTHX_ const char *s, const char *name, const char *what) { @@ -11854,6 +8708,7 @@ S_scan_ident(pTHX_ register char *s, register const char *send, char *dest, STRL } bracket++; PL_lex_brackstack[PL_lex_brackets++] = (char)(XOPERATOR | XFAKEBRACK); + PL_lex_allbrackets++; return s; } } @@ -11906,7 +8761,7 @@ S_pmflag(U32 pmfl, const char ch) { case GLOBAL_PAT_MOD: pmfl |= PMf_GLOBAL; break; case CONTINUE_PAT_MOD: pmfl |= PMf_CONTINUE; break; case ONCE_PAT_MOD: pmfl |= PMf_KEEP; break; - case KEEPCOPY_PAT_MOD: pmfl |= PMf_KEEPCOPY; break; + case KEEPCOPY_PAT_MOD: pmfl |= RXf_PMf_KEEPCOPY; break; case NONDESTRUCT_PAT_MOD: pmfl |= PMf_NONDESTRUCT; break; } return pmfl; @@ -13993,32 +10848,181 @@ Perl_keyword_plugin_standard(pTHX_ return KEYWORD_PLUGIN_DECLINE; } -#define parse_recdescent(g) S_parse_recdescent(aTHX_ g) +#define parse_recdescent(g,p) S_parse_recdescent(aTHX_ g,p) static void -S_parse_recdescent(pTHX_ int gramtype) +S_parse_recdescent(pTHX_ int gramtype, I32 fakeeof) { SAVEI32(PL_lex_brackets); if (PL_lex_brackets > 100) Renew(PL_lex_brackstack, PL_lex_brackets + 10, char); PL_lex_brackstack[PL_lex_brackets++] = XFAKEEOF; + SAVEI32(PL_lex_allbrackets); + PL_lex_allbrackets = 0; + SAVEI8(PL_lex_fakeeof); + PL_lex_fakeeof = (U8)fakeeof; if(yyparse(gramtype) && !PL_parser->error_count) qerror(Perl_mess(aTHX_ "Parse error")); } -#define parse_recdescent_for_op(g) S_parse_recdescent_for_op(aTHX_ g) +#define parse_recdescent_for_op(g,p) S_parse_recdescent_for_op(aTHX_ g,p) static OP * -S_parse_recdescent_for_op(pTHX_ int gramtype) +S_parse_recdescent_for_op(pTHX_ int gramtype, I32 fakeeof) { OP *o; ENTER; SAVEVPTR(PL_eval_root); PL_eval_root = NULL; - parse_recdescent(gramtype); + parse_recdescent(gramtype, fakeeof); o = PL_eval_root; LEAVE; return o; } +#define parse_expr(p,f) S_parse_expr(aTHX_ p,f) +static OP * +S_parse_expr(pTHX_ I32 fakeeof, U32 flags) +{ + OP *exprop; + if (flags & ~PARSE_OPTIONAL) + Perl_croak(aTHX_ "Parsing code internal error (%s)", "parse_expr"); + exprop = parse_recdescent_for_op(GRAMEXPR, fakeeof); + if (!exprop && !(flags & PARSE_OPTIONAL)) { + if (!PL_parser->error_count) + qerror(Perl_mess(aTHX_ "Parse error")); + exprop = newOP(OP_NULL, 0); + } + return exprop; +} + +/* +=for apidoc Amx|OP *|parse_arithexpr|U32 flags + +Parse a Perl arithmetic expression. This may contain operators of precedence +down to the bit shift operators. The expression must be followed (and thus +terminated) either by a comparison or lower-precedence operator or by +something that would normally terminate an expression such as semicolon. +If I includes C then the expression is optional, +otherwise it is mandatory. It is up to the caller to ensure that the +dynamic parser state (L et al) is correctly set to reflect +the source of the code to be parsed and the lexical context for the +expression. + +The op tree representing the expression is returned. If an optional +expression is absent, a null pointer is returned, otherwise the pointer +will be non-null. + +If an error occurs in parsing or compilation, in most cases a valid op +tree is returned anyway. The error is reflected in the parser state, +normally resulting in a single exception at the top level of parsing +which covers all the compilation errors that occurred. Some compilation +errors, however, will throw an exception immediately. + +=cut +*/ + +OP * +Perl_parse_arithexpr(pTHX_ U32 flags) +{ + return parse_expr(LEX_FAKEEOF_COMPARE, flags); +} + +/* +=for apidoc Amx|OP *|parse_termexpr|U32 flags + +Parse a Perl term expression. This may contain operators of precedence +down to the assignment operators. The expression must be followed (and thus +terminated) either by a comma or lower-precedence operator or by +something that would normally terminate an expression such as semicolon. +If I includes C then the expression is optional, +otherwise it is mandatory. It is up to the caller to ensure that the +dynamic parser state (L et al) is correctly set to reflect +the source of the code to be parsed and the lexical context for the +expression. + +The op tree representing the expression is returned. If an optional +expression is absent, a null pointer is returned, otherwise the pointer +will be non-null. + +If an error occurs in parsing or compilation, in most cases a valid op +tree is returned anyway. The error is reflected in the parser state, +normally resulting in a single exception at the top level of parsing +which covers all the compilation errors that occurred. Some compilation +errors, however, will throw an exception immediately. + +=cut +*/ + +OP * +Perl_parse_termexpr(pTHX_ U32 flags) +{ + return parse_expr(LEX_FAKEEOF_COMMA, flags); +} + +/* +=for apidoc Amx|OP *|parse_listexpr|U32 flags + +Parse a Perl list expression. This may contain operators of precedence +down to the comma operator. The expression must be followed (and thus +terminated) either by a low-precedence logic operator such as C or by +something that would normally terminate an expression such as semicolon. +If I includes C then the expression is optional, +otherwise it is mandatory. It is up to the caller to ensure that the +dynamic parser state (L et al) is correctly set to reflect +the source of the code to be parsed and the lexical context for the +expression. + +The op tree representing the expression is returned. If an optional +expression is absent, a null pointer is returned, otherwise the pointer +will be non-null. + +If an error occurs in parsing or compilation, in most cases a valid op +tree is returned anyway. The error is reflected in the parser state, +normally resulting in a single exception at the top level of parsing +which covers all the compilation errors that occurred. Some compilation +errors, however, will throw an exception immediately. + +=cut +*/ + +OP * +Perl_parse_listexpr(pTHX_ U32 flags) +{ + return parse_expr(LEX_FAKEEOF_LOWLOGIC, flags); +} + +/* +=for apidoc Amx|OP *|parse_fullexpr|U32 flags + +Parse a single complete Perl expression. This allows the full +expression grammar, including the lowest-precedence operators such +as C. The expression must be followed (and thus terminated) by a +token that an expression would normally be terminated by: end-of-file, +closing bracketing punctuation, semicolon, or one of the keywords that +signals a postfix expression-statement modifier. If I includes +C then the expression is optional, otherwise it is +mandatory. It is up to the caller to ensure that the dynamic parser +state (L et al) is correctly set to reflect the source of +the code to be parsed and the lexical context for the expression. + +The op tree representing the expression is returned. If an optional +expression is absent, a null pointer is returned, otherwise the pointer +will be non-null. + +If an error occurs in parsing or compilation, in most cases a valid op +tree is returned anyway. The error is reflected in the parser state, +normally resulting in a single exception at the top level of parsing +which covers all the compilation errors that occurred. Some compilation +errors, however, will throw an exception immediately. + +=cut +*/ + +OP * +Perl_parse_fullexpr(pTHX_ U32 flags) +{ + return parse_expr(LEX_FAKEEOF_NONEXPR, flags); +} + /* =for apidoc Amx|OP *|parse_block|U32 flags @@ -14052,7 +11056,7 @@ Perl_parse_block(pTHX_ U32 flags) { if (flags) Perl_croak(aTHX_ "Parsing code internal error (%s)", "parse_block"); - return parse_recdescent_for_op(GRAMBLOCK); + return parse_recdescent_for_op(GRAMBLOCK, LEX_FAKEEOF_NEVER); } /* @@ -14090,7 +11094,7 @@ Perl_parse_barestmt(pTHX_ U32 flags) { if (flags) Perl_croak(aTHX_ "Parsing code internal error (%s)", "parse_barestmt"); - return parse_recdescent_for_op(GRAMBARESTMT); + return parse_recdescent_for_op(GRAMBARESTMT, LEX_FAKEEOF_NEVER); } /* @@ -14178,7 +11182,7 @@ Perl_parse_label(pTHX_ U32 flags) Parse a single complete Perl statement. This may be a normal imperative statement or a declaration that has compile-time effect, and may include -an optional label. It is up to the caller to ensure that the dynamic +optional labels. It is up to the caller to ensure that the dynamic parser state (L et al) is correctly set to reflect the source of the code to be parsed and the lexical context for the statement. @@ -14205,7 +11209,7 @@ Perl_parse_fullstmt(pTHX_ U32 flags) { if (flags) Perl_croak(aTHX_ "Parsing code internal error (%s)", "parse_fullstmt"); - return parse_recdescent_for_op(GRAMFULLSTMT); + return parse_recdescent_for_op(GRAMFULLSTMT, LEX_FAKEEOF_NEVER); } /* @@ -14244,8 +11248,8 @@ Perl_parse_stmtseq(pTHX_ U32 flags) OP *stmtseqop; I32 c; if (flags) - Perl_croak(aTHX_ "Parsing code internal error (%s)", "parse_fullstmt"); - stmtseqop = parse_recdescent_for_op(GRAMSTMTSEQ); + Perl_croak(aTHX_ "Parsing code internal error (%s)", "parse_stmtseq"); + stmtseqop = parse_recdescent_for_op(GRAMSTMTSEQ, LEX_FAKEEOF_CLOSING); c = lex_peek_unichar(0); if (c != -1 && c != /*{*/'}') qerror(Perl_mess(aTHX_ "Parse error")); @@ -14257,7 +11261,7 @@ Perl_munge_qwlist_to_paren_list(pTHX_ OP *qwlist) { PERL_ARGS_ASSERT_MUNGE_QWLIST_TO_PAREN_LIST; deprecate("qw(...) as parentheses"); - force_next(')'); + force_next((4<<24)|')'); if (qwlist->op_type == OP_STUB) { op_free(qwlist); } @@ -14266,7 +11270,7 @@ Perl_munge_qwlist_to_paren_list(pTHX_ OP *qwlist) NEXTVAL_NEXTTOKE.opval = qwlist; force_next(THING); } - force_next('('); + force_next((2<<24)|'('); } /*