2 * Copyright (C) 2014, 2016 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 #include "BuiltinUtils.h"
29 #include "BytecodeIntrinsicRegistry.h"
30 #include "CommonIdentifiers.h"
31 #include "JSCBuiltins.h"
35 #define JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(macro) \
36 JSC_COMMON_BYTECODE_INTRINSIC_FUNCTIONS_EACH_NAME(macro) \
37 JSC_COMMON_BYTECODE_INTRINSIC_CONSTANTS_EACH_NAME(macro) \
38 macro(arrayIteratorNextIndex) \
39 macro(arrayIterationKind) \
40 macro(arrayIteratorNext) \
41 macro(arrayIteratorIsDone) \
42 macro(arrayIteratorKind) \
45 macro(iteratedObject) \
46 macro(iteratedString) \
47 macro(stringIteratorNextIndex) \
49 macro(fulfillmentHandler) \
50 macro(rejectionHandler) \
53 macro(countdownHolder) \
55 macro(ownEnumerablePropertyKeys) \
64 macro(InternalPromise) \
69 macro(defineProperty) \
70 macro(getPrototypeOf) \
71 macro(getOwnPropertyDescriptor) \
72 macro(getOwnPropertyNames) \
77 macro(typedArrayLength) \
78 macro(typedArraySort) \
79 macro(typedArrayGetOriginalConstructor) \
80 macro(typedArraySubarrayCreate) \
83 macro(getTemplateObject) \
84 macro(templateRegistryKey) \
87 macro(promiseReactions) \
88 macro(promiseResult) \
92 macro(repeatCharacter) \
95 macro(InspectorInstrumentation) \
99 macro(allocateTypedArray) \
104 macro(Uint8ClampedArray) \
107 macro(Float32Array) \
108 macro(Float64Array) \
111 macro(generatorNext) \
112 macro(generatorState) \
113 macro(generatorFrame) \
114 macro(generatorValue) \
115 macro(generatorThis) \
116 macro(generatorResumeMode) \
118 macro(DateTimeFormat) \
119 macro(NumberFormat) \
120 macro(intlSubstituteValue) \
121 macro(thisTimeValue) \
122 macro(thisNumberValue) \
123 macro(newTargetLocal) \
124 macro(derivedConstructor) \
125 macro(isTypedArrayView) \
126 macro(isBoundFunction) \
127 macro(hasInstanceBoundFunction) \
130 macro(isArrayConstructor) \
131 macro(isConstructor) \
132 macro(isDerivedConstructor) \
133 macro(concatMemcpy) \
134 macro(appendMemcpy) \
135 macro(predictFinalLengthFromArgumunts) \
137 macro(regExpCreate) \
139 macro(setIteratorNext) \
140 macro(replaceUsingRegExp) \
141 macro(replaceUsingStringSearch) \
143 macro(mapIteratorNext) \
144 macro(regExpBuiltinExec) \
145 macro(regExpMatchFast) \
146 macro(regExpProtoFlagsGetter) \
147 macro(regExpProtoGlobalGetter) \
148 macro(regExpProtoIgnoreCaseGetter) \
149 macro(regExpProtoMultilineGetter) \
150 macro(regExpProtoSourceGetter) \
151 macro(regExpProtoStickyGetter) \
152 macro(regExpProtoUnicodeGetter) \
153 macro(regExpPrototypeSymbolReplace) \
154 macro(regExpReplaceFast) \
155 macro(regExpSearchFast) \
156 macro(regExpSplitFast) \
157 macro(regExpTestFast) \
158 macro(stringIncludesInternal) \
159 macro(stringSplitFast) \
160 macro(stringSubstrInternal) \
162 macro(makeBoundFunction) \
163 macro(hasOwnLengthProperty) \
164 macro(importModule) \
170 macro(CompileError) \
172 macro(RuntimeError) \
175 #define INITIALIZE_PRIVATE_TO_PUBLIC_ENTRY(name) m_privateToPublicMap.add(m_##name##PrivateName.impl(), &m_##name);
176 #define INITIALIZE_PUBLIC_TO_PRIVATE_ENTRY(name) m_publicToPrivateMap.add(m_##name.impl(), &m_##name##PrivateName);
178 // We commandeer the publicToPrivateMap to allow us to convert private symbol names into the appropriate symbol.
179 // e.g. @iteratorSymbol points to Symbol.iterator in this map rather than to a an actual private name.
180 // FIXME: This is a weird hack and we shouldn't need to do this.
181 #define INITIALIZE_SYMBOL_PUBLIC_TO_PRIVATE_ENTRY(name) m_publicToPrivateMap.add(m_##name##SymbolPrivateIdentifier.impl(), &m_##name##Symbol);
184 WTF_MAKE_NONCOPYABLE(BuiltinNames); WTF_MAKE_FAST_ALLOCATED;
187 // We treat the dollarVM name as a special case below for $vm (because CommonIdentifiers does not
188 // yet support the $ character).
190 BuiltinNames(VM* vm, CommonIdentifiers* commonIdentifiers)
191 : m_emptyIdentifier(commonIdentifiers->emptyIdentifier)
192 JSC_FOREACH_BUILTIN_FUNCTION_NAME(INITIALIZE_BUILTIN_NAMES)
193 JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(INITIALIZE_BUILTIN_NAMES)
194 JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_WELL_KNOWN_SYMBOL(INITIALIZE_BUILTIN_SYMBOLS)
195 , m_dollarVMName(Identifier::fromString(vm, "$vm"))
196 , m_dollarVMPrivateName(Identifier::fromUid(PrivateName(PrivateName::Description, ASCIILiteral("PrivateSymbol.$vm"))))
198 JSC_FOREACH_BUILTIN_FUNCTION_NAME(INITIALIZE_PRIVATE_TO_PUBLIC_ENTRY)
199 JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(INITIALIZE_PRIVATE_TO_PUBLIC_ENTRY)
200 JSC_FOREACH_BUILTIN_FUNCTION_NAME(INITIALIZE_PUBLIC_TO_PRIVATE_ENTRY)
201 JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(INITIALIZE_PUBLIC_TO_PRIVATE_ENTRY)
202 JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_WELL_KNOWN_SYMBOL(INITIALIZE_SYMBOL_PUBLIC_TO_PRIVATE_ENTRY)
203 m_privateToPublicMap.add(m_dollarVMPrivateName.impl(), &m_dollarVMName);
204 m_publicToPrivateMap.add(m_dollarVMName.impl(), &m_dollarVMPrivateName);
207 bool isPrivateName(SymbolImpl& uid) const;
208 bool isPrivateName(UniquedStringImpl& uid) const;
209 bool isPrivateName(const Identifier&) const;
210 const Identifier* lookUpPrivateName(const Identifier&) const;
211 const Identifier& lookUpPublicName(const Identifier&) const;
213 void appendExternalName(const Identifier& publicName, const Identifier& privateName);
215 JSC_FOREACH_BUILTIN_FUNCTION_NAME(DECLARE_BUILTIN_IDENTIFIER_ACCESSOR)
216 JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(DECLARE_BUILTIN_IDENTIFIER_ACCESSOR)
217 JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_WELL_KNOWN_SYMBOL(DECLARE_BUILTIN_SYMBOL_ACCESSOR)
218 const JSC::Identifier& dollarVMPublicName() const { return m_dollarVMName; }
219 const JSC::Identifier& dollarVMPrivateName() const { return m_dollarVMPrivateName; }
222 Identifier m_emptyIdentifier;
223 JSC_FOREACH_BUILTIN_FUNCTION_NAME(DECLARE_BUILTIN_NAMES)
224 JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(DECLARE_BUILTIN_NAMES)
225 JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_WELL_KNOWN_SYMBOL(DECLARE_BUILTIN_SYMBOLS)
226 const JSC::Identifier m_dollarVMName;
227 const JSC::Identifier m_dollarVMPrivateName;
228 typedef HashMap<RefPtr<UniquedStringImpl>, const Identifier*, IdentifierRepHash> BuiltinNamesMap;
229 BuiltinNamesMap m_publicToPrivateMap;
230 BuiltinNamesMap m_privateToPublicMap;
233 inline bool BuiltinNames::isPrivateName(SymbolImpl& uid) const
235 return m_privateToPublicMap.contains(&uid);
238 inline bool BuiltinNames::isPrivateName(UniquedStringImpl& uid) const
242 return m_privateToPublicMap.contains(&uid);
245 inline bool BuiltinNames::isPrivateName(const Identifier& ident) const
249 return isPrivateName(*ident.impl());
252 inline const Identifier* BuiltinNames::lookUpPrivateName(const Identifier& ident) const
254 auto iter = m_publicToPrivateMap.find(ident.impl());
255 if (iter != m_publicToPrivateMap.end())
260 inline const Identifier& BuiltinNames::lookUpPublicName(const Identifier& ident) const
262 auto iter = m_privateToPublicMap.find(ident.impl());
263 if (iter != m_privateToPublicMap.end())
265 return m_emptyIdentifier;
268 inline void BuiltinNames::appendExternalName(const Identifier& publicName, const Identifier& privateName)
271 for (const auto& key : m_publicToPrivateMap.keys())
272 ASSERT(publicName.string() != *key);
275 m_privateToPublicMap.add(privateName.impl(), &publicName);
276 m_publicToPrivateMap.add(publicName.impl(), &privateName);