Differences From Artifact [c556b01892]:
- File src/runtime/selector.m — part of check-in [8d930f2067] at 2014-03-22 17:56:09 on branch trunk — Generalize runtime/hashtable.m (user: js, size: 3377) [annotate] [blame] [check-ins using]
To Artifact [c0034eeff2]:
- File
src/runtime/selector.m
— part of check-in
[1ebb9eb7b3]
at
2014-05-15 15:32:35
on branch trunk
— Multiple dtable / sparse array improvements
* dtable.m is now the old sparse array, using IMP as type for values and
thus not violating the C standard anymore (functions may not be stored
in void*)
* New sparsearray.m which can work with any size, based on the sparse
array from the fast path of class.m
* Fast path of class.m now uses the new sparsearray.m (user: js, size: 3432) [annotate] [blame] [check-ins using]
︙ | ︙ | |||
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #import "runtime.h" #import "runtime-private.h" #import "macros.h" #ifdef OF_SELUID24 # define SEL_MAX 0xFFFFFF #else # define SEL_MAX 0xFFFF #endif static struct objc_hashtable *selectors = NULL; static uint32_t selectors_cnt = 0; static struct objc_sparsearray *selector_names = NULL; static void **free_list = NULL; static size_t free_list_cnt = 0; | > > | 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #import "runtime.h" #import "runtime-private.h" #import "macros.h" #ifdef OF_SELUID24 # define SEL_MAX 0xFFFFFF # define SEL_SIZE 3 #else # define SEL_MAX 0xFFFF # define SEL_SIZE 2 #endif static struct objc_hashtable *selectors = NULL; static uint32_t selectors_cnt = 0; static struct objc_sparsearray *selector_names = NULL; static void **free_list = NULL; static size_t free_list_cnt = 0; |
︙ | ︙ | |||
51 52 53 54 55 56 57 | objc_hash_string, objc_equal_string, 2); else if ((rsel = objc_hashtable_get(selectors, sel->name)) != NULL) { ((struct objc_selector*)sel)->uid = rsel->uid; return; } if (selector_names == NULL) | | | | 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | objc_hash_string, objc_equal_string, 2); else if ((rsel = objc_hashtable_get(selectors, sel->name)) != NULL) { ((struct objc_selector*)sel)->uid = rsel->uid; return; } if (selector_names == NULL) selector_names = objc_sparsearray_new(SEL_SIZE); name = sel->name; rsel = (struct objc_selector*)sel; rsel->uid = selectors_cnt++; objc_hashtable_set(selectors, name, rsel); objc_sparsearray_set(selector_names, (uint32_t)rsel->uid, (void*)name); } SEL sel_registerName(const char *name) { const struct objc_abi_selector *rsel; struct objc_abi_selector *sel; |
︙ | ︙ |