[macruby-changes] [2446] MacRuby/trunk/vm.cpp

source_changes at macosforge.org source_changes at macosforge.org
Mon Aug 31 14:01:31 PDT 2009


Revision: 2446
          http://trac.macosforge.org/projects/ruby/changeset/2446
Author:   eloy.de.enige at gmail.com
Date:     2009-08-31 14:01:30 -0700 (Mon, 31 Aug 2009)
Log Message:
-----------
When dispatching to method_missing also pass along the block that was given. All of Bacon's specs now pass! (Except an irrelevant Float spec.)

Modified Paths:
--------------
    MacRuby/trunk/vm.cpp

Modified: MacRuby/trunk/vm.cpp
===================================================================
--- MacRuby/trunk/vm.cpp	2009-08-31 20:39:52 UTC (rev 2445)
+++ MacRuby/trunk/vm.cpp	2009-08-31 21:01:30 UTC (rev 2446)
@@ -2013,13 +2013,13 @@
     rb_vm_define_method(klass, sel, imp, body, false);
 }
 
-static VALUE method_missing(VALUE obj, SEL sel, int argc, const VALUE *argv,
+static VALUE method_missing(VALUE obj, SEL sel, rb_vm_block_t *block, int argc, const VALUE *argv,
 	rb_vm_method_missing_reason_t call_status);
 
 static void *
 undefined_imp(void *rcv, SEL sel)
 {
-    method_missing((VALUE)rcv, sel, NULL, NULL, METHOD_MISSING_DEFAULT);
+    method_missing((VALUE)rcv, sel, NULL, NULL, NULL, METHOD_MISSING_DEFAULT);
     return NULL; // never reached
 }
 
@@ -2412,7 +2412,7 @@
 }
 
 static VALUE
-method_missing(VALUE obj, SEL sel, int argc, const VALUE *argv,
+method_missing(VALUE obj, SEL sel, rb_vm_block_t *block, int argc, const VALUE *argv,
 	       rb_vm_method_missing_reason_t call_status)
 {
     GET_VM()->set_method_missing_reason(call_status);
@@ -2447,7 +2447,10 @@
     new_argv[0] = ID2SYM(rb_intern(buf));
     MEMCPY(&new_argv[1], argv, VALUE, argc);
 
-    return rb_vm_call(obj, selMethodMissing, argc + 1, new_argv, false);
+    struct mcache *cache;
+    cache = GET_CORE()->method_cache_get(selMethodMissing, false);
+    return rb_vm_call_with_cache2(cache, block, obj, NULL, selMethodMissing,
+    	argc + 1, new_argv);
 }
 
 inline void *
@@ -2558,7 +2561,8 @@
     if ((node->flags & VM_METHOD_PRIVATE) && opt == 0) {
 	// Calling a private method with no explicit receiver OR an attribute
 	// assignment to non-self, triggering #method_missing.
-	return method_missing(self, sel, argc, argv, METHOD_MISSING_PRIVATE);
+	rb_vm_block_t *b = GET_VM()->current_block();
+	return method_missing(self, sel, b, argc, argv, METHOD_MISSING_PRIVATE);
     }
 
     if ((node->flags & VM_METHOD_EMPTY) && arity.max == arity.min) {
@@ -2971,7 +2975,7 @@
 	opt == DISPATCH_VCALL
 	    ? METHOD_MISSING_VCALL : opt == DISPATCH_SUPER
 		? METHOD_MISSING_SUPER : METHOD_MISSING_DEFAULT;
-    return method_missing((VALUE)self, sel, argc, argv, status);
+    return method_missing((VALUE)self, sel, block, argc, argv, status);
 }
 
 #define MAX_DISPATCH_ARGS 200
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090831/7718b00e/attachment.html>


More information about the macruby-changes mailing list