[macruby-changes] [1947] MacRuby/branches/experimental

source_changes at macosforge.org source_changes at macosforge.org
Sat Jun 27 13:36:07 PDT 2009


Revision: 1947
          http://trac.macosforge.org/projects/ruby/changeset/1947
Author:   lsansonetti at apple.com
Date:     2009-06-27 13:36:06 -0700 (Sat, 27 Jun 2009)
Log Message:
-----------
Thread#raise: added

Modified Paths:
--------------
    MacRuby/branches/experimental/eval.c
    MacRuby/branches/experimental/include/ruby/intern.h
    MacRuby/branches/experimental/thread.c
    MacRuby/branches/experimental/vm.cpp
    MacRuby/branches/experimental/vm.h

Modified: MacRuby/branches/experimental/eval.c
===================================================================
--- MacRuby/branches/experimental/eval.c	2009-06-27 06:39:27 UTC (rev 1946)
+++ MacRuby/branches/experimental/eval.c	2009-06-27 20:36:06 UTC (rev 1947)
@@ -350,8 +350,6 @@
  *     raise ArgumentError, "No parameters", caller
  */
 
-VALUE rb_make_exception(int, VALUE *);
-
 static VALUE
 rb_f_raise(VALUE klass, SEL sel, int argc, VALUE *argv)
 {

Modified: MacRuby/branches/experimental/include/ruby/intern.h
===================================================================
--- MacRuby/branches/experimental/include/ruby/intern.h	2009-06-27 06:39:27 UTC (rev 1946)
+++ MacRuby/branches/experimental/include/ruby/intern.h	2009-06-27 20:36:06 UTC (rev 1947)
@@ -204,6 +204,7 @@
 NORETURN(void rb_error_frozen(const char*));
 void rb_check_frozen(VALUE);
 /* eval.c */
+VALUE rb_make_exception(int, VALUE *);
 int rb_sourceline(void);
 const char *rb_sourcefile(void);
 

Modified: MacRuby/branches/experimental/thread.c
===================================================================
--- MacRuby/branches/experimental/thread.c	2009-06-27 06:39:27 UTC (rev 1946)
+++ MacRuby/branches/experimental/thread.c	2009-06-27 20:36:06 UTC (rev 1947)
@@ -242,9 +242,19 @@
  */
 
 static VALUE
-thread_raise_m(int argc, VALUE *argv, VALUE self)
+thread_raise_m(VALUE self, SEL sel, int argc, VALUE *argv)
 {
-    // TODO
+    VALUE exc = rb_make_exception(argc, argv);
+
+    rb_vm_thread_t *t = GetThreadPtr(self);
+
+    if (t->thread == pthread_self()) {
+	rb_exc_raise(exc);
+    }
+    else if (t->status != THREAD_DEAD) {
+	rb_vm_thread_raise(t, exc);
+    }
+
     return Qnil;
 }
 
@@ -1358,7 +1368,7 @@
     rb_objc_define_method(*(VALUE *)rb_cThread, "abort_on_exception=", rb_thread_s_abort_exc_set, 1);
 
     rb_objc_define_method(rb_cThread, "initialize", thread_initialize, -1);
-    rb_define_method(rb_cThread, "raise", thread_raise_m, -1);
+    rb_objc_define_method(rb_cThread, "raise", thread_raise_m, -1);
     rb_objc_define_method(rb_cThread, "join", thread_join_m, -1);
     rb_objc_define_method(rb_cThread, "value", thread_value, 0);
     rb_objc_define_method(rb_cThread, "kill", rb_thread_kill, 0);

Modified: MacRuby/branches/experimental/vm.cpp
===================================================================
--- MacRuby/branches/experimental/vm.cpp	2009-06-27 06:39:27 UTC (rev 1946)
+++ MacRuby/branches/experimental/vm.cpp	2009-06-27 20:36:06 UTC (rev 1947)
@@ -4604,6 +4604,17 @@
 
 extern "C"
 void
+rb_vm_thread_raise(rb_vm_thread_t *t, VALUE exc)
+{
+    // XXX we should lock here
+    RoxorVM *vm = (RoxorVM *)t->vm;
+    vm->push_current_exception(exc);
+
+    rb_vm_thread_cancel(t);
+}
+
+extern "C"
+void
 rb_thread_sleep(int sec)
 {
     struct timeval time;

Modified: MacRuby/branches/experimental/vm.h
===================================================================
--- MacRuby/branches/experimental/vm.h	2009-06-27 06:39:27 UTC (rev 1946)
+++ MacRuby/branches/experimental/vm.h	2009-06-27 20:36:06 UTC (rev 1947)
@@ -359,6 +359,7 @@
 VALUE rb_vm_thread_locals(VALUE thread, bool create_storage);
 void rb_vm_thread_wakeup(rb_vm_thread_t *t);
 void rb_vm_thread_cancel(rb_vm_thread_t *t);
+void rb_vm_thread_raise(rb_vm_thread_t *t, VALUE exc);
 
 bool rb_vm_abort_on_exception(void);
 void rb_vm_set_abort_on_exception(bool flag);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090627/72c6bbee/attachment.html>


More information about the macruby-changes mailing list