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

source_changes at macosforge.org source_changes at macosforge.org
Thu Mar 19 20:50:00 PDT 2009


Revision: 1000
          http://trac.macosforge.org/projects/ruby/changeset/1000
Author:   lsansonetti at apple.com
Date:     2009-03-19 20:49:59 -0700 (Thu, 19 Mar 2009)
Log Message:
-----------
fixed the recursive dvar bug + re-enabled block caching

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

Modified: MacRuby/branches/experimental/roxor.cpp
===================================================================
--- MacRuby/branches/experimental/roxor.cpp	2009-03-20 00:21:06 UTC (rev 999)
+++ MacRuby/branches/experimental/roxor.cpp	2009-03-20 03:49:59 UTC (rev 1000)
@@ -4739,7 +4739,8 @@
     }
 
     if (block != NULL) {
-	GET_VM()->push_block((rb_vm_block_t *)block);
+	rb_vm_block_t *b = (rb_vm_block_t *)block;
+	GET_VM()->push_block(b);
 	VALUE retval = 
 	    __rb_vm_dispatch(cache, self, NULL, sel, opt, argc, argv);
 	GET_VM()->pop_block();
@@ -4855,13 +4856,13 @@
 void *
 rb_vm_block_create(IMP imp, NODE *node, VALUE self, int dvars_size, ...)
 {
-//    std::map<IMP, rb_vm_block_t *>::iterator iter =
-//	GET_VM()->blocks.find(imp);
+    std::map<IMP, rb_vm_block_t *>::iterator iter =
+	GET_VM()->blocks.find(imp);
 
     rb_vm_block_t *b;
 
- //   if (iter == GET_VM()->blocks.end()) {
-	b = (rb_vm_block_t *)xmalloc(sizeof(rb_vm_block_t) + (sizeof(VALUE *) * dvars_size));
+    if (iter == GET_VM()->blocks.end()) {
+	b = (rb_vm_block_t *)xmalloc(sizeof(rb_vm_block_t) + (sizeof(VALUE) * dvars_size));
 
 	b->imp = imp;
 	b->node = node;
@@ -4869,23 +4870,23 @@
 	b->is_lambda = true;
 	b->dvars_size = dvars_size;
 
-	if (dvars_size) {
-	    va_list ar;
-	    va_start(ar, dvars_size);
-	    for (int i = 0; i < dvars_size; ++i) {
-		b->dvars[i] = va_arg(ar, VALUE *);
-	    }
-	    va_end(ar);
+	rb_objc_retain(b);
+	GET_VM()->blocks[imp] = b;
+    }
+    else {
+	b = iter->second;
+	assert(b->dvars_size == dvars_size);
+    }
+
+    if (dvars_size > 0) {
+	va_list ar;
+	va_start(ar, dvars_size);
+	for (int i = 0; i < dvars_size; ++i) {
+	    b->dvars[i] = va_arg(ar, VALUE *);
 	}
+	va_end(ar);
+    }
 
-//	rb_objc_retain(b);
-//	GET_VM()->blocks[imp] = b;
-//    }
-//    else {
-//	b = iter->second;
-//	assert(b->dvars_size == dvars_size);
-//    }
-
     return b;
 }
 
@@ -5068,7 +5069,29 @@
 #if ROXOR_DEBUG
     printf("yield block %p argc %d arity %d dvars %d\n", b, argc, arity.real, b->dvars_size);
 #endif
-    return __rb_vm_rcall(b->self, b->node, b->imp, arity, argc, argv);
+
+    VALUE **old_dvars;
+    if (b->dvars_size > 0) {
+	old_dvars = (VALUE **)alloca(sizeof(VALUE *) * b->dvars_size);
+	for (int i = 0; i < b->dvars_size; i++) {
+	    old_dvars[i] = b->dvars[i];
+	}
+	//memcpy(old_dvars, b->dvars, sizeof(VALUE) * b->dvars_size);
+    }
+    else {
+	old_dvars = NULL;
+    }
+
+    VALUE v = __rb_vm_rcall(b->self, b->node, b->imp, arity, argc, argv);
+
+    if (old_dvars != NULL) {
+	for (int i = 0; i < b->dvars_size; i++) {
+	    b->dvars[i] = old_dvars[i];
+	}
+	//memcpy(b->dvars, old_dvars, sizeof(VALUE) * b->dvars_size);
+    }
+
+    return v;
 }
 
 extern "C"

Modified: MacRuby/branches/experimental/test_roxor.rb
===================================================================
--- MacRuby/branches/experimental/test_roxor.rb	2009-03-20 00:21:06 UTC (rev 999)
+++ MacRuby/branches/experimental/test_roxor.rb	2009-03-20 03:49:59 UTC (rev 1000)
@@ -837,6 +837,9 @@
   }
   assert "42", "def foo; yield; end; begin; foo(&Object.new); rescue TypeError; p 42; end"
 
+  assert "42", "x = 0; proc { x = 42 }.call; p x"
+  assert "42", "x = 0; p = proc { x += 40 }; x = 2; p.call; p x"
+
   assert "42", "n = 0; 100.times { |i| n += 1; break if n == 42 }; p n"
   assert "42", "n = 0; 100.times { |i| next if i % 2 == 0; n += 1; }; p n - 8"
   assert "42", "p 100.times { break 42 }"
@@ -845,6 +848,19 @@
 
   assert "42", "p [42].map { |x| x }.map { |y| y }[0]"
 
+  assert '1302', %q{
+    $count = 0
+    def foo(v, x)
+      x.times {
+        x -= 1
+        foo(v, x)
+        $count += v
+      }
+    end
+    foo(42, 5)
+    p $count
+  }
+
 end
 
 test "exception" do
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090319/d68dca7d/attachment-0001.html>


More information about the macruby-changes mailing list