vm_trace.c: isolate exceptions

* 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]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44260 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2013-12-17 07:19:25 +00:00
Родитель 8859ff1d09
Коммит a98e343d39
3 изменённых файлов: 22 добавлений и 0 удалений

Просмотреть файл

@ -1,3 +1,9 @@
Tue Dec 17 16:19:09 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]
Tue Dec 17 10:48:04 2013 Aman Gupta <ruby@tmm1.net>
* configure.in (RUBY_DTRACE_POSTPROCESS): Fix compatibility with

Просмотреть файл

@ -279,6 +279,19 @@ class TestGc < Test::Unit::TestCase
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
def test_verify_internal_consistency
assert_nil(GC.verify_internal_consistency)
end

Просмотреть файл

@ -1511,7 +1511,9 @@ rb_postponed_job_flush(rb_vm_t *vm)
{
rb_thread_t *th = GET_THREAD();
unsigned long saved_postponed_job_interrupt_mask = th->interrupt_mask & POSTPONED_JOB_INTERRUPT_MASK;
VALUE saved_errno = th->errinfo;
th->errinfo = Qnil;
/* mask POSTPONED_JOB dispatch */
th->interrupt_mask |= POSTPONED_JOB_INTERRUPT_MASK;
{
@ -1530,4 +1532,5 @@ rb_postponed_job_flush(rb_vm_t *vm)
}
/* restore POSTPONED_JOB mask */
th->interrupt_mask &= ~(saved_postponed_job_interrupt_mask ^ POSTPONED_JOB_INTERRUPT_MASK);
th->errinfo = saved_errno;
}