[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