From: ibylich@... Date: 2018-02-22T09:54:36+00:00 Subject: [ruby-core:85747] [Ruby trunk Bug#14506] Possible bug in cmdarg_stack Issue #14506 has been updated by ibylich (Ilya Bylich). This patch does not introduce any logical changes (at least I don't expect any). mame (Yusuke Endoh) wrote: > I think that this is not a bug, and that your patch is for refactoring. Am I right? Yes, exactly. mame (Yusuke Endoh) wrote: > Please clarify your motivation if any. I understand that you want this change [for ease of backporting from parser.y to the parser gem](https://github.com/whitequark/parser/issues/452). I'm neutral to this. Well, MRI's parser can rely only on cmdarg to recognize keyword_do/keyword_do_block, but for example above it doesn't. Instead, it transitions into dual state (which, from what I understand, works like a flag). Parser gem uses Ragel for lexing and Ragel doesn't support dual states. The motivation of this patch is to refactor and simplify this place in MRI to allow backporting of this feature "as is" to the parser gem. ---------------------------------------- Bug #14506: Possible bug in cmdarg_stack https://bugs.ruby-lang.org/issues/14506#change-70588 * 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: