fd78a053810af9af4699560e038a15edd60b7f40
[WebKit-https.git] / Source / JavaScriptCore / builtins / BuiltinNames.h
1 /*
2  * Copyright (C) 2014, 2016 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
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.
12  *
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.
24  */
25
26 #pragma once
27
28 #include "BuiltinUtils.h"
29 #include "BytecodeIntrinsicRegistry.h"
30 #include "CommonIdentifiers.h"
31 #include "JSCBuiltins.h"
32
33 namespace JSC {
34
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) \
43     macro(charCodeAt) \
44     macro(isView) \
45     macro(iteratedObject) \
46     macro(iteratedString) \
47     macro(stringIteratorNextIndex) \
48     macro(promise) \
49     macro(fulfillmentHandler) \
50     macro(rejectionHandler) \
51     macro(index) \
52     macro(deferred) \
53     macro(countdownHolder) \
54     macro(Object) \
55     macro(ownEnumerablePropertyKeys) \
56     macro(Number) \
57     macro(Array) \
58     macro(ArrayBuffer) \
59     macro(String) \
60     macro(RegExp) \
61     macro(Map) \
62     macro(Promise) \
63     macro(Reflect) \
64     macro(InternalPromise) \
65     macro(abs) \
66     macro(floor) \
67     macro(trunc) \
68     macro(create) \
69     macro(defineProperty) \
70     macro(getPrototypeOf) \
71     macro(getOwnPropertyDescriptor) \
72     macro(getOwnPropertyNames) \
73     macro(ownKeys) \
74     macro(Error) \
75     macro(RangeError) \
76     macro(TypeError) \
77     macro(typedArrayLength) \
78     macro(typedArraySort) \
79     macro(typedArrayGetOriginalConstructor) \
80     macro(typedArraySubarrayCreate) \
81     macro(BuiltinLog) \
82     macro(homeObject) \
83     macro(getTemplateObject) \
84     macro(templateRegistryKey) \
85     macro(enqueueJob) \
86     macro(handler) \
87     macro(promiseState) \
88     macro(promiseFulfillReactions) \
89     macro(promiseRejectReactions) \
90     macro(promiseResult) \
91     macro(push) \
92     macro(repeatCharacter) \
93     macro(capabilities) \
94     macro(starDefault) \
95     macro(InspectorInstrumentation) \
96     macro(get) \
97     macro(set) \
98     macro(shift) \
99     macro(allocateTypedArray) \
100     macro(Int8Array) \
101     macro(Int16Array) \
102     macro(Int32Array) \
103     macro(Uint8Array) \
104     macro(Uint8ClampedArray) \
105     macro(Uint16Array) \
106     macro(Uint32Array) \
107     macro(Float32Array) \
108     macro(Float64Array) \
109     macro(exec) \
110     macro(generator) \
111     macro(generatorNext) \
112     macro(generatorState) \
113     macro(generatorFrame) \
114     macro(generatorValue) \
115     macro(generatorThis) \
116     macro(generatorResumeMode) \
117     macro(Collator) \
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) \
128     macro(instanceOf) \
129     macro(isArraySlow) \
130     macro(isArrayConstructor) \
131     macro(isConstructor) \
132     macro(isDerivedConstructor) \
133     macro(concatMemcpy) \
134     macro(appendMemcpy) \
135     macro(predictFinalLengthFromArgumunts) \
136     macro(print) \
137     macro(regExpCreate) \
138     macro(SetIterator) \
139     macro(setIteratorNext) \
140     macro(replaceUsingRegExp) \
141     macro(replaceUsingStringSearch) \
142     macro(MapIterator) \
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) \
161     macro(makeBoundFunction) \
162     macro(hasOwnLengthProperty) \
163     macro(WebAssembly) \
164     macro(Module) \
165     macro(Instance) \
166     macro(Memory) \
167     macro(Table) \
168     macro(CompileError) \
169     macro(RuntimeError) \
170
171
172 #define INITIALIZE_PRIVATE_TO_PUBLIC_ENTRY(name) m_privateToPublicMap.add(m_##name##PrivateName.impl(), &m_##name);
173 #define INITIALIZE_PUBLIC_TO_PRIVATE_ENTRY(name) m_publicToPrivateMap.add(m_##name.impl(), &m_##name##PrivateName);
174
175 // We commandeer the publicToPrivateMap to allow us to convert private symbol names into the appropriate symbol.
176 // e.g. @iteratorSymbol points to Symbol.iterator in this map rather than to a an actual private name.
177 // FIXME: This is a weird hack and we shouldn't need to do this.
178 #define INITIALIZE_SYMBOL_PUBLIC_TO_PRIVATE_ENTRY(name) m_publicToPrivateMap.add(m_##name##SymbolPrivateIdentifier.impl(), &m_##name##Symbol);
179
180 class BuiltinNames {
181     WTF_MAKE_NONCOPYABLE(BuiltinNames); WTF_MAKE_FAST_ALLOCATED;
182     
183 public:
184     // We treat the dollarVM name as a special case below for $vm (because CommonIdentifiers does not
185     // yet support the $ character).
186
187     BuiltinNames(VM* vm, CommonIdentifiers* commonIdentifiers)
188         : m_emptyIdentifier(commonIdentifiers->emptyIdentifier)
189         JSC_FOREACH_BUILTIN_FUNCTION_NAME(INITIALIZE_BUILTIN_NAMES)
190         JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(INITIALIZE_BUILTIN_NAMES)
191         JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_WELL_KNOWN_SYMBOL(INITIALIZE_BUILTIN_SYMBOLS)
192         , m_dollarVMName(Identifier::fromString(vm, "$vm"))
193         , m_dollarVMPrivateName(Identifier::fromUid(PrivateName(PrivateName::Description, ASCIILiteral("PrivateSymbol.$vm"))))
194     {
195         JSC_FOREACH_BUILTIN_FUNCTION_NAME(INITIALIZE_PRIVATE_TO_PUBLIC_ENTRY)
196         JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(INITIALIZE_PRIVATE_TO_PUBLIC_ENTRY)
197         JSC_FOREACH_BUILTIN_FUNCTION_NAME(INITIALIZE_PUBLIC_TO_PRIVATE_ENTRY)
198         JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(INITIALIZE_PUBLIC_TO_PRIVATE_ENTRY)
199         JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_WELL_KNOWN_SYMBOL(INITIALIZE_SYMBOL_PUBLIC_TO_PRIVATE_ENTRY)
200         m_privateToPublicMap.add(m_dollarVMPrivateName.impl(), &m_dollarVMName);
201         m_publicToPrivateMap.add(m_dollarVMName.impl(), &m_dollarVMPrivateName);
202     }
203
204     bool isPrivateName(SymbolImpl& uid) const;
205     bool isPrivateName(UniquedStringImpl& uid) const;
206     bool isPrivateName(const Identifier&) const;
207     const Identifier* lookUpPrivateName(const Identifier&) const;
208     const Identifier& lookUpPublicName(const Identifier&) const;
209     
210     void appendExternalName(const Identifier& publicName, const Identifier& privateName);
211
212     JSC_FOREACH_BUILTIN_FUNCTION_NAME(DECLARE_BUILTIN_IDENTIFIER_ACCESSOR)
213     JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(DECLARE_BUILTIN_IDENTIFIER_ACCESSOR)
214     JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_WELL_KNOWN_SYMBOL(DECLARE_BUILTIN_SYMBOL_ACCESSOR)
215     const JSC::Identifier& dollarVMPublicName() const { return m_dollarVMName; }
216     const JSC::Identifier& dollarVMPrivateName() const { return m_dollarVMPrivateName; }
217
218 private:
219     Identifier m_emptyIdentifier;
220     JSC_FOREACH_BUILTIN_FUNCTION_NAME(DECLARE_BUILTIN_NAMES)
221     JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(DECLARE_BUILTIN_NAMES)
222     JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_WELL_KNOWN_SYMBOL(DECLARE_BUILTIN_SYMBOLS)
223     const JSC::Identifier m_dollarVMName;
224     const JSC::Identifier m_dollarVMPrivateName;
225     typedef HashMap<RefPtr<UniquedStringImpl>, const Identifier*, IdentifierRepHash> BuiltinNamesMap;
226     BuiltinNamesMap m_publicToPrivateMap;
227     BuiltinNamesMap m_privateToPublicMap;
228 };
229
230 inline bool BuiltinNames::isPrivateName(SymbolImpl& uid) const
231 {
232     return m_privateToPublicMap.contains(&uid);
233 }
234
235 inline bool BuiltinNames::isPrivateName(UniquedStringImpl& uid) const
236 {
237     if (!uid.isSymbol())
238         return false;
239     return m_privateToPublicMap.contains(&uid);
240 }
241
242 inline bool BuiltinNames::isPrivateName(const Identifier& ident) const
243 {
244     if (ident.isNull())
245         return false;
246     return isPrivateName(*ident.impl());
247 }
248
249 inline const Identifier* BuiltinNames::lookUpPrivateName(const Identifier& ident) const
250 {
251     auto iter = m_publicToPrivateMap.find(ident.impl());
252     if (iter != m_publicToPrivateMap.end())
253         return iter->value;
254     return 0;
255 }
256
257 inline const Identifier& BuiltinNames::lookUpPublicName(const Identifier& ident) const
258 {
259     auto iter = m_privateToPublicMap.find(ident.impl());
260     if (iter != m_privateToPublicMap.end())
261         return *iter->value;
262     return m_emptyIdentifier;
263 }
264
265 inline void BuiltinNames::appendExternalName(const Identifier& publicName, const Identifier& privateName)
266 {
267 #ifndef NDEBUG
268     for (const auto& key : m_publicToPrivateMap.keys())
269         ASSERT(publicName.string() != *key);
270 #endif
271
272     m_privateToPublicMap.add(privateName.impl(), &publicName);
273     m_publicToPrivateMap.add(publicName.impl(), &privateName);
274 }
275
276 } // namespace JSC