Bug #10685
closed
Segfault from keyword rest arg when coercing an object that defines to_hash
Added by headius (Charles Nutter) almost 10 years ago.
Updated almost 10 years ago.
Description
This spec appears to cause the segfault mentioned in http://rubini.us/2014/12/31/matz-s-ruby-developers-don-t-use-rubyspec/ today.
it "calls #to_hash on the last element if keyword arguments are present" do
obj = mock("destructure block keyword arguments")
obj.should_receive(:to_hash).and_return({x: 9})
result = m([1, 2, 3, obj]) { |a, *b, c, **k| [a, b, c, k] }
result.should == [1, [2], 3, {x: 9}]
end
I tried to boil it down to a shorter example and was not able to isolate it from RubySpec/mspec entanglement.
Here's the full dump including the last spec line that starts to run (the spec above): https://gist.github.com/headius/5d52df923eb615729ca3
I ran it using mspec gem from rubyspec's "archive" branch using "mspec ci -f s language".
I think this is the equivalent code extracted from MSpec. But I can't get this to crash on 2.2.0p0.
def m(a) yield a end
class Mock
def to_hash
puts 'to_hash called'
{x: 9}
end
end
obj = Mock.new
result = m([1, 2, 3, obj]) { |a, *b, c, **k| [a, b, c, k] }
p result#.should == [1, [2], 3, {x: 9}]
p result == [1, [2], 3, {x: 9}]
- Status changed from Open to Closed
- % Done changed from 0 to 100
Applied in changeset r49089.
vm_args.c: add ref r49088
- vm_args.c (keyword_hash_p): fix non-symbol keys hash.
rb_extract_keywords() returns 0 not Qnil when no symbol keys is
included. [ruby-core:67264] [Bug #10685]
- Description updated (diff)
- Backport changed from 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN to 2.0.0: DONTNEED, 2.1: DONTNEED, 2.2: REQUIRED
Chris Seaton wrote:
I think this is the equivalent code extracted from MSpec. But I can't get this to crash on 2.2.0p0.
It's another failure, but false positive.
- Has duplicate Bug #10695: Segmentation fault with *args and **kwargs added
- Has duplicate Bug #10734: Segfault when combining default arguments with keyword arguments added
- Backport changed from 2.0.0: DONTNEED, 2.1: DONTNEED, 2.2: REQUIRED to 2.0.0: DONTNEED, 2.1: DONTNEED, 2.2: DONE
ruby_2_2 r49272 merged revision(s) 49089.
Also available in: Atom
PDF
Like0
Like0Like0Like0Like0Like0Like0Like0Like0