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

source_changes at macosforge.org source_changes at macosforge.org
Wed Jul 8 16:41:46 PDT 2009


Revision: 2004
          http://trac.macosforge.org/projects/ruby/changeset/2004
Author:   lsansonetti at apple.com
Date:     2009-07-08 16:41:46 -0700 (Wed, 08 Jul 2009)
Log Message:
-----------
finally implemented rb_rescue2()

Modified Paths:
--------------
    MacRuby/branches/experimental/eval.c
    MacRuby/branches/experimental/vm.cpp

Modified: MacRuby/branches/experimental/eval.c
===================================================================
--- MacRuby/branches/experimental/eval.c	2009-07-08 19:29:01 UTC (rev 2003)
+++ MacRuby/branches/experimental/eval.c	2009-07-08 23:41:46 UTC (rev 2004)
@@ -459,14 +459,6 @@
 }
 
 VALUE
-rb_rescue2(VALUE (* b_proc) (ANYARGS), VALUE data1,
-	   VALUE (* r_proc) (ANYARGS), VALUE data2, ...)
-{
-    // TODO
-    return (*b_proc)(data1);
-}
-
-VALUE
 rb_rescue(VALUE (* b_proc)(ANYARGS), VALUE data1,
 	  VALUE (* r_proc)(ANYARGS), VALUE data2)
 {

Modified: MacRuby/branches/experimental/vm.cpp
===================================================================
--- MacRuby/branches/experimental/vm.cpp	2009-07-08 19:29:01 UTC (rev 2003)
+++ MacRuby/branches/experimental/vm.cpp	2009-07-08 23:41:46 UTC (rev 2004)
@@ -3757,6 +3757,41 @@
 }
 
 extern "C"
+VALUE
+rb_rescue2(VALUE (*b_proc) (ANYARGS), VALUE data1,
+           VALUE (*r_proc) (ANYARGS), VALUE data2, ...)
+{
+    try {
+	return (*b_proc)(data1);
+    }
+    catch (...) {
+	VALUE exc = rb_vm_current_exception();
+	if (exc != Qnil) {
+	    va_list ar;
+	    VALUE eclass;
+	    bool handled = false;
+
+	    va_start(ar, data2);
+	    while ((eclass = va_arg(ar, VALUE)) != 0) {
+		if (rb_obj_is_kind_of(exc, eclass)) {
+		    handled = true;
+		    break;
+		}
+	    }
+	    va_end(ar);
+
+	    if (handled) {
+		if (r_proc != NULL) {
+		    return (*r_proc)(data2);
+		}
+		return Qnil;
+	    }
+	}
+	throw;
+    }
+}
+
+extern "C"
 void
 rb_vm_break(VALUE val)
 {
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090708/ca5028fc/attachment.html>


More information about the macruby-changes mailing list