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

source_changes at macosforge.org source_changes at macosforge.org
Sat Jun 20 18:45:05 PDT 2009


Revision: 1914
          http://trac.macosforge.org/projects/ruby/changeset/1914
Author:   vincent.isambart at gmail.com
Date:     2009-06-20 18:45:04 -0700 (Sat, 20 Jun 2009)
Log Message:
-----------
added a failing test and its fix

Modified Paths:
--------------
    MacRuby/branches/experimental/test_vm/block.rb
    MacRuby/branches/experimental/vm.cpp

Modified: MacRuby/branches/experimental/test_vm/block.rb
===================================================================
--- MacRuby/branches/experimental/test_vm/block.rb	2009-06-20 23:43:28 UTC (rev 1913)
+++ MacRuby/branches/experimental/test_vm/block.rb	2009-06-21 01:45:04 UTC (rev 1914)
@@ -532,3 +532,8 @@
 }
 
 assert '[2, 3, 4]', "p [1, 2, 3].map(&:succ)"
+
+assert '42', %{
+  b = proc { |x| if x then p x else b.call(42) end }
+  b.call(nil)
+}

Modified: MacRuby/branches/experimental/vm.cpp
===================================================================
--- MacRuby/branches/experimental/vm.cpp	2009-06-20 23:43:28 UTC (rev 1913)
+++ MacRuby/branches/experimental/vm.cpp	2009-06-21 01:45:04 UTC (rev 1914)
@@ -2756,6 +2756,36 @@
 
 extern "C"
 rb_vm_block_t *
+rb_vm_dup_active_block(rb_vm_block_t *src_b)
+{
+    assert(src_b->flags & VM_BLOCK_ACTIVE);
+
+    int block_size = sizeof(rb_vm_block_t)
+	    + (sizeof(VALUE *) * src_b->dvars_size);
+
+    rb_vm_block_t *new_b = (rb_vm_block_t *)xmalloc(block_size);
+
+    memcpy(new_b, src_b, block_size);
+    GC_WB(&new_b->parent_block, src_b->parent_block);
+    new_b->flags = src_b->flags & ~VM_BLOCK_ACTIVE;
+
+    rb_vm_local_t *src_l = src_b->locals;
+    rb_vm_local_t **new_l = &new_b->locals;
+    while (src_l != NULL) {
+	GC_WB(new_l, xmalloc(sizeof(rb_vm_local_t)));
+	(*new_l)->name = src_l->name;
+	GC_WB(&(*new_l)->value, src_l->value);
+
+	new_l = &(*new_l)->next;
+	src_l = src_l->next;
+    }
+    *new_l = NULL;
+
+    return new_b;
+}
+
+extern "C"
+rb_vm_block_t *
 rb_vm_prepare_block(void *llvm_function, NODE *node, VALUE self,
 		    rb_vm_var_uses **parent_var_uses,
 		    rb_vm_block_t *parent_block,
@@ -2834,7 +2864,7 @@
 	for (int i = 0; i < lvars_size; ++i) {
 	    assert(l != NULL);
 	    l->name = va_arg(ar, ID);
-	    l->value = va_arg(ar, VALUE *);
+	    GC_WB(&l->value, va_arg(ar, VALUE *));
 	    l = l->next;
 	}
     }
@@ -3273,7 +3303,9 @@
 
 block_call:
 
-    assert(!(b->flags & VM_BLOCK_ACTIVE));
+    if (b->flags & VM_BLOCK_ACTIVE) {
+	b = rb_vm_dup_active_block(b);
+    }
     b->flags |= VM_BLOCK_ACTIVE;
     VALUE v = Qnil;
     try {
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090620/bd3b64c7/attachment-0001.html>


More information about the macruby-changes mailing list