This project is closed and read-only.
Backport #9168 » backport_r44260_to_ruby_2_0_0.patch
| gc.c (working copy) | ||
|---|---|---|
|
int status;
|
||
|
VALUE args[3];
|
||
|
VALUE objid = nonspecial_obj_id(obj);
|
||
|
VALUE saved_errinfo = rb_errinfo();
|
||
|
if (RARRAY_LEN(table) > 0) {
|
||
|
args[1] = rb_obj_freeze(rb_ary_new3(1, objid));
|
||
| ... | ... | |
|
}
|
||
|
args[2] = (VALUE)rb_safe_level();
|
||
|
rb_set_errinfo(Qnil);
|
||
|
for (i=0; i<RARRAY_LEN(table); i++) {
|
||
|
VALUE final = RARRAY_PTR(table)[i];
|
||
|
args[0] = RARRAY_PTR(final)[1];
|
||
| ... | ... | |
|
if (status)
|
||
|
rb_set_errinfo(Qnil);
|
||
|
}
|
||
|
GET_THREAD()->errinfo = saved_errinfo;
|
||
|
}
|
||
|
static void
|
||
| test/ruby/test_gc.rb (working copy) | ||
|---|---|---|
|
end;
|
||
|
end
|
||
|
end
|
||
|
def test_exception_in_finalizer
|
||
|
bug9168 = '[ruby-core:58652] [Bug #9168]'
|
||
|
assert_normal_exit(<<-'end;', bug9168)
|
||
|
raise_proc = proc {raise}
|
||
|
10000.times do
|
||
|
ObjectSpace.define_finalizer(Object.new, raise_proc)
|
||
|
Thread.handle_interrupt(RuntimeError => :immediate) {break}
|
||
|
Thread.handle_interrupt(RuntimeError => :on_blocking) {break}
|
||
|
Thread.handle_interrupt(RuntimeError => :never) {break}
|
||
|
end
|
||
|
end;
|
||
|
end
|
||
|
end
|
||
| ChangeLog (working copy) | ||
|---|---|---|
|
Sat Dec 21 22:16:44 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||
|
* vm_trace.c (rb_postponed_job_flush): isolate exceptions in
|
||
|
postponed jobs and restore outer ones. based on a patch by
|
||
|
tarui. [ruby-core:58652] [Bug #9168]
|
||
|
Sat Dec 21 16:16:56 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||
|
* gc.c (finalize_deferred): flush all deferred finalizers while other
|
||
| vm_trace.c (working copy) | ||
|---|---|---|
|
const int outer_state = th->state;
|
||
|
int state = 0;
|
||
|
th->state = 0;
|
||
|
th->errinfo = Qnil;
|
||
|
th->vm->trace_running++;
|
||
|
th->trace_arg = trace_arg;
|
||
- « Previous
- 1
- 2
- Next »