зеркало из https://github.com/github/ruby.git
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:
Родитель
8859ff1d09
Коммит
a98e343d39
|
@ -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;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче