Project

General

Profile

Actions

Bug #13073

closed

Hash Key => Proc parse failure

Added by myrrlyn (Alexander Payne) almost 5 years ago. Updated over 4 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:78837]

Description

A Hash that stores multiple Proc literals causes syntax failures when passed as a method argument. Specifically, this only appears to happen on the second Proc literal in a Hash, not the first.

Minimal test case:

def foo a, h
  [a, h]
end

foo :bar, {
  a: proc do
  end,
  b: proc do
  end
}

Attempting to load this code causes the following error:

SyntaxError: test.rb:8: syntax error, unexpected keyword_do_block, expecting '}'
  b: proc do
            ^

I first encountered this while attempting to run the Middleman gem (version 4.2.0). The specific error is:

/usr/local/lib/ruby/gems/2.4.0/gems/middleman-core-4.2.0/lib/middleman-core/application.rb:194: syntax error, unexpected keyword_do_block, expecting '}' (SyntaxError)
      layout: proc do |file, app|
                     ^
/usr/local/lib/ruby/gems/2.4.0/gems/middleman-core-4.2.0/lib/middleman-core/application.rb:194: syntax error, unexpected '|', expecting '='
   layout: proc do |file, app|
                              ^
/usr/local/lib/ruby/gems/2.4.0/gems/middleman-core-4.2.0/lib/middleman-core/application.rb:197: syntax error, unexpected '}', expecting keyword_end
    }, 'Callbacks that can exclude 
     ^
/usr/local/lib/ruby/gems/2.4.0/gems/middleman-core-4.2.0/lib/middleman-core/application.rb:460: syntax error, unexpected keyword_end, expecting end-of-input

The offending code is visible on GitHub, here.

Updated by myrrlyn (Alexander Payne) almost 5 years ago

A Hash that stores multiple Proc literals causes syntax failures when passed as a method argument. Specifically, this only appears to happen on the second Proc literal in a Hash, not the first.

Minimal test case:

def foo a, h
  [a, h]
end

foo :bar, {
  a: proc do
  end,
  b: proc do
  end
}

Attempting to load this code causes the following error:

SyntaxError: test.rb:8: syntax error, unexpected keyword_do_block, expecting '}'
  b: proc do
            ^

Note that simply commenting out the lines for b: proc do \n end cause the file to be successfully parsed.

def foo a, h
  [a, h]
end

foo :bar, {
  a: proc do
  end,
#  b: proc do
#  end
}

I first encountered this while attempting to run the Middleman gem (version 4.2.0). The specific error is:

/usr/local/lib/ruby/gems/2.4.0/gems/middleman-core-4.2.0/lib/middleman-core/application.rb:194: syntax error, unexpected keyword_do_block, expecting '}' (SyntaxError)
      layout: proc do |file, app|
                     ^
/usr/local/lib/ruby/gems/2.4.0/gems/middleman-core-4.2.0/lib/middleman-core/application.rb:194: syntax error, unexpected '|', expecting '='
   layout: proc do |file, app|
                              ^
/usr/local/lib/ruby/gems/2.4.0/gems/middleman-core-4.2.0/lib/middleman-core/application.rb:197: syntax error, unexpected '}', expecting keyword_end
    }, 'Callbacks that can exclude 
     ^
/usr/local/lib/ruby/gems/2.4.0/gems/middleman-core-4.2.0/lib/middleman-core/application.rb:460: syntax error, unexpected keyword_end, expecting end-of-input

The offending code is visible on GitHub, here.

Actions #2

Updated by nobu (Nobuyoshi Nakada) almost 5 years ago

  • Status changed from Open to Closed

Applied in changeset r57198.


parse.y: preserve cmdarg stack

  • parse.y (do_body): preserve cmdarg stack around do/end block. [ruby-core:78837] [Bug #13073]

Updated by naruse (Yui NARUSE) over 4 years ago

  • Backport changed from 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN to 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: DONE

ruby_2_4 r57837 merged revision(s) 57198.

Actions

Also available in: Atom PDF