Project

General

Profile

Actions

Bug #11750

closed

SEGV with Enumerator, yield and proc.

Added by akr (Akira Tanaka) over 8 years ago. Updated over 8 years ago.

Status:
Closed
Target version:
-
ruby -v:
ruby 2.3.0dev (2015-11-29 trunk 52789) [x86_64-linux]
[ruby-core:71737]

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

bug-11750.log (11.2 KB) bug-11750.log nobu (Nobuyoshi Nakada), 11/30/2015 05:35 AM

Updated by nobu (Nobuyoshi Nakada) over 8 years ago

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)
Actions #3

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

Also available in: Atom PDF

Like0
Like0Like0Like0