#1076: Abort occurs when raise a SecurityError within Thread. ----------------------------------+----------------------------------------- Reporter: watson1978@… | Owner: lsansonetti@… Type: defect | Status: new Priority: blocker | Milestone: Component: MacRuby | Keywords: ----------------------------------+----------------------------------------- Comment(by watson1978@…): I think that should not raise an exception in rb_thread_remove_from_group(). Because the exception of rb_thread_remove_from_group() is not caught within rb_vm_thread_run(). Patch: {{{ #!diff diff --git a/NSArray.m b/NSArray.m index 8916881..b1c714e 100644 --- a/NSArray.m +++ b/NSArray.m @@ -1280,6 +1280,17 @@ rb_ary_delete(VALUE ary, VALUE item) } VALUE +rb_ary_delete_force(VALUE ary, VALUE item) +{ + if (IS_RARY(ary)) { + return rary_delete_force(ary, 0, item); + } + else { + return nsary_delete((id)ary, 0, item); + } +} + +VALUE rb_ary_delete_at(VALUE ary, long pos) { if (IS_RARY(ary)) { diff --git a/array.c b/array.c index 2c1c486..2cd818c 100644 --- a/array.c +++ b/array.c @@ -1854,6 +1854,15 @@ rary_delete(VALUE ary, SEL sel, VALUE item) return item; } +VALUE +rary_delete_force(VALUE ary, SEL sel, VALUE item) +{ + if (rary_delete_element(ary, item, true) == false) { + return Qnil; + } + return item; +} + /* * call-seq: * array.delete_at(index) -> obj or nil diff --git a/array.h b/array.h index 4f44716..fb4419a 100644 --- a/array.h +++ b/array.h @@ -146,6 +146,7 @@ VALUE rary_clear(VALUE ary, SEL sel); VALUE rary_reverse_bang(VALUE ary, SEL sel); VALUE rary_includes(VALUE ary, SEL sel, VALUE item); VALUE rary_delete(VALUE ary, SEL sel, VALUE item); +VALUE rary_delete_force(VALUE ary, SEL sel, VALUE item); VALUE rary_delete_at(VALUE ary, SEL sel, VALUE pos); VALUE rary_pop(VALUE ary, SEL sel, int argc, VALUE *argv); VALUE rary_shift(VALUE ary, SEL sel, int argc, VALUE *argv); diff --git a/macruby_internal.h b/macruby_internal.h index 53fad7b..484e857 100644 --- a/macruby_internal.h +++ b/macruby_internal.h @@ -103,6 +103,8 @@ VALUE rb_io_addstr(VALUE, SEL, VALUE); VALUE rb_io_printf(VALUE, SEL, int, VALUE *); VALUE rb_io_print(VALUE, SEL, int, VALUE *); +VALUE rb_ary_delete_force(VALUE ary, VALUE item); + VALUE rb_objc_num_coerce_bin(VALUE x, VALUE Y, SEL sel); VALUE rb_objc_num_coerce_cmp(VALUE, VALUE, SEL sel); VALUE rb_objc_num_coerce_relop(VALUE, VALUE, SEL sel); diff --git a/thread.c b/thread.c index 5c6296b..476c642 100644 --- a/thread.c +++ b/thread.c @@ -1329,7 +1329,7 @@ rb_thread_remove_from_group(VALUE thread) if (t->group != Qnil) { rb_thread_group_t *tg = GetThreadGroupPtr(t->group); thgroup_lock(tg); - if (rb_ary_delete(tg->threads, thread) != thread) { + if (rb_ary_delete_force(tg->threads, thread) != thread) { printf("trying to remove a thread (%p) from a group that doesn't "\ "contain it\n", (void *)thread); abort(); }}} -- Ticket URL: <http://www.macruby.org/trac/ticket/1076#comment:1> MacRuby <http://macruby.org/>