[macruby-changes] [1001] MacRuby/branches/experimental/roxor.cpp
source_changes at macosforge.org
source_changes at macosforge.org
Thu Mar 19 20:55:07 PDT 2009
Revision: 1001
http://trac.macosforge.org/projects/ruby/changeset/1001
Author: lsansonetti at apple.com
Date: 2009-03-19 20:55:06 -0700 (Thu, 19 Mar 2009)
Log Message:
-----------
cleaned + added a comment for posterity
Modified Paths:
--------------
MacRuby/branches/experimental/roxor.cpp
Modified: MacRuby/branches/experimental/roxor.cpp
===================================================================
--- MacRuby/branches/experimental/roxor.cpp 2009-03-20 03:49:59 UTC (rev 1000)
+++ MacRuby/branches/experimental/roxor.cpp 2009-03-20 03:55:06 UTC (rev 1001)
@@ -5070,13 +5070,14 @@
printf("yield block %p argc %d arity %d dvars %d\n", b, argc, arity.real, b->dvars_size);
#endif
+ // 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;
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);
+ memcpy(old_dvars, b->dvars, sizeof(VALUE) * b->dvars_size);
}
else {
old_dvars = NULL;
@@ -5085,10 +5086,7 @@
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);
+ memcpy(b->dvars, old_dvars, sizeof(VALUE) * b->dvars_size);
}
return v;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090319/5dc2ec17/attachment.html>
More information about the macruby-changes
mailing list