@@ -581,77 +581,10 @@ - (ConstructorPrototypePair)allocateConstructorAndPrototypeInContext:(JSContext
581581
582582@end
583583
584- struct WrapperKey {
585- static constexpr uintptr_t hashTableDeletedValue () { return 1 ; }
586-
587- WrapperKey () = default ;
588-
589- explicit WrapperKey (WTF ::HashTableDeletedValueType)
590- : m_wrapper(reinterpret_cast <JSValue *>(hashTableDeletedValue()))
591- {
592- }
593-
594- explicit WrapperKey (JSValue *wrapper)
595- : m_wrapper(wrapper)
596- {
597- }
598-
599- bool isHashTableDeletedValue () const
600- {
601- return reinterpret_cast <uintptr_t >(m_wrapper) == hashTableDeletedValue ();
602- }
603-
604- __unsafe_unretained JSValue *m_wrapper { nil };
605-
606- struct Hash {
607- static unsigned hash (const WrapperKey& key)
608- {
609- return DefaultHash<JSValueRef>::Hash::hash ([key.m_wrapper JSValueRef ]);
610- }
611-
612- static bool equal (const WrapperKey& lhs, const WrapperKey& rhs)
613- {
614- return lhs.m_wrapper == rhs.m_wrapper ;
615- }
616-
617- static const bool safeToCompareToEmptyOrDeleted = false ;
618- };
619-
620- struct Traits : public SimpleClassHashTraits <WrapperKey> {
621- static const bool hasIsEmptyValueFunction = true ;
622- static bool isEmptyValue (const WrapperKey& key)
623- {
624- return key.m_wrapper == nullptr ;
625- }
626- };
627-
628- struct Translator {
629- struct ValueAndContext {
630- __unsafe_unretained JSContext *m_context;
631- JSValueRef m_value;
632- };
633-
634- static unsigned hash (const ValueAndContext& value)
635- {
636- return DefaultHash<JSValueRef>::Hash::hash (value.m_value );
637- }
638-
639- static bool equal (const WrapperKey& lhs, const ValueAndContext& value)
640- {
641- return [lhs.m_wrapper JSValueRef ] == value.m_value ;
642- }
643-
644- static void translate (WrapperKey& result, const ValueAndContext& value, unsigned )
645- {
646- result = WrapperKey ([[[JSValue alloc ] initWithValue: value.m_value inContext: value.m_context] autorelease ]);
647- }
648- };
649- };
650-
651584@implementation JSWrapperMap {
652585 NSMutableDictionary *m_classMap;
653586 std::unique_ptr<JSC ::WeakGCMap<__unsafe_unretained id , JSC ::JSObject>> m_cachedJSWrappers;
654- HashSet<WrapperKey, WrapperKey::Hash, WrapperKey::Traits> m_cachedObjCWrappers;
587+ NSMapTable * m_cachedObjCWrappers;
655588}
656589
657590- (instancetype )initWithGlobalContextRef : (JSGlobalContextRef)context
@@ -660,6 +593,10 @@ - (instancetype)initWithGlobalContextRef:(JSGlobalContextRef)context
660593 if (!self)
661594 return nil ;
662595
596+ NSPointerFunctionsOptions keyOptions = NSPointerFunctionsOpaqueMemory | NSPointerFunctionsOpaquePersonality;
597+ NSPointerFunctionsOptions valueOptions = NSPointerFunctionsWeakMemory | NSPointerFunctionsObjectPersonality;
598+ m_cachedObjCWrappers = [[NSMapTable alloc ] initWithKeyOptions: keyOptions valueOptions: valueOptions capacity: 0 ];
599+
663600 m_cachedJSWrappers = std::make_unique<JSC ::WeakGCMap<__unsafe_unretained id , JSC ::JSObject>>(toJS (context)->vm ());
664601
665602 ASSERT (!toJSGlobalObject (context)->wrapperMap ());
@@ -670,6 +607,7 @@ - (instancetype)initWithGlobalContextRef:(JSGlobalContextRef)context
670607
671608- (void )dealloc
672609{
610+ [m_cachedObjCWrappers release ];
673611 [m_classMap release ];
674612 [super dealloc ];
675613}
@@ -724,14 +662,12 @@ - (JSValue *)jsWrapperForObject:(id)object inContext:(JSContext *)context
724662- (JSValue *)objcWrapperForJSValueRef : (JSValueRef)value inContext :context
725663{
726664 ASSERT (toJSGlobalObject ([context JSGlobalContextRef ])->wrapperMap () == self);
727- WrapperKey::Translator::ValueAndContext valueAndContext { context, value };
728- auto addResult = m_cachedObjCWrappers.add <WrapperKey::Translator>(valueAndContext);
729- return addResult.iterator ->m_wrapper ;
730- }
731-
732- - (void )removeWrapper : (JSValue *)wrapper
733- {
734- m_cachedObjCWrappers.remove (WrapperKey (wrapper));
665+ JSValue *wrapper = (__bridge JSValue *)NSMapGet (m_cachedObjCWrappers, value);
666+ if (!wrapper) {
667+ wrapper = [[[JSValue alloc ] initWithValue: value inContext: context] autorelease ];
668+ NSMapInsert (m_cachedObjCWrappers, value, (__bridge void *)wrapper);
669+ }
670+ return wrapper;
735671}
736672
737673@end
0 commit comments