summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornicola <nicola@138bc75d-0d04-0410-961f-82ee72b054a4>2010-12-24 20:10:46 +0000
committernicola <nicola@138bc75d-0d04-0410-961f-82ee72b054a4>2010-12-24 20:10:46 +0000
commit53f87f101af3cc1c05543b3ec46ee2e455bd6fa9 (patch)
tree82ccf00b97041686d44ec777ecbed412ef03db12
parentf3031d3508b1b727dfef911f7ba6cf1e5a0d4e6b (diff)
downloadgcc-53f87f101af3cc1c05543b3ec46ee2e455bd6fa9.tar.gz
In libobjc/:
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. In gcc/testsuite/: 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@168231 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/obj-c++.dg/gnu-api-2-sel.mm23
-rw-r--r--gcc/testsuite/objc.dg/gnu-api-2-sel.m23
-rw-r--r--libobjc/ChangeLog8
-rw-r--r--libobjc/objc/runtime.h6
-rw-r--r--libobjc/selector.c12
6 files changed, 73 insertions, 6 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2e68afa4f21..2f07ea6c7ff 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,12 @@
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
alignment to class_addIvar, instead of the alignment itself.
* obj-c++.dg/gnu-api-2-class.mm: Same change.
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 956ba29ca83..6d1d0fcf203 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 db2dcd3ec28..70368cae185 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 d8f23f74c9a..f234a2654d1 100644
--- a/libobjc/ChangeLog
+++ b/libobjc/ChangeLog
@@ -1,5 +1,13 @@
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
alignment is actually the log_2 of the alignment in bytes.
* ivars.c (class_addIvar): Corresponding change to the
diff --git a/libobjc/objc/runtime.h b/libobjc/objc/runtime.h
index 9332f7be069..551c348d307 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 f8a7f14fdb1..4110df2662b 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 ==