[macruby-changes] [1559] MacRuby/branches/experimental/roxor.cpp

source_changes at macosforge.org source_changes at macosforge.org
Fri May 8 16:24:25 PDT 2009


Revision: 1559
          http://trac.macosforge.org/projects/ruby/changeset/1559
Author:   lsansonetti at apple.com
Date:     2009-05-08 16:24:25 -0700 (Fri, 08 May 2009)
Log Message:
-----------
don't stack reentrant blocks

Modified Paths:
--------------
    MacRuby/branches/experimental/roxor.cpp

Modified: MacRuby/branches/experimental/roxor.cpp
===================================================================
--- MacRuby/branches/experimental/roxor.cpp	2009-05-08 12:09:25 UTC (rev 1558)
+++ MacRuby/branches/experimental/roxor.cpp	2009-05-08 23:24:25 UTC (rev 1559)
@@ -7825,15 +7825,21 @@
 	va_end(ar);
     }
 
-    rb_vm_block_t *b = (rb_vm_block_t *)block;
-    rb_vm_block_t *old_b = GET_VM()->previous_block;
-    GET_VM()->previous_block = GET_VM()->current_block;
-    GET_VM()->current_block = b;
+    const bool swap_blocks = block == NULL || block != GET_VM()->current_block;
 
+    rb_vm_block_t *old_block = NULL;
+    if (swap_blocks) {
+	old_block = GET_VM()->previous_block;
+	GET_VM()->previous_block = GET_VM()->current_block;
+	GET_VM()->current_block = block;
+    }
+
     VALUE retval = __rb_vm_dispatch(cache, self, NULL, sel, opt, argc, argv);
 
-    GET_VM()->current_block = GET_VM()->previous_block;
-    GET_VM()->previous_block = old_b;
+    if (swap_blocks) {
+	GET_VM()->current_block = GET_VM()->previous_block;
+	GET_VM()->previous_block = old_block;
+    }
 
     if (!GET_VM()->bindings.empty()) {
 	rb_objc_release(GET_VM()->bindings.back());
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090508/97d9e13f/attachment.html>


More information about the macruby-changes mailing list