Project

General

Profile

Bug #7570 ยป fatal_in_fiber.patch

nagachika (Tomoyuki Chikanaga), 12/16/2012 02:01 AM

View differences:

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;
}
    (1-1/1)