[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