From: nobu@... Date: 2018-02-22T11:21:43+00:00 Subject: [ruby-core:85748] [Ruby trunk Bug#14506] Possible bug in cmdarg_stack Issue #14506 has been updated by nobu (Nobuyoshi Nakada). Seems nice. Maybe, `lambda` and `brace_body` parts aren't needed? And, just curiosity, what do you mean by "dual state", `cmdarg` and `lex_state`? ---------------------------------------- Bug #14506: Possible bug in cmdarg_stack https://bugs.ruby-lang.org/issues/14506#change-70589 * Author: ibylich (Ilya Bylich) * Status: Assigned * Priority: Normal * Assignee: nobu (Nobuyoshi Nakada) * Target version: * ruby -v: ruby 2.6.0dev (2018-02-19 trunk 62484) [x86_64-darwin17] * Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN ---------------------------------------- cmdarg stack is a stack of bytes that has 1 on top of it when the parser is in the command mode. But for this code: ~~~ ruby a b(c d), "x" do end ~~~ And this line in parse.y: ~~~ c > SHOW_BITSTACK(p->cmdarg_stack, "BEFORE kDO_BLOCK"); if (CMDARG_P() && !IS_lex_state_for(state, EXPR_CMDARG)) return keyword_do_block; ~~~ It prints: ~~~ text $ dev-ruby -vye 'a b(c d), "x" do end' | grep -E "kDO_BLOCK" BEFORE kDO_BLOCK: 10 at line 7461 ~~~ So CMDARG_P is false. I understand that 'keyword_do_block" is handled later in the "if (IS_lex_state_for(state, (EXPR_BEG | EXPR_ENDARG)))" section, but is it possible to change parser to rely only on cmdarg stack? -- https://bugs.ruby-lang.org/ Unsubscribe: