Revision: 1060 http://trac.macosforge.org/projects/ruby/changeset/1060 Author: lsansonetti@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; }
participants (1)
-
source_changes@macosforge.org