[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