1111#include " selector.h"
1212#include " lock.h"
1313#include " gc_ops.h"
14+ #include " helpers.hh"
1415
1516/* *
1617 * A single associative reference. Contains the key, value, and association
@@ -105,7 +106,7 @@ static void cleanupReferenceList(struct reference_list *list)
105106 // Full barrier - ensure that we've zero'd the key before doing
106107 // this!
107108 __sync_synchronize ();
108- objc_release (r->object );
109+ objc_release (( id ) r->object );
109110 }
110111 r->object = 0 ;
111112 r->policy = 0 ;
@@ -117,7 +118,7 @@ static void freeReferenceList(struct reference_list *l)
117118{
118119 if (NULL == l) { return ; }
119120 freeReferenceList (l->next );
120- gc-> free (l);
121+ free (l);
121122}
122123
123124static void setReference (struct reference_list *list,
@@ -135,44 +136,45 @@ static void setReference(struct reference_list *list,
135136 break ;
136137 case OBJC_ASSOCIATION_RETAIN_NONATOMIC :
137138 case OBJC_ASSOCIATION_RETAIN :
138- obj = objc_retain (obj);
139+ obj = objc_retain (( id ) obj);
139140 case OBJC_ASSOCIATION_ASSIGN :
140141 break ;
141142 }
142143 // While inserting into the list, we need to lock it temporarily.
143- volatile int *lock = lock_for_pointer (list);
144- lock_spinlock (lock);
145144 struct reference *r = findReference (list, key);
146- // If there's an existing reference, then we can update it, otherwise we
147- // have to install a new one
148- if (NULL == r)
149145 {
150- // Search for an unused slot
151- r = findReference (list, 0 );
146+ auto lock = acquire_locks_for_pointers (list);
147+ // If there's an existing reference, then we can update it, otherwise we
148+ // have to install a new one
152149 if (NULL == r)
153150 {
154- struct reference_list *l = list;
151+ // Search for an unused slot
152+ r = findReference (list, 0 );
153+ if (NULL == r)
154+ {
155+ struct reference_list *l = list;
155156
156- while (NULL != l->next ) { l = l->next ; }
157+ while (NULL != l->next ) { l = l->next ; }
157158
158- l->next = gc->malloc (sizeof (struct reference_list));
159- r = &l->next ->list [0 ];
159+ l->next = allocate_zeroed<struct reference_list >();
160+ r = &l->next ->list [0 ];
161+ }
162+ r->key = key;
160163 }
161- r->key = key;
162164 }
163- unlock_spinlock (lock);
164165 // Now we only need to lock if the old or new property is atomic
165166 BOOL needLock = isAtomic (r->policy ) || isAtomic (policy);
167+ ThinLock *lock;
166168 if (needLock)
167169 {
168170 lock = lock_for_pointer (r);
169- lock_spinlock ( lock);
171+ lock-> lock ( );
170172 }
171173 @try
172174 {
173175 if (OBJC_ASSOCIATION_ASSIGN != r->policy )
174176 {
175- objc_release (r->object );
177+ objc_release (( id ) r->object );
176178 }
177179 }
178180 @finally
@@ -182,7 +184,7 @@ static void setReference(struct reference_list *list,
182184 }
183185 if (needLock)
184186 {
185- unlock_spinlock ( lock);
187+ lock-> unlock ( );
186188 }
187189}
188190
@@ -201,8 +203,8 @@ static inline Class findHiddenClass(id obj)
201203
202204static Class allocateHiddenClass (Class superclass)
203205{
204- Class newClass =
205- calloc ( 1 , sizeof ( struct objc_class ) + sizeof (struct reference_list));
206+ struct objc_class * newClass =
207+ allocate_zeroed< struct objc_class >( sizeof (struct reference_list ));
206208
207209 if (Nil == newClass) { return Nil ; }
208210
@@ -221,9 +223,9 @@ static Class allocateHiddenClass(Class superclass)
221223
222224 LOCK_RUNTIME_FOR_SCOPE ();
223225 newClass->sibling_class = superclass->subclass_list ;
224- superclass->subclass_list = newClass;
226+ superclass->subclass_list = ( Class ) newClass;
225227
226- return newClass;
228+ return ( Class ) newClass;
227229}
228230
229231static inline Class initHiddenClassForObject (id obj)
@@ -248,7 +250,7 @@ static void deallocHiddenClass(id obj, SEL _cmd)
248250 Class hiddenClass = findHiddenClass (obj);
249251 // After calling [super dealloc], the object will no longer exist.
250252 // Free the hidden class.
251- struct reference_list *list = object_getIndexedIvars (hiddenClass);
253+ struct reference_list *list = static_cast < struct reference_list *>( object_getIndexedIvars (hiddenClass) );
252254 DESTROY_LOCK (&list->lock );
253255 cleanupReferenceList (list);
254256 freeReferenceList (list->next );
@@ -289,38 +291,33 @@ static void deallocHiddenClass(id obj, SEL _cmd)
289291 Class cls = (Class )object;
290292 if ((NULL == cls->extra_data ) && create)
291293 {
292- volatile int *lock = lock_for_pointer (cls);
293- struct reference_list *list = gc->malloc (sizeof (struct reference_list));
294- lock_spinlock (lock);
294+ struct reference_list *list = allocate_zeroed<struct reference_list >();
295+ auto guard = acquire_locks_for_pointers (cls);
295296 if (NULL == cls->extra_data )
296297 {
297298 INIT_LOCK (list->lock );
298299 cls->extra_data = list;
299- unlock_spinlock (lock);
300300 }
301301 else
302302 {
303- unlock_spinlock (lock);
304- gc->free (list);
303+ free (list);
305304 }
306305 }
307306 return cls->extra_data ;
308307 }
309308 Class hiddenClass = findHiddenClass (object);
310309 if ((NULL == hiddenClass) && create)
311310 {
312- volatile int *lock = lock_for_pointer (object);
313- lock_spinlock (lock);
311+ auto guard = acquire_locks_for_pointers (object);
314312 hiddenClass = findHiddenClass (object);
315313 if (NULL == hiddenClass)
316314 {
317315 hiddenClass = initHiddenClassForObject (object);
318- struct reference_list *list = object_getIndexedIvars (hiddenClass);
316+ struct reference_list *list = static_cast < struct reference_list *>( object_getIndexedIvars (hiddenClass) );
319317 INIT_LOCK (list->lock );
320318 }
321- unlock_spinlock (lock);
322319 }
323- return hiddenClass ? object_getIndexedIvars (hiddenClass) : NULL ;
320+ return hiddenClass ? static_cast < struct reference_list *>( object_getIndexedIvars (hiddenClass)) : nullptr ;
324321}
325322
326323void objc_setAssociatedObject (id object,
@@ -345,9 +342,9 @@ id objc_getAssociatedObject(id object, const void *key)
345342 // Apple's objc4 retains and autoreleases the object under these policies
346343 if (r->policy & OBJC_ASSOCIATION_RETAIN_NONATOMIC )
347344 {
348- objc_retainAutorelease (r->object );
345+ objc_retainAutorelease (( id ) r->object );
349346 }
350- return r->object ;
347+ return ( id ) r->object ;
351348 }
352349 if (class_isMetaClass (object->isa ))
353350 {
@@ -363,7 +360,7 @@ id objc_getAssociatedObject(id object, const void *key)
363360 }
364361 if (Nil != cls)
365362 {
366- struct reference_list *next_list = object_getIndexedIvars (cls);
363+ struct reference_list *next_list = static_cast < struct reference_list *>( object_getIndexedIvars (cls) );
367364 if (list != next_list)
368365 {
369366 list = next_list;
@@ -372,9 +369,9 @@ id objc_getAssociatedObject(id object, const void *key)
372369 {
373370 if (r->policy & OBJC_ASSOCIATION_RETAIN_NONATOMIC )
374371 {
375- objc_retainAutorelease (r->object );
372+ objc_retainAutorelease (( id ) r->object );
376373 }
377- return r->object ;
374+ return ( id ) r->object ;
378375 }
379376 }
380377 cls = class_getSuperclass (cls);
@@ -433,16 +430,14 @@ static Class hiddenClassForObject(id object)
433430 Class hiddenClass = findHiddenClass (object);
434431 if (NULL == hiddenClass)
435432 {
436- volatile int *lock = lock_for_pointer (object);
437- lock_spinlock (lock);
433+ auto guard = acquire_locks_for_pointers (object);
438434 hiddenClass = findHiddenClass (object);
439435 if (NULL == hiddenClass)
440436 {
441437 hiddenClass = initHiddenClassForObject (object);
442- struct reference_list *list = object_getIndexedIvars (hiddenClass);
438+ struct reference_list *list = static_cast < struct reference_list *>( object_getIndexedIvars (hiddenClass) );
443439 INIT_LOCK (list->lock );
444440 }
445- unlock_spinlock (lock);
446441 }
447442 return hiddenClass;
448443}
@@ -464,13 +459,13 @@ id object_clone_np(id object)
464459 // Make sure that the prototype has a hidden class, so that methods added
465460 // to it will appear in the clone.
466461 referenceListForObject (object, YES );
467- id new = class_createInstance (object->isa , 0 );
468- Class hiddenClass = initHiddenClassForObject (new );
469- struct reference_list *list = object_getIndexedIvars (hiddenClass);
462+ id newInstance = class_createInstance (object->isa , 0 );
463+ Class hiddenClass = initHiddenClassForObject (newInstance );
464+ struct reference_list *list = static_cast < struct reference_list *>( object_getIndexedIvars (hiddenClass) );
470465 INIT_LOCK (list->lock );
471- objc_setAssociatedObject (new , &prototypeKey, object,
466+ objc_setAssociatedObject (newInstance , &prototypeKey, object,
472467 OBJC_ASSOCIATION_RETAIN_NONATOMIC );
473- return new ;
468+ return newInstance ;
474469}
475470
476471id object_getPrototype_np (id object)
0 commit comments