Rolling out r214038 and r213697: Crashes when using computed properties with rest...
[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(templateRegistryKey) \
84     macro(enqueueJob) \
85     macro(hostPromiseRejectionTracker) \
86     macro(promiseIsHandled) \
87     macro(promiseState) \
88     macro(promiseReactions) \
89     macro(promiseResult) \
90     macro(onFulfilled) \
91     macro(onRejected) \
92     macro(push) \
93     macro(repeatCharacter) \
94     macro(capabilities) \
95     macro(starDefault) \
96     macro(InspectorInstrumentation) \
97     macro(get) \
98     macro(set) \
99     macro(shift) \
100     macro(allocateTypedArray) \
101     macro(Int8Array) \
102     macro(Int16Array) \
103     macro(Int32Array) \
104     macro(Uint8Array) \
105     macro(Uint8ClampedArray) \
106     macro(Uint16Array) \
107     macro(Uint32Array) \
108     macro(Float32Array) \
109     macro(Float64Array) \
110     macro(exec) \
111     macro(generator) \
112     macro(generatorNext) \
113     macro(generatorState) \
114     macro(generatorFrame) \
115     macro(generatorValue) \
116     macro(generatorThis) \
117     macro(generatorResumeMode) \
118     macro(Collator) \
119     macro(DateTimeFormat) \
120     macro(NumberFormat) \
121     macro(intlSubstituteValue) \
122     macro(thisTimeValue) \
123     macro(thisNumberValue) \
124     macro(newTargetLocal) \
125     macro(derivedConstructor) \
126     macro(isTypedArrayView) \
127     macro(isBoundFunction) \
128     macro(hasInstanceBoundFunction) \
129     macro(instanceOf) \
130     macro(isArraySlow) \
131     macro(isArrayConstructor) \
132     macro(isConstructor) \
133     macro(isDerivedConstructor) \
134     macro(concatMemcpy) \
135     macro(appendMemcpy) \
136     macro(predictFinalLengthFromArgumunts) \
137     macro(print) \
138     macro(regExpCreate) \
139     macro(SetIterator) \
140     macro(setIteratorNext) \
141     macro(replaceUsingRegExp) \
142     macro(replaceUsingStringSearch) \
143     macro(MapIterator) \
144     macro(mapIteratorNext) \
145     macro(regExpBuiltinExec) \
146     macro(regExpMatchFast) \
147     macro(regExpProtoFlagsGetter) \
148     macro(regExpProtoGlobalGetter) \
149     macro(regExpProtoIgnoreCaseGetter) \
150     macro(regExpProtoMultilineGetter) \
151     macro(regExpProtoSourceGetter) \
152     macro(regExpProtoStickyGetter) \
153     macro(regExpProtoUnicodeGetter) \
154     macro(regExpPrototypeSymbolReplace) \
155     macro(regExpReplaceFast) \
156     macro(regExpSearchFast) \
157     macro(regExpSplitFast) \
158     macro(regExpTestFast) \
159     macro(stringIncludesInternal) \
160     macro(stringSplitFast) \
161     macro(stringSubstrInternal) \
162     macro(makeBoundFunction) \
163     macro(hasOwnLengthProperty) \
164     macro(importModule) \
165     macro(WebAssembly) \
166     macro(Module) \
167     macro(Instance) \
168     macro(Memory) \
169     macro(Table) \
170     macro(CompileError) \
171     macro(LinkError) \
172     macro(RuntimeError) \
173
174
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);
177
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);
182
183 class BuiltinNames {
184     WTF_MAKE_NONCOPYABLE(BuiltinNames); WTF_MAKE_FAST_ALLOCATED;
185     
186 public:
187     // We treat the dollarVM name as a special case below for $vm (because CommonIdentifiers does not
188     // yet support the $ character).
189
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"))))
197     {
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);
205     }
206
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;
212     
213     void appendExternalName(const Identifier& publicName, const Identifier& privateName);
214
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; }
220
221 private:
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;
231 };
232
233 inline bool BuiltinNames::isPrivateName(SymbolImpl& uid) const
234 {
235     return m_privateToPublicMap.contains(&uid);
236 }
237
238 inline bool BuiltinNames::isPrivateName(UniquedStringImpl& uid) const
239 {
240     if (!uid.isSymbol())
241         return false;
242     return m_privateToPublicMap.contains(&uid);
243 }
244
245 inline bool BuiltinNames::isPrivateName(const Identifier& ident) const
246 {
247     if (ident.isNull())
248         return false;
249     return isPrivateName(*ident.impl());
250 }
251
252 inline const Identifier* BuiltinNames::lookUpPrivateName(const Identifier& ident) const
253 {
254     auto iter = m_publicToPrivateMap.find(ident.impl());
255     if (iter != m_publicToPrivateMap.end())
256         return iter->value;
257     return 0;
258 }
259
260 inline const Identifier& BuiltinNames::lookUpPublicName(const Identifier& ident) const
261 {
262     auto iter = m_privateToPublicMap.find(ident.impl());
263     if (iter != m_privateToPublicMap.end())
264         return *iter->value;
265     return m_emptyIdentifier;
266 }
267
268 inline void BuiltinNames::appendExternalName(const Identifier& publicName, const Identifier& privateName)
269 {
270 #ifndef NDEBUG
271     for (const auto& key : m_publicToPrivateMap.keys())
272         ASSERT(publicName.string() != *key);
273 #endif
274
275     m_privateToPublicMap.add(privateName.impl(), &publicName);
276     m_publicToPrivateMap.add(publicName.impl(), &privateName);
277 }
278
279 } // namespace JSC