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