From: Dave Mitchell Date: Sun, 31 Dec 2006 18:56:37 +0000 (+0000) Subject: in lex_start(), ensure that all lexer state vars are saved X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=02b34bbea1ac385edebf3102d8f728a3ff73dbfc;p=p5sagit%2Fp5-mst-13.2.git in lex_start(), ensure that all lexer state vars are saved and re-initialised. This is mostly overkill, but mimicks the effect of having all the vars in a single parser object. p4raw-id: //depot/perl@29648 --- diff --git a/toke.c b/toke.c index 7166194..7277d89 100644 --- a/toke.c +++ b/toke.c @@ -599,17 +599,17 @@ Perl_lex_start(pTHX_ SV *line) } SAVEI32(PL_lasttoke); } - if (PL_madskills) { - SAVESPTR(PL_thistoken); - SAVESPTR(PL_thiswhite); - SAVESPTR(PL_nextwhite); - SAVESPTR(PL_thisopen); - SAVESPTR(PL_thisclose); - SAVESPTR(PL_thisstuff); - SAVEVPTR(PL_thismad); - SAVEI32(PL_realtokenstart); - SAVEI32(PL_faketokens); - } + SAVESPTR(PL_endwhite); + SAVESPTR(PL_thistoken); + SAVESPTR(PL_thiswhite); + SAVESPTR(PL_nextwhite); + SAVESPTR(PL_thisopen); + SAVESPTR(PL_thisclose); + SAVESPTR(PL_thisstuff); + SAVEVPTR(PL_thismad); + SAVEI32(PL_realtokenstart); + SAVEI32(PL_faketokens); + SAVESPTR(PL_skipwhite); SAVEI32(PL_curforce); #else if (PL_lex_state == LEX_KNOWNEXT) { @@ -636,9 +636,20 @@ Perl_lex_start(pTHX_ SV *line) SAVESPTR(PL_lex_stuff); SAVEI32(PL_lex_defer); SAVEI32(PL_sublex_info.sub_inwhat); + SAVEI32(PL_sublex_info.super_state); + SAVEVPTR(PL_sublex_info.sub_op); + SAVEPPTR(PL_sublex_info.super_bufptr); + SAVEPPTR(PL_sublex_info.super_bufend); SAVESPTR(PL_lex_repl); SAVEINT(PL_expect); SAVEINT(PL_lex_expect); + SAVEI32(PL_lex_formbrack); + SAVEVPTR(PL_lex_op); + SAVEI32(PL_multi_close); + SAVEI32(PL_multi_open); + SAVEI32(PL_multi_start); + SAVEI8(PL_pending_ident); + SAVEBOOL(PL_preambled); PL_lex_state = LEX_NORMAL; PL_lex_defer = 0; @@ -655,11 +666,35 @@ Perl_lex_start(pTHX_ SV *line) PL_lex_inpat = 0; #ifdef PERL_MAD PL_lasttoke = 0; + PL_endwhite = NULL; + PL_faketokens = 0; + PL_nextwhite = NULL; + PL_realtokenstart = 0; + PL_skipwhite = NULL; + PL_thisclose = NULL; + PL_thisopen = NULL; + PL_thisstuff = NULL; + PL_thistoken = NULL; + PL_thiswhite = NULL; + PL_thismad = NULL; #else PL_nexttoke = 0; #endif PL_lex_inwhat = 0; PL_sublex_info.sub_inwhat = 0; + PL_sublex_info.super_state = 0; + PL_sublex_info.sub_op = NULL; + PL_sublex_info.super_bufptr = NULL; + PL_sublex_info.super_bufend = NULL; + PL_lex_expect = 0; + PL_lex_formbrack = 0; + PL_lex_op = NULL; + PL_multi_close = 0; + PL_multi_open = 0; + PL_multi_start = 0; + PL_pending_ident = '\0'; + PL_preambled = FALSE; + if (line) { s = SvPV_const(line, len); } else { @@ -1279,11 +1314,12 @@ S_newSV_maybe_utf8(pTHX_ const char *start, STRLEN len) * S_force_word * When the lexer knows the next thing is a word (for instance, it has * just seen -> and it knows that the next char is a word char, then - * it calls S_force_word to stick the next word into the PL_next lookahead. + * it calls S_force_word to stick the next word into the PL_nexttoke/val + * lookahead. * * Arguments: * char *start : buffer position (must be within PL_linestr) - * int token : PL_next will be this type of bare word (e.g., METHOD,WORD) + * int token : PL_next* will be this type of bare word (e.g., METHOD,WORD) * int check_keyword : if true, Perl checks to make sure the word isn't * a keyword (do this if the word is a label, e.g. goto FOO) * int allow_pack : if true, : characters will also be allowed (require,