[macruby-changes] [473] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Fri Aug 22 17:22:53 PDT 2008


Revision: 473
          http://trac.macosforge.org/projects/ruby/changeset/473
Author:   lsansonetti at apple.com
Date:     2008-08-22 17:22:53 -0700 (Fri, 22 Aug 2008)
Log Message:
-----------
store the sklass somewhere else

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

Modified: MacRuby/trunk/vm_core.h
===================================================================
--- MacRuby/trunk/vm_core.h	2008-08-22 08:47:56 UTC (rev 472)
+++ MacRuby/trunk/vm_core.h	2008-08-23 00:22:53 UTC (rev 473)
@@ -272,6 +272,7 @@
     /* klass/module nest information stack (cref) */
     NODE *cref_stack;
     VALUE klass;
+    VALUE previous_sklass;	/* for super in included modules */
 
     /* misc */
     ID defined_method_id;	/* for define_method */

Modified: MacRuby/trunk/vm_insnhelper.c
===================================================================
--- MacRuby/trunk/vm_insnhelper.c	2008-08-22 08:47:56 UTC (rev 472)
+++ MacRuby/trunk/vm_insnhelper.c	2008-08-23 00:22:53 UTC (rev 473)
@@ -1392,36 +1392,37 @@
 }
 
 #if WITH_OBJC
-static VALUE previous_sklass = Qnil;
 static inline VALUE
-vm_search_normal_superclass2(VALUE klass, VALUE recv, ID mid, NODE **mnp, IMP *impp, SEL *selp)
+vm_search_normal_superclass2(VALUE klass, rb_iseq_t *ip, VALUE recv, ID mid, NODE **mnp, IMP *impp, SEL *selp)
 {
-    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;
+    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;
 
-	    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) {
-		previous_sklass = klass;
-		*mnp = mn;
-		*impp = imp;
-		*selp = sel;
-		return imod;
+		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;
+		}
 	    }
 	}
+	if (ip->previous_sklass != 0) {
+	    klass = ip->previous_sklass;
+	    ip->previous_sklass = 0;
+	}
     }
-    if (previous_sklass != Qnil) {
-	klass = previous_sklass;
-	previous_sklass = Qnil;
-    }
     return vm_search_normal_superclass(klass, recv);
 }
 #endif
@@ -1459,7 +1460,7 @@
 	}
 
 	id = lcfp->method_id;
-	klass = vm_search_normal_superclass2(lcfp->method_class, recv, id, mnp, impp, selp);
+	klass = vm_search_normal_superclass2(lcfp->method_class, NULL, recv, id, mnp, impp, selp);
 
 	if (sigval == Qfalse) {
 	    /* zsuper */
@@ -1467,7 +1468,7 @@
 	}
     }
     else {
-	klass = vm_search_normal_superclass2(ip->klass, recv, id, mnp, impp, selp);
+	klass = vm_search_normal_superclass2(ip->klass, ip, recv, id, mnp, impp, selp);
     }
 
     *idp = id;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macruby-changes/attachments/20080822/8ebc0fd9/attachment.html 


More information about the macruby-changes mailing list