From bfbd5f7e35650613ff4e802aa1facdf2b3aa3044 Mon Sep 17 00:00:00 2001 From: Karl Williamson Date: Wed, 8 Oct 2025 05:13:50 -0600 Subject: [PATCH] toke.c: Use flags parameter for S_force_word This makes it clear at each call point what is happening, instead of having to jump to the S_force_word definition to know what 'false, true' vs 'true, false' actually means. And this prepares for future commits. --- embed.fnc | 3 +-- embed.h | 2 +- proto.h | 2 +- toke.c | 28 +++++++++++++++++----------- 4 files changed, 20 insertions(+), 15 deletions(-) diff --git a/embed.fnc b/embed.fnc index 53274297b7..60edc5d79f 100644 --- a/embed.fnc +++ b/embed.fnc @@ -6142,8 +6142,7 @@ S |char * |force_version |NN char *s \ |int guessing S |char * |force_word |NN char *start \ |int token \ - |int check_keyword \ - |int allow_pack + |U32 flags RS |SV * |get_and_check_backslash_N_name_wrapper \ |SPTR const char *s \ |EPTRQ const char * const e diff --git a/embed.h b/embed.h index e23ead8488..7771d44b3b 100644 --- a/embed.h +++ b/embed.h @@ -1680,7 +1680,7 @@ # define force_next(a) S_force_next(aTHX_ a) # define force_strict_version(a) S_force_strict_version(aTHX_ a) # define force_version(a,b) S_force_version(aTHX_ a,b) -# define force_word(a,b,c,d) S_force_word(aTHX_ a,b,c,d) +# define force_word(a,b,c) S_force_word(aTHX_ a,b,c) # define get_and_check_backslash_N_name_wrapper(a,b) S_get_and_check_backslash_N_name_wrapper(aTHX_ a,b) # define incline(a,b) S_incline(aTHX_ a,b) # define intuit_method(a,b,c) S_intuit_method(aTHX_ a,b,c) diff --git a/proto.h b/proto.h index b7c6fc438b..30fab02161 100644 --- a/proto.h +++ b/proto.h @@ -9421,7 +9421,7 @@ S_force_version(pTHX_ char *s, int guessing); assert(s) STATIC char * -S_force_word(pTHX_ char *start, int token, int check_keyword, int allow_pack); +S_force_word(pTHX_ char *start, int token, U32 flags); # define PERL_ARGS_ASSERT_FORCE_WORD \ assert(start) diff --git a/toke.c b/toke.c index 2669a77221..dabb7300ad 100644 --- a/toke.c +++ b/toke.c @@ -173,6 +173,10 @@ static const char ident_var_zero_multi_digit[] = "Numeric variables with more th */ #define YYL_RETRY (-1) +/* Bits in the flags parameter of various functions */ +#define CHECK_KEYWORD (1 << 0) +#define ALLOW_PACKAGE (1 << 1) + #ifdef DEBUGGING static const char* const lex_state_names[] = { "KNOWNEXT", @@ -244,7 +248,7 @@ static const char* const lex_state_names[] = { #define TERM(retval) return (CLINE, PL_expect = XOPERATOR, PL_bufptr = s, REPORT(retval)) #define PHASERBLOCK(f) return (pl_yylval.ival=f, PL_expect = XBLOCK, PL_bufptr = s, REPORT((int)PHASER)) #define POSTDEREF(f) return (PL_bufptr = s, S_postderef(aTHX_ REPORT(f),s[1])) -#define LOOPX(f) return (PL_bufptr = force_word(s,BAREWORD,TRUE,FALSE), \ +#define LOOPX(f) return (PL_bufptr = force_word(s, BAREWORD, CHECK_KEYWORD), \ pl_yylval.ival=f, \ PL_expect = PL_nexttoke ? XOPERATOR : XTERM, \ REPORT((int)LOOPEX)) @@ -2269,10 +2273,12 @@ S_newSV_maybe_utf8(pTHX_ const char *const start, STRLEN len) */ STATIC char * -S_force_word(pTHX_ char *start, int token, int check_keyword, int allow_pack) +S_force_word(pTHX_ char *start, int token, U32 flags) { char *s; STRLEN len; + const bool check_keyword = flags & CHECK_KEYWORD; + const bool allow_pack = flags & ALLOW_PACKAGE; PERL_ARGS_ASSERT_FORCE_WORD; @@ -5393,12 +5399,12 @@ S_tokenize_use(pTHX_ int is_use, char *s) { force_next(BAREWORD); } else if (*s == 'v') { - s = force_word(s,BAREWORD,FALSE,TRUE); + s = force_word(s, BAREWORD, ALLOW_PACKAGE); s = force_version(s, FALSE); } } else { - s = force_word(s,BAREWORD,FALSE,TRUE); + s = force_word(s, BAREWORD, ALLOW_PACKAGE); s = force_version(s, FALSE); } pl_yylval.ival = is_use; @@ -6131,7 +6137,7 @@ yyl_hyphen(pTHX_ char *s) s++; if (memBEGINs(s, (STRLEN) (PL_bufend - s), "=>")) { - s = force_word(PL_bufptr,BAREWORD,FALSE,FALSE); + s = force_word(PL_bufptr, BAREWORD, 0); DEBUG_T( { printbuf("### Saw unary minus before =>, forcing word %s\n", s); } ); OPERATOR(PERLY_MINUS); /* unary minus */ } @@ -6213,7 +6219,7 @@ yyl_hyphen(pTHX_ char *s) TOKEN(ARROW); } if (isIDFIRST_lazy_if_safe(s, PL_bufend, UTF)) { - s = force_word(s,METHCALL0,FALSE,TRUE); + s = force_word(s, METHCALL0, ALLOW_PACKAGE); TOKEN(ARROW); } else if (*s == '$') @@ -6592,7 +6598,7 @@ yyl_leftcurly(pTHX_ char *s, const U8 formbrack) d++; if (*d == '}') { const char minus = (PL_tokenbuf[0] == '-'); - s = force_word(s + minus, BAREWORD, FALSE, TRUE); + s = force_word(s + minus, BAREWORD, ALLOW_PACKAGE); if (minus) force_next(PERLY_MINUS); } @@ -7323,7 +7329,7 @@ yyl_require(pTHX_ char *s, I32 orig_keyword) || (s = force_version(s, TRUE), *s == 'v')) { *PL_tokenbuf = '\0'; - s = force_word(s,BAREWORD,TRUE,TRUE); + s = force_word(s, BAREWORD, CHECK_KEYWORD | ALLOW_PACKAGE); if (isIDFIRST_lazy_if_safe(PL_tokenbuf, C_ARRAY_END(PL_tokenbuf), UTF)) @@ -8294,7 +8300,7 @@ yyl_word_or_keyword(pTHX_ char *s, STRLEN len, I32 key, I32 orig_keyword, struct case KEY_class: ck_warner_d(packWARN(WARN_EXPERIMENTAL__CLASS), "class is experimental"); - s = force_word(s,BAREWORD,FALSE,TRUE); + s = force_word(s, BAREWORD, ALLOW_PACKAGE); s = skipspace(s); s = force_strict_version(s); PL_expect = XATTRBLOCK; @@ -8774,7 +8780,7 @@ yyl_word_or_keyword(pTHX_ char *s, STRLEN len, I32 key, I32 orig_keyword, struct LOP(OP_PACK,XTERM); case KEY_package: - s = force_word(s,BAREWORD,FALSE,TRUE); + s = force_word(s, BAREWORD, ALLOW_PACKAGE); s = skipspace(s); s = force_strict_version(s); PREBLOCK(KW_PACKAGE); @@ -8957,7 +8963,7 @@ yyl_word_or_keyword(pTHX_ char *s, STRLEN len, I32 key, I32 orig_keyword, struct checkcomma(s,PL_tokenbuf,"subroutine name"); s = skipspace(s); PL_expect = XTERM; - s = force_word(s,BAREWORD,TRUE,TRUE); + s = force_word(s, BAREWORD, CHECK_KEYWORD | ALLOW_PACKAGE); LOP(OP_SORT,XREF); case KEY_split: