Changeset 257681 in webkit for trunk/Source/JavaScriptCore/builtins/BuiltinNames.cpp
- Timestamp:
- Feb 29, 2020, 12:04:13 AM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/builtins/BuiltinNames.cpp
r249175 r257681 53 53 54 54 #define INITIALIZE_BUILTIN_NAMES_IN_JSC(name) , m_##name(JSC::Identifier::fromString(vm, #name)) 55 #define INITIALIZE_BUILTIN_SYMBOLS_IN_JSC(name) , m_##name##Symbol(JSC::Identifier::fromUid(vm, &static_cast<SymbolImpl&>(JSC::Symbols::name##Symbol))), m_##name##SymbolPrivateIdentifier(JSC::Identifier::fromString(vm, #name "Symbol")) 55 #define INITIALIZE_BUILTIN_SYMBOLS_IN_JSC(name) \ 56 , m_##name##Symbol(JSC::Identifier::fromUid(vm, &static_cast<SymbolImpl&>(JSC::Symbols::name##Symbol))) \ 57 , m_##name##SymbolPrivateIdentifier(JSC::Identifier::fromString(vm, #name)) 56 58 57 59 #define INITIALIZE_PUBLIC_TO_PRIVATE_ENTRY(name) \ 58 60 do { \ 59 61 SymbolImpl* symbol = &static_cast<SymbolImpl&>(JSC::Symbols::name##PrivateName); \ 60 checkPublicToPrivateMapConsistency( m_##name.impl(),symbol); \61 m_p ublicToPrivateMap.add(m_##name.impl(),symbol); \62 checkPublicToPrivateMapConsistency(symbol); \ 63 m_privateNameSet.add(symbol); \ 62 64 } while (0); 63 65 64 // We commandeer the publicToPrivateMap to allow us to convert private symbol names into the appropriate symbol. 65 // e.g. @iteratorSymbol points to Symbol.iterator in this map rather than to a an actual private name. 66 // FIXME: This is a weird hack and we shouldn't need to do this. 67 #define INITIALIZE_SYMBOL_PUBLIC_TO_PRIVATE_ENTRY(name) \ 66 #define INITIALIZE_WELL_KNOWN_SYMBOL_PUBLIC_TO_PRIVATE_ENTRY(name) \ 68 67 do { \ 69 68 SymbolImpl* symbol = static_cast<SymbolImpl*>(m_##name##Symbol.impl()); \ 70 checkPublicToPrivateMapConsistency(m_##name##SymbolPrivateIdentifier.impl(), symbol); \ 71 m_publicToPrivateMap.add(m_##name##SymbolPrivateIdentifier.impl(), symbol); \ 69 m_wellKnownSymbolsMap.add(m_##name##SymbolPrivateIdentifier.impl(), symbol); \ 72 70 } while (0); 73 71 … … 85 83 JSC_FOREACH_BUILTIN_FUNCTION_NAME(INITIALIZE_PUBLIC_TO_PRIVATE_ENTRY) 86 84 JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(INITIALIZE_PUBLIC_TO_PRIVATE_ENTRY) 87 JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_WELL_KNOWN_SYMBOL(INITIALIZE_ SYMBOL_PUBLIC_TO_PRIVATE_ENTRY)88 m_p ublicToPrivateMap.add(m_dollarVMName.impl(),static_cast<SymbolImpl*>(m_dollarVMPrivateName.impl()));85 JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_WELL_KNOWN_SYMBOL(INITIALIZE_WELL_KNOWN_SYMBOL_PUBLIC_TO_PRIVATE_ENTRY) 86 m_privateNameSet.add(static_cast<SymbolImpl*>(m_dollarVMPrivateName.impl())); 89 87 } 90 88 … … 92 90 #undef INITIALIZE_BUILTIN_SYMBOLS_IN_JSC 93 91 #undef INITIALIZE_PUBLIC_TO_PRIVATE_ENTRY 94 #undef INITIALIZE_SYMBOL_PUBLIC_TO_PRIVATE_ENTRY 92 #undef INITIALIZE_WELL_KNOWN_SYMBOL_PUBLIC_TO_PRIVATE_ENTRY 93 94 95 using LCharBuffer = WTF::HashTranslatorCharBuffer<LChar>; 96 using UCharBuffer = WTF::HashTranslatorCharBuffer<UChar>; 97 98 template<typename CharacterType> 99 struct CharBufferSeacher { 100 using Buffer = WTF::HashTranslatorCharBuffer<CharacterType>; 101 static unsigned hash(const Buffer& buf) 102 { 103 return buf.hash; 104 } 105 106 static bool equal(const String& str, const Buffer& buf) 107 { 108 return WTF::equal(str.impl(), buf.characters, buf.length); 109 } 110 }; 111 112 template<typename CharacterType> 113 static PrivateSymbolImpl* lookUpPrivateNameImpl(const HashSet<String>& set, const WTF::HashTranslatorCharBuffer<CharacterType>& buffer) 114 { 115 auto iterator = set.find<CharBufferSeacher<CharacterType>>(buffer); 116 if (iterator == set.end()) 117 return nullptr; 118 StringImpl* impl = iterator->impl(); 119 ASSERT(impl->isSymbol()); 120 SymbolImpl* symbol = static_cast<SymbolImpl*>(impl); 121 ASSERT(symbol->isPrivate()); 122 return static_cast<PrivateSymbolImpl*>(symbol); 123 } 124 125 template<typename CharacterType> 126 static SymbolImpl* lookUpWellKnownSymbolImpl(const HashMap<String, SymbolImpl*>& map, const WTF::HashTranslatorCharBuffer<CharacterType>& buffer) 127 { 128 auto iterator = map.find<CharBufferSeacher<CharacterType>>(buffer); 129 if (iterator == map.end()) 130 return nullptr; 131 return iterator->value; 132 } 133 134 PrivateSymbolImpl* BuiltinNames::lookUpPrivateName(const LChar* characters, unsigned length) const 135 { 136 LCharBuffer buffer { characters, length }; 137 return lookUpPrivateNameImpl(m_privateNameSet, buffer); 138 } 139 140 PrivateSymbolImpl* BuiltinNames::lookUpPrivateName(const UChar* characters, unsigned length) const 141 { 142 UCharBuffer buffer { characters, length }; 143 return lookUpPrivateNameImpl(m_privateNameSet, buffer); 144 } 145 146 PrivateSymbolImpl* BuiltinNames::lookUpPrivateName(const String& string) const 147 { 148 if (string.is8Bit()) { 149 LCharBuffer buffer { string.characters8(), string.length(), string.hash() }; 150 return lookUpPrivateNameImpl(m_privateNameSet, buffer); 151 } 152 UCharBuffer buffer { string.characters16(), string.length(), string.hash() }; 153 return lookUpPrivateNameImpl(m_privateNameSet, buffer); 154 } 155 156 SymbolImpl* BuiltinNames::lookUpWellKnownSymbol(const LChar* characters, unsigned length) const 157 { 158 LCharBuffer buffer { characters, length }; 159 return lookUpWellKnownSymbolImpl(m_wellKnownSymbolsMap, buffer); 160 } 161 162 SymbolImpl* BuiltinNames::lookUpWellKnownSymbol(const UChar* characters, unsigned length) const 163 { 164 UCharBuffer buffer { characters, length }; 165 return lookUpWellKnownSymbolImpl(m_wellKnownSymbolsMap, buffer); 166 } 167 168 SymbolImpl* BuiltinNames::lookUpWellKnownSymbol(const String& string) const 169 { 170 if (string.is8Bit()) { 171 LCharBuffer buffer { string.characters8(), string.length(), string.hash() }; 172 return lookUpWellKnownSymbolImpl(m_wellKnownSymbolsMap, buffer); 173 } 174 UCharBuffer buffer { string.characters16(), string.length(), string.hash() }; 175 return lookUpWellKnownSymbolImpl(m_wellKnownSymbolsMap, buffer); 176 } 95 177 96 178 } // namespace JSC
Note:
See TracChangeset
for help on using the changeset viewer.