• Kouhei Sutou's avatar
    Fix segmentation fault by backtrace and GC · f1eb3aea
    Kouhei Sutou authored
    GitHub: fix #3122
    
    It reverts #3126. #3126 fixes the segmentation fault but generates
    broken backtrace.
    
    This change fixes the segmentation fault and generates correct
    backtrace. The strategy of this change is "generating backtrace while
    irep is alive".
    
    /tmp/test.rb:
        def gen
          e0 = nil
          begin
            1.times {
              raise 'foobar'
            }
          rescue => e
            e0 = e
          end
          e0
        end
    
        e = gen
        GC.start
        gen
        GC.start
    
        puts e.backtrace.join("\n")
    
    Run:
    
        % bin/mruby /tmp/test.rb
        /tmp/test.rb:5:in Object.gen
        /home/kou/work/ruby/mruby.kou/mrblib/numeric.rb:77:in Integral#times
        /tmp/test.rb:4:in Object.gen
        /tmp/test.rb:13
    
    FYI:
    
        % ruby -v /tmp/test.rb
        ruby 2.3.0p0 (2015-12-25) [x86_64-linux-gnu]
        /tmp/test.rb:5:in `block in gen'
        /tmp/test.rb:4:in `times'
        /tmp/test.rb:4:in `gen'
        /tmp/test.rb:13:in `<main>'
    f1eb3aea
gc.c 39.3 KB