Bug #7570 ยป fatal_in_fiber.patch
| ext/-test-/fatal/extconf.rb | ||
|---|---|---|
| 
     create_makefile("-test-/fatal/rb_fatal") 
   | 
||
| ext/-test-/fatal/rb_fatal.c | ||
|---|---|---|
| 
     #include <ruby.h> 
   | 
||
| 
     static VALUE 
   | 
||
| 
     ruby_fatal(VALUE obj, VALUE msg) 
   | 
||
| 
     { 
   | 
||
| 
         const char *cmsg = NULL; 
   | 
||
| 
         (void)obj; 
   | 
||
| 
         cmsg = RSTRING_PTR(msg); 
   | 
||
| 
         rb_fatal("%s", cmsg); 
   | 
||
| 
         return 0; /* never reached */ 
   | 
||
| 
     } 
   | 
||
| 
     void 
   | 
||
| 
     Init_rb_fatal(void) 
   | 
||
| 
     { 
   | 
||
| 
         rb_define_method(rb_mKernel, "rb_fatal", ruby_fatal, 1); 
   | 
||
| 
     } 
   | 
||
| test/ruby/test_fiber.rb | ||
|---|---|---|
| 
           Thread.new{ Fiber.new{ Thread.exit }.resume }.join 
   | 
||
| 
         end 
   | 
||
| 
       end 
   | 
||
| 
       def test_fatal_in_fiber 
   | 
||
| 
         assert_in_out_err(["-r-test-/fatal/rb_fatal", "-e", <<-EOS], "", [], /ok/) 
   | 
||
| 
           Fiber.new{ 
   | 
||
| 
             rb_fatal "ok" 
   | 
||
| 
           }.resume 
   | 
||
| 
           puts :ng 
   | 
||
| 
         EOS 
   | 
||
| 
       end 
   | 
||
| 
     end 
   | 
||
| vm.c | ||
|---|---|---|
| 
           case TAG_RETRY: 
   | 
||
| 
     	result = make_localjump_error("retry outside of rescue clause", Qnil, state); 
   | 
||
| 
     	break; 
   | 
||
| 
           case TAG_FATAL: 
   | 
||
| 
     	/* internal exception or Thread.exit */ 
   | 
||
| 
     	/* Thread.exit set th->errinfo to INT2FIX(TAG_FATAL) */ 
   | 
||
| 
     	if (!FIXNUM_P(val)) 
   | 
||
| 
     	    result = val; 
   | 
||
| 
           default: 
   | 
||
| 
     	break; 
   | 
||
| 
         } 
   | 
||