diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2e68afa4f213a1475f7bd6e2ab4e457a0996dae9..2f07ea6c7ff95293f84244a4a48649b52ef566f3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2010-12-24 Nicola Pero <nicola.pero@meta-innovation.com> + + * objc.dg/gnu-api-2-sel.m: Test calling sel_getUid, + sel_registerName and sel_registerTypedName with NULL arguments. + Updated the test to work with the Apple runtime as well. + * obj-c++.dg/gnu-api-2-sel.mm: Same change. + 2010-12-24 Nicola Pero <nicola.pero@meta-innovation.com> * objc.dg/gnu-api-2-class.m: Updated test to pass log_2 of the diff --git a/gcc/testsuite/obj-c++.dg/gnu-api-2-sel.mm b/gcc/testsuite/obj-c++.dg/gnu-api-2-sel.mm index 956ba29ca838e8ea7f1a46ed536c0197923ed453..6d1d0fcf203777c3d80e1d6bb3c2dc245830623b 100644 --- a/gcc/testsuite/obj-c++.dg/gnu-api-2-sel.mm +++ b/gcc/testsuite/obj-c++.dg/gnu-api-2-sel.mm @@ -3,7 +3,6 @@ This is test 'sel', covering all functions starting with 'sel'. */ /* { dg-do run } */ -/* { dg-skip-if "" { *-*-* } { "-fnext-runtime" } { "" } } */ /* To get the modern GNU Objective-C Runtime API, you include objc/runtime.h. */ @@ -16,11 +15,13 @@ { Class isa; } + alloc; - init; ++ initialize; @end @implementation MyRootClass + alloc { return class_createInstance (self, 0); } - init { return self; } ++ initialize { return self; } @end @protocol MyProtocol @@ -49,6 +50,7 @@ int main () { /* Functions are tested in alphabetical order. */ +#ifdef __GNU_LIBOBJC__ std::cout << "Testing sel_copyTypedSelectorList ()...\n"; { unsigned int count; @@ -72,6 +74,7 @@ int main () if (list[2] != NULL) abort (); } +#endif std::cout << "Testing sel_getName () ...\n"; { @@ -82,6 +85,7 @@ int main () abort (); } +#ifdef __GNU_LIBOBJC__ std::cout << "Testing sel_getTypeEncoding () ...\n"; { /* Get a selector from a real class, so it has interesting @@ -96,7 +100,9 @@ int main () if (sel_getTypeEncoding (NULL) != NULL) abort (); } +#endif +#ifdef __GNU_LIBOBJC__ std::cout << "Testing sel_getTypedSelector () ...\n"; { /* First try with a selector where we know that a typed one has @@ -128,11 +134,15 @@ int main () if (selector != NULL) abort (); } +#endif std::cout << "Testing sel_getUid () ...\n"; { if (std::strcmp (sel_getName (sel_getUid ("myMethod")), "myMethod") != 0) abort (); + + if (sel_getUid (NULL) != NULL) + abort (); } std::cout << "Testing sel_isEqual () ...\n"; @@ -145,8 +155,12 @@ int main () { if (std::strcmp (sel_getName (sel_registerName ("myMethod")), "myMethod") != 0) abort (); + + if (sel_registerName (NULL) != NULL) + abort (); } +#ifdef __GNU_LIBOBJC__ std::cout << "Testing set_registerTypedName () ...\n"; { const char *types = method_getTypeEncoding (class_getInstanceMethod @@ -159,7 +173,14 @@ int main () if (std::strcmp (sel_getTypeEncoding (selector), types) != 0) abort (); + + if (sel_registerTypedName (NULL, NULL) != NULL) + abort (); + + if (sel_registerTypedName (NULL, types) != NULL) + abort (); } +#endif return (0); } diff --git a/gcc/testsuite/objc.dg/gnu-api-2-sel.m b/gcc/testsuite/objc.dg/gnu-api-2-sel.m index db2dcd3ec28b59d30a54c26fac6815a8d55ec725..70368cae1852b845246658bccb90079dc76b102b 100644 --- a/gcc/testsuite/objc.dg/gnu-api-2-sel.m +++ b/gcc/testsuite/objc.dg/gnu-api-2-sel.m @@ -3,7 +3,6 @@ This is test 'sel', covering all functions starting with 'sel'. */ /* { dg-do run } */ -/* { dg-skip-if "" { *-*-* } { "-fnext-runtime" } { "" } } */ /* To get the modern GNU Objective-C Runtime API, you include objc/runtime.h. */ @@ -16,11 +15,13 @@ { Class isa; } + alloc; - init; ++ initialize; @end @implementation MyRootClass + alloc { return class_createInstance (self, 0); } - init { return self; } ++ initialize { return self; } @end @protocol MyProtocol @@ -49,6 +50,7 @@ int main(int argc, void **args) { /* Functions are tested in alphabetical order. */ +#ifdef __GNU_LIBOBJC__ printf ("Testing sel_copyTypedSelectorList ()...\n"); { unsigned int count; @@ -72,6 +74,7 @@ int main(int argc, void **args) if (list[2] != NULL) abort (); } +#endif printf ("Testing sel_getName () ...\n"); { @@ -82,6 +85,7 @@ int main(int argc, void **args) abort (); } +#ifdef __GNU_LIBOBJC__ printf ("Testing sel_getTypeEncoding () ...\n"); { /* Get a selector from a real class, so it has interesting @@ -96,7 +100,9 @@ int main(int argc, void **args) if (sel_getTypeEncoding (NULL) != NULL) abort (); } +#endif +#ifdef __GNU_LIBOBJC__ printf ("Testing sel_getTypedSelector () ...\n"); { /* First try with a selector where we know that a typed one has @@ -128,11 +134,15 @@ int main(int argc, void **args) if (selector != NULL) abort (); } +#endif printf ("Testing sel_getUid () ...\n"); { if (strcmp (sel_getName (sel_getUid ("myMethod")), "myMethod") != 0) abort (); + + if (sel_getUid (NULL) != NULL) + abort (); } printf ("Testing sel_isEqual () ...\n"); @@ -145,8 +155,12 @@ int main(int argc, void **args) { if (strcmp (sel_getName (sel_registerName ("myMethod")), "myMethod") != 0) abort (); + + if (sel_registerName (NULL) != NULL) + abort (); } +#ifdef __GNU_LIBOBJC__ printf ("Testing set_registerTypedName () ...\n"); { const char *types = method_getTypeEncoding (class_getInstanceMethod @@ -159,7 +173,14 @@ int main(int argc, void **args) if (strcmp (sel_getTypeEncoding (selector), types) != 0) abort (); + + if (sel_registerTypedName (NULL, NULL) != NULL) + abort (); + + if (sel_registerTypedName (NULL, types) != NULL) + abort (); } +#endif return 0; } diff --git a/libobjc/ChangeLog b/libobjc/ChangeLog index d8f23f74c9a1c4c2d981b83696c5226ae87d4d87..f234a2654d153865efc4ce394cc130d965bf3818 100644 --- a/libobjc/ChangeLog +++ b/libobjc/ChangeLog @@ -1,3 +1,11 @@ +2010-12-24 Nicola Pero <nicola.pero@meta-innovation.com> + + * selector.c (sel_getTypedSelector): Return NULL if given a NULL + argument. + (sel_registerTypedName): Same. + (sel_registerName): Same. + * objc/runtime.h: Updated documentation. + 2010-12-24 Nicola Pero <nicola.pero@meta-innovation.com> * objc/runtime.h (class_addIvar): Updated documentation. The diff --git a/libobjc/objc/runtime.h b/libobjc/objc/runtime.h index 9332f7be0692cf080af88e5eb9083f3b646a50e4..551c348d3074cb58100f4eea734d054eaec1edeb 100644 --- a/libobjc/objc/runtime.h +++ b/libobjc/objc/runtime.h @@ -191,14 +191,14 @@ objc_EXPORT SEL sel_getUid (const char *name); you know the types, it is better to call sel_registerTypedName(). If a selector with this name and no types already exists, it is returned. Note that this function should really be called - 'objc_registerSelector'. */ + 'objc_registerSelector'. Return NULL if 'name' is NULL. */ objc_EXPORT SEL sel_registerName (const char *name); /* Register a selector with a given name and types. If a selector with this name and types already exists, it is returned. Note that this function should really be called 'objc_registerTypedSelector', and it's called 'sel_registerTypedName' only for consistency with - 'sel_registerName'. + 'sel_registerName'. Return NULL if 'name' is NULL. Compatibility Note: the Apple/NeXT runtime has untyped selectors, so it does not have this function, which is specific to the GNU @@ -227,7 +227,7 @@ objc_EXPORT SEL * sel_copyTypedSelectorList (const char *name, /* Return a selector with name 'name' and a non-zero type encoding, if any such selector is registered with the runtime. If there is no - such selector, NULL is returned. + such selector, NULL is returned. Return NULL if 'name' is NULL. This is useful if you have the name of the selector, and would really like to get a selector for it that includes the type diff --git a/libobjc/selector.c b/libobjc/selector.c index f8a7f14fdb16ad0266f05d48ea330ddadd8c7e38..4110df2662bb3f04ee092efdf1b7bc6ad4509a95 100644 --- a/libobjc/selector.c +++ b/libobjc/selector.c @@ -357,8 +357,12 @@ SEL sel_getTypedSelector (const char *name) { sidx i; - objc_mutex_lock (__objc_runtime_mutex); + if (name == NULL) + return NULL; + + objc_mutex_lock (__objc_runtime_mutex); + /* Look for a typed selector. */ i = (sidx) objc_hash_value_for_key (__objc_selector_hash, name); if (i != 0) @@ -658,6 +662,9 @@ SEL sel_registerName (const char *name) { SEL ret; + + if (name == NULL) + return NULL; objc_mutex_lock (__objc_runtime_mutex); /* Assume that name is not constant static memory and needs to be @@ -680,6 +687,9 @@ sel_registerTypedName (const char *name, const char *type) { SEL ret; + if (name == NULL) + return NULL; + objc_mutex_lock (__objc_runtime_mutex); /* Assume that name and type are not constant static memory and need to be copied before put into a runtime structure. is_const ==