ruby-changes:13502
From: marcandre <ko1@a...>
Date: Sat, 10 Oct 2009 14:16:35 +0900 (JST)
Subject: [ruby-changes:13502] Ruby:r25278 (trunk): * thread.c (rb_threadptr_execute_interrupts_rec, rb_threadptr_raise): Thread#raise with no argument will now re-raise the current exception if there is one
marcandre 2009-10-10 14:13:08 +0900 (Sat, 10 Oct 2009) New Revision: 25278 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=25278 Log: * thread.c (rb_threadptr_execute_interrupts_rec, rb_threadptr_raise): Thread#raise with no argument will now re-raise the current exception if there is one [ruby-core:25367] * eval.c (get_errinfo, rb_rubylevel_thread_errinfo): Getter for current exception for a given thread Modified files: trunk/ChangeLog trunk/eval.c trunk/eval_intern.h trunk/thread.c Index: eval_intern.h =================================================================== --- eval_intern.h (revision 25277) +++ eval_intern.h (revision 25278) @@ -212,6 +212,7 @@ VALUE rb_vm_top_self(); VALUE rb_vm_cbase(void); void rb_trap_restore_mask(void); +VALUE rb_rubylevel_thread_errinfo(rb_thread_t *); #ifndef CharNext /* defined as CharNext[AW] on Windows. */ #define CharNext(p) ((p) + mblen(p, RUBY_MBCHAR_MAXSIZE)) Index: ChangeLog =================================================================== --- ChangeLog (revision 25277) +++ ChangeLog (revision 25278) @@ -1,3 +1,12 @@ +Sat Oct 10 14:09:40 2009 Marc-Andre Lafortune <ruby-core@m...> + + * thread.c (rb_threadptr_execute_interrupts_rec, rb_threadptr_raise): + Thread#raise with no argument will now re-raise the current exception + if there is one [ruby-core:25367] + + * eval.c (get_errinfo, rb_rubylevel_thread_errinfo): Getter for + current exception for a given thread + Sat Oct 10 12:21:31 2009 Nobuyoshi Nakada <nobu@r...> * transcode.c (rb_transcoding, str_transcoding_resize): fixed Index: thread.c =================================================================== --- thread.c (revision 25277) +++ thread.c (revision 25278) @@ -76,6 +76,7 @@ static const VALUE eKillSignal = INT2FIX(0); static const VALUE eTerminateSignal = INT2FIX(1); +static const VALUE eReRaiseSignal = INT2FIX(2); static volatile int system_working = 1; inline static void @@ -1246,6 +1247,10 @@ TH_JUMP_TAG(th, TAG_FATAL); } else { + if (err == eReRaiseSignal) { + err = rb_rubylevel_thread_errinfo(th); + err = rb_make_exception(NIL_P(err) ? 0 : 1, &err); + } rb_exc_raise(err); } } @@ -1312,7 +1317,12 @@ goto again; } - exc = rb_make_exception(argc, argv); + if (argc == 0) { + exc = eReRaiseSignal; + } + else { + exc = rb_make_exception(argc, argv); + } th->thrown_errinfo = exc; rb_threadptr_ready(th); return Qnil; Index: eval.c =================================================================== --- eval.c (revision 25277) +++ eval.c (revision 25278) @@ -902,9 +902,8 @@ VALUE rb_f_untrace_var(); static VALUE * -errinfo_place(void) +errinfo_place(rb_thread_t *th) { - rb_thread_t *th = GET_THREAD(); rb_control_frame_t *cfp = th->cfp; rb_control_frame_t *end_cfp = RUBY_VM_END_CONTROL_FRAME(th); @@ -925,19 +924,24 @@ } static VALUE -get_errinfo(void) +get_thread_errinfo(rb_thread_t *th) { - VALUE *ptr = errinfo_place(); + VALUE *ptr = errinfo_place(th); if (ptr) { return *ptr; } else { - rb_thread_t *th = GET_THREAD(); return th->errinfo; } } static VALUE +get_errinfo(void) +{ + return get_thread_errinfo(GET_THREAD()); +} + +static VALUE errinfo_getter(ID id) { return get_errinfo(); @@ -951,7 +955,7 @@ rb_raise(rb_eTypeError, "assigning non-exception to $!"); } else { - VALUE *ptr = errinfo_place(); + VALUE *ptr = errinfo_place(GET_THREAD()); if (ptr) { *ptr = val; } @@ -984,6 +988,12 @@ return get_errinfo(); } +VALUE +rb_rubylevel_thread_errinfo(rb_thread_t *th) +{ + return get_thread_errinfo(th); +} + static VALUE errat_getter(ID id) { -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/