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