[macruby-changes] [1060] MacRuby/branches/experimental
source_changes at macosforge.org
source_changes at macosforge.org
Sun Mar 22 12:09:29 PDT 2009
Revision: 1060
http://trac.macosforge.org/projects/ruby/changeset/1060
Author: lsansonetti at apple.com
Date: 2009-03-22 12:09:29 -0700 (Sun, 22 Mar 2009)
Log Message:
-----------
more block fixes
Modified Paths:
--------------
MacRuby/branches/experimental/eval.c
MacRuby/branches/experimental/roxor.cpp
MacRuby/branches/experimental/roxor.h
MacRuby/branches/experimental/vm_eval.c
Modified: MacRuby/branches/experimental/eval.c
===================================================================
--- MacRuby/branches/experimental/eval.c 2009-03-22 16:36:42 UTC (rev 1059)
+++ MacRuby/branches/experimental/eval.c 2009-03-22 19:09:29 UTC (rev 1060)
@@ -448,7 +448,7 @@
static VALUE
rb_f_block_given_p(VALUE self, SEL sel)
{
- return rb_block_given_p() ? Qtrue : Qfalse;
+ return rb_vm_block_saved() ? Qtrue : Qfalse;
}
VALUE rb_eThreadError;
Modified: MacRuby/branches/experimental/roxor.cpp
===================================================================
--- MacRuby/branches/experimental/roxor.cpp 2009-03-22 16:36:42 UTC (rev 1059)
+++ MacRuby/branches/experimental/roxor.cpp 2009-03-22 19:09:29 UTC (rev 1060)
@@ -400,6 +400,7 @@
unsigned char method_missing_reason;
rb_vm_block_t *current_block;
rb_vm_block_t *previous_block; // only used for non-Ruby created blocks
+ bool block_saved; // used by block_given?
RoxorVM(void);
@@ -1774,6 +1775,7 @@
current_block = NULL;
previous_block = NULL;
+ block_saved = false;
load_path = rb_ary_new();
rb_objc_retain((void *)load_path);
@@ -4696,7 +4698,7 @@
extern "C"
VALUE
-rb_vm_dispatch(struct mcache *cache, VALUE self, SEL sel, void *block,
+rb_vm_dispatch(struct mcache *cache, VALUE self, SEL sel, rb_vm_block_t *block,
unsigned char opt, int argc, ...)
{
#define MAX_DISPATCH_ARGS 200
@@ -4741,17 +4743,17 @@
argc = real_argc;
}
- if (block != NULL) {
- rb_vm_block_t *b = (rb_vm_block_t *)block;
- rb_vm_block_t *old_b = GET_VM()->current_block;
- GET_VM()->current_block = b;
- VALUE retval =
- __rb_vm_dispatch(cache, self, NULL, sel, opt, argc, argv);
- GET_VM()->current_block = old_b;
- return retval;
- }
+ rb_vm_block_t *b = (rb_vm_block_t *)block;
+ rb_vm_block_t *old_b = GET_VM()->current_block;
+ bool old_block_saved = GET_VM()->block_saved;
+ GET_VM()->block_saved = old_b != NULL;
+ GET_VM()->current_block = b;
- return __rb_vm_dispatch(cache, self, NULL, sel, opt, argc, argv);
+ VALUE retval = __rb_vm_dispatch(cache, self, NULL, sel, opt, argc, argv);
+
+ GET_VM()->current_block = old_b;
+ GET_VM()->block_saved = old_block_saved;
+ return retval;
}
extern "C"
@@ -4961,6 +4963,7 @@
return GET_VM()->method_cache_get(sel, false);
}
+// Should be used inside a method implementation.
extern "C"
int
rb_block_given_p(void)
@@ -4968,7 +4971,15 @@
return GET_VM()->current_block != NULL ? Qtrue : Qfalse;
}
+// Should only be used by #block_given?.
extern "C"
+bool
+rb_vm_block_saved(void)
+{
+ return GET_VM()->block_saved;
+}
+
+extern "C"
rb_vm_block_t *
rb_vm_current_block(void)
{
Modified: MacRuby/branches/experimental/roxor.h
===================================================================
--- MacRuby/branches/experimental/roxor.h 2009-03-22 16:36:42 UTC (rev 1059)
+++ MacRuby/branches/experimental/roxor.h 2009-03-22 19:09:29 UTC (rev 1060)
@@ -112,6 +112,7 @@
rb_vm_block_t *rb_vm_prepare_block(void *llvm_function, NODE *node, VALUE self, int dvars_size, ...);
rb_vm_block_t *rb_vm_current_block(void);
+bool rb_vm_block_saved(void);
void rb_vm_change_current_block(rb_vm_block_t *block);
void rb_vm_restore_current_block(void);
VALUE rb_vm_block_eval(rb_vm_block_t *block, int argc, const VALUE *argv);
Modified: MacRuby/branches/experimental/vm_eval.c
===================================================================
--- MacRuby/branches/experimental/vm_eval.c 2009-03-22 16:36:42 UTC (rev 1059)
+++ MacRuby/branches/experimental/vm_eval.c 2009-03-22 19:09:29 UTC (rev 1060)
@@ -283,7 +283,7 @@
if (cache == NULL) {
cache = rb_vm_get_call_cache(sel);
}
- VALUE val = rb_vm_call_with_cache2(cache, obj, 0, sel, argc, argv);
+ VALUE val = rb_vm_call_with_cache2(cache, obj, 0, sel, argc, argv);
rb_vm_restore_current_block();
return val;
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090322/2e6af8f4/attachment.html>
More information about the macruby-changes
mailing list