071eb494487880f44695a6ecc46ec4ad626bb8ae
[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 INITIALIZE_BUILTIN_NAMES_IN_JSC(name) , m_##name(JSC::Identifier::fromString(vm, #name)), m_##name##PrivateName(JSC::Identifier::fromUid(vm, &static_cast<SymbolImpl&>(JSC::Symbols::name##PrivateName)))
36 #define INITIALIZE_BUILTIN_SYMBOLS(name) , m_##name##Symbol(JSC::Identifier::fromUid(vm, &static_cast<SymbolImpl&>(JSC::Symbols::name##Symbol))), m_##name##SymbolPrivateIdentifier(JSC::Identifier::fromString(vm, #name "Symbol"))
37 #define DECLARE_BUILTIN_SYMBOLS(name) const JSC::Identifier m_##name##Symbol; const JSC::Identifier m_##name##SymbolPrivateIdentifier;
38 #define DECLARE_BUILTIN_SYMBOL_ACCESSOR(name) \
39     const JSC::Identifier& name##Symbol() const { return m_##name##Symbol; }
40
41 #define JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(macro) \
42     JSC_COMMON_BYTECODE_INTRINSIC_FUNCTIONS_EACH_NAME(macro) \
43     JSC_COMMON_BYTECODE_INTRINSIC_CONSTANTS_EACH_NAME(macro) \
44     macro(add) \
45     macro(arrayIteratorNextIndex) \
46     macro(arrayIterationKind) \
47     macro(arrayIteratorNext) \
48     macro(arrayIteratorIsDone) \
49     macro(arrayIteratorKind) \
50     macro(assert) \
51     macro(charCodeAt) \
52     macro(executor) \
53     macro(isView) \
54     macro(iteratedObject) \
55     macro(iteratedString) \
56     macro(stringIteratorNextIndex) \
57     macro(promise) \
58     macro(Object) \
59     macro(Number) \
60     macro(Array) \
61     macro(ArrayBuffer) \
62     macro(String) \
63     macro(RegExp) \
64     macro(Map) \
65     macro(Promise) \
66     macro(Reflect) \
67     macro(InternalPromise) \
68     macro(abs) \
69     macro(floor) \
70     macro(trunc) \
71     macro(create) \
72     macro(defineProperty) \
73     macro(getPrototypeOf) \
74     macro(getOwnPropertyDescriptor) \
75     macro(getOwnPropertyNames) \
76     macro(ownKeys) \
77     macro(Error) \
78     macro(RangeError) \
79     macro(Set) \
80     macro(TypeError) \
81     macro(typedArrayLength) \
82     macro(typedArraySort) \
83     macro(typedArrayGetOriginalConstructor) \
84     macro(typedArraySubarrayCreate) \
85     macro(BuiltinLog) \
86     macro(homeObject) \
87     macro(templateRegistryKey) \
88     macro(enqueueJob) \
89     macro(hostPromiseRejectionTracker) \
90     macro(promiseIsHandled) \
91     macro(promiseState) \
92     macro(promiseReactions) \
93     macro(promiseResult) \
94     macro(onFulfilled) \
95     macro(onRejected) \
96     macro(push) \
97     macro(repeatCharacter) \
98     macro(capabilities) \
99     macro(starDefault) \
100     macro(InspectorInstrumentation) \
101     macro(get) \
102     macro(set) \
103     macro(shift) \
104     macro(allocateTypedArray) \
105     macro(Int8Array) \
106     macro(Int16Array) \
107     macro(Int32Array) \
108     macro(Uint8Array) \
109     macro(Uint8ClampedArray) \
110     macro(Uint16Array) \
111     macro(Uint32Array) \
112     macro(Float32Array) \
113     macro(Float64Array) \
114     macro(exec) \
115     macro(generator) \
116     macro(generatorNext) \
117     macro(generatorState) \
118     macro(generatorFrame) \
119     macro(generatorValue) \
120     macro(generatorThis) \
121     macro(syncIterator) \
122     macro(nextMethod) \
123     macro(asyncGeneratorState) \
124     macro(asyncGeneratorSuspendReason) \
125     macro(asyncGeneratorQueue) \
126     macro(asyncGeneratorQueueFirst) \
127     macro(asyncGeneratorQueueLast) \
128     macro(asyncGeneratorQueueItemNext) \
129     macro(asyncGeneratorQueueItemPrevious) \
130     macro(generatorResumeMode) \
131     macro(Collator) \
132     macro(DateTimeFormat) \
133     macro(NumberFormat) \
134     macro(intlSubstituteValue) \
135     macro(thisTimeValue) \
136     macro(thisNumberValue) \
137     macro(newTargetLocal) \
138     macro(derivedConstructor) \
139     macro(isTypedArrayView) \
140     macro(isBoundFunction) \
141     macro(hasInstanceBoundFunction) \
142     macro(instanceOf) \
143     macro(isArraySlow) \
144     macro(isArrayConstructor) \
145     macro(isConstructor) \
146     macro(concatMemcpy) \
147     macro(appendMemcpy) \
148     macro(regExpCreate) \
149     macro(replaceUsingRegExp) \
150     macro(replaceUsingStringSearch) \
151     macro(mapBucket) \
152     macro(mapBucketHead) \
153     macro(mapBucketNext) \
154     macro(mapBucketKey) \
155     macro(mapBucketValue) \
156     macro(mapIteratorKind) \
157     macro(setBucket) \
158     macro(setBucketHead) \
159     macro(setBucketNext) \
160     macro(setBucketKey) \
161     macro(setIteratorKind) \
162     macro(regExpBuiltinExec) \
163     macro(regExpMatchFast) \
164     macro(regExpProtoFlagsGetter) \
165     macro(regExpProtoGlobalGetter) \
166     macro(regExpProtoIgnoreCaseGetter) \
167     macro(regExpProtoMultilineGetter) \
168     macro(regExpProtoSourceGetter) \
169     macro(regExpProtoStickyGetter) \
170     macro(regExpProtoUnicodeGetter) \
171     macro(regExpPrototypeSymbolReplace) \
172     macro(regExpSearchFast) \
173     macro(regExpSplitFast) \
174     macro(regExpTestFast) \
175     macro(stringIncludesInternal) \
176     macro(stringSplitFast) \
177     macro(stringSubstrInternal) \
178     macro(makeBoundFunction) \
179     macro(hasOwnLengthProperty) \
180     macro(importModule) \
181     macro(propertyIsEnumerable) \
182     macro(WebAssembly) \
183     macro(Module) \
184     macro(Instance) \
185     macro(Memory) \
186     macro(Table) \
187     macro(CompileError) \
188     macro(LinkError) \
189     macro(RuntimeError) \
190     macro(meta) \
191
192 namespace Symbols {
193 #define DECLARE_BUILTIN_STATIC_SYMBOLS(name) extern SymbolImpl::StaticSymbolImpl name##Symbol;
194 JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_WELL_KNOWN_SYMBOL(DECLARE_BUILTIN_STATIC_SYMBOLS)
195 #undef DECLARE_BUILTIN_STATIC_SYMBOLS
196
197 #define DECLARE_BUILTIN_PRIVATE_NAMES(name) extern SymbolImpl::StaticSymbolImpl name##PrivateName;
198 JSC_FOREACH_BUILTIN_FUNCTION_NAME(DECLARE_BUILTIN_PRIVATE_NAMES)
199 JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(DECLARE_BUILTIN_PRIVATE_NAMES)
200 #undef DECLARE_BUILTIN_PRIVATE_NAMES
201
202 extern SymbolImpl::StaticSymbolImpl dollarVMPrivateName;
203 extern SymbolImpl::StaticSymbolImpl underscoreProtoPrivateName;
204 }
205
206 #define INITIALIZE_PRIVATE_TO_PUBLIC_ENTRY(name) m_privateToPublicMap.add(m_##name##PrivateName.impl(), &m_##name);
207 #define INITIALIZE_PUBLIC_TO_PRIVATE_ENTRY(name) m_publicToPrivateMap.add(m_##name.impl(), &m_##name##PrivateName);
208
209 // We commandeer the publicToPrivateMap to allow us to convert private symbol names into the appropriate symbol.
210 // e.g. @iteratorSymbol points to Symbol.iterator in this map rather than to a an actual private name.
211 // FIXME: This is a weird hack and we shouldn't need to do this.
212 #define INITIALIZE_SYMBOL_PUBLIC_TO_PRIVATE_ENTRY(name) m_publicToPrivateMap.add(m_##name##SymbolPrivateIdentifier.impl(), &m_##name##Symbol);
213
214 class BuiltinNames {
215     WTF_MAKE_NONCOPYABLE(BuiltinNames); WTF_MAKE_FAST_ALLOCATED;
216     
217 public:
218     // We treat the dollarVM name as a special case below for $vm (because CommonIdentifiers does not
219     // yet support the $ character).
220
221     BuiltinNames(VM* vm, CommonIdentifiers* commonIdentifiers)
222         : m_emptyIdentifier(commonIdentifiers->emptyIdentifier)
223         JSC_FOREACH_BUILTIN_FUNCTION_NAME(INITIALIZE_BUILTIN_NAMES_IN_JSC)
224         JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(INITIALIZE_BUILTIN_NAMES_IN_JSC)
225         JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_WELL_KNOWN_SYMBOL(INITIALIZE_BUILTIN_SYMBOLS)
226         , m_dollarVMName(Identifier::fromString(vm, "$vm"))
227         , m_dollarVMPrivateName(Identifier::fromUid(vm, &static_cast<SymbolImpl&>(Symbols::dollarVMPrivateName)))
228         , m_underscoreProtoPrivateName(Identifier::fromUid(vm, &static_cast<SymbolImpl&>(Symbols::underscoreProtoPrivateName)))
229     {
230         JSC_FOREACH_BUILTIN_FUNCTION_NAME(INITIALIZE_PRIVATE_TO_PUBLIC_ENTRY)
231         JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(INITIALIZE_PRIVATE_TO_PUBLIC_ENTRY)
232         JSC_FOREACH_BUILTIN_FUNCTION_NAME(INITIALIZE_PUBLIC_TO_PRIVATE_ENTRY)
233         JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(INITIALIZE_PUBLIC_TO_PRIVATE_ENTRY)
234         JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_WELL_KNOWN_SYMBOL(INITIALIZE_SYMBOL_PUBLIC_TO_PRIVATE_ENTRY)
235         m_privateToPublicMap.add(m_dollarVMPrivateName.impl(), &m_dollarVMName);
236         m_publicToPrivateMap.add(m_dollarVMName.impl(), &m_dollarVMPrivateName);
237         m_privateToPublicMap.add(m_underscoreProtoPrivateName.impl(), &commonIdentifiers->underscoreProto);
238         m_publicToPrivateMap.add(commonIdentifiers->underscoreProto.impl(), &m_underscoreProtoPrivateName);
239     }
240
241     const Identifier* lookUpPrivateName(const Identifier&) const;
242     const Identifier& lookUpPublicName(const Identifier&) const;
243     
244     void appendExternalName(const Identifier& publicName, const Identifier& privateName);
245
246     JSC_FOREACH_BUILTIN_FUNCTION_NAME(DECLARE_BUILTIN_IDENTIFIER_ACCESSOR)
247     JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(DECLARE_BUILTIN_IDENTIFIER_ACCESSOR)
248     JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_WELL_KNOWN_SYMBOL(DECLARE_BUILTIN_SYMBOL_ACCESSOR)
249     const JSC::Identifier& dollarVMPublicName() const { return m_dollarVMName; }
250     const JSC::Identifier& dollarVMPrivateName() const { return m_dollarVMPrivateName; }
251     const JSC::Identifier& underscoreProtoPrivateName() const { return m_underscoreProtoPrivateName; }
252
253 private:
254     Identifier m_emptyIdentifier;
255     JSC_FOREACH_BUILTIN_FUNCTION_NAME(DECLARE_BUILTIN_NAMES)
256     JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(DECLARE_BUILTIN_NAMES)
257     JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_WELL_KNOWN_SYMBOL(DECLARE_BUILTIN_SYMBOLS)
258     const JSC::Identifier m_dollarVMName;
259     const JSC::Identifier m_dollarVMPrivateName;
260     const JSC::Identifier m_underscoreProtoPrivateName;
261     typedef HashMap<RefPtr<UniquedStringImpl>, const Identifier*, IdentifierRepHash> BuiltinNamesMap;
262     BuiltinNamesMap m_publicToPrivateMap;
263     BuiltinNamesMap m_privateToPublicMap;
264 };
265
266 inline const Identifier* BuiltinNames::lookUpPrivateName(const Identifier& ident) const
267 {
268     auto iter = m_publicToPrivateMap.find(ident.impl());
269     if (iter != m_publicToPrivateMap.end())
270         return iter->value;
271     return 0;
272 }
273
274 inline const Identifier& BuiltinNames::lookUpPublicName(const Identifier& ident) const
275 {
276     auto iter = m_privateToPublicMap.find(ident.impl());
277     if (iter != m_privateToPublicMap.end())
278         return *iter->value;
279     return m_emptyIdentifier;
280 }
281
282 inline void BuiltinNames::appendExternalName(const Identifier& publicName, const Identifier& privateName)
283 {
284 #ifndef NDEBUG
285     for (const auto& key : m_publicToPrivateMap.keys())
286         ASSERT(publicName.string() != *key);
287 #endif
288
289     m_privateToPublicMap.add(privateName.impl(), &publicName);
290     m_publicToPrivateMap.add(publicName.impl(), &privateName);
291 }
292
293 } // namespace JSC