[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