2 * Copyright (C) 2007, 2008, 2009, 2014, 2015 Apple Inc. All rights reserved.
3 * Copyright (C) 2008 Cameron Zwarich (cwzwarich@uwaterloo.ca)
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. Neither the name of Apple Inc. ("Apple") nor the names of
15 * its contributors may be used to endorse or promote products derived
16 * from this software without specific prior written permission.
18 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
19 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
22 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 #include "JSGlobalObject.h"
33 #include "ArrayConstructor.h"
34 #include "ArrayIteratorPrototype.h"
35 #include "ArrayPrototype.h"
36 #include "BooleanConstructor.h"
37 #include "BooleanPrototype.h"
38 #include "BuiltinNames.h"
39 #include "ClonedArguments.h"
40 #include "CodeBlock.h"
41 #include "CodeCache.h"
42 #include "ConsolePrototype.h"
43 #include "DateConstructor.h"
44 #include "DatePrototype.h"
46 #include "DebuggerScope.h"
47 #include "DirectArguments.h"
49 #include "ErrorConstructor.h"
50 #include "ErrorPrototype.h"
51 #include "FunctionConstructor.h"
52 #include "FunctionPrototype.h"
53 #include "GetterSetter.h"
54 #include "HeapIterationScope.h"
55 #include "Interpreter.h"
56 #include "IteratorPrototype.h"
57 #include "JSAPIWrapperObject.h"
58 #include "JSArrayBuffer.h"
59 #include "JSArrayBufferConstructor.h"
60 #include "JSArrayBufferPrototype.h"
61 #include "JSArrayIterator.h"
62 #include "JSBoundFunction.h"
63 #include "JSCInlines.h"
64 #include "JSCallbackConstructor.h"
65 #include "JSCallbackFunction.h"
66 #include "JSCallbackObject.h"
67 #include "JSCatchScope.h"
68 #include "JSConsole.h"
69 #include "JSDataView.h"
70 #include "JSDataViewPrototype.h"
71 #include "JSDollarVM.h"
72 #include "JSDollarVMPrototype.h"
73 #include "JSFunction.h"
74 #include "JSFunctionNameScope.h"
75 #include "JSGenericTypedArrayViewConstructorInlines.h"
76 #include "JSGenericTypedArrayViewInlines.h"
77 #include "JSGenericTypedArrayViewPrototypeInlines.h"
78 #include "JSGlobalObjectFunctions.h"
80 #include "JSLexicalEnvironment.h"
83 #include "JSMapIterator.h"
84 #include "JSONObject.h"
86 #include "JSSetIterator.h"
87 #include "JSStringIterator.h"
88 #include "JSTemplateRegistryKey.h"
89 #include "JSTypedArrayConstructors.h"
90 #include "JSTypedArrayPrototypes.h"
91 #include "JSTypedArrays.h"
92 #include "JSWeakMap.h"
93 #include "JSWeakSet.h"
94 #include "JSWithScope.h"
95 #include "LegacyProfiler.h"
97 #include "MapConstructor.h"
98 #include "MapIteratorPrototype.h"
99 #include "MapPrototype.h"
100 #include "MathObject.h"
101 #include "Microtask.h"
102 #include "NativeErrorConstructor.h"
103 #include "NativeErrorPrototype.h"
104 #include "NullGetterFunction.h"
105 #include "NullSetterFunction.h"
106 #include "NumberConstructor.h"
107 #include "NumberPrototype.h"
108 #include "ObjCCallbackFunction.h"
109 #include "ObjectConstructor.h"
110 #include "ObjectPrototype.h"
111 #include "ParserError.h"
112 #include "RegExpConstructor.h"
113 #include "RegExpMatchesArray.h"
114 #include "RegExpObject.h"
115 #include "RegExpPrototype.h"
116 #include "ScopedArguments.h"
117 #include "SetConstructor.h"
118 #include "SetIteratorPrototype.h"
119 #include "SetPrototype.h"
120 #include "StrictEvalActivation.h"
121 #include "StringConstructor.h"
122 #include "StringIteratorPrototype.h"
123 #include "StringPrototype.h"
125 #include "SymbolConstructor.h"
126 #include "SymbolPrototype.h"
127 #include "VariableWriteFireDetail.h"
128 #include "WeakGCMapInlines.h"
129 #include "WeakMapConstructor.h"
130 #include "WeakMapPrototype.h"
131 #include "WeakSetConstructor.h"
132 #include "WeakSetPrototype.h"
135 #include "IntlObject.h"
136 #endif // ENABLE(INTL)
139 #include "JSPromise.h"
140 #include "JSPromiseConstructor.h"
141 #include "JSPromisePrototype.h"
142 #endif // ENABLE(PROMISES)
144 #if ENABLE(REMOTE_INSPECTOR)
145 #include "JSGlobalObjectDebuggable.h"
146 #include "JSGlobalObjectInspectorController.h"
149 #if ENABLE(WEB_REPLAY)
150 #include "EmptyInputCursor.h"
151 #include "JSReplayInputs.h"
154 #include "JSGlobalObject.lut.h"
158 const ClassInfo
JSGlobalObject::s_info
= { "GlobalObject", &Base::s_info
, &globalObjectTable
, CREATE_METHOD_TABLE(JSGlobalObject
) };
160 const GlobalObjectMethodTable
JSGlobalObject::s_globalObjectMethodTable
= { &allowsAccessFrom
, &supportsProfiling
, &supportsRichSourceInfo
, &shouldInterruptScript
, &javaScriptRuntimeFlags
, 0, &shouldInterruptScriptBeforeTimeout
};
162 /* Source for JSGlobalObject.lut.h
163 @begin globalObjectTable
164 parseFloat globalFuncParseFloat DontEnum|Function 1
165 isNaN globalFuncIsNaN DontEnum|Function 1
166 isFinite globalFuncIsFinite DontEnum|Function 1
167 escape globalFuncEscape DontEnum|Function 1
168 unescape globalFuncUnescape DontEnum|Function 1
169 decodeURI globalFuncDecodeURI DontEnum|Function 1
170 decodeURIComponent globalFuncDecodeURIComponent DontEnum|Function 1
171 encodeURI globalFuncEncodeURI DontEnum|Function 1
172 encodeURIComponent globalFuncEncodeURIComponent DontEnum|Function 1
176 static EncodedJSValue JSC_HOST_CALL
getTemplateObject(ExecState
* exec
)
178 JSValue thisValue
= exec
->thisValue();
179 ASSERT(thisValue
.inherits(JSTemplateRegistryKey::info()));
180 return JSValue::encode(exec
->lexicalGlobalObject()->templateRegistry().getTemplateObject(exec
, jsCast
<JSTemplateRegistryKey
*>(thisValue
)->templateRegistryKey()));
184 static EncodedJSValue JSC_HOST_CALL
enqueueJob(ExecState
* exec
)
187 JSGlobalObject
* globalObject
= exec
->lexicalGlobalObject();
189 JSValue job
= exec
->argument(0);
190 JSValue arguments
= exec
->argument(1);
191 ASSERT(arguments
.inherits(JSArray::info()));
193 globalObject
->queueMicrotask(createJSJob(vm
, job
, jsCast
<JSArray
*>(arguments
)));
195 return JSValue::encode(jsUndefined());
198 JSGlobalObject::JSGlobalObject(VM
& vm
, Structure
* structure
, const GlobalObjectMethodTable
* globalObjectMethodTable
)
199 : Base(vm
, structure
, 0)
201 #if ENABLE(WEB_REPLAY)
202 , m_inputCursor(EmptyInputCursor::create())
204 , m_masqueradesAsUndefinedWatchpoint(adoptRef(new WatchpointSet(IsWatched
)))
205 , m_havingABadTimeWatchpoint(adoptRef(new WatchpointSet(IsWatched
)))
206 , m_varInjectionWatchpoint(adoptRef(new WatchpointSet(IsWatched
)))
207 , m_weakRandom(Options::forceWeakRandomSeed() ? Options::forcedWeakRandomSeed() : static_cast<unsigned>(randomNumber() * (std::numeric_limits
<unsigned>::max() + 1.0)))
208 , m_templateRegistry(vm
)
209 , m_evalEnabled(true)
211 , m_consoleClient(nullptr)
212 , m_globalObjectMethodTable(globalObjectMethodTable
? globalObjectMethodTable
: &s_globalObjectMethodTable
)
216 JSGlobalObject::~JSGlobalObject()
218 #if ENABLE(REMOTE_INSPECTOR)
219 m_inspectorController
->globalObjectDestroyed();
223 m_debugger
->detach(this, Debugger::GlobalObjectIsDestructing
);
225 if (LegacyProfiler
* profiler
= vm().enabledProfiler())
226 profiler
->stopProfiling(this);
229 void JSGlobalObject::destroy(JSCell
* cell
)
231 static_cast<JSGlobalObject
*>(cell
)->JSGlobalObject::~JSGlobalObject();
234 void JSGlobalObject::setGlobalThis(VM
& vm
, JSObject
* globalThis
)
236 m_globalThis
.set(vm
, this, globalThis
);
239 void JSGlobalObject::init(VM
& vm
)
241 ASSERT(vm
.currentThreadIsHoldingAPILock());
243 JSGlobalObject::globalExec()->init(0, 0, CallFrame::noCaller(), 0, 0);
247 #if ENABLE(REMOTE_INSPECTOR)
248 m_inspectorController
= std::make_unique
<Inspector::JSGlobalObjectInspectorController
>(*this);
249 m_inspectorDebuggable
= std::make_unique
<JSGlobalObjectDebuggable
>(*this);
250 m_inspectorDebuggable
->init();
251 m_consoleClient
= m_inspectorController
->consoleClient();
254 ExecState
* exec
= JSGlobalObject::globalExec();
256 m_functionPrototype
.set(vm
, this, FunctionPrototype::create(vm
, FunctionPrototype::createStructure(vm
, this, jsNull()))); // The real prototype will be set once ObjectPrototype is created.
257 m_calleeStructure
.set(vm
, this, JSCallee::createStructure(vm
, this, jsNull()));
259 // Need to create the callee structure (above) before creating the callee.
260 m_globalCallee
.set(vm
, this, JSCallee::create(vm
, this, this));
261 exec
->setCallee(m_globalCallee
.get());
263 m_functionStructure
.set(vm
, this, JSFunction::createStructure(vm
, this, m_functionPrototype
.get()));
264 m_boundFunctionStructure
.set(vm
, this, JSBoundFunction::createStructure(vm
, this, m_functionPrototype
.get()));
265 m_namedFunctionStructure
.set(vm
, this, Structure::addPropertyTransition(vm
, m_functionStructure
.get(), vm
.propertyNames
->name
, DontDelete
| ReadOnly
| DontEnum
, m_functionNameOffset
));
266 m_internalFunctionStructure
.set(vm
, this, InternalFunction::createStructure(vm
, this, m_functionPrototype
.get()));
267 JSFunction
* callFunction
= 0;
268 JSFunction
* applyFunction
= 0;
269 m_functionPrototype
->addFunctionProperties(exec
, this, &callFunction
, &applyFunction
);
270 m_callFunction
.set(vm
, this, callFunction
);
271 m_applyFunction
.set(vm
, this, applyFunction
);
272 m_arrayProtoValuesFunction
.set(vm
, this, JSFunction::create(vm
, this, 0, vm
.propertyNames
->values
.string(), arrayProtoFuncValues
));
274 m_initializePromiseFunction
.set(vm
, this, JSFunction::createBuiltinFunction(vm
, operationsPromiseInitializePromiseCodeGenerator(vm
), this));
275 m_newPromiseDeferredFunction
.set(vm
, this, JSFunction::createBuiltinFunction(vm
, operationsPromiseNewPromiseDeferredCodeGenerator(vm
), this));
276 #endif // ENABLE(PROMISES)
277 m_nullGetterFunction
.set(vm
, this, NullGetterFunction::create(vm
, NullGetterFunction::createStructure(vm
, this, m_functionPrototype
.get())));
278 m_nullSetterFunction
.set(vm
, this, NullSetterFunction::create(vm
, NullSetterFunction::createStructure(vm
, this, m_functionPrototype
.get())));
279 m_objectPrototype
.set(vm
, this, ObjectPrototype::create(vm
, this, ObjectPrototype::createStructure(vm
, this, jsNull())));
280 GetterSetter
* protoAccessor
= GetterSetter::create(vm
, this);
281 protoAccessor
->setGetter(vm
, this, JSFunction::create(vm
, this, 0, String(), globalFuncProtoGetter
));
282 protoAccessor
->setSetter(vm
, this, JSFunction::create(vm
, this, 0, String(), globalFuncProtoSetter
));
283 m_objectPrototype
->putDirectNonIndexAccessor(vm
, vm
.propertyNames
->underscoreProto
, protoAccessor
, Accessor
| DontEnum
);
284 m_functionPrototype
->structure()->setPrototypeWithoutTransition(vm
, m_objectPrototype
.get());
286 m_typedArrays
[toIndex(TypeInt8
)].prototype
.set(vm
, this, JSInt8ArrayPrototype::create(vm
, this, JSInt8ArrayPrototype::createStructure(vm
, this, m_objectPrototype
.get())));
287 m_typedArrays
[toIndex(TypeInt16
)].prototype
.set(vm
, this, JSInt16ArrayPrototype::create(vm
, this, JSInt16ArrayPrototype::createStructure(vm
, this, m_objectPrototype
.get())));
288 m_typedArrays
[toIndex(TypeInt32
)].prototype
.set(vm
, this, JSInt32ArrayPrototype::create(vm
, this, JSInt32ArrayPrototype::createStructure(vm
, this, m_objectPrototype
.get())));
289 m_typedArrays
[toIndex(TypeUint8
)].prototype
.set(vm
, this, JSUint8ArrayPrototype::create(vm
, this, JSUint8ArrayPrototype::createStructure(vm
, this, m_objectPrototype
.get())));
290 m_typedArrays
[toIndex(TypeUint8Clamped
)].prototype
.set(vm
, this, JSUint8ClampedArrayPrototype::create(vm
, this, JSUint8ClampedArrayPrototype::createStructure(vm
, this, m_objectPrototype
.get())));
291 m_typedArrays
[toIndex(TypeUint16
)].prototype
.set(vm
, this, JSUint16ArrayPrototype::create(vm
, this, JSUint16ArrayPrototype::createStructure(vm
, this, m_objectPrototype
.get())));
292 m_typedArrays
[toIndex(TypeUint32
)].prototype
.set(vm
, this, JSUint32ArrayPrototype::create(vm
, this, JSUint32ArrayPrototype::createStructure(vm
, this, m_objectPrototype
.get())));
293 m_typedArrays
[toIndex(TypeFloat32
)].prototype
.set(vm
, this, JSFloat32ArrayPrototype::create(vm
, this, JSFloat32ArrayPrototype::createStructure(vm
, this, m_objectPrototype
.get())));
294 m_typedArrays
[toIndex(TypeFloat64
)].prototype
.set(vm
, this, JSFloat64ArrayPrototype::create(vm
, this, JSFloat64ArrayPrototype::createStructure(vm
, this, m_objectPrototype
.get())));
295 m_typedArrays
[toIndex(TypeDataView
)].prototype
.set(vm
, this, JSDataViewPrototype::create(vm
, JSDataViewPrototype::createStructure(vm
, this, m_objectPrototype
.get())));
297 m_typedArrays
[toIndex(TypeInt8
)].structure
.set(vm
, this, JSInt8Array::createStructure(vm
, this, m_typedArrays
[toIndex(TypeInt8
)].prototype
.get()));
298 m_typedArrays
[toIndex(TypeInt16
)].structure
.set(vm
, this, JSInt16Array::createStructure(vm
, this, m_typedArrays
[toIndex(TypeInt16
)].prototype
.get()));
299 m_typedArrays
[toIndex(TypeInt32
)].structure
.set(vm
, this, JSInt32Array::createStructure(vm
, this, m_typedArrays
[toIndex(TypeInt32
)].prototype
.get()));
300 m_typedArrays
[toIndex(TypeUint8
)].structure
.set(vm
, this, JSUint8Array::createStructure(vm
, this, m_typedArrays
[toIndex(TypeUint8
)].prototype
.get()));
301 m_typedArrays
[toIndex(TypeUint8Clamped
)].structure
.set(vm
, this, JSUint8ClampedArray::createStructure(vm
, this, m_typedArrays
[toIndex(TypeUint8Clamped
)].prototype
.get()));
302 m_typedArrays
[toIndex(TypeUint16
)].structure
.set(vm
, this, JSUint16Array::createStructure(vm
, this, m_typedArrays
[toIndex(TypeUint16
)].prototype
.get()));
303 m_typedArrays
[toIndex(TypeUint32
)].structure
.set(vm
, this, JSUint32Array::createStructure(vm
, this, m_typedArrays
[toIndex(TypeUint32
)].prototype
.get()));
304 m_typedArrays
[toIndex(TypeFloat32
)].structure
.set(vm
, this, JSFloat32Array::createStructure(vm
, this, m_typedArrays
[toIndex(TypeFloat32
)].prototype
.get()));
305 m_typedArrays
[toIndex(TypeFloat64
)].structure
.set(vm
, this, JSFloat64Array::createStructure(vm
, this, m_typedArrays
[toIndex(TypeFloat64
)].prototype
.get()));
306 m_typedArrays
[toIndex(TypeDataView
)].structure
.set(vm
, this, JSDataView::createStructure(vm
, this, m_typedArrays
[toIndex(TypeDataView
)].prototype
.get()));
308 m_catchScopeStructure
.set(vm
, this, JSCatchScope::createStructure(vm
, this, jsNull()));
309 m_functionNameScopeStructure
.set(vm
, this, JSFunctionNameScope::createStructure(vm
, this, jsNull()));
310 m_lexicalEnvironmentStructure
.set(vm
, this, JSLexicalEnvironment::createStructure(vm
, this));
311 m_strictEvalActivationStructure
.set(vm
, this, StrictEvalActivation::createStructure(vm
, this, jsNull()));
312 m_debuggerScopeStructure
.set(m_vm
, this, DebuggerScope::createStructure(m_vm
, this));
313 m_withScopeStructure
.set(vm
, this, JSWithScope::createStructure(vm
, this, jsNull()));
315 m_nullPrototypeObjectStructure
.set(vm
, this, JSFinalObject::createStructure(vm
, this, jsNull(), JSFinalObject::defaultInlineCapacity()));
317 m_callbackFunctionStructure
.set(vm
, this, JSCallbackFunction::createStructure(vm
, this, m_functionPrototype
.get()));
318 m_directArgumentsStructure
.set(vm
, this, DirectArguments::createStructure(vm
, this, m_objectPrototype
.get()));
319 m_scopedArgumentsStructure
.set(vm
, this, ScopedArguments::createStructure(vm
, this, m_objectPrototype
.get()));
320 m_outOfBandArgumentsStructure
.set(vm
, this, ClonedArguments::createStructure(vm
, this, m_objectPrototype
.get()));
321 m_callbackConstructorStructure
.set(vm
, this, JSCallbackConstructor::createStructure(vm
, this, m_objectPrototype
.get()));
322 m_callbackObjectStructure
.set(vm
, this, JSCallbackObject
<JSDestructibleObject
>::createStructure(vm
, this, m_objectPrototype
.get()));
323 #if JSC_OBJC_API_ENABLED
324 m_objcCallbackFunctionStructure
.set(vm
, this, ObjCCallbackFunction::createStructure(vm
, this, m_functionPrototype
.get()));
325 m_objcWrapperObjectStructure
.set(vm
, this, JSCallbackObject
<JSAPIWrapperObject
>::createStructure(vm
, this, m_objectPrototype
.get()));
328 m_arrayPrototype
.set(vm
, this, ArrayPrototype::create(vm
, this, ArrayPrototype::createStructure(vm
, this, m_objectPrototype
.get())));
330 m_originalArrayStructureForIndexingShape
[UndecidedShape
>> IndexingShapeShift
].set(vm
, this, JSArray::createStructure(vm
, this, m_arrayPrototype
.get(), ArrayWithUndecided
));
331 m_originalArrayStructureForIndexingShape
[Int32Shape
>> IndexingShapeShift
].set(vm
, this, JSArray::createStructure(vm
, this, m_arrayPrototype
.get(), ArrayWithInt32
));
332 m_originalArrayStructureForIndexingShape
[DoubleShape
>> IndexingShapeShift
].set(vm
, this, JSArray::createStructure(vm
, this, m_arrayPrototype
.get(), ArrayWithDouble
));
333 m_originalArrayStructureForIndexingShape
[ContiguousShape
>> IndexingShapeShift
].set(vm
, this, JSArray::createStructure(vm
, this, m_arrayPrototype
.get(), ArrayWithContiguous
));
334 m_originalArrayStructureForIndexingShape
[ArrayStorageShape
>> IndexingShapeShift
].set(vm
, this, JSArray::createStructure(vm
, this, m_arrayPrototype
.get(), ArrayWithArrayStorage
));
335 m_originalArrayStructureForIndexingShape
[SlowPutArrayStorageShape
>> IndexingShapeShift
].set(vm
, this, JSArray::createStructure(vm
, this, m_arrayPrototype
.get(), ArrayWithSlowPutArrayStorage
));
336 for (unsigned i
= 0; i
< NumberOfIndexingShapes
; ++i
)
337 m_arrayStructureForIndexingShapeDuringAllocation
[i
] = m_originalArrayStructureForIndexingShape
[i
];
339 RegExp
* emptyRegex
= RegExp::create(vm
, "", NoFlags
);
341 m_regExpPrototype
.set(vm
, this, RegExpPrototype::create(vm
, RegExpPrototype::createStructure(vm
, this, m_objectPrototype
.get()), emptyRegex
));
342 m_regExpStructure
.set(vm
, this, RegExpObject::createStructure(vm
, this, m_regExpPrototype
.get()));
343 m_regExpMatchesArrayStructure
.set(vm
, this, createRegExpMatchesArrayStructure(vm
, *this));
346 m_promisePrototype
.set(vm
, this, JSPromisePrototype::create(exec
, this, JSPromisePrototype::createStructure(vm
, this, m_objectPrototype
.get())));
347 m_promiseStructure
.set(vm
, this, JSPromise::createStructure(vm
, this, m_promisePrototype
.get()));
348 #endif // ENABLE(PROMISES)
350 m_parseIntFunction
.set(vm
, this, JSFunction::create(vm
, this, 2, vm
.propertyNames
->parseInt
.string(), globalFuncParseInt
, NoIntrinsic
));
351 putDirectWithoutTransition(vm
, vm
.propertyNames
->parseInt
, m_parseIntFunction
.get(), DontEnum
| Function
);
353 #define CREATE_PROTOTYPE_FOR_SIMPLE_TYPE(capitalName, lowerName, properName, instanceType, jsName) \
354 m_ ## lowerName ## Prototype.set(vm, this, capitalName##Prototype::create(vm, this, capitalName##Prototype::createStructure(vm, this, m_objectPrototype.get()))); \
355 m_ ## properName ## Structure.set(vm, this, instanceType::createStructure(vm, this, m_ ## lowerName ## Prototype.get()));
357 FOR_EACH_SIMPLE_BUILTIN_TYPE(CREATE_PROTOTYPE_FOR_SIMPLE_TYPE
)
359 #undef CREATE_PROTOTYPE_FOR_SIMPLE_TYPE
361 m_iteratorPrototype
.set(vm
, this, IteratorPrototype::create(vm
, this, IteratorPrototype::createStructure(vm
, this, m_objectPrototype
.get())));
363 #define CREATE_PROTOTYPE_FOR_DERIVED_ITERATOR_TYPE(capitalName, lowerName, properName, instanceType, jsName) \
364 m_ ## lowerName ## Prototype.set(vm, this, capitalName##Prototype::create(vm, this, capitalName##Prototype::createStructure(vm, this, m_iteratorPrototype.get()))); \
365 m_ ## properName ## Structure.set(vm, this, instanceType::createStructure(vm, this, m_ ## lowerName ## Prototype.get()));
367 FOR_EACH_BUILTIN_DERIVED_ITERATOR_TYPE(CREATE_PROTOTYPE_FOR_DERIVED_ITERATOR_TYPE
)
369 #undef CREATE_PROTOTYPE_FOR_DERIVED_ITERATOR_TYPE
373 ObjectConstructor
* objectConstructor
= ObjectConstructor::create(vm
, this, ObjectConstructor::createStructure(vm
, this, m_functionPrototype
.get()), m_objectPrototype
.get());
374 m_objectConstructor
.set(vm
, this, objectConstructor
);
376 JSFunction
* definePropertyFunction
= m_objectConstructor
->addDefineProperty(exec
, this);
377 m_definePropertyFunction
.set(vm
, this, definePropertyFunction
);
379 JSCell
* functionConstructor
= FunctionConstructor::create(vm
, FunctionConstructor::createStructure(vm
, this, m_functionPrototype
.get()), m_functionPrototype
.get());
380 JSCell
* arrayConstructor
= ArrayConstructor::create(vm
, ArrayConstructor::createStructure(vm
, this, m_functionPrototype
.get()), m_arrayPrototype
.get());
382 m_regExpConstructor
.set(vm
, this, RegExpConstructor::create(vm
, RegExpConstructor::createStructure(vm
, this, m_functionPrototype
.get()), m_regExpPrototype
.get()));
384 #define CREATE_CONSTRUCTOR_FOR_SIMPLE_TYPE(capitalName, lowerName, properName, instanceType, jsName) \
385 capitalName ## Constructor* lowerName ## Constructor = capitalName ## Constructor::create(vm, capitalName ## Constructor::createStructure(vm, this, m_functionPrototype.get()), m_ ## lowerName ## Prototype.get()); \
386 m_ ## lowerName ## Prototype->putDirectWithoutTransition(vm, vm.propertyNames->constructor, lowerName ## Constructor, DontEnum); \
388 FOR_EACH_SIMPLE_BUILTIN_TYPE(CREATE_CONSTRUCTOR_FOR_SIMPLE_TYPE)
390 #undef CREATE_CONSTRUCTOR_FOR_SIMPLE_TYPE
392 m_errorConstructor
.set(vm
, this, errorConstructor
);
394 Structure
* nativeErrorPrototypeStructure
= NativeErrorPrototype::createStructure(vm
, this, m_errorPrototype
.get());
395 Structure
* nativeErrorStructure
= NativeErrorConstructor::createStructure(vm
, this, m_functionPrototype
.get());
396 m_evalErrorConstructor
.set(vm
, this, NativeErrorConstructor::create(vm
, this, nativeErrorStructure
, nativeErrorPrototypeStructure
, ASCIILiteral("EvalError")));
397 m_rangeErrorConstructor
.set(vm
, this, NativeErrorConstructor::create(vm
, this, nativeErrorStructure
, nativeErrorPrototypeStructure
, ASCIILiteral("RangeError")));
398 m_referenceErrorConstructor
.set(vm
, this, NativeErrorConstructor::create(vm
, this, nativeErrorStructure
, nativeErrorPrototypeStructure
, ASCIILiteral("ReferenceError")));
399 m_syntaxErrorConstructor
.set(vm
, this, NativeErrorConstructor::create(vm
, this, nativeErrorStructure
, nativeErrorPrototypeStructure
, ASCIILiteral("SyntaxError")));
400 m_typeErrorConstructor
.set(vm
, this, NativeErrorConstructor::create(vm
, this, nativeErrorStructure
, nativeErrorPrototypeStructure
, ASCIILiteral("TypeError")));
401 m_URIErrorConstructor
.set(vm
, this, NativeErrorConstructor::create(vm
, this, nativeErrorStructure
, nativeErrorPrototypeStructure
, ASCIILiteral("URIError")));
403 m_promiseConstructor
.set(vm
, this, JSPromiseConstructor::create(vm
, JSPromiseConstructor::createStructure(vm
, this, m_functionPrototype
.get()), m_promisePrototype
.get()));
406 m_objectPrototype
->putDirectWithoutTransition(vm
, vm
.propertyNames
->constructor
, objectConstructor
, DontEnum
);
407 m_functionPrototype
->putDirectWithoutTransition(vm
, vm
.propertyNames
->constructor
, functionConstructor
, DontEnum
);
408 m_arrayPrototype
->putDirectWithoutTransition(vm
, vm
.propertyNames
->constructor
, arrayConstructor
, DontEnum
);
409 m_regExpPrototype
->putDirectWithoutTransition(vm
, vm
.propertyNames
->constructor
, m_regExpConstructor
.get(), DontEnum
);
411 m_promisePrototype
->putDirectWithoutTransition(vm
, vm
.propertyNames
->constructor
, m_promiseConstructor
.get(), DontEnum
);
414 putDirectWithoutTransition(vm
, vm
.propertyNames
->Object
, objectConstructor
, DontEnum
);
415 putDirectWithoutTransition(vm
, vm
.propertyNames
->Function
, functionConstructor
, DontEnum
);
416 putDirectWithoutTransition(vm
, vm
.propertyNames
->Array
, arrayConstructor
, DontEnum
);
417 putDirectWithoutTransition(vm
, vm
.propertyNames
->RegExp
, m_regExpConstructor
.get(), DontEnum
);
418 putDirectWithoutTransition(vm
, vm
.propertyNames
->EvalError
, m_evalErrorConstructor
.get(), DontEnum
);
419 putDirectWithoutTransition(vm
, vm
.propertyNames
->RangeError
, m_rangeErrorConstructor
.get(), DontEnum
);
420 putDirectWithoutTransition(vm
, vm
.propertyNames
->ReferenceError
, m_referenceErrorConstructor
.get(), DontEnum
);
421 putDirectWithoutTransition(vm
, vm
.propertyNames
->SyntaxError
, m_syntaxErrorConstructor
.get(), DontEnum
);
422 putDirectWithoutTransition(vm
, vm
.propertyNames
->TypeError
, m_typeErrorConstructor
.get(), DontEnum
);
423 putDirectWithoutTransition(vm
, vm
.propertyNames
->URIError
, m_URIErrorConstructor
.get(), DontEnum
);
425 if (!m_runtimeFlags
.isPromiseDisabled())
426 putDirectWithoutTransition(vm
, vm
.propertyNames
->Promise
, m_promiseConstructor
.get(), DontEnum
);
430 #define PUT_CONSTRUCTOR_FOR_SIMPLE_TYPE(capitalName, lowerName, properName, instanceType, jsName) \
431 putDirectWithoutTransition(vm, vm.propertyNames-> jsName, lowerName ## Constructor, DontEnum); \
433 FOR_EACH_SIMPLE_BUILTIN_TYPE_WITH_CONSTRUCTOR(PUT_CONSTRUCTOR_FOR_SIMPLE_TYPE)
435 if (!m_runtimeFlags
.isSymbolDisabled())
436 putDirectWithoutTransition(vm
, vm
.propertyNames
->Symbol
, symbolConstructor
, DontEnum
);
438 #undef PUT_CONSTRUCTOR_FOR_SIMPLE_TYPE
439 PrototypeMap
& prototypeMap
= vm
.prototypeMap
;
440 Structure
* iteratorResultStructure
= prototypeMap
.emptyObjectStructureForPrototype(m_objectPrototype
.get(), JSFinalObject::defaultInlineCapacity());
441 PropertyOffset offset
;
442 iteratorResultStructure
= Structure::addPropertyTransition(vm
, iteratorResultStructure
, vm
.propertyNames
->done
, 0, offset
);
443 iteratorResultStructure
= Structure::addPropertyTransition(vm
, iteratorResultStructure
, vm
.propertyNames
->value
, 0, offset
);
444 m_iteratorResultStructure
.set(vm
, this, iteratorResultStructure
);
446 m_evalFunction
.set(vm
, this, JSFunction::create(vm
, this, 1, vm
.propertyNames
->eval
.string(), globalFuncEval
));
447 putDirectWithoutTransition(vm
, vm
.propertyNames
->eval
, m_evalFunction
.get(), DontEnum
);
450 putDirectWithoutTransition(vm
, vm
.propertyNames
->Intl
, IntlObject::create(vm
, IntlObject::createStructure(vm
, this, m_objectPrototype
.get())), DontEnum
);
451 #endif // ENABLE(INTL)
452 putDirectWithoutTransition(vm
, vm
.propertyNames
->JSON
, JSONObject::create(vm
, JSONObject::createStructure(vm
, this, m_objectPrototype
.get())), DontEnum
);
453 putDirectWithoutTransition(vm
, vm
.propertyNames
->Math
, MathObject::create(vm
, this, MathObject::createStructure(vm
, this, m_objectPrototype
.get())), DontEnum
);
455 std::array
<InternalFunction
*, NUMBER_OF_TYPED_ARRAY_TYPES
> typedArrayConstructors
;
456 typedArrayConstructors
[toIndex(TypeInt8
)] = JSInt8ArrayConstructor::create(vm
, JSInt8ArrayConstructor::createStructure(vm
, this, m_functionPrototype
.get()), m_typedArrays
[toIndex(TypeInt8
)].prototype
.get(), ASCIILiteral("Int8Array"));
457 typedArrayConstructors
[toIndex(TypeInt16
)] = JSInt16ArrayConstructor::create(vm
, JSInt16ArrayConstructor::createStructure(vm
, this, m_functionPrototype
.get()), m_typedArrays
[toIndex(TypeInt16
)].prototype
.get(), ASCIILiteral("Int16Array"));
458 typedArrayConstructors
[toIndex(TypeInt32
)] = JSInt32ArrayConstructor::create(vm
, JSInt32ArrayConstructor::createStructure(vm
, this, m_functionPrototype
.get()), m_typedArrays
[toIndex(TypeInt32
)].prototype
.get(), ASCIILiteral("Int32Array"));
459 typedArrayConstructors
[toIndex(TypeUint8
)] = JSUint8ArrayConstructor::create(vm
, JSUint8ArrayConstructor::createStructure(vm
, this, m_functionPrototype
.get()), m_typedArrays
[toIndex(TypeUint8
)].prototype
.get(), ASCIILiteral("Uint8Array"));
460 typedArrayConstructors
[toIndex(TypeUint8Clamped
)] = JSUint8ClampedArrayConstructor::create(vm
, JSUint8ClampedArrayConstructor::createStructure(vm
, this, m_functionPrototype
.get()), m_typedArrays
[toIndex(TypeUint8Clamped
)].prototype
.get(), ASCIILiteral("Uint8ClampedArray"));
461 typedArrayConstructors
[toIndex(TypeUint16
)] = JSUint16ArrayConstructor::create(vm
, JSUint16ArrayConstructor::createStructure(vm
, this, m_functionPrototype
.get()), m_typedArrays
[toIndex(TypeUint16
)].prototype
.get(), ASCIILiteral("Uint16Array"));
462 typedArrayConstructors
[toIndex(TypeUint32
)] = JSUint32ArrayConstructor::create(vm
, JSUint32ArrayConstructor::createStructure(vm
, this, m_functionPrototype
.get()), m_typedArrays
[toIndex(TypeUint32
)].prototype
.get(), ASCIILiteral("Uint32Array"));
463 typedArrayConstructors
[toIndex(TypeFloat32
)] = JSFloat32ArrayConstructor::create(vm
, JSFloat32ArrayConstructor::createStructure(vm
, this, m_functionPrototype
.get()), m_typedArrays
[toIndex(TypeFloat32
)].prototype
.get(), ASCIILiteral("Float32Array"));
464 typedArrayConstructors
[toIndex(TypeFloat64
)] = JSFloat64ArrayConstructor::create(vm
, JSFloat64ArrayConstructor::createStructure(vm
, this, m_functionPrototype
.get()), m_typedArrays
[toIndex(TypeFloat64
)].prototype
.get(), ASCIILiteral("Float64Array"));
465 typedArrayConstructors
[toIndex(TypeDataView
)] = JSDataViewConstructor::create(vm
, JSDataViewConstructor::createStructure(vm
, this, m_functionPrototype
.get()), m_typedArrays
[toIndex(TypeDataView
)].prototype
.get(), ASCIILiteral("DataView"));
467 for (unsigned typedArrayIndex
= NUMBER_OF_TYPED_ARRAY_TYPES
; typedArrayIndex
--;) {
468 m_typedArrays
[typedArrayIndex
].prototype
->putDirectWithoutTransition(vm
, vm
.propertyNames
->constructor
, typedArrayConstructors
[typedArrayIndex
], DontEnum
);
469 putDirectWithoutTransition(vm
, Identifier::fromString(exec
, typedArrayConstructors
[typedArrayIndex
]->name(exec
)), typedArrayConstructors
[typedArrayIndex
], DontEnum
);
472 JSFunction
* builtinLog
= JSFunction::create(vm
, this, 1, vm
.propertyNames
->emptyIdentifier
.string(), globalFuncBuiltinLog
);
474 JSFunction
* privateFuncAbs
= JSFunction::create(vm
, this, 0, String(), mathProtoFuncAbs
, AbsIntrinsic
);
475 JSFunction
* privateFuncFloor
= JSFunction::create(vm
, this, 0, String(), mathProtoFuncFloor
, FloorIntrinsic
);
476 JSFunction
* privateFuncIsFinite
= JSFunction::create(vm
, this, 0, String(), globalFuncIsFinite
);
478 JSFunction
* privateFuncObjectKeys
= JSFunction::create(vm
, this, 0, String(), objectConstructorKeys
);
479 JSFunction
* privateFuncObjectGetOwnPropertyDescriptor
= JSFunction::create(vm
, this, 0, String(), objectConstructorGetOwnPropertyDescriptor
);
480 JSFunction
* privateFuncObjectGetOwnPropertySymbols
= JSFunction::create(vm
, this, 0, String(), objectConstructorGetOwnPropertySymbols
);
481 JSFunction
* privateFuncGetTemplateObject
= JSFunction::create(vm
, this, 0, String(), getTemplateObject
);
482 JSFunction
* privateFuncToLength
= JSFunction::createBuiltinFunction(vm
, globalObjectToLengthCodeGenerator(vm
), this);
483 JSFunction
* privateFuncToInteger
= JSFunction::createBuiltinFunction(vm
, globalObjectToIntegerCodeGenerator(vm
), this);
485 GlobalPropertyInfo staticGlobals
[] = {
486 GlobalPropertyInfo(vm
.propertyNames
->NaN
, jsNaN(), DontEnum
| DontDelete
| ReadOnly
),
487 GlobalPropertyInfo(vm
.propertyNames
->Infinity
, jsNumber(std::numeric_limits
<double>::infinity()), DontEnum
| DontDelete
| ReadOnly
),
488 GlobalPropertyInfo(vm
.propertyNames
->undefinedKeyword
, jsUndefined(), DontEnum
| DontDelete
| ReadOnly
),
489 GlobalPropertyInfo(vm
.propertyNames
->undefinedPrivateName
, jsUndefined(), DontEnum
| DontDelete
| ReadOnly
),
490 GlobalPropertyInfo(vm
.propertyNames
->ObjectPrivateName
, objectConstructor
, DontEnum
| DontDelete
| ReadOnly
),
491 GlobalPropertyInfo(vm
.propertyNames
->objectKeysPrivateName
, privateFuncObjectKeys
, DontEnum
| DontDelete
| ReadOnly
),
492 GlobalPropertyInfo(vm
.propertyNames
->objectGetOwnPropertyDescriptorPrivateName
, privateFuncObjectGetOwnPropertyDescriptor
, DontEnum
| DontDelete
| ReadOnly
),
493 GlobalPropertyInfo(vm
.propertyNames
->objectGetOwnPropertySymbolsPrivateName
, privateFuncObjectGetOwnPropertySymbols
, DontEnum
| DontDelete
| ReadOnly
),
494 GlobalPropertyInfo(vm
.propertyNames
->getTemplateObjectPrivateName
, privateFuncGetTemplateObject
, DontEnum
| DontDelete
| ReadOnly
),
495 GlobalPropertyInfo(vm
.propertyNames
->enqueueJobPrivateName
, JSFunction::create(vm
, this, 0, String(), enqueueJob
), DontEnum
| DontDelete
| ReadOnly
),
496 GlobalPropertyInfo(vm
.propertyNames
->TypeErrorPrivateName
, m_typeErrorConstructor
.get(), DontEnum
| DontDelete
| ReadOnly
),
497 GlobalPropertyInfo(vm
.propertyNames
->BuiltinLogPrivateName
, builtinLog
, DontEnum
| DontDelete
| ReadOnly
),
498 GlobalPropertyInfo(vm
.propertyNames
->ArrayPrivateName
, arrayConstructor
, DontEnum
| DontDelete
| ReadOnly
),
499 GlobalPropertyInfo(vm
.propertyNames
->NumberPrivateName
, numberConstructor
, DontEnum
| DontDelete
| ReadOnly
),
500 GlobalPropertyInfo(vm
.propertyNames
->StringPrivateName
, stringConstructor
, DontEnum
| DontDelete
| ReadOnly
),
501 GlobalPropertyInfo(vm
.propertyNames
->absPrivateName
, privateFuncAbs
, DontEnum
| DontDelete
| ReadOnly
),
502 GlobalPropertyInfo(vm
.propertyNames
->floorPrivateName
, privateFuncFloor
, DontEnum
| DontDelete
| ReadOnly
),
503 GlobalPropertyInfo(vm
.propertyNames
->getPrototypeOfPrivateName
, privateFuncFloor
, DontEnum
| DontDelete
| ReadOnly
),
504 GlobalPropertyInfo(vm
.propertyNames
->getOwnPropertyNamesPrivateName
, privateFuncFloor
, DontEnum
| DontDelete
| ReadOnly
),
505 GlobalPropertyInfo(vm
.propertyNames
->isFinitePrivateName
, privateFuncIsFinite
, DontEnum
| DontDelete
| ReadOnly
),
506 GlobalPropertyInfo(vm
.propertyNames
->arrayIterationKindKeyPrivateName
, jsNumber(ArrayIterateKey
), DontEnum
| DontDelete
| ReadOnly
),
507 GlobalPropertyInfo(vm
.propertyNames
->arrayIterationKindValuePrivateName
, jsNumber(ArrayIterateValue
), DontEnum
| DontDelete
| ReadOnly
),
508 GlobalPropertyInfo(vm
.propertyNames
->arrayIterationKindKeyValuePrivateName
, jsNumber(ArrayIterateKeyValue
), DontEnum
| DontDelete
| ReadOnly
),
509 GlobalPropertyInfo(vm
.propertyNames
->symbolIteratorPrivateName
, Symbol::create(vm
, static_cast<SymbolImpl
&>(*vm
.propertyNames
->iteratorSymbol
.impl())), DontEnum
| DontDelete
| ReadOnly
),
511 GlobalPropertyInfo(vm
.propertyNames
->PromisePrivateName
, m_promiseConstructor
.get(), DontEnum
| DontDelete
| ReadOnly
),
512 GlobalPropertyInfo(vm
.propertyNames
->promisePendingPrivateName
, jsNumber(static_cast<unsigned>(JSPromise::Status::Pending
)), DontEnum
| DontDelete
| ReadOnly
),
513 GlobalPropertyInfo(vm
.propertyNames
->promiseFulfilledPrivateName
, jsNumber(static_cast<unsigned>(JSPromise::Status::Fulfilled
)), DontEnum
| DontDelete
| ReadOnly
),
514 GlobalPropertyInfo(vm
.propertyNames
->promiseRejectedPrivateName
, jsNumber(static_cast<unsigned>(JSPromise::Status::Rejected
)), DontEnum
| DontDelete
| ReadOnly
),
516 GlobalPropertyInfo(vm
.propertyNames
->builtinNames().toLengthPrivateName(), privateFuncToLength
, DontEnum
| DontDelete
| ReadOnly
),
517 GlobalPropertyInfo(vm
.propertyNames
->builtinNames().toIntegerPrivateName(), privateFuncToInteger
, DontEnum
| DontDelete
| ReadOnly
),
518 GlobalPropertyInfo(vm
.propertyNames
->builtinNames().isObjectPrivateName(), JSFunction::createBuiltinFunction(vm
, globalObjectIsObjectCodeGenerator(vm
), this), DontEnum
| DontDelete
| ReadOnly
),
519 GlobalPropertyInfo(vm
.propertyNames
->builtinNames().isPromisePrivateName(), JSFunction::createBuiltinFunction(vm
, operationsPromiseIsPromiseCodeGenerator(vm
), this), DontEnum
| DontDelete
| ReadOnly
),
520 GlobalPropertyInfo(vm
.propertyNames
->builtinNames().newPromiseReactionPrivateName(), JSFunction::createBuiltinFunction(vm
, operationsPromiseNewPromiseReactionCodeGenerator(vm
), this), DontEnum
| DontDelete
| ReadOnly
),
521 GlobalPropertyInfo(vm
.propertyNames
->builtinNames().newPromiseCapabilityPrivateName(), JSFunction::createBuiltinFunction(vm
, operationsPromiseNewPromiseCapabilityCodeGenerator(vm
), this), DontEnum
| DontDelete
| ReadOnly
),
522 GlobalPropertyInfo(vm
.propertyNames
->builtinNames().triggerPromiseReactionsPrivateName(), JSFunction::createBuiltinFunction(vm
, operationsPromiseTriggerPromiseReactionsCodeGenerator(vm
), this), DontEnum
| DontDelete
| ReadOnly
),
523 GlobalPropertyInfo(vm
.propertyNames
->builtinNames().rejectPromisePrivateName(), JSFunction::createBuiltinFunction(vm
, operationsPromiseRejectPromiseCodeGenerator(vm
), this), DontEnum
| DontDelete
| ReadOnly
),
524 GlobalPropertyInfo(vm
.propertyNames
->builtinNames().fulfillPromisePrivateName(), JSFunction::createBuiltinFunction(vm
, operationsPromiseFulfillPromiseCodeGenerator(vm
), this), DontEnum
| DontDelete
| ReadOnly
),
525 GlobalPropertyInfo(vm
.propertyNames
->builtinNames().createResolvingFunctionsPrivateName(), JSFunction::createBuiltinFunction(vm
, operationsPromiseCreateResolvingFunctionsCodeGenerator(vm
), this), DontEnum
| DontDelete
| ReadOnly
),
526 GlobalPropertyInfo(vm
.propertyNames
->builtinNames().promiseReactionJobPrivateName(), JSFunction::createBuiltinFunction(vm
, operationsPromisePromiseReactionJobCodeGenerator(vm
), this), DontEnum
| DontDelete
| ReadOnly
),
527 GlobalPropertyInfo(vm
.propertyNames
->builtinNames().promiseResolveThenableJobPrivateName(), JSFunction::createBuiltinFunction(vm
, operationsPromisePromiseResolveThenableJobCodeGenerator(vm
), this), DontEnum
| DontDelete
| ReadOnly
),
529 addStaticGlobals(staticGlobals
, WTF_ARRAY_LENGTH(staticGlobals
));
531 m_specialPointers
[Special::CallFunction
] = m_callFunction
.get();
532 m_specialPointers
[Special::ApplyFunction
] = m_applyFunction
.get();
533 m_specialPointers
[Special::ObjectConstructor
] = objectConstructor
;
534 m_specialPointers
[Special::ArrayConstructor
] = arrayConstructor
;
536 m_linkTimeConstants
[static_cast<unsigned>(LinkTimeConstant::DefinePropertyFunction
)] = m_definePropertyFunction
.get();
538 ConsolePrototype
* consolePrototype
= ConsolePrototype::create(vm
, this, ConsolePrototype::createStructure(vm
, this, m_objectPrototype
.get()));
539 m_consoleStructure
.set(vm
, this, JSConsole::createStructure(vm
, this, consolePrototype
));
540 JSConsole
* consoleObject
= JSConsole::create(vm
, m_consoleStructure
.get());
541 putDirectWithoutTransition(vm
, Identifier::fromString(exec
, "console"), consoleObject
, DontEnum
);
543 if (UNLIKELY(Options::enableDollarVM())) {
544 JSDollarVMPrototype
* dollarVMPrototype
= JSDollarVMPrototype::create(vm
, this, JSDollarVMPrototype::createStructure(vm
, this, m_objectPrototype
.get()));
545 m_dollarVMStructure
.set(vm
, this, JSDollarVM::createStructure(vm
, this, dollarVMPrototype
));
546 JSDollarVM
* dollarVM
= JSDollarVM::create(vm
, m_dollarVMStructure
.get());
547 putDirectWithoutTransition(vm
, Identifier::fromString(exec
, "$vm"), dollarVM
, DontEnum
);
550 resetPrototype(vm
, prototype());
553 void JSGlobalObject::put(JSCell
* cell
, ExecState
* exec
, PropertyName propertyName
, JSValue value
, PutPropertySlot
& slot
)
555 JSGlobalObject
* thisObject
= jsCast
<JSGlobalObject
*>(cell
);
556 ASSERT(!Heap::heap(value
) || Heap::heap(value
) == Heap::heap(thisObject
));
558 if (symbolTablePut(thisObject
, exec
, propertyName
, value
, slot
.isStrictMode()))
560 Base::put(thisObject
, exec
, propertyName
, value
, slot
);
563 bool JSGlobalObject::defineOwnProperty(JSObject
* object
, ExecState
* exec
, PropertyName propertyName
, const PropertyDescriptor
& descriptor
, bool shouldThrow
)
565 JSGlobalObject
* thisObject
= jsCast
<JSGlobalObject
*>(object
);
566 PropertySlot
slot(thisObject
);
567 // silently ignore attempts to add accessors aliasing vars.
568 if (descriptor
.isAccessorDescriptor() && symbolTableGet(thisObject
, propertyName
, slot
))
570 return Base::defineOwnProperty(thisObject
, exec
, propertyName
, descriptor
, shouldThrow
);
573 void JSGlobalObject::addGlobalVar(const Identifier
& ident
, ConstantMode constantMode
)
575 ConcurrentJITLocker
locker(symbolTable()->m_lock
);
576 SymbolTableEntry entry
= symbolTable()->get(locker
, ident
.impl());
580 ScopeOffset offset
= symbolTable()->takeNextScopeOffset(locker
);
581 SymbolTableEntry
newEntry(VarOffset(offset
), (constantMode
== IsConstant
) ? ReadOnly
: 0);
582 if (constantMode
== IsVariable
)
583 newEntry
.prepareToWatch();
585 newEntry
.disableWatching();
586 symbolTable()->add(locker
, ident
.impl(), newEntry
);
588 ScopeOffset offsetForAssert
= addVariables(1);
589 RELEASE_ASSERT(offsetForAssert
== offset
);
592 void JSGlobalObject::addFunction(ExecState
* exec
, const Identifier
& propertyName
)
595 removeDirect(vm
, propertyName
); // Newly declared functions overwrite existing properties.
596 addGlobalVar(propertyName
, IsVariable
);
599 static inline JSObject
* lastInPrototypeChain(JSObject
* object
)
601 JSObject
* o
= object
;
602 while (o
->prototype().isObject())
603 o
= asObject(o
->prototype());
607 // Private namespace for helpers for JSGlobalObject::haveABadTime()
610 class ObjectsWithBrokenIndexingFinder
: public MarkedBlock::VoidFunctor
{
612 ObjectsWithBrokenIndexingFinder(MarkedArgumentBuffer
&, JSGlobalObject
*);
613 IterationStatus
operator()(JSCell
*);
618 MarkedArgumentBuffer
& m_foundObjects
;
619 JSGlobalObject
* m_globalObject
;
622 ObjectsWithBrokenIndexingFinder::ObjectsWithBrokenIndexingFinder(
623 MarkedArgumentBuffer
& foundObjects
, JSGlobalObject
* globalObject
)
624 : m_foundObjects(foundObjects
)
625 , m_globalObject(globalObject
)
629 inline bool hasBrokenIndexing(JSObject
* object
)
631 // This will change if we have more indexing types.
632 IndexingType type
= object
->indexingType();
633 // This could be made obviously more efficient, but isn't made so right now, because
634 // we expect this to be an unlikely slow path anyway.
635 return hasUndecided(type
) || hasInt32(type
) || hasDouble(type
) || hasContiguous(type
) || hasArrayStorage(type
);
638 inline void ObjectsWithBrokenIndexingFinder::visit(JSCell
* cell
)
640 if (!cell
->isObject())
643 JSObject
* object
= asObject(cell
);
645 // Run this filter first, since it's cheap, and ought to filter out a lot of objects.
646 if (!hasBrokenIndexing(object
))
649 // We only want to have a bad time in the affected global object, not in the entire
650 // VM. But we have to be careful, since there may be objects that claim to belong to
651 // a different global object that have prototypes from our global object.
652 bool foundGlobalObject
= false;
653 for (JSObject
* current
= object
; ;) {
654 if (current
->globalObject() == m_globalObject
) {
655 foundGlobalObject
= true;
659 JSValue prototypeValue
= current
->prototype();
660 if (prototypeValue
.isNull())
662 current
= asObject(prototypeValue
);
664 if (!foundGlobalObject
)
667 m_foundObjects
.append(object
);
670 IterationStatus
ObjectsWithBrokenIndexingFinder::operator()(JSCell
* cell
)
673 return IterationStatus::Continue
;
676 } // end private namespace for helpers for JSGlobalObject::haveABadTime()
678 void JSGlobalObject::haveABadTime(VM
& vm
)
680 ASSERT(&vm
== &this->vm());
682 if (isHavingABadTime())
685 // Make sure that all allocations or indexed storage transitions that are inlining
686 // the assumption that it's safe to transition to a non-SlowPut array storage don't
688 m_havingABadTimeWatchpoint
->fireAll("Having a bad time");
689 ASSERT(isHavingABadTime()); // The watchpoint is what tells us that we're having a bad time.
691 // Make sure that all JSArray allocations that load the appropriate structure from
692 // this object now load a structure that uses SlowPut.
693 for (unsigned i
= 0; i
< NumberOfIndexingShapes
; ++i
)
694 m_arrayStructureForIndexingShapeDuringAllocation
[i
].set(vm
, this, originalArrayStructureForIndexingType(ArrayWithSlowPutArrayStorage
));
696 // Make sure that all objects that have indexed storage switch to the slow kind of
698 MarkedArgumentBuffer foundObjects
; // Use MarkedArgumentBuffer because switchToSlowPutArrayStorage() may GC.
699 ObjectsWithBrokenIndexingFinder
finder(foundObjects
, this);
701 HeapIterationScope
iterationScope(vm
.heap
);
702 vm
.heap
.objectSpace().forEachLiveCell(iterationScope
, finder
);
704 while (!foundObjects
.isEmpty()) {
705 JSObject
* object
= asObject(foundObjects
.last());
706 foundObjects
.removeLast();
707 ASSERT(hasBrokenIndexing(object
));
708 object
->switchToSlowPutArrayStorage(vm
);
712 bool JSGlobalObject::objectPrototypeIsSane()
714 return !hasIndexedProperties(m_objectPrototype
->indexingType())
715 && m_objectPrototype
->prototype().isNull();
718 bool JSGlobalObject::arrayPrototypeChainIsSane()
720 return !hasIndexedProperties(m_arrayPrototype
->indexingType())
721 && m_arrayPrototype
->prototype() == m_objectPrototype
.get()
722 && objectPrototypeIsSane();
725 bool JSGlobalObject::stringPrototypeChainIsSane()
727 return !hasIndexedProperties(m_stringPrototype
->indexingType())
728 && m_stringPrototype
->prototype() == m_objectPrototype
.get()
729 && objectPrototypeIsSane();
732 void JSGlobalObject::createThrowTypeError(VM
& vm
)
734 JSFunction
* thrower
= JSFunction::create(vm
, this, 0, String(), globalFuncThrowTypeError
);
735 GetterSetter
* getterSetter
= GetterSetter::create(vm
, this);
736 getterSetter
->setGetter(vm
, this, thrower
);
737 getterSetter
->setSetter(vm
, this, thrower
);
738 m_throwTypeErrorGetterSetter
.set(vm
, this, getterSetter
);
741 // Set prototype, and also insert the object prototype at the end of the chain.
742 void JSGlobalObject::resetPrototype(VM
& vm
, JSValue prototype
)
744 setPrototype(vm
, prototype
);
746 JSObject
* oldLastInPrototypeChain
= lastInPrototypeChain(this);
747 JSObject
* objectPrototype
= m_objectPrototype
.get();
748 if (oldLastInPrototypeChain
!= objectPrototype
)
749 oldLastInPrototypeChain
->setPrototype(vm
, objectPrototype
);
751 // Whenever we change the prototype of the global object, we need to create a new JSProxy with the correct prototype.
752 setGlobalThis(vm
, JSProxy::create(vm
, JSProxy::createStructure(vm
, this, prototype
, PureForwardingProxyType
), this));
755 void JSGlobalObject::visitChildren(JSCell
* cell
, SlotVisitor
& visitor
)
757 JSGlobalObject
* thisObject
= jsCast
<JSGlobalObject
*>(cell
);
758 ASSERT_GC_OBJECT_INHERITS(thisObject
, info());
759 Base::visitChildren(thisObject
, visitor
);
761 visitor
.append(&thisObject
->m_globalThis
);
763 visitor
.append(&thisObject
->m_globalCallee
);
764 visitor
.append(&thisObject
->m_regExpConstructor
);
765 visitor
.append(&thisObject
->m_errorConstructor
);
766 visitor
.append(&thisObject
->m_evalErrorConstructor
);
767 visitor
.append(&thisObject
->m_rangeErrorConstructor
);
768 visitor
.append(&thisObject
->m_referenceErrorConstructor
);
769 visitor
.append(&thisObject
->m_syntaxErrorConstructor
);
770 visitor
.append(&thisObject
->m_typeErrorConstructor
);
771 visitor
.append(&thisObject
->m_URIErrorConstructor
);
772 visitor
.append(&thisObject
->m_objectConstructor
);
774 visitor
.append(&thisObject
->m_promiseConstructor
);
777 visitor
.append(&thisObject
->m_nullGetterFunction
);
778 visitor
.append(&thisObject
->m_nullSetterFunction
);
780 visitor
.append(&thisObject
->m_parseIntFunction
);
781 visitor
.append(&thisObject
->m_evalFunction
);
782 visitor
.append(&thisObject
->m_callFunction
);
783 visitor
.append(&thisObject
->m_applyFunction
);
784 visitor
.append(&thisObject
->m_definePropertyFunction
);
785 visitor
.append(&thisObject
->m_arrayProtoValuesFunction
);
787 visitor
.append(&thisObject
->m_initializePromiseFunction
);
788 visitor
.append(&thisObject
->m_newPromiseDeferredFunction
);
790 visitor
.append(&thisObject
->m_throwTypeErrorGetterSetter
);
792 visitor
.append(&thisObject
->m_objectPrototype
);
793 visitor
.append(&thisObject
->m_functionPrototype
);
794 visitor
.append(&thisObject
->m_arrayPrototype
);
795 visitor
.append(&thisObject
->m_errorPrototype
);
796 visitor
.append(&thisObject
->m_iteratorPrototype
);
798 visitor
.append(&thisObject
->m_promisePrototype
);
801 visitor
.append(&thisObject
->m_debuggerScopeStructure
);
802 visitor
.append(&thisObject
->m_withScopeStructure
);
803 visitor
.append(&thisObject
->m_strictEvalActivationStructure
);
804 visitor
.append(&thisObject
->m_lexicalEnvironmentStructure
);
805 visitor
.append(&thisObject
->m_catchScopeStructure
);
806 visitor
.append(&thisObject
->m_functionNameScopeStructure
);
807 visitor
.append(&thisObject
->m_directArgumentsStructure
);
808 visitor
.append(&thisObject
->m_scopedArgumentsStructure
);
809 visitor
.append(&thisObject
->m_outOfBandArgumentsStructure
);
810 for (unsigned i
= 0; i
< NumberOfIndexingShapes
; ++i
)
811 visitor
.append(&thisObject
->m_originalArrayStructureForIndexingShape
[i
]);
812 for (unsigned i
= 0; i
< NumberOfIndexingShapes
; ++i
)
813 visitor
.append(&thisObject
->m_arrayStructureForIndexingShapeDuringAllocation
[i
]);
814 visitor
.append(&thisObject
->m_booleanObjectStructure
);
815 visitor
.append(&thisObject
->m_callbackConstructorStructure
);
816 visitor
.append(&thisObject
->m_callbackFunctionStructure
);
817 visitor
.append(&thisObject
->m_callbackObjectStructure
);
818 #if JSC_OBJC_API_ENABLED
819 visitor
.append(&thisObject
->m_objcCallbackFunctionStructure
);
820 visitor
.append(&thisObject
->m_objcWrapperObjectStructure
);
822 visitor
.append(&thisObject
->m_nullPrototypeObjectStructure
);
823 visitor
.append(&thisObject
->m_errorStructure
);
824 visitor
.append(&thisObject
->m_calleeStructure
);
825 visitor
.append(&thisObject
->m_functionStructure
);
826 visitor
.append(&thisObject
->m_boundFunctionStructure
);
827 visitor
.append(&thisObject
->m_namedFunctionStructure
);
828 visitor
.append(&thisObject
->m_symbolObjectStructure
);
829 visitor
.append(&thisObject
->m_regExpStructure
);
830 visitor
.append(&thisObject
->m_regExpMatchesArrayStructure
);
831 visitor
.append(&thisObject
->m_consoleStructure
);
832 visitor
.append(&thisObject
->m_dollarVMStructure
);
833 visitor
.append(&thisObject
->m_internalFunctionStructure
);
836 visitor
.append(&thisObject
->m_promiseStructure
);
837 #endif // ENABLE(PROMISES)
839 #define VISIT_SIMPLE_TYPE(CapitalName, lowerName, properName, instanceType, jsName) \
840 visitor.append(&thisObject->m_ ## lowerName ## Prototype); \
841 visitor.append(&thisObject->m_ ## properName ## Structure); \
843 FOR_EACH_SIMPLE_BUILTIN_TYPE(VISIT_SIMPLE_TYPE)
844 FOR_EACH_BUILTIN_DERIVED_ITERATOR_TYPE(VISIT_SIMPLE_TYPE
)
846 #undef VISIT_SIMPLE_TYPE
848 for (unsigned i
= NUMBER_OF_TYPED_ARRAY_TYPES
; i
--;) {
849 visitor
.append(&thisObject
->m_typedArrays
[i
].prototype
);
850 visitor
.append(&thisObject
->m_typedArrays
[i
].structure
);
854 JSValue
JSGlobalObject::toThis(JSCell
*, ExecState
* exec
, ECMAMode ecmaMode
)
856 if (ecmaMode
== StrictMode
)
857 return jsUndefined();
858 return exec
->globalThisValue();
861 ExecState
* JSGlobalObject::globalExec()
863 return CallFrame::create(m_globalCallFrame
);
866 void JSGlobalObject::addStaticGlobals(GlobalPropertyInfo
* globals
, int count
)
868 ScopeOffset startOffset
= addVariables(count
);
870 for (int i
= 0; i
< count
; ++i
) {
871 GlobalPropertyInfo
& global
= globals
[i
];
872 ASSERT(global
.attributes
& DontDelete
);
876 ConcurrentJITLocker
locker(symbolTable()->m_lock
);
877 offset
= symbolTable()->takeNextScopeOffset(locker
);
878 RELEASE_ASSERT(offset
= startOffset
+ i
);
879 SymbolTableEntry
newEntry(VarOffset(offset
), global
.attributes
);
880 symbolTable()->add(locker
, global
.identifier
.impl(), newEntry
);
882 variableAt(offset
).set(vm(), this, global
.value
);
886 bool JSGlobalObject::getOwnPropertySlot(JSObject
* object
, ExecState
* exec
, PropertyName propertyName
, PropertySlot
& slot
)
888 JSGlobalObject
* thisObject
= jsCast
<JSGlobalObject
*>(object
);
889 if (getStaticFunctionSlot
<Base
>(exec
, globalObjectTable
, thisObject
, propertyName
, slot
))
891 return symbolTableGet(thisObject
, propertyName
, slot
);
894 void JSGlobalObject::clearRareData(JSCell
* cell
)
896 jsCast
<JSGlobalObject
*>(cell
)->m_rareData
= nullptr;
899 void slowValidateCell(JSGlobalObject
* globalObject
)
901 RELEASE_ASSERT(globalObject
->isGlobalObject());
902 ASSERT_GC_OBJECT_INHERITS(globalObject
, JSGlobalObject::info());
905 UnlinkedProgramCodeBlock
* JSGlobalObject::createProgramCodeBlock(CallFrame
* callFrame
, ProgramExecutable
* executable
, JSObject
** exception
)
908 JSParserStrictMode strictMode
= executable
->isStrictMode() ? JSParserStrictMode::Strict
: JSParserStrictMode::NotStrict
;
909 DebuggerMode debuggerMode
= hasDebugger() ? DebuggerOn
: DebuggerOff
;
910 ProfilerMode profilerMode
= hasProfiler() ? ProfilerOn
: ProfilerOff
;
911 UnlinkedProgramCodeBlock
* unlinkedCodeBlock
= vm().codeCache()->getProgramCodeBlock(
912 vm(), executable
, executable
->source(), JSParserBuiltinMode::NotBuiltin
, strictMode
,
913 debuggerMode
, profilerMode
, error
);
916 debugger()->sourceParsed(callFrame
, executable
->source().provider(), error
.line(), error
.message());
918 if (error
.isValid()) {
919 *exception
= error
.toErrorObject(this, executable
->source());
923 return unlinkedCodeBlock
;
926 UnlinkedEvalCodeBlock
* JSGlobalObject::createEvalCodeBlock(CallFrame
* callFrame
, EvalExecutable
* executable
, ThisTDZMode thisTDZMode
)
929 JSParserStrictMode strictMode
= executable
->isStrictMode() ? JSParserStrictMode::Strict
: JSParserStrictMode::NotStrict
;
930 DebuggerMode debuggerMode
= hasDebugger() ? DebuggerOn
: DebuggerOff
;
931 ProfilerMode profilerMode
= hasProfiler() ? ProfilerOn
: ProfilerOff
;
932 UnlinkedEvalCodeBlock
* unlinkedCodeBlock
= vm().codeCache()->getEvalCodeBlock(
933 vm(), executable
, executable
->source(), JSParserBuiltinMode::NotBuiltin
, strictMode
, thisTDZMode
, debuggerMode
, profilerMode
, error
);
936 debugger()->sourceParsed(callFrame
, executable
->source().provider(), error
.line(), error
.message());
938 if (error
.isValid()) {
939 throwVMError(callFrame
, error
.toErrorObject(this, executable
->source()));
943 return unlinkedCodeBlock
;
946 void JSGlobalObject::setRemoteDebuggingEnabled(bool enabled
)
948 #if ENABLE(REMOTE_INSPECTOR)
949 m_inspectorDebuggable
->setRemoteDebuggingAllowed(enabled
);
951 UNUSED_PARAM(enabled
);
955 bool JSGlobalObject::remoteDebuggingEnabled() const
957 #if ENABLE(REMOTE_INSPECTOR)
958 return m_inspectorDebuggable
->remoteDebuggingAllowed();
964 #if ENABLE(WEB_REPLAY)
965 void JSGlobalObject::setInputCursor(PassRefPtr
<InputCursor
> prpCursor
)
967 m_inputCursor
= prpCursor
;
968 ASSERT(m_inputCursor
);
970 InputCursor
& cursor
= inputCursor();
971 // Save or set the random seed. This performed here rather than the constructor
972 // to avoid threading the input cursor through all the abstraction layers.
973 if (cursor
.isCapturing())
974 cursor
.appendInput
<SetRandomSeed
>(m_weakRandom
.seedUnsafe());
975 else if (cursor
.isReplaying()) {
976 if (SetRandomSeed
* input
= cursor
.fetchInput
<SetRandomSeed
>())
977 m_weakRandom
.initializeSeed(static_cast<unsigned>(input
->randomSeed()));
982 void JSGlobalObject::setName(const String
& name
)
986 #if ENABLE(REMOTE_INSPECTOR)
987 m_inspectorDebuggable
->update();
991 void JSGlobalObject::queueMicrotask(PassRefPtr
<Microtask
> task
)
993 if (globalObjectMethodTable()->queueTaskToEventLoop
)
994 globalObjectMethodTable()->queueTaskToEventLoop(this, task
);
996 WTFLogAlways("ERROR: Event loop not supported.");