[macruby-changes] [639] MacRuby/trunk/vm_insnhelper.c

source_changes at macosforge.org source_changes at macosforge.org
Sun Sep 28 22:13:09 PDT 2008


Revision: 639
          http://trac.macosforge.org/projects/ruby/changeset/639
Author:   lsansonetti at apple.com
Date:     2008-09-28 22:13:09 -0700 (Sun, 28 Sep 2008)
Log Message:
-----------
appropriately invalidating the objc method cache

Modified Paths:
--------------
    MacRuby/trunk/vm_insnhelper.c

Modified: MacRuby/trunk/vm_insnhelper.c
===================================================================
--- MacRuby/trunk/vm_insnhelper.c	2008-09-29 03:14:51 UTC (rev 638)
+++ MacRuby/trunk/vm_insnhelper.c	2008-09-29 05:13:09 UTC (rev 639)
@@ -531,6 +531,7 @@
     mn = NULL;
 
     if (mcache != NULL) {
+cache_relookup:
 	if (mcache->flags & RB_MCACHE_RCALL_FLAG) {
 	    if (mcache->as.rcall.klass == klass && mcache->as.rcall.node != NULL) {
 		mn = mcache->as.rcall.node;
@@ -641,8 +642,15 @@
 	else if (mcache->flags & RB_MCACHE_OCALL_FLAG) {
 	    rb_control_frame_t *reg_cfp;
 	    rb_control_frame_t *_cfp;
-	   
-ocall_dispatch: 
+
+	    if (mcache->as.ocall.klass != klass) {
+		mcache->flags = RB_MCACHE_RCALL_FLAG;
+		mcache->as.rcall.klass = 0;
+		mcache->as.rcall.node = NULL;
+		goto cache_relookup;
+	    }
+
+ocall_dispatch:
 	    reg_cfp = cfp;
 	    _cfp = vm_push_frame(th, 0, FRAME_MAGIC_CFUNC | (flag << FRAME_MAGIC_MASK_BITS),
 		    recv, (VALUE) blockptr, 0, reg_cfp->sp, 0, 1);
@@ -888,6 +896,7 @@
 					mcache->as.rcall.sel, imp,
 					method_getTypeEncoding(method)));
 			    mcache->flags = RB_MCACHE_OCALL_FLAG;
+			    mcache->as.rcall.sel = sel;
 			    mcache->as.ocall.klass = klass;
 			    mcache->as.ocall.imp = imp;
 			    mcache->as.ocall.sig.argc = method_getNumberOfArguments(method);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macruby-changes/attachments/20080928/0965f2e2/attachment.html 


More information about the macruby-changes mailing list