From 08440691cb007fc5325014daf9f4ee319b507523 Mon Sep 17 00:00:00 2001 From: rfm Date: Sun, 27 Feb 2011 23:29:25 +0000 Subject: [PATCH] simplify typed selector usage. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@32396 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 9 +++++++ Source/Additions/GSObjCRuntime.m | 42 +++++++++++++++++++++++--------- Source/GSFFCallInvocation.m | 2 +- Source/GSFFIInvocation.m | 11 +++++---- Source/ObjectiveC2/runtime.c | 33 ------------------------- Source/ObjectiveC2/runtime.h | 4 --- 6 files changed, 46 insertions(+), 55 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7f80fffcd..95a2eb9b1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2011-02-27 Richard Frith-Macdonald + + * Source/GSFFCallInvocation.m: + * Source/ObjectiveC2/runtime.c: + * Source/ObjectiveC2/runtime.h: + * Source/Additions/GSObjCRuntime.m: + Avoid messy runtime differences by using old runtime api for typed + selector features not in the Apple runtime. + 2011-02-27 Banlu Kemiyatorn * Source/NSOperation.m: Fix error checking condition for dependencies. diff --git a/Source/Additions/GSObjCRuntime.m b/Source/Additions/GSObjCRuntime.m index eee7c20fa..e1a9b27a5 100644 --- a/Source/Additions/GSObjCRuntime.m +++ b/Source/Additions/GSObjCRuntime.m @@ -149,11 +149,28 @@ GSSelectorFromNameAndTypes(const char *name, const char *types) } else { -#ifdef __GNU_LIBOBJC__ - return sel_registerTypedName(name, types); -#else - return sel_registerTypedName_np(name, types); -#endif + SEL s; + + if (types == 0) + { + s = sel_get_any_typed_uid(name); + } + else + { + s = sel_get_typed_uid(name, types); + } + if (s == 0) + { + if (types == 0) + { + s = sel_register_name(name); + } + else + { + s = sel_register_typed_name(name, types); + } + } + return s; } #endif } @@ -164,12 +181,13 @@ GSTypesFromSelector(SEL sel) return 0; #else if (sel == 0) - return 0; -#ifdef __GNU_LIBOBJC__ - return sel_getTypeEncoding(sel); -#else - return sel_getType_np(sel); -#endif + { + return 0; + } + else + { + return sel_get_type(sel); + } #endif } void @@ -1347,7 +1365,7 @@ GSObjCGetVal(NSObject *self, const char *key, SEL sel, cls = [self class]; type_slot = objc_get_slot(cls, @selector(retain)); - typed = sel_registerTypedName_np(sel_getName(sel), + typed = GSObjCSelectorFromNameAndTypes(sel_getName(sel), type_slot->types); slot = objc_get_slot(cls, typed); if (strcmp(slot->types, type_slot->types) == 0) diff --git a/Source/GSFFCallInvocation.m b/Source/GSFFCallInvocation.m index 31832fcc9..57eb25f51 100644 --- a/Source/GSFFCallInvocation.m +++ b/Source/GSFFCallInvocation.m @@ -919,7 +919,7 @@ GSInvocationCallback (void *callback_data, va_alist args) { const char *runtimeName = sel_getName(selector); - selector = sel_getType_np(runtimeName, receiverTypes); + runtimeTypes = GSTypesFromSelector(selector); if (selector == 0) { selector = GSSelectorFromNameAndTypes(runtimeName, receiverTypes); diff --git a/Source/GSFFIInvocation.m b/Source/GSFFIInvocation.m index e52aee3ca..295f4b0a5 100644 --- a/Source/GSFFIInvocation.m +++ b/Source/GSFFIInvocation.m @@ -99,15 +99,16 @@ gs_find_best_typed_sel (SEL sel) return (SEL)0; sel_copyTypes_np (selName, &types, 1); - return sel_registerTypedName_np(selName, types); + return GSObjCSelectorFromNameAndTypes(selName, types); } #elif defined (__GNU_LIBOBJC__) { /* Get the list of all selectors with this name. */ const char *selName = sel_getName (sel); unsigned int numberOfReturnedSelectors; - SEL *selectors = sel_copyTypedSelectorList (selName, &numberOfReturnedSelectors); + SEL *selectors; + selectors = sel_copyTypedSelectorList (selName, &numberOfReturnedSelectors); /* If no selectors are returned, there is no selector. */ if (selectors == NULL) return NULL; @@ -118,7 +119,7 @@ gs_find_best_typed_sel (SEL sel) SEL selector = selectors[0]; free (selectors); - if (sel_getTypeEncoding (selector)) + if (GSTypesFromSelector(selector)) return selector; else return NULL; @@ -130,8 +131,8 @@ gs_find_best_typed_sel (SEL sel) { SEL first_selector = selectors[0]; SEL second_selector = selectors[1]; - const char *first_selector_types = sel_getTypeEncoding (first_selector); - const char *second_selector_types = sel_getTypeEncoding (second_selector); + const char *first_selector_types = GSTypesFromSelector(first_selector); + const char *second_selector_types = GSTypesFromSelector(second_selector); free (selectors); if (first_selector_types && !second_selector_types) diff --git a/Source/ObjectiveC2/runtime.c b/Source/ObjectiveC2/runtime.c index b72b1c1a6..edb89f075 100644 --- a/Source/ObjectiveC2/runtime.c +++ b/Source/ObjectiveC2/runtime.c @@ -1328,14 +1328,6 @@ sel_getName(SEL sel) return sel_get_name(sel); } -const char * -sel_getType_np(SEL sel) -{ - if (sel == 0) - return ""; - return sel_get_type(sel); -} - SEL sel_getUid(const char *selName) { @@ -1356,28 +1348,3 @@ sel_registerName(const char *selName) return sel_register_name(selName); } -SEL sel_registerTypedName_np(const char *selName, const char *types) -{ - SEL s; - - if (types == 0) - { - s = sel_get_any_typed_uid(selName); - } - else - { - s = sel_get_typed_uid(selName, types); - } - if (s == 0) - { - if (types == 0) - { - s = sel_register_name(selName); - } - else - { - s = sel_register_typed_name(selName, types); - } - } - return s; -} diff --git a/Source/ObjectiveC2/runtime.h b/Source/ObjectiveC2/runtime.h index 03a6600e7..03e16e0aa 100644 --- a/Source/ObjectiveC2/runtime.h +++ b/Source/ObjectiveC2/runtime.h @@ -291,14 +291,10 @@ static const id self = nil; const char *sel_getName(SEL sel); -const char *sel_getType_np(SEL sel); - SEL sel_getUid(const char *selName); BOOL sel_isEqual(SEL sel1, SEL sel2); SEL sel_registerName(const char *selName); -SEL sel_registerTypedName_np(const char *selName, const char *types); - #endif // __OBJECTIVEC2_RUNTIME_H_INCLUDED