//------------------------------------------------------------------------------------------------------- // Copyright (C) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- // JavascriptLibraryBase.h is used by static lib shared between Trident and Chakra. We need to keep // the size consistent and try not to change its size. We need to have matching mshtml.dll // if the size changed here. #pragma once class ChakraEngine; namespace Js { class EngineInterfaceObject; class JavascriptLibraryBase : public FinalizableObject { friend class JavascriptLibrary; friend class ScriptSite; public: JavascriptLibraryBase(GlobalObject* globalObject): globalObject(globalObject), chakraEngine(nullptr) { } Var GetPI() { return pi; } Var GetNaN() { return nan; } Var GetNegativeInfinite() { return negativeInfinite; } Var GetPositiveInfinite() { return positiveInfinite; } Var GetMaxValue() { return maxValue; } Var GetMinValue() { return minValue; } Var GetNegativeZero() { return negativeZero; } RecyclableObject* GetUndefined() { return undefinedValue; } RecyclableObject* GetNull() { return nullValue; } JavascriptBoolean* GetTrue() { return booleanTrue; } JavascriptBoolean* GetFalse() { return booleanFalse; } JavascriptSymbol* GetSymbolHasInstance() { return symbolHasInstance; } JavascriptSymbol* GetSymbolIsConcatSpreadable() { return symbolIsConcatSpreadable; } JavascriptSymbol* GetSymbolAsyncIterator() { return symbolAsyncIterator; } JavascriptSymbol* GetSymbolIterator() { return symbolIterator; } JavascriptSymbol* GetSymbolToPrimitive() { return symbolToPrimitive; } JavascriptSymbol* GetSymbolToStringTag() { return symbolToStringTag; } JavascriptSymbol* GetSymbolUnscopables() { return symbolUnscopables; } JavascriptFunction* GetObjectConstructor() { return objectConstructor; } JavascriptFunction* GetArrayConstructor() { return arrayConstructor; } JavascriptFunction* GetBooleanConstructor() { return booleanConstructor; } JavascriptFunction* GetDateConstructor() { return dateConstructor; } JavascriptFunction* GetFunctionConstructor() { return functionConstructor; } JavascriptFunction* GetNumberConstructor() { return numberConstructor; } JavascriptFunction* GetBigIntConstructor() { return bigIntConstructor; } JavascriptRegExpConstructor* GetRegExpConstructor() { return regexConstructor; } JavascriptFunction* GetStringConstructor() { return stringConstructor; } JavascriptFunction* GetArrayBufferConstructor() { return arrayBufferConstructor; } JavascriptFunction* GetPixelArrayConstructor() { return pixelArrayConstructor; } JavascriptFunction* GetTypedArrayConstructor() const { return typedArrayConstructor; } JavascriptFunction* GetInt8ArrayConstructor() { return Int8ArrayConstructor; } JavascriptFunction* GetUint8ArrayConstructor() { return Uint8ArrayConstructor; } JavascriptFunction* GetUint8ClampedArrayConstructor() { return Uint8ClampedArrayConstructor; } JavascriptFunction* GetInt16ArrayConstructor() { return Int16ArrayConstructor; } JavascriptFunction* GetUint16ArrayConstructor() { return Uint16ArrayConstructor; } JavascriptFunction* GetInt32ArrayConstructor() { return Int32ArrayConstructor; } JavascriptFunction* GetUint32ArrayConstructor() { return Uint32ArrayConstructor; } JavascriptFunction* GetFloat32ArrayConstructor() { return Float32ArrayConstructor; } JavascriptFunction* GetFloat64ArrayConstructor() { return Float64ArrayConstructor; } JavascriptFunction* GetMapConstructor() { return mapConstructor; } JavascriptFunction* GetSetConstructor() { return setConstructor; } JavascriptFunction* GetWeakMapConstructor() { return weakMapConstructor; } JavascriptFunction* GetWeakSetConstructor() { return weakSetConstructor; } JavascriptFunction* GetSymbolConstructor() { return symbolConstructor; } JavascriptFunction* GetProxyConstructor() const { return proxyConstructor; } JavascriptFunction* GetPromiseConstructor() const { return promiseConstructor; } JavascriptFunction* GetGeneratorFunctionConstructor() const { return generatorFunctionConstructor; } JavascriptFunction* GetAsyncFunctionConstructor() const { return asyncFunctionConstructor; } JavascriptFunction* GetAsyncGeneratorFunctionConstructor() const { return asyncGeneratorFunctionConstructor; } JavascriptFunction* GetErrorConstructor() const { return errorConstructor; } JavascriptFunction* GetEvalErrorConstructor() const { return evalErrorConstructor; } JavascriptFunction* GetRangeErrorConstructor() const { return rangeErrorConstructor; } JavascriptFunction* GetReferenceErrorConstructor() const { return referenceErrorConstructor; } JavascriptFunction* GetSyntaxErrorConstructor() const { return syntaxErrorConstructor; } JavascriptFunction* GetTypeErrorConstructor() const { return typeErrorConstructor; } JavascriptFunction* GetURIErrorConstructor() const { return uriErrorConstructor; } JavascriptFunction* GetPromiseResolve() const { return promiseResolveFunction; } JavascriptFunction* GetPromiseThen() const { return promiseThenFunction; } JavascriptFunction* GetJSONStringify() const { return jsonStringifyFunction; } JavascriptFunction* GetObjectFreeze() const { return objectFreezeFunction; } JavascriptFunction* GetDebugEval() const { return debugEval; } JavascriptFunction* GetStackTraceFunction() const { return getStackTrace; } #ifdef EDIT_AND_CONTINUE JavascriptFunction* GetEditSource() const { return editSource; } #endif JavascriptFunction* GetArrayPrototypeForEachFunction() const { return arrayPrototypeForEachFunction; } JavascriptFunction* GetArrayPrototypeKeysFunction() const { return arrayPrototypeKeysFunction; } JavascriptFunction* GetArrayPrototypeValuesFunction() const { return arrayPrototypeValuesFunction; } JavascriptFunction* GetArrayPrototypeEntriesFunction() const { return arrayPrototypeEntriesFunction; } DynamicObject* GetMathObject() { return mathObject; } DynamicObject* GetJSONObject() { return JSONObject; } #ifdef ENABLE_INTL_OBJECT DynamicObject* GetIntlObject() { return IntlObject; } #endif #if defined(ENABLE_INTL_OBJECT) || defined(ENABLE_JS_BUILTINS) EngineInterfaceObject* GetEngineInterfaceObject() { return engineInterfaceObject; } #endif DynamicObject* GetArrayPrototype() { return arrayPrototype; } DynamicObject* GetBooleanPrototype() { return booleanPrototype; } DynamicObject* GetDatePrototype() { return datePrototype; } DynamicObject* GetFunctionPrototype() { return functionPrototype; } DynamicObject* GetNumberPrototype() { return numberPrototype; } DynamicObject* GetBigIntPrototype() { return bigintPrototype; } DynamicObject* GetSIMDBool8x16Prototype() { return simdBool8x16Prototype; } DynamicObject* GetSIMDBool16x8Prototype() { return simdBool16x8Prototype; } DynamicObject* GetSIMDBool32x4Prototype() { return simdBool32x4Prototype; } DynamicObject* GetSIMDInt8x16Prototype() { return simdInt8x16Prototype; } DynamicObject* GetSIMDInt16x8Prototype() { return simdInt16x8Prototype; } DynamicObject* GetSIMDInt32x4Prototype() { return simdInt32x4Prototype; } DynamicObject* GetSIMDUint8x16Prototype() { return simdUint8x16Prototype; } DynamicObject* GetSIMDUint16x8Prototype() { return simdUint16x8Prototype; } DynamicObject* GetSIMDUint32x4Prototype() { return simdUint32x4Prototype; } DynamicObject* GetSIMDFloat32x4Prototype() { return simdFloat32x4Prototype; } DynamicObject* GetSIMDFloat64x2Prototype() { return simdFloat64x2Prototype; } ObjectPrototypeObject* GetObjectPrototypeObject() { return objectPrototype; } DynamicObject* GetObjectPrototype(); DynamicObject* GetRegExpPrototype() { return regexPrototype; } DynamicObject* GetStringPrototype() { return stringPrototype; } DynamicObject* GetMapPrototype() { return mapPrototype; } DynamicObject* GetSetPrototype() { return setPrototype; } DynamicObject* GetWeakMapPrototype() { return weakMapPrototype; } DynamicObject* GetWeakSetPrototype() { return weakSetPrototype; } DynamicObject* GetSymbolPrototype() { return symbolPrototype; } DynamicObject* GetAsyncIteratorPrototype() const { return asyncIteratorPrototype; } DynamicObject* GetArrayIteratorPrototype() const { return arrayIteratorPrototype; } DynamicObject* GetMapIteratorPrototype() const { return mapIteratorPrototype; } DynamicObject* GetSetIteratorPrototype() const { return setIteratorPrototype; } DynamicObject* GetStringIteratorPrototype() const { return stringIteratorPrototype; } DynamicObject* GetIteratorPrototype() const { return iteratorPrototype; } DynamicObject* GetPromisePrototype() const { return promisePrototype; } DynamicObject* GetGeneratorFunctionPrototype() const { return generatorFunctionPrototype; } DynamicObject* GetGeneratorPrototype() const { return generatorPrototype; } DynamicObject* GetAsyncFunctionPrototype() const { return asyncFunctionPrototype; } DynamicObject* GetAsyncGeneratorFunctionPrototype() const { return asyncGeneratorFunctionPrototype; } DynamicObject* GetErrorPrototype() const { return errorPrototype; } DynamicObject* GetEvalErrorPrototype() const { return evalErrorPrototype; } DynamicObject* GetRangeErrorPrototype() const { return rangeErrorPrototype; } DynamicObject* GetReferenceErrorPrototype() const { return referenceErrorPrototype; } DynamicObject* GetSyntaxErrorPrototype() const { return syntaxErrorPrototype; } DynamicObject* GetTypeErrorPrototype() const { return typeErrorPrototype; } DynamicObject* GetURIErrorPrototype() const { return uriErrorPrototype; } PropertyId GetPropertyIdSymbolIterator() { return PropertyIds::_symbolIterator; }; PropertyId GetPropertyIdSymbolToStringTag() { return PropertyIds::_symbolToStringTag; }; PropertyId GetPropertyIdSymbolUnscopables() { return PropertyIds::_symbolUnscopables; }; bool IsChakraEngine() const { return chakraEngine != nullptr; } protected: Field(GlobalObject*) globalObject; Field(RuntimeFunction*) mapConstructor; Field(RuntimeFunction*) setConstructor; Field(RuntimeFunction*) weakMapConstructor; Field(RuntimeFunction*) weakSetConstructor; Field(RuntimeFunction*) arrayConstructor; Field(RuntimeFunction*) typedArrayConstructor; Field(RuntimeFunction*) Int8ArrayConstructor; Field(RuntimeFunction*) Uint8ArrayConstructor; Field(RuntimeFunction*) Uint8ClampedArrayConstructor; Field(RuntimeFunction*) Int16ArrayConstructor; Field(RuntimeFunction*) Uint16ArrayConstructor; Field(RuntimeFunction*) Int32ArrayConstructor; Field(RuntimeFunction*) Uint32ArrayConstructor; Field(RuntimeFunction*) Float32ArrayConstructor; Field(RuntimeFunction*) Float64ArrayConstructor; Field(RuntimeFunction*) arrayBufferConstructor; Field(RuntimeFunction*) dataViewConstructor; Field(RuntimeFunction*) booleanConstructor; Field(RuntimeFunction*) dateConstructor; Field(RuntimeFunction*) functionConstructor; Field(RuntimeFunction*) numberConstructor; Field(RuntimeFunction*) bigIntConstructor; Field(RuntimeFunction*) objectConstructor; Field(RuntimeFunction*) symbolConstructor; Field(JavascriptRegExpConstructor*) regexConstructor; Field(RuntimeFunction*) stringConstructor; Field(RuntimeFunction*) pixelArrayConstructor; Field(RuntimeFunction*) errorConstructor; Field(RuntimeFunction*) evalErrorConstructor; Field(RuntimeFunction*) rangeErrorConstructor; Field(RuntimeFunction*) referenceErrorConstructor; Field(RuntimeFunction*) syntaxErrorConstructor; Field(RuntimeFunction*) typeErrorConstructor; Field(RuntimeFunction*) uriErrorConstructor; Field(RuntimeFunction*) proxyConstructor; Field(RuntimeFunction*) promiseConstructor; Field(RuntimeFunction*) generatorFunctionConstructor; Field(RuntimeFunction*) asyncFunctionConstructor; Field(RuntimeFunction*) asyncGeneratorFunctionConstructor; Field(JavascriptFunction*) defaultAccessorFunction; Field(JavascriptFunction*) stackTraceAccessorFunction; Field(JavascriptFunction*) throwTypeErrorRestrictedPropertyAccessorFunction; Field(JavascriptFunction*) debugObjectNonUserGetterFunction; Field(JavascriptFunction*) debugObjectNonUserSetterFunction; Field(JavascriptFunction*) debugObjectDebugModeGetterFunction; Field(JavascriptFunction*) __proto__getterFunction; Field(JavascriptFunction*) __proto__setterFunction; Field(JavascriptFunction*) arrayIteratorPrototypeBuiltinNextFunction; Field(JavascriptFunction*) promiseResolveFunction; Field(JavascriptFunction*) promiseThenFunction; Field(JavascriptFunction*) jsonStringifyFunction; Field(JavascriptFunction*) objectFreezeFunction; Field(DynamicObject*) mathObject; // SIMD_JS Field(DynamicObject*) simdObject; Field(DynamicObject*) debugObject; Field(DynamicObject*) JSONObject; #ifdef ENABLE_INTL_OBJECT Field(DynamicObject*) IntlObject; #endif #if defined(ENABLE_INTL_OBJECT) || defined(ENABLE_JS_BUILTINS) Field(EngineInterfaceObject*) engineInterfaceObject; #endif Field(DynamicObject*) reflectObject; Field(DynamicObject*) arrayPrototype; Field(DynamicObject*) typedArrayPrototype; Field(DynamicObject*) Int8ArrayPrototype; Field(DynamicObject*) Uint8ArrayPrototype; Field(DynamicObject*) Uint8ClampedArrayPrototype; Field(DynamicObject*) Int16ArrayPrototype; Field(DynamicObject*) Uint16ArrayPrototype; Field(DynamicObject*) Int32ArrayPrototype; Field(DynamicObject*) Uint32ArrayPrototype; Field(DynamicObject*) Float32ArrayPrototype; Field(DynamicObject*) Float64ArrayPrototype; Field(DynamicObject*) Int64ArrayPrototype; Field(DynamicObject*) Uint64ArrayPrototype; Field(DynamicObject*) BoolArrayPrototype; Field(DynamicObject*) CharArrayPrototype; Field(DynamicObject*) arrayBufferPrototype; Field(DynamicObject*) dataViewPrototype; Field(DynamicObject*) pixelArrayPrototype; Field(DynamicObject*) booleanPrototype; Field(DynamicObject*) datePrototype; Field(DynamicObject*) functionPrototype; Field(DynamicObject*) numberPrototype; Field(DynamicObject*) bigintPrototype; Field(ObjectPrototypeObject*) objectPrototype; Field(DynamicObject*) regexPrototype; Field(DynamicObject*) stringPrototype; Field(DynamicObject*) mapPrototype; Field(DynamicObject*) setPrototype; Field(DynamicObject*) weakMapPrototype; Field(DynamicObject*) weakSetPrototype; Field(DynamicObject*) symbolPrototype; Field(DynamicObject*) asyncIteratorPrototype; // aka %AsyncIteratorPrototype% Field(DynamicObject*) iteratorPrototype; // aka %IteratorPrototype% Field(DynamicObject*) arrayIteratorPrototype; Field(DynamicObject*) mapIteratorPrototype; Field(DynamicObject*) setIteratorPrototype; Field(DynamicObject*) stringIteratorPrototype; Field(DynamicObject*) promisePrototype; Field(DynamicObject*) generatorFunctionPrototype; // aka %Generator% Field(DynamicObject*) generatorPrototype; // aka %GeneratorPrototype% Field(DynamicObject*) asyncFunctionPrototype; // aka %AsyncFunctionPrototype% Field(DynamicObject*) asyncGeneratorPrototype; // aka %AsyncGeneratorPrototype% Field(DynamicObject*) asyncGeneratorFunctionPrototype; // aka %AsyncGeneratorFunctionPrototype% Field(DynamicObject*) asyncFromSyncIteratorProtototype; Field(DynamicObject*) errorPrototype; Field(DynamicObject*) evalErrorPrototype; Field(DynamicObject*) rangeErrorPrototype; Field(DynamicObject*) referenceErrorPrototype; Field(DynamicObject*) syntaxErrorPrototype; Field(DynamicObject*) typeErrorPrototype; Field(DynamicObject*) uriErrorPrototype; //SIMD Prototypes Field(DynamicObject*) simdBool8x16Prototype; Field(DynamicObject*) simdBool16x8Prototype; Field(DynamicObject*) simdBool32x4Prototype; Field(DynamicObject*) simdInt8x16Prototype; Field(DynamicObject*) simdInt16x8Prototype; Field(DynamicObject*) simdInt32x4Prototype; Field(DynamicObject*) simdUint8x16Prototype; Field(DynamicObject*) simdUint16x8Prototype; Field(DynamicObject*) simdUint32x4Prototype; Field(DynamicObject*) simdFloat32x4Prototype; Field(DynamicObject*) simdFloat64x2Prototype; Field(JavascriptBoolean*) booleanTrue; Field(JavascriptBoolean*) booleanFalse; Field(Var) nan; Field(Var) negativeInfinite; Field(Var) positiveInfinite; Field(Var) pi; Field(Var) minValue; Field(Var) maxValue; Field(Var) negativeZero; Field(RecyclableObject*) undefinedValue; Field(RecyclableObject*) nullValue; Field(JavascriptSymbol*) symbolAsyncIterator; Field(JavascriptSymbol*) symbolHasInstance; Field(JavascriptSymbol*) symbolIsConcatSpreadable; Field(JavascriptSymbol*) symbolIterator; Field(JavascriptSymbol*) symbolSpecies; Field(JavascriptSymbol*) symbolToPrimitive; Field(JavascriptSymbol*) symbolToStringTag; Field(JavascriptSymbol*) symbolUnscopables; public: typedef void (CALLBACK *HostPromiseRejectionTrackerCallback)(Var promise, Var reason, bool handled, void *callbackState); void SetNativeHostPromiseRejectionTrackerCallback(HostPromiseRejectionTrackerCallback function, void *state) { this->nativeHostPromiseRejectionTracker = function; this->nativeHostPromiseRejectionTrackerState = state; } private: FieldNoBarrier(HostPromiseRejectionTrackerCallback) nativeHostPromiseRejectionTracker = nullptr; Field(void *) nativeHostPromiseRejectionTrackerState = nullptr; public: Field(ScriptContext*) scriptContext; Field(ChakraEngine*) chakraEngine; private: virtual void Dispose(bool isShutdown) override; virtual void Finalize(bool isShutdown) override; virtual void Mark(Recycler *recycler) override { AssertMsg(false, "Mark called on object that isn't TrackableObject"); } protected: Field(JavascriptFunction*) arrayPrototypeForEachFunction; Field(JavascriptFunction*) arrayPrototypeKeysFunction; Field(JavascriptFunction*) arrayPrototypeValuesFunction; Field(JavascriptFunction*) arrayPrototypeEntriesFunction; Field(JavascriptFunction*) debugEval; Field(JavascriptFunction*) getStackTrace; #ifdef EDIT_AND_CONTINUE Field(JavascriptFunction*) editSource; #endif Field(JavascriptFunction*) mathMin; Field(JavascriptFunction*) mathMax; #ifdef ENABLE_JS_BUILTINS public: JavascriptFunction* GetMathMinFunction() const { return mathMin; } JavascriptFunction* GetMathMaxFunction() const { return mathMax; } #endif }; }