[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]