diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1997-06-25 16:13:42 -0400 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1997-06-25 16:13:42 -0400 |
commit | 73845be11eb868e566e1d0a706d5e9e519e85ce8 (patch) | |
tree | b78365d0dfacf0182327e1b8ffc02a96e3446860 | |
parent | 38692f1f94e9483345a45de94d2a70443e4717e4 (diff) | |
download | gcc-73845be11eb868e566e1d0a706d5e9e519e85ce8.zip gcc-73845be11eb868e566e1d0a706d5e9e519e85ce8.tar.gz gcc-73845be11eb868e566e1d0a706d5e9e519e85ce8.tar.bz2 |
(__objc_register_instance_methods_to_class): New function.
From-SVN: r14307
-rw-r--r-- | gcc/objc/selector.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/gcc/objc/selector.c b/gcc/objc/selector.c index de1bd45..b2fdccb 100644 --- a/gcc/objc/selector.c +++ b/gcc/objc/selector.c @@ -88,6 +88,71 @@ register_selectors_from_list (MethodList_t method_list) } +/* Register instance methods as class methods for root classes */ +void __objc_register_instance_methods_to_class(Class class) +{ + MethodList_t method_list; + MethodList_t class_method_list; + int max_methods_no = 16; + MethodList_t new_list; + Method_t curr_method; + + /* Only if a root class. */ + if(class->super_class) + return; + + /* Allocate a method list to hold the new class methods */ + new_list = objc_calloc(sizeof(struct objc_method_list) + + sizeof(struct objc_method[max_methods_no]), 1); + method_list = class->methods; + class_method_list = class->class_pointer->methods; + curr_method = &new_list->method_list[0]; + + /* Iterate through the method lists for the class */ + while (method_list) + { + int i; + + /* Iterate through the methods from this method list */ + for (i = 0; i < method_list->method_count; i++) + { + Method_t mth = &method_list->method_list[i]; + if (mth->method_name + && !search_for_method_in_list (class_method_list, + mth->method_name)) + { + /* This instance method isn't a class method. + Add it into the new_list. */ + *curr_method = *mth; + + /* Reallocate the method list if necessary */ + if(++new_list->method_count == max_methods_no) + new_list = + objc_realloc(new_list, sizeof(struct objc_method_list) + + sizeof(struct + objc_method[max_methods_no += 16])); + curr_method = &new_list->method_list[new_list->method_count]; + } + } + + method_list = method_list->method_next; + } + + /* If we created any new class methods + then attach the method list to the class */ + if (new_list->method_count) + { + new_list = + objc_realloc(new_list, sizeof(struct objc_method_list) + + sizeof(struct objc_method[new_list->method_count])); + new_list->method_next = class->class_pointer->methods; + class->class_pointer->methods = new_list; + } + + __objc_update_dispatch_table_for_class (class->class_pointer); +} + + /* Returns YES iff t1 and t2 have same method types, but we ignore the argframe layout */ BOOL |