[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