[macruby-changes] [1503] MacRuby/branches/experimental
source_changes at macosforge.org
source_changes at macosforge.org
Tue Apr 28 18:11:36 PDT 2009
Revision: 1503
http://trac.macosforge.org/projects/ruby/changeset/1503
Author: vincent.isambart at gmail.com
Date: 2009-04-28 18:11:35 -0700 (Tue, 28 Apr 2009)
Log Message:
-----------
do not always use the cached version of a block object
Modified Paths:
--------------
MacRuby/branches/experimental/roxor.cpp
MacRuby/branches/experimental/roxor.h
Modified: MacRuby/branches/experimental/roxor.cpp
===================================================================
--- MacRuby/branches/experimental/roxor.cpp 2009-04-29 01:11:29 UTC (rev 1502)
+++ MacRuby/branches/experimental/roxor.cpp 2009-04-29 01:11:35 UTC (rev 1503)
@@ -7700,7 +7700,7 @@
rb_vm_block_t *b;
bool cached = false;
- if (iter == GET_VM()->blocks.end()) {
+ if ((iter == GET_VM()->blocks.end()) || (iter->second->flags & (VM_BLOCK_ACTIVE | VM_BLOCK_PROC))) {
b = (rb_vm_block_t *)xmalloc(sizeof(rb_vm_block_t)
+ (sizeof(VALUE *) * dvars_size));
@@ -8005,23 +8005,11 @@
block_call:
- // We need to preserve dynamic variable slots here because our block may
- // call the parent method which may call the block again, and since dvars
- // are currently implemented using alloca() we will painfully die if the
- // previous slots are not restored.
- VALUE *old_dvars[100];
- assert(b->dvars_size < 100);
- for (int i = 0; i < b->dvars_size; i++) {
- old_dvars[i] = b->dvars[i];
- }
-
+ b->flags |= VM_BLOCK_ACTIVE;
VALUE v = __rb_vm_bcall(b->self, (VALUE)b->dvars, b->imp, b->arity, argc,
argv);
+ b->flags &= ~VM_BLOCK_ACTIVE;
- for (int i = 0; i < b->dvars_size; i++) {
- b->dvars[i] = old_dvars[i];
- }
-
return v;
}
Modified: MacRuby/branches/experimental/roxor.h
===================================================================
--- MacRuby/branches/experimental/roxor.h 2009-04-29 01:11:29 UTC (rev 1502)
+++ MacRuby/branches/experimental/roxor.h 2009-04-29 01:11:35 UTC (rev 1503)
@@ -21,6 +21,7 @@
#define VM_BLOCK_PROC 0x0001 // block is a Proc object
#define VM_BLOCK_LAMBDA 0x0002 // block is a lambda
+#define VM_BLOCK_ACTIVE 0x0004 // block is active (being executed)
typedef struct {
VALUE self;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090428/f601daa7/attachment-0001.html>
More information about the macruby-changes
mailing list