Actions
Bug #11750
closedSEGV with Enumerator, yield and proc.
Description
I found SEGV as follows.
% cat z.rb
def f
Enumerator.new {|y|
1000000.times {
yield
y.yield
}
}
end
def g
x = proc {}
f(&x)
end
e = g
e.each {}
% ./miniruby z.rb
(snip)
Files
Updated by nobu (Nobuyoshi Nakada) over 8 years ago
- File bug-11750.log bug-11750.log added
- Description updated (diff)
By bisecting, it raises SytemStackError
or segfaults since r51243.
* vm_core.h: remove blockprocval field from rb_proc_t and rb_binding_t.
Instead of this field, mark given block in Proc at rb_env_t::env.
Enumerator
, Generator
, or Yielder
may need more marking or write-barrier.
Updated by ko1 (Koichi Sasada) over 8 years ago
- Assignee set to ko1 (Koichi Sasada)
Updated by ko1 (Koichi Sasada) over 8 years ago
- Status changed from Open to Closed
Applied in changeset r53144.
-
vm.c: fix mark miss for proc given as passed block.
[Bug #11750] -
vm.c (vm_make_proc_from_block): should return a Proc object
if block is given. Previous implementation returns
a Proc object only when corresponding Proc object is not
available. -
vm.c (vm_make_env_each): ditto.
-
test/ruby/test_proc.rb: add a test for this bug.
Actions
Like0
Like0Like0Like0