#if __OBJC2__
#include "objc-private.h"
-#include "objc-cache.h"
#include "DenseMapExtras.h"
-#if SUPPORT_PREOPT
-static const objc_selopt_t *builtins = NULL;
-static bool useDyldSelectorLookup = false;
-#endif
-
-
static objc::ExplicitInitDenseSet<const char *> namedSelectors;
static SEL search_builtins(const char *key);
void sel_init(size_t selrefCount)
{
#if SUPPORT_PREOPT
- // If dyld finds a known shared cache selector, then it must be also looking
- // in the shared cache table.
- if (_dyld_get_objc_selector("retain") != nil)
- useDyldSelectorLookup = true;
- else
- builtins = preoptimizedSelectors();
-
- if (PrintPreopt && useDyldSelectorLookup) {
+ if (PrintPreopt) {
_objc_inform("PREOPTIMIZATION: using dyld selector opt");
}
-
- if (PrintPreopt && builtins) {
- uint32_t occupied = builtins->occupied;
- uint32_t capacity = builtins->capacity;
-
- _objc_inform("PREOPTIMIZATION: using selopt at %p", builtins);
- _objc_inform("PREOPTIMIZATION: %u selectors", occupied);
- _objc_inform("PREOPTIMIZATION: %u/%u (%u%%) hash table occupancy",
- occupied, capacity,
- (unsigned)(occupied/(double)capacity*100));
- }
- namedSelectors.init(useDyldSelectorLookup ? 0 : (unsigned)selrefCount);
-#else
- namedSelectors.init((unsigned)selrefCount);
#endif
+ namedSelectors.init((unsigned)selrefCount);
+
// Register selectors used by libobjc
mutex_locker_t lock(selLock);
}
+unsigned long sel_hash(SEL sel)
+{
+ unsigned long selAddr = (unsigned long)sel;
+#if CONFIG_USE_PREOPT_CACHES
+ selAddr ^= (selAddr >> 7);
+#endif
+ return selAddr;
+}
+
+
BOOL sel_isMapped(SEL sel)
{
if (!sel) return NO;
static SEL search_builtins(const char *name)
{
#if SUPPORT_PREOPT
- if (builtins) {
- SEL result = 0;
- if ((result = (SEL)builtins->get(name)))
- return result;
-
- if ((result = (SEL)_dyld_get_objc_selector(name)))
- return result;
- } else if (useDyldSelectorLookup) {
- if (SEL result = (SEL)_dyld_get_objc_selector(name))
- return result;
- }
+ if (SEL result = (SEL)_dyld_get_objc_selector(name))
+ return result;
#endif
return nil;
}