Revision
639
Author
lsansonetti@apple.com
Date
2008-09-28 22:13:09 -0700 (Sun, 28 Sep 2008)

Log Message

appropriately invalidating the objc method cache

Modified Paths

Diff

Modified: MacRuby/trunk/vm_insnhelper.c (638 => 639)


--- 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);