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

source_changes at macosforge.org source_changes at macosforge.org
Sun Aug 24 13:51:04 PDT 2008


Revision: 474
          http://trac.macosforge.org/projects/ruby/changeset/474
Author:   lsansonetti at apple.com
Date:     2008-08-24 13:51:03 -0700 (Sun, 24 Aug 2008)
Log Message:
-----------
re-storing the sklass somewhere else again, this time as an ivar in the module

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

Modified: MacRuby/trunk/vm_insnhelper.c
===================================================================
--- MacRuby/trunk/vm_insnhelper.c	2008-08-23 00:22:53 UTC (rev 473)
+++ MacRuby/trunk/vm_insnhelper.c	2008-08-24 20:51:03 UTC (rev 474)
@@ -1393,36 +1393,45 @@
 
 #if WITH_OBJC
 static inline VALUE
-vm_search_normal_superclass2(VALUE klass, rb_iseq_t *ip, VALUE recv, ID mid, NODE **mnp, IMP *impp, SEL *selp)
+vm_search_normal_superclass2(VALUE klass, VALUE recv, ID mid, NODE **mnp, IMP *impp, SEL *selp)
 {
-    if (ip != NULL) {
-	VALUE ary = rb_attr_get(klass, idIncludedModules);
-	if (ary != Qnil) {
-	    int i, count = RARRAY_LEN(ary);
-	    for (i = 0; i < count; i++) {
-		VALUE imod = RARRAY_AT(ary, i);
-		NODE *mn;
-		IMP imp;
-		SEL sel;
+    static ID idPreviousKlass = 0;
+    CFMutableDictionaryRef iv_dict;
+    VALUE ary, k;
+  
+    if (idPreviousKlass == 0) {
+	idPreviousKlass = rb_intern("__previous_sklass__");
+    }
 
-		VALUE saved_imod_super = RCLASS_SUPER(imod);
-		RCLASS_SUPER(imod) = 0;
-		mn = rb_objc_method_node(imod, mid, &imp, &sel);
-		RCLASS_SUPER(imod) = saved_imod_super;
-		if (imp != NULL) {
-		    ip->previous_sklass = klass;
-		    *mnp = mn;
-		    *impp = imp;
-		    *selp = sel;
-		    return imod;
-		}
+    ary = rb_attr_get(klass, idIncludedModules);
+    if (ary != Qnil) {
+	int i, count = RARRAY_LEN(ary);
+	for (i = 0; i < count; i++) {
+	    VALUE saved_imod_super, imod;
+	    NODE *mn;
+	    IMP imp;
+	    SEL sel;
+
+	    imod = RARRAY_AT(ary, i);
+	    saved_imod_super = RCLASS_SUPER(imod);
+	    RCLASS_SUPER(imod) = 0;
+	    mn = rb_objc_method_node(imod, mid, &imp, &sel);
+	    RCLASS_SUPER(imod) = saved_imod_super;
+	    if (imp != NULL) {
+		rb_ivar_set(imod, idPreviousKlass, klass);
+		*mnp = mn;
+		*impp = imp;
+		*selp = sel;
+		return imod;
 	    }
 	}
-	if (ip->previous_sklass != 0) {
-	    klass = ip->previous_sklass;
-	    ip->previous_sklass = 0;
-	}
     }
+
+    iv_dict = rb_class_ivar_dict(klass);
+    if (iv_dict != NULL && CFDictionaryGetValueIfPresent((CFDictionaryRef)iv_dict, (const void *)idPreviousKlass, (const void **)&k)) {
+	CFDictionaryRemoveValue(iv_dict, (const void *)idPreviousKlass);
+	klass = k;
+    }
     return vm_search_normal_superclass(klass, recv);
 }
 #endif
@@ -1460,7 +1469,7 @@
 	}
 
 	id = lcfp->method_id;
-	klass = vm_search_normal_superclass2(lcfp->method_class, NULL, recv, id, mnp, impp, selp);
+	klass = vm_search_normal_superclass2(lcfp->method_class, recv, id, mnp, impp, selp);
 
 	if (sigval == Qfalse) {
 	    /* zsuper */
@@ -1468,7 +1477,7 @@
 	}
     }
     else {
-	klass = vm_search_normal_superclass2(ip->klass, ip, recv, id, mnp, impp, selp);
+	klass = vm_search_normal_superclass2(ip->klass, recv, id, mnp, impp, selp);
     }
 
     *idp = id;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macruby-changes/attachments/20080824/bce28f4d/attachment.html 


More information about the macruby-changes mailing list