Modified: MacRuby/trunk/vm_insnhelper.c (472 => 473)
--- 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;