[macruby-changes] [750] MacRuby/trunk
source_changes at macosforge.org
source_changes at macosforge.org
Sat Nov 22 21:31:43 PST 2008
Revision: 750
http://trac.macosforge.org/projects/ruby/changeset/750
Author: lsansonetti at apple.com
Date: 2008-11-22 21:31:42 -0800 (Sat, 22 Nov 2008)
Log Message:
-----------
fix for #142
Modified Paths:
--------------
MacRuby/trunk/class.c
MacRuby/trunk/id.c
MacRuby/trunk/id.h
MacRuby/trunk/include/ruby/intern.h
MacRuby/trunk/vm_insnhelper.c
Modified: MacRuby/trunk/class.c
===================================================================
--- MacRuby/trunk/class.c 2008-11-21 04:15:20 UTC (rev 749)
+++ MacRuby/trunk/class.c 2008-11-23 05:31:42 UTC (rev 750)
@@ -525,8 +525,10 @@
ary = rb_ary_new();
rb_ivar_set(klass, idIncludedModules, ary);
}
- if (rb_ary_includes(ary, module))
- return;
+ else {
+ if (rb_ary_includes(ary, module))
+ return;
+ }
rb_ary_insert(ary, 0, module);
long v = RCLASS_VERSION(module) | RCLASS_IS_INCLUDED;
@@ -539,6 +541,13 @@
}
rb_ary_push(ary, klass);
+ CFMutableDictionaryRef iv_dict;
+
+ iv_dict = rb_class_ivar_dict(klass);
+ if (iv_dict != NULL) {
+ CFDictionaryRemoveValue(iv_dict, (const void *)idAncestors);
+ }
+
DLOG("INCM", "%s <- %s", class_getName((Class)klass), class_getName((Class)module));
if (add_methods) {
@@ -662,19 +671,35 @@
static void rb_mod_included_modules_nosuper(VALUE, VALUE);
VALUE
-rb_mod_ancestors(VALUE mod)
+rb_mod_ancestors_nocopy(VALUE mod)
{
- VALUE p, ary = rb_ary_new();
-
- for (p = mod; p; p = RCLASS_SUPER(p)) {
- rb_ary_push(ary, p);
- rb_mod_included_modules_nosuper(p, ary);
- if (RCLASS_MODULE(p))
- break;
+ VALUE ary;
+
+ ary = rb_attr_get(mod, idAncestors);
+ if (NIL_P(ary)) {
+ VALUE p;
+
+ ary = rb_ary_new();
+
+ for (p = mod; p; p = RCLASS_SUPER(p)) {
+ rb_ary_push(ary, p);
+ rb_mod_included_modules_nosuper(p, ary);
+ if (RCLASS_MODULE(p))
+ break;
+ }
+
+ rb_ivar_set(mod, idAncestors, ary);
}
+
return ary;
}
+VALUE
+rb_mod_ancestors(VALUE mod)
+{
+ return rb_ary_dup(rb_mod_ancestors_nocopy(mod));
+}
+
static int
ins_methods_push(VALUE name, long type, VALUE ary, long visi)
{
Modified: MacRuby/trunk/id.c
===================================================================
--- MacRuby/trunk/id.c 2008-11-21 04:15:20 UTC (rev 749)
+++ MacRuby/trunk/id.c 2008-11-23 05:31:42 UTC (rev 750)
@@ -94,4 +94,5 @@
idIncludedModules = rb_intern("__included_modules__");
idIncludedInClasses = rb_intern("__included_in_classes__");
+ idAncestors = rb_intern("__ancestors__");
}
Modified: MacRuby/trunk/id.h
===================================================================
--- MacRuby/trunk/id.h 2008-11-21 04:15:20 UTC (rev 749)
+++ MacRuby/trunk/id.h 2008-11-23 05:31:42 UTC (rev 750)
@@ -76,5 +76,6 @@
extern SEL sel_zone;
extern ID idIncludedModules;
extern ID idIncludedInClasses;
+extern ID idAncestors;
#endif
#endif /* RUBY_ID_H */
Modified: MacRuby/trunk/include/ruby/intern.h
===================================================================
--- MacRuby/trunk/include/ruby/intern.h 2008-11-21 04:15:20 UTC (rev 749)
+++ MacRuby/trunk/include/ruby/intern.h 2008-11-23 05:31:42 UTC (rev 750)
@@ -167,6 +167,7 @@
VALUE rb_mod_included_modules(VALUE);
VALUE rb_mod_include_p(VALUE, VALUE);
VALUE rb_mod_ancestors(VALUE);
+VALUE rb_mod_ancestors_nocopy(VALUE);
VALUE rb_class_instance_methods(int, VALUE*, VALUE);
VALUE rb_class_public_instance_methods(int, VALUE*, VALUE);
VALUE rb_class_protected_instance_methods(int, VALUE*, VALUE);
Modified: MacRuby/trunk/vm_insnhelper.c
===================================================================
--- MacRuby/trunk/vm_insnhelper.c 2008-11-21 04:15:20 UTC (rev 749)
+++ MacRuby/trunk/vm_insnhelper.c 2008-11-23 05:31:42 UTC (rev 750)
@@ -829,23 +829,7 @@
}
else {
#if WITH_OBJC
- if (flag & VM_CALL_SUPER_BIT) {
- VALUE k;
- for (k = CLASS_OF(recv); k != 0; k = RCLASS_SUPER(k)) {
- VALUE ary = rb_attr_get(k, idIncludedModules);
- if (ary != Qnil) {
- int i, count = RARRAY_LEN(ary);
- for (i = 0; i < count; i++) {
- VALUE imod = RARRAY_AT(ary, i);
- mn = rb_objc_method_node(imod, id, NULL, NULL);
- if (mn != NULL) {
- goto start_method_dispatch;
- }
- }
- }
- }
- }
- else if (mcache != NULL) {
+ if (mcache != NULL) {
struct rb_objc_method_sig sig;
if (rb_objc_fill_sig(recv, (Class)klass, mcache->as.rcall.sel, &sig, NULL)) {
/* the class probably implements forwardInvocation: */
@@ -1445,17 +1429,17 @@
static inline VALUE
vm_search_normal_superclass(VALUE klass, VALUE recv)
{
- if (TYPE(klass) == T_CLASS) {
- klass = RCLASS_SUPER(klass);
- }
- else if (TYPE(klass) == T_MODULE) {
- VALUE k = CLASS_OF(recv);
- while (k) {
- if (TYPE(k) == T_ICLASS && RBASIC(k)->klass == klass) {
- klass = RCLASS_SUPER(k);
+ VALUE ary;
+ int i, count;
+
+ ary = rb_mod_ancestors_nocopy(CLASS_OF(recv));
+ count = RARRAY_LEN(ary);
+ for (i = 0; i < count; i++) {
+ if (RARRAY_AT(ary, i) == klass) {
+ if (i < count) {
+ klass = RARRAY_AT(ary, i + 1);
break;
}
- k = RCLASS_SUPER(k);
}
}
return klass;
@@ -1466,10 +1450,8 @@
vm_search_normal_superclass2(VALUE klass, VALUE recv, ID mid, NODE **mnp,
IMP *impp, SEL *selp)
{
- static ID idPreviousKlass = 0;
static ID idNew = 0, idNew2 = 0, idNew3 = 0;
- CFMutableDictionaryRef iv_dict;
- VALUE ary, k;
+ VALUE k;
if (idNew == 0) {
idNew = rb_intern("new");
@@ -1477,45 +1459,8 @@
idNew3 = rb_intern("__new__");
}
- if (idPreviousKlass == 0) {
- idPreviousKlass = rb_intern("__previous_sklass__");
- }
-
- 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;
- }
- }
- }
-
- 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;
- }
-
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) {
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20081122/76a4404e/attachment.html>
More information about the macruby-changes
mailing list