88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
return Nil;
/*
* Fast path
*
* Instead of looking up the string in a dictionary, which needs
* locking, we use a sparse array to look up the pointer. If
* objc_classname_to_class() gets called a lot, it is most likely that
* the GCC ABI is used, which always calls into objc_lookup_class(), or
* that it is used in a loop by the user. In both cases, it is very
* likely that the same string pointer is passed again and again.
*
* This is not used before objc_classname_to_class() has been called a
* certain amount of times, so that no memory is wasted if it is only
* used rarely, for example if the ObjFW ABI is used and the user does
* not call it in a loop.
*
* Runtime internal usage does not use the fast path and does not count
* as a call into objc_classname_to_class(). The reason for this is
* that if the runtime calls into objc_classname_to_class(), it already
* has the lock and thus the performance gain would be small, but it
* would waste memory.
*/
if (cache && fastPath != NULL) {
class = objc_sparsearray_get(fastPath, (uintptr_t)name);
if (class != Nil)
return class;
}
|
|
|
|
|
|
|
|
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
return Nil;
/*
* Fast path
*
* Instead of looking up the string in a dictionary, which needs
* locking, we use a sparse array to look up the pointer. If
* objc_classnameToClass() gets called a lot, it is most likely that
* the GCC ABI is used, which always calls into objc_lookup_class(), or
* that it is used in a loop by the user. In both cases, it is very
* likely that the same string pointer is passed again and again.
*
* This is not used before objc_classnameToClass() has been called a
* certain amount of times, so that no memory is wasted if it is only
* used rarely, for example if the ObjFW ABI is used and the user does
* not call it in a loop.
*
* Runtime internal usage does not use the fast path and does not count
* as a call into objc_classnameToClass(). The reason for this is that
* if the runtime calls into objc_classnameToClass(), it already has
* the lock and thus the performance gain would be small, but it would
* waste memory.
*/
if (cache && fastPath != NULL) {
class = objc_sparsearray_get(fastPath, (uintptr_t)name);
if (class != Nil)
return class;
}
|