[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