simplify typed selector usage.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@32396 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
rfm 2011-02-27 23:29:25 +00:00
parent 1b2dd79c1f
commit 08440691cb
6 changed files with 46 additions and 55 deletions

View file

@ -1,3 +1,12 @@
2011-02-27 Richard Frith-Macdonald <rfm@gnu.org>
* 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 <object@gmail.com> 2011-02-27 Banlu Kemiyatorn <object@gmail.com>
* Source/NSOperation.m: Fix error checking condition for dependencies. * Source/NSOperation.m: Fix error checking condition for dependencies.

View file

@ -149,11 +149,28 @@ GSSelectorFromNameAndTypes(const char *name, const char *types)
} }
else else
{ {
#ifdef __GNU_LIBOBJC__ SEL s;
return sel_registerTypedName(name, types);
#else if (types == 0)
return sel_registerTypedName_np(name, types); {
#endif 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 #endif
} }
@ -164,12 +181,13 @@ GSTypesFromSelector(SEL sel)
return 0; return 0;
#else #else
if (sel == 0) if (sel == 0)
return 0; {
#ifdef __GNU_LIBOBJC__ return 0;
return sel_getTypeEncoding(sel); }
#else else
return sel_getType_np(sel); {
#endif return sel_get_type(sel);
}
#endif #endif
} }
void void
@ -1347,7 +1365,7 @@ GSObjCGetVal(NSObject *self, const char *key, SEL sel,
cls = [self class]; cls = [self class];
type_slot = objc_get_slot(cls, @selector(retain)); type_slot = objc_get_slot(cls, @selector(retain));
typed = sel_registerTypedName_np(sel_getName(sel), typed = GSObjCSelectorFromNameAndTypes(sel_getName(sel),
type_slot->types); type_slot->types);
slot = objc_get_slot(cls, typed); slot = objc_get_slot(cls, typed);
if (strcmp(slot->types, type_slot->types) == 0) if (strcmp(slot->types, type_slot->types) == 0)

View file

@ -919,7 +919,7 @@ GSInvocationCallback (void *callback_data, va_alist args)
{ {
const char *runtimeName = sel_getName(selector); const char *runtimeName = sel_getName(selector);
selector = sel_getType_np(runtimeName, receiverTypes); runtimeTypes = GSTypesFromSelector(selector);
if (selector == 0) if (selector == 0)
{ {
selector = GSSelectorFromNameAndTypes(runtimeName, receiverTypes); selector = GSSelectorFromNameAndTypes(runtimeName, receiverTypes);

View file

@ -99,15 +99,16 @@ gs_find_best_typed_sel (SEL sel)
return (SEL)0; return (SEL)0;
sel_copyTypes_np (selName, &types, 1); sel_copyTypes_np (selName, &types, 1);
return sel_registerTypedName_np(selName, types); return GSObjCSelectorFromNameAndTypes(selName, types);
} }
#elif defined (__GNU_LIBOBJC__) #elif defined (__GNU_LIBOBJC__)
{ {
/* Get the list of all selectors with this name. */ /* Get the list of all selectors with this name. */
const char *selName = sel_getName (sel); const char *selName = sel_getName (sel);
unsigned int numberOfReturnedSelectors; 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 no selectors are returned, there is no selector. */
if (selectors == NULL) if (selectors == NULL)
return NULL; return NULL;
@ -118,7 +119,7 @@ gs_find_best_typed_sel (SEL sel)
SEL selector = selectors[0]; SEL selector = selectors[0];
free (selectors); free (selectors);
if (sel_getTypeEncoding (selector)) if (GSTypesFromSelector(selector))
return selector; return selector;
else else
return NULL; return NULL;
@ -130,8 +131,8 @@ gs_find_best_typed_sel (SEL sel)
{ {
SEL first_selector = selectors[0]; SEL first_selector = selectors[0];
SEL second_selector = selectors[1]; SEL second_selector = selectors[1];
const char *first_selector_types = sel_getTypeEncoding (first_selector); const char *first_selector_types = GSTypesFromSelector(first_selector);
const char *second_selector_types = sel_getTypeEncoding (second_selector); const char *second_selector_types = GSTypesFromSelector(second_selector);
free (selectors); free (selectors);
if (first_selector_types && !second_selector_types) if (first_selector_types && !second_selector_types)

View file

@ -1328,14 +1328,6 @@ sel_getName(SEL sel)
return sel_get_name(sel); return sel_get_name(sel);
} }
const char *
sel_getType_np(SEL sel)
{
if (sel == 0)
return "";
return sel_get_type(sel);
}
SEL SEL
sel_getUid(const char *selName) sel_getUid(const char *selName)
{ {
@ -1356,28 +1348,3 @@ sel_registerName(const char *selName)
return sel_register_name(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;
}

View file

@ -291,14 +291,10 @@ static const id self = nil;
const char *sel_getName(SEL sel); const char *sel_getName(SEL sel);
const char *sel_getType_np(SEL sel);
SEL sel_getUid(const char *selName); SEL sel_getUid(const char *selName);
BOOL sel_isEqual(SEL sel1, SEL sel2); BOOL sel_isEqual(SEL sel1, SEL sel2);
SEL sel_registerName(const char *selName); SEL sel_registerName(const char *selName);
SEL sel_registerTypedName_np(const char *selName, const char *types);
#endif // __OBJECTIVEC2_RUNTIME_H_INCLUDED #endif // __OBJECTIVEC2_RUNTIME_H_INCLUDED