[macruby-changes] [751] MacRuby/trunk/vm_insnhelper.c
source_changes at macosforge.org
source_changes at macosforge.org
Sun Nov 23 17:56:58 PST 2008
Revision: 751
http://trac.macosforge.org/projects/ruby/changeset/751
Author: lsansonetti at apple.com
Date: 2008-11-23 17:56:57 -0800 (Sun, 23 Nov 2008)
Log Message:
-----------
fixed a regression introduced by r750 (thanks Vincent Isambart for noticing it)
Modified Paths:
--------------
MacRuby/trunk/vm_insnhelper.c
Modified: MacRuby/trunk/vm_insnhelper.c
===================================================================
--- MacRuby/trunk/vm_insnhelper.c 2008-11-23 05:31:42 UTC (rev 750)
+++ MacRuby/trunk/vm_insnhelper.c 2008-11-24 01:56:57 UTC (rev 751)
@@ -1426,48 +1426,66 @@
return mn;
}
+#if WITH_OBJC
static inline VALUE
-vm_search_normal_superclass(VALUE klass, VALUE recv)
+vm_search_normal_superclass(VALUE klass, VALUE recv, ID mid)
{
- VALUE ary;
+ static ID idNew = 0, idNew2 = 0, idNew3 = 0;
+ VALUE k, ary;
int i, count;
+ bool klass_located;
ary = rb_mod_ancestors_nocopy(CLASS_OF(recv));
count = RARRAY_LEN(ary);
- for (i = 0; i < count; i++) {
- if (RARRAY_AT(ary, i) == klass) {
+ k = klass;
+ for (i = 0, klass_located = false; i < count; i++) {
+ if (!klass_located && RARRAY_AT(ary, i) == klass) {
+ klass_located = true;
+ }
+ if (klass_located) {
if (i < count) {
- klass = RARRAY_AT(ary, i + 1);
+ k = RARRAY_AT(ary, i + 1);
+ if (mid != 0 && TYPE(k) == T_MODULE) {
+ VALUE tmp;
+ bool method_defined;
+
+ tmp = RCLASS_SUPER(k);
+ RCLASS_SUPER(k) = 0;
+ method_defined = rb_objc_method_node(k, mid, NULL, NULL) != NULL;
+ RCLASS_SUPER(k) = tmp;
+ if (!method_defined) {
+ continue;
+ }
+ }
break;
}
}
}
- return klass;
-}
+ if (k == klass) {
+ /* XXX this should be an assertion */
+ rb_warn("could not identify the superclass of %s from the ancestors chain!",
+ class_getName((Class)klass));
+ k = RCLASS_SUPER(klass);
+ }
-#if WITH_OBJC
-static inline VALUE
-vm_search_normal_superclass2(VALUE klass, VALUE recv, ID mid, NODE **mnp,
- IMP *impp, SEL *selp)
-{
- static ID idNew = 0, idNew2 = 0, idNew3 = 0;
- VALUE k;
-
+ DLOG("RCALL", "superclass for <%s %p> defined as %s",
+ class_getName((Class)klass),
+ (void *)recv,
+ class_getName((Class)k));
+
if (idNew == 0) {
idNew = rb_intern("new");
idNew2 = rb_intern("new:");
idNew3 = rb_intern("__new__");
}
- k = vm_search_normal_superclass(klass, recv);
-
/* because #new is added on every new NSObject subclasses, and if overriden
we should still call our implementation with super */
if ((mid == idNew || mid == idNew2) && k == *(VALUE *)rb_cNSObject) {
- *mnp = rb_objc_method_node(klass, idNew3, impp, selp);
- if (*mnp == NULL)
+ if (rb_objc_method_node(klass, idNew3, NULL, NULL) == NULL) {
rb_bug("can't look up __new__ in klass `%s'\n",
class_getName((Class)klass));
+ }
k = klass;
}
@@ -1508,7 +1526,7 @@
}
id = lcfp->method_id;
- klass = vm_search_normal_superclass2(lcfp->method_class, recv, id, mnp, impp, selp);
+ klass = vm_search_normal_superclass(lcfp->method_class, recv, id);
if (sigval == Qfalse) {
/* zsuper */
@@ -1516,7 +1534,7 @@
}
}
else {
- klass = vm_search_normal_superclass2(ip->klass, recv, id, mnp, impp, selp);
+ klass = vm_search_normal_superclass(ip->klass, recv, id);
}
*idp = id;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20081123/97282104/attachment.html>
More information about the macruby-changes
mailing list