Revision: 473 http://trac.macosforge.org/projects/ruby/changeset/473 Author: lsansonetti@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;
participants (1)
-
source_changes@macosforge.org