diff --git a/loader.c b/loader.c index f4df0471..4c9ba39d 100644 --- a/loader.c +++ b/loader.c @@ -13,6 +13,10 @@ #include #include +#if defined(__wasm__) && defined(OLDABI_COMPAT) +#error WebAssembly does not support the legacy Objective-C ABI. +#endif + /** * Runtime lock. This is exposed in */ @@ -214,7 +218,7 @@ OBJC_PUBLIC void __objc_load(struct objc_init *init) { continue; } - objc_register_selector(sel); + objc_register_selector_unchecked(sel); } for (struct objc_protocol *proto = init->proto_begin ; proto < init->proto_end ; proto++) diff --git a/selector.h b/selector.h index c9409873..852f2ce7 100644 --- a/selector.h +++ b/selector.h @@ -56,6 +56,12 @@ extern "C" */ SEL objc_register_selector(SEL aSel); +/** + * Registers a selector that the caller knows has not already been registered. + * The version 2 ABI provides each selector exactly once during __objc_load. + */ +SEL objc_register_selector_unchecked(SEL aSel); + #ifdef __cplusplus } #endif diff --git a/selector_table.cc b/selector_table.cc index 5fc68af8..576a669b 100644 --- a/selector_table.cc +++ b/selector_table.cc @@ -437,6 +437,11 @@ extern "C" PRIVATE SEL objc_register_selector(SEL aSel) { return aSel; } + return objc_register_selector_unchecked(aSel); +} + +extern "C" PRIVATE SEL objc_register_selector_unchecked(SEL aSel) +{ UnregisteredSelector unregistered{aSel->name, aSel->types}; // Check that this isn't already registered, before we try SEL registered = selector_lookup(aSel->name, aSel->types);