In libobjc/: 2010-12-21 Nicola Pero <nicola.pero@meta-innovation.com>

In libobjc/:
2010-12-21  Nicola Pero  <nicola.pero@meta-innovation.com>

	PR libobjc/18764
	* class.c (__objc_add_class_to_hash): Return YES if the class was
	added, and NO if it already existed.
	* init.c (__objc_init_class): If __objc_add_class_to_hash returns
	NO, then abort the program with an error message.
	* objc-private/runtime.h (__objc_add_class_to_hash): Updated
	declaration.

From-SVN: r168139
This commit is contained in:
Nicola Pero 2010-12-21 22:49:37 +00:00 committed by Nicola Pero
parent 2fdd3e0468
commit 1575c9deae
4 changed files with 57 additions and 35 deletions

View File

@ -1,3 +1,13 @@
2010-12-21 Nicola Pero <nicola.pero@meta-innovation.com>
PR libobjc/18764
* class.c (__objc_add_class_to_hash): Return YES if the class was
added, and NO if it already existed.
* init.c (__objc_init_class): If __objc_add_class_to_hash returns
NO, then abort the program with an error message.
* objc-private/runtime.h (__objc_add_class_to_hash): Updated
declaration.
2010-12-21 Nicola Pero <nicola.pero@meta-innovation.com>
* init.c (_objc_load_callback): Initialize with 0.

View File

@ -446,11 +446,12 @@ __objc_init_class_tables (void)
}
/* This function adds a class to the class hash table, and assigns the
class a number, unless it's already known. */
void
class a number, unless it's already known. Return 'YES' if the
class was added. Return 'NO' if the class was already known. */
BOOL
__objc_add_class_to_hash (Class class)
{
Class h_class;
Class existing_class;
objc_mutex_lock (__objc_runtime_mutex);
@ -461,11 +462,17 @@ __objc_add_class_to_hash (Class class)
assert (CLS_ISCLASS (class));
/* Check to see if the class is already in the hash table. */
h_class = class_table_get_safe (class->name);
if (! h_class)
existing_class = class_table_get_safe (class->name);
if (existing_class)
{
/* The class isn't in the hash table. Add the class and assign a class
number. */
objc_mutex_unlock (__objc_runtime_mutex);
return NO;
}
else
{
/* The class isn't in the hash table. Add the class and assign
a class number. */
static unsigned int class_number = 1;
CLS_SETNUMBER (class, class_number);
@ -473,9 +480,10 @@ __objc_add_class_to_hash (Class class)
++class_number;
class_table_insert (class->name, class);
}
objc_mutex_unlock (__objc_runtime_mutex);
return YES;
}
}
Class

View File

@ -879,8 +879,8 @@ void
__objc_init_class (Class class)
{
/* Store the class in the class table and assign class numbers. */
__objc_add_class_to_hash (class);
if (__objc_add_class_to_hash (class))
{
/* Register all of the selectors in the class and meta class. */
__objc_register_selectors_from_class (class);
__objc_register_selectors_from_class ((Class) class->class_pointer);
@ -889,13 +889,17 @@ __objc_init_class (Class class)
__objc_install_premature_dtable (class);
__objc_install_premature_dtable (class->class_pointer);
/* Register the instance methods as class methods, this is only done
for root classes. */
/* Register the instance methods as class methods, this is only
done for root classes. */
__objc_register_instance_methods_to_class (class);
if (class->protocols)
__objc_init_protocols (class->protocols);
}
else
_objc_abort ("Module contains duplicate class '%s'\n",
class->name);
}
/* __objc_init_protocol must be called with __objc_runtime_mutex
already locked, and the "Protocol" class already registered. */

View File

@ -52,7 +52,7 @@ objc/runtime.h. */
extern "C" {
#endif /* __cplusplus */
extern void __objc_add_class_to_hash(Class); /* (objc-class.c) */
extern BOOL __objc_add_class_to_hash (Class); /* (objc-class.c) */
extern void __objc_init_class_tables (void); /* (objc-class.c) */
extern void __objc_init_dispatch_tables (void); /* (objc-dispatch.c) */
extern void __objc_install_premature_dtable (Class); /* (objc-dispatch.c) */