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

source_changes at macosforge.org source_changes at macosforge.org
Thu Mar 19 11:57:16 PDT 2009


Revision: 994
          http://trac.macosforge.org/projects/ruby/changeset/994
Author:   lsansonetti at apple.com
Date:     2009-03-19 11:57:16 -0700 (Thu, 19 Mar 2009)
Log Message:
-----------
reset dvars to their new given values upon block retrieve

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

Modified: MacRuby/branches/experimental/roxor.cpp
===================================================================
--- MacRuby/branches/experimental/roxor.cpp	2009-03-19 17:51:50 UTC (rev 993)
+++ MacRuby/branches/experimental/roxor.cpp	2009-03-19 18:57:16 UTC (rev 994)
@@ -410,7 +410,7 @@
 	VALUE backref;
 	VALUE broken_with;
 	int safe_level;
-	std::map<NODE *, rb_vm_block_t *> blocks;
+	std::map<IMP, rb_vm_block_t *> blocks;
 	std::map<double, struct rb_float_cache *> float_cache;
 	unsigned char method_missing_reason;
 
@@ -4831,30 +4831,47 @@
 void *
 rb_vm_block_create(IMP imp, NODE *node, VALUE self, int dvars_size, ...)
 {
-    std::map<NODE *, rb_vm_block_t *>::iterator iter = 
-	GET_VM()->blocks.find(node);
+    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));
+
 	VALUE **dvars = NULL;
 	if (dvars_size > 0) {
-	    va_list ar;
-	    va_start(ar, dvars_size);
-	    dvars = (VALUE **)malloc(sizeof(VALUE *) * dvars_size);
-	    for (int i = 0; i < dvars_size; ++i) {
-		dvars[i] = va_arg(ar, VALUE *);
-	    }
-	    va_end(ar);
+	    dvars = (VALUE **)xmalloc(sizeof(VALUE *) * (dvars_size + 10));
+	    GC_WB(&b->dvars, dvars);
 	}
-	rb_vm_block_t *b = (rb_vm_block_t *)malloc(sizeof(rb_vm_block_t));
+	else {
+	    b->dvars = NULL;
+	}
+
 	b->imp = imp;
 	b->node = node;
 	b->self = self;
 	b->dvars_size = dvars_size;
-	b->dvars = dvars;
 	b->is_lambda = true;
-	GET_VM()->blocks[node] = b;
-	return b;
+
+	rb_objc_retain(b);
+	GET_VM()->blocks[imp] = b;
     }
-    return iter->second;
+    else {
+	b = iter->second;
+	assert(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);
+    }
+
+    return b;
 }
 
 extern "C"
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090319/8dc512a9/attachment.html>


More information about the macruby-changes mailing list