[macruby-changes] [468] MacRuby/trunk/objc.m

source_changes at macosforge.org source_changes at macosforge.org
Thu Aug 21 22:23:29 PDT 2008


Revision: 468
          http://trac.macosforge.org/projects/ruby/changeset/468
Author:   lsansonetti at apple.com
Date:     2008-08-21 22:23:29 -0700 (Thu, 21 Aug 2008)
Log Message:
-----------
propagate alias methods to classes that include the module

Modified Paths:
--------------
    MacRuby/trunk/objc.m

Modified: MacRuby/trunk/objc.m
===================================================================
--- MacRuby/trunk/objc.m	2008-08-22 04:32:09 UTC (rev 467)
+++ MacRuby/trunk/objc.m	2008-08-22 05:23:29 UTC (rev 468)
@@ -1144,6 +1144,8 @@
     SEL name_sel, def_sel;
     Method method, dest_method;
     bool redo = false;
+    VALUE included_in_classes;
+    int included_in_classes_count = -1;
 
     name_str = rb_id2name(name);
     def_str = rb_id2name(def);
@@ -1151,6 +1153,8 @@
     name_sel = sel_registerName(name_str);
     def_sel = sel_registerName(def_str);
 
+    included_in_classes = RCLASS_MODULE(klass) ? rb_attr_get(klass, idIncludedInClasses) : Qnil;
+
     method = class_getInstanceMethod((Class)klass, def_sel);
     if (method == NULL) {
 	size_t len = strlen(def_str);
@@ -1173,6 +1177,29 @@
 
 alias_method:
 
+#define forward_method_definition(sel,imp,types) \
+    do { \
+        if (included_in_classes != Qnil) { \
+            int i; \
+            if (included_in_classes_count == -1) \
+                included_in_classes_count = RARRAY_LEN(included_in_classes); \
+            for (i = 0; i < included_in_classes_count; i++) { \
+                VALUE k = RARRAY_AT(included_in_classes, i); \
+                Method m = class_getInstanceMethod((Class)k, sel); \
+                DLOG("DEFI", "-[%s %s]", class_getName((Class)k), (char *)sel); \
+                if (m != NULL) { \
+                    Method m2 = class_getInstanceMethod((Class)RCLASS_SUPER(k), sel); \
+                    if (m != m2) { \
+                        method_setImplementation(m, imp); \
+                        break; \
+                    } \
+                } \
+                assert(class_addMethod((Class)k, sel, imp, types)); \
+            } \
+        } \
+    } \
+    while (0)
+
     dest_method = class_getInstanceMethod((Class)klass, name_sel);
 
     DLOG("ALIAS", "%c[%s %s -> %s] types=%s direct_override=%d orig_node=%p", 
@@ -1187,6 +1214,7 @@
 		    method_getImplementation(method), 
 		    method_getTypeEncoding(method)));
     }
+    forward_method_definition(name_sel, method_getImplementation(method), method_getTypeEncoding(method));
 
     if (!redo && name_str[strlen(name_str) - 1] != ':') {
 	char buf[100];
@@ -1417,7 +1445,7 @@
     VALUE included_in_classes;
     int included_in_classes_count = - 1;
 
-#define forward_method_definition(ary,sel,imp,types) \
+#define forward_method_definition(sel,imp,types) \
     do { \
 	if (included_in_classes != Qnil) { \
 	    int i; \
@@ -1537,7 +1565,7 @@
     else {
 	assert(class_addMethod((Class)mod, sel, imp, types));
     }
-    forward_method_definition(included_in_classes, sel, imp, types);
+    forward_method_definition(sel, imp, types);
 
     if (node != NULL) {
 	const char *sel_str = (const char *)sel;
@@ -1578,9 +1606,11 @@
 	    else { 
 		assert(class_addMethod((Class)mod, new_sel, imp, new_types));
 	    }
-	    forward_method_definition(included_in_classes, new_sel, imp, new_types);
+	    forward_method_definition(new_sel, imp, new_types);
 	}
     }
+
+#undef forward_method_definition
 }
 
 static inline bool
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macruby-changes/attachments/20080821/7e0a4441/attachment-0001.html 


More information about the macruby-changes mailing list