blob: 2ffde65ed8ab97e6617ab21404003e8281c6c621 [file]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
#pragma once
#define InlineSlotCountIncrement (HeapConstants::ObjectGranularity / sizeof(Var))
#define MaxPreInitializedObjectTypeInlineSlotCount 16
#define MaxPreInitializedObjectHeaderInlinedTypeInlineSlotCount \
(Js::DynamicTypeHandler::GetObjectHeaderInlinableSlotCapacity() + MaxPreInitializedObjectTypeInlineSlotCount)
#define PreInitializedObjectTypeCount ((MaxPreInitializedObjectTypeInlineSlotCount / InlineSlotCountIncrement) + 1)
CompileAssert(MaxPreInitializedObjectTypeInlineSlotCount <= USHRT_MAX);
class ScriptSite;
class ActiveScriptExternalLibrary;
class ProjectionExternalLibrary;
class EditAndContinue;
class ChakraHostScriptContext;
#ifdef ENABLE_PROJECTION
namespace Projection
{
class ProjectionContext;
class WinRTPromiseEngineInterfaceExtensionObject;
}
#endif
namespace Js
{
static const unsigned int EvalMRUSize = 15;
typedef JsUtil::BaseDictionary<DWORD_PTR, SourceContextInfo *, Recycler, PowerOf2SizePolicy> SourceContextInfoMap;
typedef JsUtil::BaseDictionary<uint, SourceContextInfo *, Recycler, PowerOf2SizePolicy> DynamicSourceContextInfoMap;
typedef JsUtil::BaseDictionary<EvalMapString, ScriptFunction*, RecyclerNonLeafAllocator, PrimeSizePolicy> SecondLevelEvalCache;
typedef TwoLevelHashRecord<FastEvalMapString, ScriptFunction*, SecondLevelEvalCache, EvalMapString> EvalMapRecord;
typedef JsUtil::Cache<FastEvalMapString, EvalMapRecord*, RecyclerNonLeafAllocator, PrimeSizePolicy, JsUtil::MRURetentionPolicy<FastEvalMapString, EvalMRUSize>, FastEvalMapStringComparer> EvalCacheTopLevelDictionary;
typedef JsUtil::Cache<EvalMapString, FunctionInfo*, RecyclerNonLeafAllocator, PrimeSizePolicy, JsUtil::MRURetentionPolicy<EvalMapString, EvalMRUSize>> NewFunctionCache;
typedef JsUtil::BaseDictionary<ParseableFunctionInfo*, ParseableFunctionInfo*, Recycler, PrimeSizePolicy, RecyclerPointerComparer> ParseableFunctionInfoMap;
// This is the dictionary used by script context to cache the eval.
typedef TwoLevelHashDictionary<FastEvalMapString, ScriptFunction*, EvalMapRecord, EvalCacheTopLevelDictionary, EvalMapString> EvalCacheDictionary;
typedef JsUtil::BaseDictionary<JavascriptMethod, JavascriptFunction*, Recycler, PowerOf2SizePolicy> BuiltInLibraryFunctionMap;
// valid if object!= NULL
struct EnumeratedObjectCache
{
static const int kMaxCachedPropStrings = 16;
Field(DynamicObject*) object;
Field(DynamicType*) type;
Field(PropertyString*) propertyStrings[kMaxCachedPropStrings];
Field(int) validPropStrings;
};
struct PropertyStringMap
{
Field(PropertyString*) strLen2[80];
inline static uint PStrMapIndex(char16 ch)
{
Assert(ch >= '0' && ch <= 'z');
return ch - '0';
}
};
struct Cache
{
Field(PropertyStringMap*) propertyStrings[80];
Field(JavascriptString *) lastNumberToStringRadix10String;
Field(EnumeratedObjectCache) enumObjCache;
Field(JavascriptString *) lastUtcTimeFromStrString;
Field(EvalCacheDictionary*) evalCacheDictionary;
Field(EvalCacheDictionary*) indirectEvalCacheDictionary;
Field(NewFunctionCache*) newFunctionCache;
Field(RegexPatternMruMap *) dynamicRegexMap;
Field(SourceContextInfoMap*) sourceContextInfoMap; // maps host provided context cookie to the URL of the script buffer passed.
Field(DynamicSourceContextInfoMap*) dynamicSourceContextInfoMap;
Field(SourceContextInfo*) noContextSourceContextInfo;
Field(SRCINFO*) noContextGlobalSourceInfo;
Field(Field(SRCINFO const *)*) moduleSrcInfo;
Field(BuiltInLibraryFunctionMap*) builtInLibraryFunctions;
#if ENABLE_PROFILE_INFO
#if DBG_DUMP || defined(DYNAMIC_PROFILE_STORAGE) || defined(RUNTIME_DATA_COLLECTION)
Field(DynamicProfileInfoList*) profileInfoList;
#endif
#endif
};
class MissingPropertyTypeHandler;
class SourceTextModuleRecord;
class ArrayBufferBase;
class SharedContents;
typedef RecyclerFastAllocator<JavascriptNumber, LeafBit> RecyclerJavascriptNumberAllocator;
typedef JsUtil::List<Var, Recycler> ListForListIterator;
class UndeclaredBlockVariable : public RecyclableObject
{
friend class JavascriptLibrary;
UndeclaredBlockVariable(Type* type) : RecyclableObject(type) { }
};
class SourceTextModuleRecord;
typedef JsUtil::List<SourceTextModuleRecord*> ModuleRecordList;
#if ENABLE_COPYONACCESS_ARRAY
struct CacheForCopyOnAccessArraySegments
{
static const uint32 MAX_SIZE = 31;
Field(SparseArraySegment<int32> *) cache[MAX_SIZE];
Field(uint32) count;
uint32 AddSegment(SparseArraySegment<int32> *segment)
{
cache[count++] = segment;
return count;
}
SparseArraySegment<int32> *GetSegmentByIndex(byte index)
{
Assert(index <= MAX_SIZE);
return cache[index - 1];
}
bool IsNotOverHardLimit()
{
return count < MAX_SIZE;
}
bool IsNotFull()
{
return count < (uint32) CONFIG_FLAG(CopyOnAccessArraySegmentCacheSize);
}
bool IsValidIndex(uint32 index)
{
return count && index && index <= count;
}
#if ENABLE_DEBUG_CONFIG_OPTIONS
uint32 GetCount()
{
return count;
}
#endif
};
#endif
template <typename T>
struct StringTemplateCallsiteObjectComparer
{
static bool Equals(T x, T y)
{
static_assert(false, "Unexpected type T");
}
static hash_t GetHashCode(T i)
{
static_assert(false, "Unexpected type T");
}
};
template <>
struct StringTemplateCallsiteObjectComparer<ParseNodePtr>
{
static bool Equals(ParseNodePtr x, RecyclerWeakReference<Js::RecyclableObject>* y);
static bool Equals(ParseNodePtr x, ParseNodePtr y);
static hash_t GetHashCode(ParseNodePtr i);
};
template <>
struct StringTemplateCallsiteObjectComparer<RecyclerWeakReference<Js::RecyclableObject>*>
{
static bool Equals(RecyclerWeakReference<Js::RecyclableObject>* x, RecyclerWeakReference<Js::RecyclableObject>* y);
static bool Equals(RecyclerWeakReference<Js::RecyclableObject>* x, ParseNodePtr y);
static hash_t GetHashCode(RecyclerWeakReference<Js::RecyclableObject>* o);
};
class JavascriptLibrary : public JavascriptLibraryBase
{
friend class EditAndContinue;
friend class ScriptSite;
friend class GlobalObject;
friend class ScriptContext;
friend class EngineInterfaceObject;
friend class ExternalLibraryBase;
friend class ActiveScriptExternalLibrary;
friend class IntlEngineInterfaceExtensionObject;
friend class JsBuiltInEngineInterfaceExtensionObject;
friend class ChakraHostScriptContext;
#ifdef ENABLE_PROJECTION
friend class ProjectionExternalLibrary;
friend class Projection::WinRTPromiseEngineInterfaceExtensionObject;
friend class Projection::ProjectionContext;
#endif
static const char16* domBuiltinPropertyNames[];
public:
#if ENABLE_COPYONACCESS_ARRAY
Field(CacheForCopyOnAccessArraySegments *) cacheForCopyOnAccessArraySegments;
#endif
static DWORD GetScriptContextOffset() { return offsetof(JavascriptLibrary, scriptContext); }
static DWORD GetUndeclBlockVarOffset() { return offsetof(JavascriptLibrary, undeclBlockVarSentinel); }
static DWORD GetEmptyStringOffset() { return offsetof(JavascriptLibrary, emptyString); }
static DWORD GetUndefinedValueOffset() { return offsetof(JavascriptLibrary, undefinedValue); }
static DWORD GetNullValueOffset() { return offsetof(JavascriptLibrary, nullValue); }
static DWORD GetBooleanTrueOffset() { return offsetof(JavascriptLibrary, booleanTrue); }
static DWORD GetBooleanFalseOffset() { return offsetof(JavascriptLibrary, booleanFalse); }
static DWORD GetNegativeZeroOffset() { return offsetof(JavascriptLibrary, negativeZero); }
static DWORD GetNumberTypeStaticOffset() { return offsetof(JavascriptLibrary, numberTypeStatic); }
static DWORD GetStringTypeStaticOffset() { return offsetof(JavascriptLibrary, stringTypeStatic); }
static DWORD GetObjectTypesOffset() { return offsetof(JavascriptLibrary, objectTypes); }
static DWORD GetObjectHeaderInlinedTypesOffset() { return offsetof(JavascriptLibrary, objectHeaderInlinedTypes); }
static DWORD GetRegexTypeOffset() { return offsetof(JavascriptLibrary, regexType); }
static DWORD GetArrayConstructorOffset() { return offsetof(JavascriptLibrary, arrayConstructor); }
static DWORD GetPositiveInfinityOffset() { return offsetof(JavascriptLibrary, positiveInfinite); }
static DWORD GetNaNOffset() { return offsetof(JavascriptLibrary, nan); }
static DWORD GetNativeIntArrayTypeOffset() { return offsetof(JavascriptLibrary, nativeIntArrayType); }
#if ENABLE_COPYONACCESS_ARRAY
static DWORD GetCopyOnAccessNativeIntArrayTypeOffset() { return offsetof(JavascriptLibrary, copyOnAccessNativeIntArrayType); }
#endif
static DWORD GetNativeFloatArrayTypeOffset() { return offsetof(JavascriptLibrary, nativeFloatArrayType); }
static DWORD GetVTableAddressesOffset() { return offsetof(JavascriptLibrary, vtableAddresses); }
static DWORD GetConstructorCacheDefaultInstanceOffset() { return offsetof(JavascriptLibrary, constructorCacheDefaultInstance); }
static DWORD GetAbsDoubleCstOffset() { return offsetof(JavascriptLibrary, absDoubleCst); }
static DWORD GetUintConvertConstOffset() { return offsetof(JavascriptLibrary, uintConvertConst); }
static DWORD GetBuiltinFunctionsOffset() { return offsetof(JavascriptLibrary, builtinFunctions); }
static DWORD GetCharStringCacheOffset() { return offsetof(JavascriptLibrary, charStringCache); }
static DWORD GetCharStringCacheAOffset() { return GetCharStringCacheOffset() + CharStringCache::GetCharStringCacheAOffset(); }
const JavascriptLibraryBase* GetLibraryBase() const { return static_cast<const JavascriptLibraryBase*>(this); }
void SetGlobalObject(GlobalObject* globalObject) {this->globalObject = globalObject; }
static DWORD GetRandSeed0Offset() { return offsetof(JavascriptLibrary, randSeed0); }
static DWORD GetRandSeed1Offset() { return offsetof(JavascriptLibrary, randSeed1); }
static DWORD GetTypeDisplayStringsOffset() { return offsetof(JavascriptLibrary, typeDisplayStrings); }
typedef bool (CALLBACK *PromiseContinuationCallback)(Var task, void *callbackState);
Var GetUndeclBlockVar() const { return undeclBlockVarSentinel; }
bool IsUndeclBlockVar(Var var) const { return var == undeclBlockVarSentinel; }
static bool IsTypedArrayConstructor(Var constructor, ScriptContext* scriptContext);
private:
FieldNoBarrier(Recycler *) recycler;
Field(ExternalLibraryBase*) externalLibraryList;
Field(UndeclaredBlockVariable*) undeclBlockVarSentinel;
Field(DynamicType *) generatorConstructorPrototypeObjectType;
Field(DynamicType *) constructorPrototypeObjectType;
Field(DynamicType *) heapArgumentsType;
Field(DynamicType *) activationObjectType;
Field(DynamicType *) arrayType;
Field(DynamicType *) nativeIntArrayType;
#if ENABLE_COPYONACCESS_ARRAY
Field(DynamicType *) copyOnAccessNativeIntArrayType;
#endif
Field(DynamicType *) nativeFloatArrayType;
Field(DynamicType *) arrayBufferType;
Field(DynamicType *) sharedArrayBufferType;
Field(DynamicType *) dataViewType;
Field(DynamicType *) typedArrayType;
Field(DynamicType *) int8ArrayType;
Field(DynamicType *) uint8ArrayType;
Field(DynamicType *) uint8ClampedArrayType;
Field(DynamicType *) int16ArrayType;
Field(DynamicType *) uint16ArrayType;
Field(DynamicType *) int32ArrayType;
Field(DynamicType *) uint32ArrayType;
Field(DynamicType *) float32ArrayType;
Field(DynamicType *) float64ArrayType;
Field(DynamicType *) int64ArrayType;
Field(DynamicType *) uint64ArrayType;
Field(DynamicType *) boolArrayType;
Field(DynamicType *) charArrayType;
Field(StaticType *) booleanTypeStatic;
Field(DynamicType *) booleanTypeDynamic;
Field(DynamicType *) dateType;
Field(StaticType *) variantDateType;
Field(DynamicType *) symbolTypeDynamic;
Field(StaticType *) symbolTypeStatic;
Field(DynamicType *) iteratorResultType;
Field(DynamicType *) arrayIteratorType;
Field(DynamicType *) mapIteratorType;
Field(DynamicType *) setIteratorType;
Field(DynamicType *) stringIteratorType;
Field(DynamicType *) promiseType;
Field(DynamicType *) listIteratorType;
Field(JavascriptFunction*) builtinFunctions[BuiltinFunction::Count];
Field(INT_PTR) vtableAddresses[VTableValue::Count];
Field(JavascriptString*) typeDisplayStrings[TypeIds_Limit];
Field(ConstructorCache *) constructorCacheDefaultInstance;
__declspec(align(16)) Field(const BYTE *) absDoubleCst;
Field(double const *) uintConvertConst;
// Function Types
Field(DynamicTypeHandler *) anonymousFunctionTypeHandler;
Field(DynamicTypeHandler *) anonymousFunctionWithPrototypeTypeHandler;
Field(DynamicTypeHandler *) functionTypeHandler;
Field(DynamicTypeHandler *) functionWithPrototypeTypeHandler;
Field(DynamicType *) externalFunctionWithDeferredPrototypeType;
Field(DynamicType *) wrappedFunctionWithDeferredPrototypeType;
Field(DynamicType *) stdCallFunctionWithDeferredPrototypeType;
Field(DynamicType *) idMappedFunctionWithPrototypeType;
Field(DynamicType *) externalConstructorFunctionWithDeferredPrototypeType;
Field(DynamicType *) defaultExternalConstructorFunctionWithDeferredPrototypeType;
Field(DynamicType *) boundFunctionType;
Field(DynamicType *) regexConstructorType;
Field(DynamicType *) crossSiteDeferredPrototypeFunctionType;
Field(DynamicType *) crossSiteIdMappedFunctionWithPrototypeType;
Field(DynamicType *) crossSiteExternalConstructFunctionWithPrototypeType;
Field(StaticType *) enumeratorType;
Field(DynamicType *) errorType;
Field(DynamicType *) evalErrorType;
Field(DynamicType *) rangeErrorType;
Field(DynamicType *) referenceErrorType;
Field(DynamicType *) syntaxErrorType;
Field(DynamicType *) typeErrorType;
Field(DynamicType *) uriErrorType;
Field(DynamicType *) webAssemblyCompileErrorType;
Field(DynamicType *) webAssemblyRuntimeErrorType;
Field(DynamicType *) webAssemblyLinkErrorType;
Field(StaticType *) numberTypeStatic;
Field(StaticType *) int64NumberTypeStatic;
Field(StaticType *) uint64NumberTypeStatic;
Field(DynamicType *) webAssemblyModuleType;
Field(DynamicType *) webAssemblyInstanceType;
Field(DynamicType *) webAssemblyMemoryType;
Field(DynamicType *) webAssemblyTableType;
// SIMD_JS
Field(DynamicType *) simdBool8x16TypeDynamic;
Field(DynamicType *) simdBool16x8TypeDynamic;
Field(DynamicType *) simdBool32x4TypeDynamic;
Field(DynamicType *) simdInt8x16TypeDynamic;
Field(DynamicType *) simdInt16x8TypeDynamic;
Field(DynamicType *) simdInt32x4TypeDynamic;
Field(DynamicType *) simdUint8x16TypeDynamic;
Field(DynamicType *) simdUint16x8TypeDynamic;
Field(DynamicType *) simdUint32x4TypeDynamic;
Field(DynamicType *) simdFloat32x4TypeDynamic;
Field(StaticType *) simdFloat32x4TypeStatic;
Field(StaticType *) simdInt32x4TypeStatic;
Field(StaticType *) simdInt8x16TypeStatic;
Field(StaticType *) simdFloat64x2TypeStatic;
Field(StaticType *) simdInt16x8TypeStatic;
Field(StaticType *) simdBool32x4TypeStatic;
Field(StaticType *) simdBool16x8TypeStatic;
Field(StaticType *) simdBool8x16TypeStatic;
Field(StaticType *) simdUint32x4TypeStatic;
Field(StaticType *) simdUint16x8TypeStatic;
Field(StaticType *) simdUint8x16TypeStatic;
Field(DynamicType *) numberTypeDynamic;
Field(DynamicType *) objectTypes[PreInitializedObjectTypeCount];
Field(DynamicType *) objectHeaderInlinedTypes[PreInitializedObjectTypeCount];
Field(DynamicType *) regexPrototypeType;
Field(DynamicType *) regexType;
Field(DynamicType *) regexResultType;
Field(StaticType *) stringTypeStatic;
Field(DynamicType *) stringTypeDynamic;
Field(DynamicType *) mapType;
Field(DynamicType *) setType;
Field(DynamicType *) weakMapType;
Field(DynamicType *) weakSetType;
Field(DynamicType *) proxyType;
Field(StaticType *) withType;
Field(DynamicType *) SpreadArgumentType;
Field(DynamicType *) moduleNamespaceType;
Field(PropertyDescriptor) defaultPropertyDescriptor;
Field(JavascriptString*) nullString;
Field(JavascriptString*) emptyString;
Field(JavascriptString*) quotesString;
Field(JavascriptString*) whackString;
Field(JavascriptString*) objectArgumentsDisplayString;
Field(JavascriptString*) objectArrayDisplayString;
Field(JavascriptString*) objectBooleanDisplayString;
Field(JavascriptString*) objectDateDisplayString;
Field(JavascriptString*) objectErrorDisplayString;
Field(JavascriptString*) objectFunctionDisplayString;
Field(JavascriptString*) objectDisplayString;
Field(JavascriptString*) objectNumberDisplayString;
Field(JavascriptString*) objectRegExpDisplayString;
Field(JavascriptString*) objectStringDisplayString;
Field(JavascriptString*) stringTypeDisplayString;
Field(JavascriptString*) functionPrefixString;
Field(JavascriptString*) generatorFunctionPrefixString;
Field(JavascriptString*) asyncFunctionPrefixString;
Field(JavascriptString*) functionDisplayString;
Field(JavascriptString*) xDomainFunctionDisplayString;
Field(JavascriptString*) undefinedDisplayString;
Field(JavascriptString*) nanDisplayString;
Field(JavascriptString*) nullDisplayString;
Field(JavascriptString*) unknownDisplayString;
Field(JavascriptString*) commaDisplayString;
Field(JavascriptString*) commaSpaceDisplayString;
Field(JavascriptString*) trueDisplayString;
Field(JavascriptString*) falseDisplayString;
Field(JavascriptString*) invalidDateString;
Field(JavascriptString*) objectTypeDisplayString;
Field(JavascriptString*) functionTypeDisplayString;
Field(JavascriptString*) booleanTypeDisplayString;
Field(JavascriptString*) numberTypeDisplayString;
Field(JavascriptString*) moduleTypeDisplayString;
Field(JavascriptString*) variantDateTypeDisplayString;
// SIMD_JS
Field(JavascriptString*) simdFloat32x4DisplayString;
Field(JavascriptString*) simdFloat64x2DisplayString;
Field(JavascriptString*) simdInt32x4DisplayString;
Field(JavascriptString*) simdInt16x8DisplayString;
Field(JavascriptString*) simdInt8x16DisplayString;
Field(JavascriptString*) simdBool32x4DisplayString;
Field(JavascriptString*) simdBool16x8DisplayString;
Field(JavascriptString*) simdBool8x16DisplayString;
Field(JavascriptString*) simdUint32x4DisplayString;
Field(JavascriptString*) simdUint16x8DisplayString;
Field(JavascriptString*) simdUint8x16DisplayString;
Field(JavascriptString*) symbolTypeDisplayString;
Field(JavascriptString*) debuggerDeadZoneBlockVariableString;
Field(DynamicObject*) missingPropertyHolder;
Field(StaticType*) throwErrorObjectType;
Field(PropertyStringCacheMap*) propertyStringMap;
Field(ConstructorCache*) builtInConstructorCache;
Field(DynamicObject*) chakraLibraryObject;
#ifdef ENABLE_DEBUG_CONFIG_OPTIONS
Field(JavascriptFunction*) debugObjectFaultInjectionCookieGetterFunction;
Field(JavascriptFunction*) debugObjectFaultInjectionCookieSetterFunction;
#endif
Field(JavascriptFunction*) evalFunctionObject;
Field(JavascriptFunction*) parseIntFunctionObject;
Field(JavascriptFunction*) parseFloatFunctionObject;
Field(JavascriptFunction*) arrayPrototypeToStringFunction;
Field(JavascriptFunction*) arrayPrototypeToLocaleStringFunction;
Field(JavascriptFunction*) identityFunction;
Field(JavascriptFunction*) throwerFunction;
Field(JavascriptFunction*) generatorNextFunction;
Field(JavascriptFunction*) generatorThrowFunction;
Field(JavascriptFunction*) objectValueOfFunction;
Field(JavascriptFunction*) objectToStringFunction;
#ifdef ENABLE_WASM
Field(DynamicObject*) webAssemblyObject;
Field(JavascriptFunction*) webAssemblyQueryResponseFunction;
Field(JavascriptFunction*) webAssemblyCompileFunction;
Field(JavascriptFunction*) webAssemblyInstantiateBoundFunction;
#endif
// SIMD_JS
Field(JavascriptFunction*) simdFloat32x4ToStringFunction;
Field(JavascriptFunction*) simdFloat64x2ToStringFunction;
Field(JavascriptFunction*) simdInt32x4ToStringFunction;
Field(JavascriptFunction*) simdInt16x8ToStringFunction;
Field(JavascriptFunction*) simdInt8x16ToStringFunction;
Field(JavascriptFunction*) simdBool32x4ToStringFunction;
Field(JavascriptFunction*) simdBool16x8ToStringFunction;
Field(JavascriptFunction*) simdBool8x16ToStringFunction;
Field(JavascriptFunction*) simdUint32x4ToStringFunction;
Field(JavascriptFunction*) simdUint16x8ToStringFunction;
Field(JavascriptFunction*) simdUint8x16ToStringFunction;
Field(JavascriptSymbol*) symbolMatch;
Field(JavascriptSymbol*) symbolReplace;
Field(JavascriptSymbol*) symbolSearch;
Field(JavascriptSymbol*) symbolSplit;
Field(UnifiedRegex::RegexPattern *) emptyRegexPattern;
Field(JavascriptFunction*) regexExecFunction;
Field(JavascriptFunction*) regexFlagsGetterFunction;
Field(JavascriptFunction*) regexGlobalGetterFunction;
Field(JavascriptFunction*) regexStickyGetterFunction;
Field(JavascriptFunction*) regexUnicodeGetterFunction;
Field(RuntimeFunction*) sharedArrayBufferConstructor;
Field(DynamicObject*) sharedArrayBufferPrototype;
Field(DynamicObject*) atomicsObject;
Field(DynamicObject*) webAssemblyCompileErrorPrototype;
Field(RuntimeFunction*) webAssemblyCompileErrorConstructor;
Field(DynamicObject*) webAssemblyRuntimeErrorPrototype;
Field(RuntimeFunction*) webAssemblyRuntimeErrorConstructor;
Field(DynamicObject*) webAssemblyLinkErrorPrototype;
Field(RuntimeFunction*) webAssemblyLinkErrorConstructor;
Field(DynamicObject*) webAssemblyMemoryPrototype;
Field(RuntimeFunction*) webAssemblyMemoryConstructor;
Field(DynamicObject*) webAssemblyModulePrototype;
Field(RuntimeFunction*) webAssemblyModuleConstructor;
Field(DynamicObject*) webAssemblyInstancePrototype;
Field(RuntimeFunction*) webAssemblyInstanceConstructor;
Field(DynamicObject*) webAssemblyTablePrototype;
Field(RuntimeFunction*) webAssemblyTableConstructor;
Field(int) regexConstructorSlotIndex;
Field(int) regexExecSlotIndex;
Field(int) regexFlagsGetterSlotIndex;
Field(int) regexGlobalGetterSlotIndex;
Field(int) regexStickyGetterSlotIndex;
Field(int) regexUnicodeGetterSlotIndex;
mutable Field(CharStringCache) charStringCache;
FieldNoBarrier(PromiseContinuationCallback) nativeHostPromiseContinuationFunction;
Field(void *) nativeHostPromiseContinuationFunctionState;
typedef SList<Js::FunctionProxy*, Recycler> FunctionReferenceList;
typedef JsUtil::WeakReferenceDictionary<uintptr_t, DynamicType, DictionarySizePolicy<PowerOf2Policy, 1>> JsrtExternalTypesCache;
Field(void *) bindRefChunkBegin;
Field(Field(void*)*) bindRefChunkCurrent;
Field(Field(void*)*) bindRefChunkEnd;
Field(TypePath*) rootPath; // this should be in library instead of ScriptContext::Cache
Field(Js::Cache) cache;
Field(FunctionReferenceList*) dynamicFunctionReference;
Field(uint) dynamicFunctionReferenceDepth;
Field(FinalizableObject*) jsrtContextObject;
Field(JsrtExternalTypesCache*) jsrtExternalTypesCache;
Field(FunctionBody*) fakeGlobalFuncForUndefer;
typedef JsUtil::BaseHashSet<RecyclerWeakReference<RecyclableObject>*, Recycler, PowerOf2SizePolicy, RecyclerWeakReference<RecyclableObject>*, StringTemplateCallsiteObjectComparer> StringTemplateCallsiteObjectList;
// Used to store a list of template callsite objects.
// We use the raw strings in the callsite object (or a string template parse node) to identify unique callsite objects in the list.
// See abstract operation GetTemplateObject in ES6 Spec (RC1) 12.2.8.3
Field(StringTemplateCallsiteObjectList*) stringTemplateCallsiteObjectList;
Field(ModuleRecordList*) moduleRecordList;
// This list contains types ensured to have only writable data properties in it and all objects in its prototype chain
// (i.e., no readonly properties or accessors). Only prototype objects' types are stored in the list. When something
// in the script context adds a readonly property or accessor to an object that is used as a prototype object, this
// list is cleared. The list is also cleared before garbage collection so that it does not keep growing, and so, it can
// hold strong references to the types.
//
// The cache is used by the type-without-property local inline cache. When setting a property on a type that doesn't
// have the property, to determine whether to promote the object like an object of that type was last promoted, we need
// to ensure that objects in the prototype chain have not acquired a readonly property or setter (ideally, only for that
// property ID, but we just check for any such property). This cache is used to avoid doing this many times, especially
// when the prototype chain is not short.
//
// This list is only used to invalidate the status of types. The type itself contains a boolean indicating whether it
// and prototypes contain only writable data properties, which is reset upon invalidating the status.
Field(JsUtil::List<Type *> *) typesEnsuredToHaveOnlyWritableDataPropertiesInItAndPrototypeChain;
Field(uint64) randSeed0, randSeed1;
Field(bool) isPRNGSeeded;
Field(bool) inProfileMode;
Field(bool) inDispatchProfileMode;
Field(bool) arrayObjectHasUserDefinedSpecies;
JavascriptFunction * AddFunctionToLibraryObjectWithPrototype(DynamicObject * object, PropertyId propertyId, FunctionInfo * functionInfo, int length, DynamicObject * prototype = nullptr, DynamicType * functionType = nullptr);
JavascriptFunction * AddFunctionToLibraryObject(DynamicObject* object, PropertyId propertyId, FunctionInfo * functionInfo, int length, PropertyAttributes attributes = PropertyBuiltInMethodDefaults);
JavascriptFunction * AddFunctionToLibraryObjectWithName(DynamicObject* object, PropertyId propertyId, PropertyId nameId, FunctionInfo * functionInfo, int length);
RuntimeFunction* AddGetterToLibraryObject(DynamicObject* object, PropertyId propertyId, FunctionInfo* functionInfo);
void AddAccessorsToLibraryObject(DynamicObject* object, PropertyId propertyId, FunctionInfo * getterFunctionInfo, FunctionInfo * setterFunctionInfo);
void AddAccessorsToLibraryObject(DynamicObject* object, PropertyId propertyId, RecyclableObject * getterFunction, RecyclableObject * setterFunction);
void AddAccessorsToLibraryObjectWithName(DynamicObject* object, PropertyId propertyId, PropertyId nameId, FunctionInfo * getterFunctionInfo, FunctionInfo * setterFunction);
RuntimeFunction * CreateGetterFunction(PropertyId nameId, FunctionInfo* functionInfo);
RuntimeFunction * CreateSetterFunction(PropertyId nameId, FunctionInfo* functionInfo);
template <size_t N>
JavascriptFunction * AddFunctionToLibraryObjectWithPropertyName(DynamicObject* object, const char16(&propertyName)[N], FunctionInfo * functionInfo, int length);
static SimpleTypeHandler<1> SharedPrototypeTypeHandler;
static SimpleTypeHandler<1> SharedFunctionWithoutPrototypeTypeHandler;
static SimpleTypeHandler<1> SharedFunctionWithPrototypeTypeHandlerV11;
static SimpleTypeHandler<2> SharedFunctionWithPrototypeTypeHandler;
static SimpleTypeHandler<1> SharedFunctionWithLengthTypeHandler;
static SimpleTypeHandler<2> SharedFunctionWithLengthAndNameTypeHandler;
static SimpleTypeHandler<1> SharedIdMappedFunctionWithPrototypeTypeHandler;
static SimpleTypeHandler<2> SharedNamespaceSymbolTypeHandler;
static MissingPropertyTypeHandler MissingPropertyHolderTypeHandler;
static SimplePropertyDescriptor const SharedFunctionPropertyDescriptors[2];
static SimplePropertyDescriptor const HeapArgumentsPropertyDescriptors[3];
static SimplePropertyDescriptor const FunctionWithLengthAndPrototypeTypeDescriptors[2];
static SimplePropertyDescriptor const FunctionWithLengthAndNameTypeDescriptors[2];
static SimplePropertyDescriptor const ModuleNamespaceTypeDescriptors[2];
public:
static const ObjectInfoBits EnumFunctionClass = EnumClass_1_Bit;
static void InitializeProperties(ThreadContext * threadContext);
JavascriptLibrary(GlobalObject* globalObject) :
JavascriptLibraryBase(globalObject),
inProfileMode(false),
inDispatchProfileMode(false),
propertyStringMap(nullptr),
parseIntFunctionObject(nullptr),
evalFunctionObject(nullptr),
parseFloatFunctionObject(nullptr),
arrayPrototypeToLocaleStringFunction(nullptr),
arrayPrototypeToStringFunction(nullptr),
identityFunction(nullptr),
throwerFunction(nullptr),
jsrtContextObject(nullptr),
jsrtExternalTypesCache(nullptr),
fakeGlobalFuncForUndefer(nullptr),
externalLibraryList(nullptr),
#if ENABLE_COPYONACCESS_ARRAY
cacheForCopyOnAccessArraySegments(nullptr),
#endif
referencedPropertyRecords(nullptr),
stringTemplateCallsiteObjectList(nullptr),
moduleRecordList(nullptr),
rootPath(nullptr),
bindRefChunkBegin(nullptr),
bindRefChunkCurrent(nullptr),
bindRefChunkEnd(nullptr),
dynamicFunctionReference(nullptr)
{
this->globalObject = globalObject;
}
void Initialize(ScriptContext* scriptContext, GlobalObject * globalObject);
void Uninitialize();
GlobalObject* GetGlobalObject() const { return globalObject; }
ScriptContext* GetScriptContext() const { return scriptContext; }
Recycler * GetRecycler() const { return recycler; }
Var GetTrueOrFalse(BOOL value) { return value ? booleanTrue : booleanFalse; }
JavascriptSymbol* GetSymbolMatch() { return symbolMatch; }
JavascriptSymbol* GetSymbolReplace() { return symbolReplace; }
JavascriptSymbol* GetSymbolSearch() { return symbolSearch; }
JavascriptSymbol* GetSymbolSplit() { return symbolSplit; }
JavascriptSymbol* GetSymbolSpecies() { return symbolSpecies; }
JavascriptString* GetNullString() { return nullString; }
JavascriptString* GetEmptyString() const;
JavascriptString* GetWhackString() { return whackString; }
JavascriptString* GetUndefinedDisplayString() { return undefinedDisplayString; }
JavascriptString* GetNaNDisplayString() { return nanDisplayString; }
JavascriptString* GetQuotesString() { return quotesString; }
JavascriptString* GetNullDisplayString() { return nullDisplayString; }
JavascriptString* GetUnknownDisplayString() { return unknownDisplayString; }
JavascriptString* GetCommaDisplayString() { return commaDisplayString; }
JavascriptString* GetCommaSpaceDisplayString() { return commaSpaceDisplayString; }
JavascriptString* GetTrueDisplayString() { return trueDisplayString; }
JavascriptString* GetFalseDisplayString() { return falseDisplayString; }
JavascriptString* GetObjectDisplayString() { return objectDisplayString; }
JavascriptString* GetObjectArgumentsDisplayString() { return objectArgumentsDisplayString; }
JavascriptString* GetObjectArrayDisplayString() { return objectArrayDisplayString; }
JavascriptString* GetObjectBooleanDisplayString() { return objectBooleanDisplayString; }
JavascriptString* GetObjectDateDisplayString() { return objectDateDisplayString; }
JavascriptString* GetObjectErrorDisplayString() { return objectErrorDisplayString; }
JavascriptString* GetObjectFunctionDisplayString() { return objectFunctionDisplayString; }
JavascriptString* GetObjectNumberDisplayString() { return objectNumberDisplayString; }
JavascriptString* GetObjectRegExpDisplayString() { return objectRegExpDisplayString; }
JavascriptString* GetObjectStringDisplayString() { return objectStringDisplayString; }
JavascriptString* GetStringTypeDisplayString() { return stringTypeDisplayString; }
JavascriptString* GetFunctionPrefixString() { return functionPrefixString; }
JavascriptString* GetGeneratorFunctionPrefixString() { return generatorFunctionPrefixString; }
JavascriptString* GetAsyncFunctionPrefixString() { return asyncFunctionPrefixString; }
JavascriptString* GetFunctionDisplayString() { return functionDisplayString; }
JavascriptString* GetXDomainFunctionDisplayString() { return xDomainFunctionDisplayString; }
JavascriptString* GetInvalidDateString() { return invalidDateString; }
JavascriptString* GetObjectTypeDisplayString() const { return objectTypeDisplayString; }
JavascriptString* GetFunctionTypeDisplayString() const { return functionTypeDisplayString; }
JavascriptString* GetBooleanTypeDisplayString() const { return booleanTypeDisplayString; }
JavascriptString* GetNumberTypeDisplayString() const { return numberTypeDisplayString; }
JavascriptString* GetModuleTypeDisplayString() const { return moduleTypeDisplayString; }
JavascriptString* GetVariantDateTypeDisplayString() const { return variantDateTypeDisplayString; }
// SIMD_JS
JavascriptString* GetSIMDFloat32x4DisplayString() const { return simdFloat32x4DisplayString; }
JavascriptString* GetSIMDFloat64x2DisplayString() const { return simdFloat64x2DisplayString; }
JavascriptString* GetSIMDInt32x4DisplayString() const { return simdInt32x4DisplayString; }
JavascriptString* GetSIMDInt16x8DisplayString() const { return simdInt16x8DisplayString; }
JavascriptString* GetSIMDInt8x16DisplayString() const { return simdInt8x16DisplayString; }
JavascriptString* GetSIMDBool32x4DisplayString() const { return simdBool32x4DisplayString; }
JavascriptString* GetSIMDBool16x8DisplayString() const { return simdBool16x8DisplayString; }
JavascriptString* GetSIMDBool8x16DisplayString() const { return simdBool8x16DisplayString; }
JavascriptString* GetSIMDUint32x4DisplayString() const { return simdUint32x4DisplayString; }
JavascriptString* GetSIMDUint16x8DisplayString() const { return simdUint16x8DisplayString; }
JavascriptString* GetSIMDUint8x16DisplayString() const { return simdUint8x16DisplayString; }
JavascriptString* GetSymbolTypeDisplayString() const { return symbolTypeDisplayString; }
JavascriptString* GetDebuggerDeadZoneBlockVariableString() { Assert(debuggerDeadZoneBlockVariableString); return debuggerDeadZoneBlockVariableString; }
JavascriptRegExp* CreateEmptyRegExp();
JavascriptFunction* GetEvalFunctionObject() { return evalFunctionObject; }
JavascriptFunction* GetArrayIteratorPrototypeBuiltinNextFunction() { return arrayIteratorPrototypeBuiltinNextFunction; }
DynamicObject* GetReflectObject() const { return reflectObject; }
const PropertyDescriptor* GetDefaultPropertyDescriptor() const { return &defaultPropertyDescriptor; }
DynamicObject* GetMissingPropertyHolder() const { return missingPropertyHolder; }
JavascriptFunction* GetSharedArrayBufferConstructor() { return sharedArrayBufferConstructor; }
DynamicObject* GetAtomicsObject() { return atomicsObject; }
DynamicObject* GetWebAssemblyCompileErrorPrototype() const { return webAssemblyCompileErrorPrototype; }
DynamicObject* GetWebAssemblyCompileErrorConstructor() const { return webAssemblyCompileErrorConstructor; }
DynamicObject* GetWebAssemblyRuntimeErrorPrototype() const { return webAssemblyRuntimeErrorPrototype; }
DynamicObject* GetWebAssemblyRuntimeErrorConstructor() const { return webAssemblyRuntimeErrorConstructor; }
DynamicObject* GetWebAssemblyLinkErrorPrototype() const { return webAssemblyLinkErrorPrototype; }
DynamicObject* GetWebAssemblyLinkErrorConstructor() const { return webAssemblyLinkErrorConstructor; }
DynamicObject* GetChakraLib() const { return chakraLibraryObject; }
#if ENABLE_TTD
Js::PropertyId ExtractPrimitveSymbolId_TTD(Var value);
Js::RecyclableObject* CreatePrimitveSymbol_TTD(Js::PropertyId pid);
Js::RecyclableObject* CreatePrimitveSymbol_TTD(Js::JavascriptString* str);
Js::RecyclableObject* CreateDefaultBoxedObject_TTD(Js::TypeId kind);
void SetBoxedObjectValue_TTD(Js::RecyclableObject* obj, Js::Var value);
Js::RecyclableObject* CreateDate_TTD(double value);
Js::RecyclableObject* CreateRegex_TTD(const char16* patternSource, uint32 patternLength, UnifiedRegex::RegexFlags flags, CharCount lastIndex, Js::Var lastVar);
Js::RecyclableObject* CreateError_TTD();
Js::RecyclableObject* CreateES5Array_TTD();
static void SetLengthWritableES5Array_TTD(Js::RecyclableObject* es5Array, bool isLengthWritable);
Js::RecyclableObject* CreateSet_TTD();
Js::RecyclableObject* CreateWeakSet_TTD();
static void AddSetElementInflate_TTD(Js::JavascriptSet* set, Var value);
static void AddWeakSetElementInflate_TTD(Js::JavascriptWeakSet* set, Var value);
Js::RecyclableObject* CreateMap_TTD();
Js::RecyclableObject* CreateWeakMap_TTD();
static void AddMapElementInflate_TTD(Js::JavascriptMap* map, Var key, Var value);
static void AddWeakMapElementInflate_TTD(Js::JavascriptWeakMap* map, Var key, Var value);
Js::RecyclableObject* CreateExternalFunction_TTD(Js::Var fname);
Js::RecyclableObject* CreateBoundFunction_TTD(RecyclableObject* function, Var bThis, uint32 ct, Var* args);
Js::RecyclableObject* CreateProxy_TTD(RecyclableObject* handler, RecyclableObject* target);
Js::RecyclableObject* CreateRevokeFunction_TTD(RecyclableObject* proxy);
Js::RecyclableObject* CreateHeapArguments_TTD(uint32 numOfArguments, uint32 formalCount, ActivationObject* frameObject, byte* deletedArray);
Js::RecyclableObject* CreateES5HeapArguments_TTD(uint32 numOfArguments, uint32 formalCount, ActivationObject* frameObject, byte* deletedArray);
Js::JavascriptPromiseCapability* CreatePromiseCapability_TTD(Var promise, Var resolve, Var reject);
Js::JavascriptPromiseReaction* CreatePromiseReaction_TTD(RecyclableObject* handler, JavascriptPromiseCapability* capabilities);
Js::RecyclableObject* CreatePromise_TTD(uint32 status, Var result, JsUtil::List<Js::JavascriptPromiseReaction*, HeapAllocator>& resolveReactions, JsUtil::List<Js::JavascriptPromiseReaction*, HeapAllocator>& rejectReactions);
JavascriptPromiseResolveOrRejectFunctionAlreadyResolvedWrapper* CreateAlreadyDefinedWrapper_TTD(bool alreadyDefined);
Js::RecyclableObject* CreatePromiseResolveOrRejectFunction_TTD(RecyclableObject* promise, bool isReject, JavascriptPromiseResolveOrRejectFunctionAlreadyResolvedWrapper* alreadyResolved);
Js::RecyclableObject* CreatePromiseReactionTaskFunction_TTD(JavascriptPromiseReaction* reaction, Var argument);
Js::JavascriptPromiseAllResolveElementFunctionRemainingElementsWrapper* CreateRemainingElementsWrapper_TTD(Js::ScriptContext* ctx, uint32 value);
Js::RecyclableObject* CreatePromiseAllResolveElementFunction_TTD(Js::JavascriptPromiseCapability* capabilities, uint32 index, Js::JavascriptPromiseAllResolveElementFunctionRemainingElementsWrapper* wrapper, Js::RecyclableObject* values, bool alreadyCalled);
#endif
#ifdef ENABLE_INTL_OBJECT
void ResetIntlObject();
void EnsureIntlObjectReady();
template <class Fn>
void InitializeIntlForPrototypes(Fn fn);
void InitializeIntlForStringPrototype();
void InitializeIntlForDatePrototype();
void InitializeIntlForNumberPrototype();
#endif
#ifdef ENABLE_JS_BUILTINS
template <class Fn>
void InitializeBuiltInForPrototypes(Fn fn);
void EnsureBuiltInEngineIsReady();
static void __cdecl InitializeChakraLibraryObject(DynamicObject* chakraLibraryObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
static void __cdecl InitializeBuiltInObject(DynamicObject* builtInEngineObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
#endif
#ifdef ENABLE_DEBUG_CONFIG_OPTIONS
DynamicType * GetDebugDisposableObjectType() { return debugDisposableObjectType; }
DynamicType * GetDebugFuncExecutorInDisposeObjectType() { return debugFuncExecutorInDisposeObjectType; }
#endif
DynamicType* GetErrorType(ErrorTypeEnum typeToCreate) const;
StaticType * GetBooleanTypeStatic() const { return booleanTypeStatic; }
DynamicType * GetBooleanTypeDynamic() const { return booleanTypeDynamic; }
DynamicType * GetDateType() const { return dateType; }
DynamicType * GetBoundFunctionType() const { return boundFunctionType; }
DynamicType * GetRegExpConstructorType() const { return regexConstructorType; }
StaticType * GetEnumeratorType() const { return enumeratorType; }
DynamicType * GetSpreadArgumentType() const { return SpreadArgumentType; }
StaticType * GetWithType() const { return withType; }
DynamicType * GetErrorType() const { return errorType; }
DynamicType * GetEvalErrorType() const { return evalErrorType; }
DynamicType * GetRangeErrorType() const { return rangeErrorType; }
DynamicType * GetReferenceErrorType() const { return referenceErrorType; }
DynamicType * GetSyntaxErrorType() const { return syntaxErrorType; }
DynamicType * GetTypeErrorType() const { return typeErrorType; }
DynamicType * GetURIErrorType() const { return uriErrorType; }
DynamicType * GetWebAssemblyCompileErrorType() const { return webAssemblyCompileErrorType; }
DynamicType * GetWebAssemblyRuntimeErrorType() const { return webAssemblyRuntimeErrorType; }
DynamicType * GetWebAssemblyLinkErrorType() const { return webAssemblyLinkErrorType; }
StaticType * GetNumberTypeStatic() const { return numberTypeStatic; }
StaticType * GetInt64TypeStatic() const { return int64NumberTypeStatic; }
StaticType * GetUInt64TypeStatic() const { return uint64NumberTypeStatic; }
DynamicType * GetNumberTypeDynamic() const { return numberTypeDynamic; }
DynamicType * GetPromiseType() const { return promiseType; }
DynamicType * GetWebAssemblyModuleType() const { return webAssemblyModuleType; }
DynamicType * GetWebAssemblyInstanceType() const { return webAssemblyInstanceType; }
DynamicType * GetWebAssemblyMemoryType() const { return webAssemblyMemoryType; }
DynamicType * GetWebAssemblyTableType() const { return webAssemblyTableType; }
#ifdef ENABLE_WASM
JavascriptFunction* GetWebAssemblyQueryResponseFunction() const { return webAssemblyQueryResponseFunction; }
JavascriptFunction* GetWebAssemblyCompileFunction() const { return webAssemblyCompileFunction; }
JavascriptFunction* GetWebAssemblyInstantiateBoundFunction() const { return webAssemblyInstantiateBoundFunction; }
#endif
// SIMD_JS
DynamicType * GetSIMDBool8x16TypeDynamic() const { return simdBool8x16TypeDynamic; }
DynamicType * GetSIMDBool16x8TypeDynamic() const { return simdBool16x8TypeDynamic; }
DynamicType * GetSIMDBool32x4TypeDynamic() const { return simdBool32x4TypeDynamic; }
DynamicType * GetSIMDInt8x16TypeDynamic() const { return simdInt8x16TypeDynamic; }
DynamicType * GetSIMDInt16x8TypeDynamic() const { return simdInt16x8TypeDynamic; }
DynamicType * GetSIMDInt32x4TypeDynamic() const { return simdInt32x4TypeDynamic; }
DynamicType * GetSIMDUint8x16TypeDynamic() const { return simdUint8x16TypeDynamic; }
DynamicType * GetSIMDUint16x8TypeDynamic() const { return simdUint16x8TypeDynamic; }
DynamicType * GetSIMDUint32x4TypeDynamic() const { return simdUint32x4TypeDynamic; }
DynamicType * GetSIMDFloat32x4TypeDynamic() const { return simdFloat32x4TypeDynamic; }
StaticType* GetSIMDFloat32x4TypeStatic() const { return simdFloat32x4TypeStatic; }
StaticType* GetSIMDFloat64x2TypeStatic() const { return simdFloat64x2TypeStatic; }
StaticType* GetSIMDInt32x4TypeStatic() const { return simdInt32x4TypeStatic; }
StaticType* GetSIMDInt16x8TypeStatic() const { return simdInt16x8TypeStatic; }
StaticType* GetSIMDInt8x16TypeStatic() const { return simdInt8x16TypeStatic; }
StaticType* GetSIMDBool32x4TypeStatic() const { return simdBool32x4TypeStatic; }
StaticType* GetSIMDBool16x8TypeStatic() const { return simdBool16x8TypeStatic; }
StaticType* GetSIMDBool8x16TypeStatic() const { return simdBool8x16TypeStatic; }
StaticType* GetSIMDUInt32x4TypeStatic() const { return simdUint32x4TypeStatic; }
StaticType* GetSIMDUint16x8TypeStatic() const { return simdUint16x8TypeStatic; }
StaticType* GetSIMDUint8x16TypeStatic() const { return simdUint8x16TypeStatic; }
DynamicType * GetObjectLiteralType(uint16 requestedInlineSlotCapacity);
DynamicType * GetObjectHeaderInlinedLiteralType(uint16 requestedInlineSlotCapacity);
DynamicType * GetObjectType() const { return objectTypes[0]; }
DynamicType * GetObjectHeaderInlinedType() const { return objectHeaderInlinedTypes[0]; }
StaticType * GetSymbolTypeStatic() const { return symbolTypeStatic; }
DynamicType * GetSymbolTypeDynamic() const { return symbolTypeDynamic; }
DynamicType * GetProxyType() const { return proxyType; }
DynamicType * GetHeapArgumentsObjectType() const { return heapArgumentsType; }
DynamicType * GetActivationObjectType() const { return activationObjectType; }
DynamicType * GetModuleNamespaceType() const { return moduleNamespaceType; }
DynamicType * GetArrayType() const { return arrayType; }
DynamicType * GetNativeIntArrayType() const { return nativeIntArrayType; }
#if ENABLE_COPYONACCESS_ARRAY
DynamicType * GetCopyOnAccessNativeIntArrayType() const { return copyOnAccessNativeIntArrayType; }
#endif
DynamicType * GetNativeFloatArrayType() const { return nativeFloatArrayType; }
DynamicType * GetRegexPrototypeType() const { return regexPrototypeType; }
DynamicType * GetRegexType() const { return regexType; }
DynamicType * GetRegexResultType() const { return regexResultType; }
DynamicType * GetArrayBufferType() const { return arrayBufferType; }
StaticType * GetStringTypeStatic() const { AssertMsg(stringTypeStatic, "Where's stringTypeStatic?"); return stringTypeStatic; }
DynamicType * GetStringTypeDynamic() const { return stringTypeDynamic; }
StaticType * GetVariantDateType() const { return variantDateType; }
void EnsureDebugObject(DynamicObject* newDebugObject);
DynamicObject* GetDebugObject() const { Assert(debugObject != nullptr); return debugObject; }
DynamicType * GetMapType() const { return mapType; }
DynamicType * GetSetType() const { return setType; }
DynamicType * GetWeakMapType() const { return weakMapType; }
DynamicType * GetWeakSetType() const { return weakSetType; }
DynamicType * GetArrayIteratorType() const { return arrayIteratorType; }
DynamicType * GetMapIteratorType() const { return mapIteratorType; }
DynamicType * GetSetIteratorType() const { return setIteratorType; }
DynamicType * GetStringIteratorType() const { return stringIteratorType; }
DynamicType * GetListIteratorType() const { return listIteratorType; }
JavascriptFunction* GetDefaultAccessorFunction() const { return defaultAccessorFunction; }
JavascriptFunction* GetStackTraceAccessorFunction() const { return stackTraceAccessorFunction; }
JavascriptFunction* GetThrowTypeErrorRestrictedPropertyAccessorFunction() const { return throwTypeErrorRestrictedPropertyAccessorFunction; }
JavascriptFunction* Get__proto__getterFunction() const { return __proto__getterFunction; }
JavascriptFunction* Get__proto__setterFunction() const { return __proto__setterFunction; }
JavascriptFunction* GetObjectValueOfFunction() const { return objectValueOfFunction; }
JavascriptFunction* GetObjectToStringFunction() const { return objectToStringFunction; }
// SIMD_JS
JavascriptFunction* GetSIMDFloat32x4ToStringFunction() const { return simdFloat32x4ToStringFunction; }
JavascriptFunction* GetSIMDFloat64x2ToStringFunction() const { return simdFloat64x2ToStringFunction; }
JavascriptFunction* GetSIMDInt32x4ToStringFunction() const { return simdInt32x4ToStringFunction; }
JavascriptFunction* GetSIMDInt16x8ToStringFunction() const { return simdInt16x8ToStringFunction; }
JavascriptFunction* GetSIMDInt8x16ToStringFunction() const { return simdInt8x16ToStringFunction; }
JavascriptFunction* GetSIMDBool32x4ToStringFunction() const { return simdBool32x4ToStringFunction; }
JavascriptFunction* GetSIMDBool16x8ToStringFunction() const { return simdBool16x8ToStringFunction; }
JavascriptFunction* GetSIMDBool8x16ToStringFunction() const { return simdBool8x16ToStringFunction; }
JavascriptFunction* GetSIMDUint32x4ToStringFunction() const { return simdUint32x4ToStringFunction; }
JavascriptFunction* GetSIMDUint16x8ToStringFunction() const { return simdUint16x8ToStringFunction; }
JavascriptFunction* GetSIMDUint8x16ToStringFunction() const { return simdUint8x16ToStringFunction; }
JavascriptFunction* GetDebugObjectNonUserGetterFunction() const { return debugObjectNonUserGetterFunction; }
JavascriptFunction* GetDebugObjectNonUserSetterFunction() const { return debugObjectNonUserSetterFunction; }
UnifiedRegex::RegexPattern * GetEmptyRegexPattern() const { return emptyRegexPattern; }
JavascriptFunction* GetRegexExecFunction() const { return regexExecFunction; }
JavascriptFunction* GetRegexFlagsGetterFunction() const { return regexFlagsGetterFunction; }
JavascriptFunction* GetRegexGlobalGetterFunction() const { return regexGlobalGetterFunction; }
JavascriptFunction* GetRegexStickyGetterFunction() const { return regexStickyGetterFunction; }
JavascriptFunction* GetRegexUnicodeGetterFunction() const { return regexUnicodeGetterFunction; }
int GetRegexConstructorSlotIndex() const { return regexConstructorSlotIndex; }
int GetRegexExecSlotIndex() const { return regexExecSlotIndex; }
int GetRegexFlagsGetterSlotIndex() const { return regexFlagsGetterSlotIndex; }
int GetRegexGlobalGetterSlotIndex() const { return regexGlobalGetterSlotIndex; }
int GetRegexStickyGetterSlotIndex() const { return regexStickyGetterSlotIndex; }
int GetRegexUnicodeGetterSlotIndex() const { return regexUnicodeGetterSlotIndex; }
TypePath* GetRootPath() const { return rootPath; }
void BindReference(void * addr);
void CleanupForClose();
void BeginDynamicFunctionReferences();
void EndDynamicFunctionReferences();
void RegisterDynamicFunctionReference(FunctionProxy* func);
void SetDebugObjectNonUserAccessor(FunctionInfo *funcGetter, FunctionInfo *funcSetter);
JavascriptFunction* GetDebugObjectDebugModeGetterFunction() const { return debugObjectDebugModeGetterFunction; }
void SetDebugObjectDebugModeAccessor(FunctionInfo *funcGetter);
#ifdef ENABLE_DEBUG_CONFIG_OPTIONS
JavascriptFunction* GetDebugObjectFaultInjectionCookieGetterFunction() const { return debugObjectFaultInjectionCookieGetterFunction; }
JavascriptFunction* GetDebugObjectFaultInjectionCookieSetterFunction() const { return debugObjectFaultInjectionCookieSetterFunction; }
void SetDebugObjectFaultInjectionCookieGetterAccessor(FunctionInfo *funcGetter, FunctionInfo *funcSetter);
#endif
JavascriptFunction* GetArrayPrototypeToStringFunction() const { return arrayPrototypeToStringFunction; }
JavascriptFunction* GetArrayPrototypeToLocaleStringFunction() const { return arrayPrototypeToLocaleStringFunction; }
JavascriptFunction* GetIdentityFunction() const { return identityFunction; }
JavascriptFunction* GetThrowerFunction() const { return throwerFunction; }
void SetNativeHostPromiseContinuationFunction(PromiseContinuationCallback function, void *state);
void SetJsrtContext(FinalizableObject* jsrtContext);
FinalizableObject* GetJsrtContext();
void EnqueueTask(Var taskVar);
HeapArgumentsObject* CreateHeapArguments(Var frameObj, uint formalCount, bool isStrictMode = false);
JavascriptArray* CreateArray();
JavascriptArray* CreateArray(uint32 length);
JavascriptArray *CreateArrayOnStack(void *const stackAllocationPointer);
JavascriptNativeIntArray* CreateNativeIntArray();
JavascriptNativeIntArray* CreateNativeIntArray(uint32 length);
#if ENABLE_COPYONACCESS_ARRAY
JavascriptCopyOnAccessNativeIntArray* CreateCopyOnAccessNativeIntArray();
JavascriptCopyOnAccessNativeIntArray* CreateCopyOnAccessNativeIntArray(uint32 length);
#endif
JavascriptNativeFloatArray* CreateNativeFloatArray();
JavascriptNativeFloatArray* CreateNativeFloatArray(uint32 length);
JavascriptArray* CreateArray(uint32 length, uint32 size);
ArrayBuffer* CreateArrayBuffer(uint32 length);
ArrayBuffer* CreateArrayBuffer(byte* buffer, uint32 length);
class WebAssemblyArrayBuffer* CreateWebAssemblyArrayBuffer(uint32 length);
class WebAssemblyArrayBuffer* CreateWebAssemblyArrayBuffer(byte* buffer, uint32 length);
SharedArrayBuffer* CreateSharedArrayBuffer(uint32 length);
SharedArrayBuffer* CreateSharedArrayBuffer(SharedContents *contents);
ArrayBuffer* CreateProjectionArraybuffer(uint32 length);
ArrayBuffer* CreateProjectionArraybuffer(byte* buffer, uint32 length);
DataView* CreateDataView(ArrayBufferBase* arrayBuffer, uint32 offSet, uint32 mappedLength);
template <typename TypeName, bool clamped>
inline DynamicType* GetTypedArrayType(TypeName);
template<> inline DynamicType* GetTypedArrayType<int8,false>(int8) { return int8ArrayType; };
template<> inline DynamicType* GetTypedArrayType<uint8,false>(uint8) { return uint8ArrayType; };
template<> inline DynamicType* GetTypedArrayType<uint8,true>(uint8) { return uint8ClampedArrayType; };
template<> inline DynamicType* GetTypedArrayType<int16,false>(int16) { return int16ArrayType; };
template<> inline DynamicType* GetTypedArrayType<uint16,false>(uint16) { return uint16ArrayType; };
template<> inline DynamicType* GetTypedArrayType<int32,false>(int32) { return int32ArrayType; };
template<> inline DynamicType* GetTypedArrayType<uint32,false>(uint32) { return uint32ArrayType; };
template<> inline DynamicType* GetTypedArrayType<float,false>(float) { return float32ArrayType; };
template<> inline DynamicType* GetTypedArrayType<double,false>(double) { return float64ArrayType; };
template<> inline DynamicType* GetTypedArrayType<int64,false>(int64) { return int64ArrayType; };
template<> inline DynamicType* GetTypedArrayType<uint64,false>(uint64) { return uint64ArrayType; };
template<> inline DynamicType* GetTypedArrayType<bool,false>(bool) { return boolArrayType; };
DynamicType* GetCharArrayType() { return charArrayType; };
//
// This method would be used for creating array literals, when we really need to create a huge array
// Avoids checks at runtime.
//
JavascriptArray* CreateArrayLiteral(uint32 length);
JavascriptNativeIntArray* CreateNativeIntArrayLiteral(uint32 length);
#if ENABLE_PROFILE_INFO
JavascriptNativeIntArray* CreateCopyOnAccessNativeIntArrayLiteral(ArrayCallSiteInfo *arrayInfo, FunctionBody *functionBody, const Js::AuxArray<int32> *ints);
#endif
JavascriptNativeFloatArray* CreateNativeFloatArrayLiteral(uint32 length);
JavascriptBoolean* CreateBoolean(BOOL value);
JavascriptDate* CreateDate();
JavascriptDate* CreateDate(double value);
JavascriptDate* CreateDate(SYSTEMTIME* pst);
JavascriptMap* CreateMap();
JavascriptSet* CreateSet();
JavascriptWeakMap* CreateWeakMap();
JavascriptWeakSet* CreateWeakSet();
JavascriptError* CreateError();
JavascriptError* CreateError(DynamicType* errorType, BOOL isExternal = FALSE);
JavascriptError* CreateExternalError(ErrorTypeEnum errorTypeEnum);
JavascriptError* CreateEvalError();
JavascriptError* CreateRangeError();
JavascriptError* CreateReferenceError();
JavascriptError* CreateSyntaxError();
JavascriptError* CreateTypeError();
JavascriptError* CreateURIError();
JavascriptError* CreateStackOverflowError();
JavascriptError* CreateOutOfMemoryError();
JavascriptError* CreateWebAssemblyCompileError();
JavascriptError* CreateWebAssemblyRuntimeError();
JavascriptError* CreateWebAssemblyLinkError();
JavascriptSymbol* CreateSymbol(JavascriptString* description);
JavascriptSymbol* CreateSymbol(const char16* description, int descriptionLength);
JavascriptSymbol* CreateSymbol(const PropertyRecord* propertyRecord);
JavascriptPromise* CreatePromise();
JavascriptGenerator* CreateGenerator(Arguments& args, ScriptFunction* scriptFunction, RecyclableObject* prototype);
JavascriptFunction* CreateNonProfiledFunction(FunctionInfo * functionInfo);
template <class MethodType>
JavascriptExternalFunction* CreateIdMappedExternalFunction(MethodType entryPoint, DynamicType *pPrototypeType);
JavascriptExternalFunction* CreateExternalConstructor(Js::ExternalMethod entryPoint, PropertyId nameId, RecyclableObject * prototype);
JavascriptExternalFunction* CreateExternalConstructor(Js::ExternalMethod entryPoint, PropertyId nameId, InitializeMethod method, unsigned short deferredTypeSlots, bool hasAccessors);
DynamicType* GetCachedJsrtExternalType(uintptr_t finalizeCallback);
void CacheJsrtExternalType(uintptr_t finalizeCallback, DynamicType* dynamicType);
static DynamicTypeHandler * GetDeferredPrototypeGeneratorFunctionTypeHandler(ScriptContext* scriptContext);
static DynamicTypeHandler * GetDeferredPrototypeAsyncFunctionTypeHandler(ScriptContext* scriptContext);
DynamicType * CreateDeferredPrototypeGeneratorFunctionType(JavascriptMethod entrypoint, bool isAnonymousFunction, bool isShared = false);
DynamicType * CreateDeferredPrototypeAsyncFunctionType(JavascriptMethod entrypoint, bool isAnonymousFunction, bool isShared = false);
static DynamicTypeHandler * GetDeferredPrototypeFunctionTypeHandler(ScriptContext* scriptContext);
static DynamicTypeHandler * GetDeferredAnonymousPrototypeFunctionTypeHandler();
static DynamicTypeHandler * GetDeferredAnonymousPrototypeGeneratorFunctionTypeHandler();
static DynamicTypeHandler * GetDeferredAnonymousPrototypeAsyncFunctionTypeHandler();
DynamicTypeHandler * GetDeferredFunctionTypeHandler();
DynamicTypeHandler * ScriptFunctionTypeHandler(bool noPrototypeProperty, bool isAnonymousFunction);
DynamicTypeHandler * GetDeferredAnonymousFunctionTypeHandler();
template<bool isNameAvailable, bool isPrototypeAvailable = true>
static DynamicTypeHandler * GetDeferredFunctionTypeHandlerBase();
template<bool isNameAvailable, bool isPrototypeAvailable = true>
static DynamicTypeHandler * GetDeferredGeneratorFunctionTypeHandlerBase();
template<bool isNameAvailable>
static DynamicTypeHandler * GetDeferredAsyncFunctionTypeHandlerBase();
DynamicType * CreateDeferredPrototypeFunctionType(JavascriptMethod entrypoint);
DynamicType * CreateDeferredPrototypeFunctionTypeNoProfileThunk(JavascriptMethod entrypoint, bool isShared = false);
DynamicType * CreateFunctionType(JavascriptMethod entrypoint, RecyclableObject* prototype = nullptr);
DynamicType * CreateFunctionWithLengthType(FunctionInfo * functionInfo);
DynamicType * CreateFunctionWithLengthAndNameType(FunctionInfo * functionInfo);
DynamicType * CreateFunctionWithLengthAndPrototypeType(FunctionInfo * functionInfo);
DynamicType * CreateFunctionWithLengthType(DynamicObject * prototype, FunctionInfo * functionInfo);
DynamicType * CreateFunctionWithLengthAndNameType(DynamicObject * prototype, FunctionInfo * functionInfo);
DynamicType * CreateFunctionWithLengthAndPrototypeType(DynamicObject * prototype, FunctionInfo * functionInfo);
ScriptFunction * CreateScriptFunction(FunctionProxy* proxy);
AsmJsScriptFunction * CreateAsmJsScriptFunction(FunctionProxy* proxy);
ScriptFunctionWithInlineCache * CreateScriptFunctionWithInlineCache(FunctionProxy* proxy);
GeneratorVirtualScriptFunction * CreateGeneratorVirtualScriptFunction(FunctionProxy* proxy);
DynamicType * CreateGeneratorType(RecyclableObject* prototype);
#if 0
JavascriptNumber* CreateNumber(double value);
#endif
JavascriptNumber* CreateNumber(double value, RecyclerJavascriptNumberAllocator * numberAllocator);
JavascriptGeneratorFunction* CreateGeneratorFunction(JavascriptMethod entryPoint, GeneratorVirtualScriptFunction* scriptFunction);
JavascriptAsyncFunction* CreateAsyncFunction(JavascriptMethod entryPoint, GeneratorVirtualScriptFunction* scriptFunction);
JavascriptExternalFunction* CreateExternalFunction(ExternalMethod entryPointer, PropertyId nameId, Var signature, JavascriptTypeId prototypeTypeId, UINT64 flags);
JavascriptExternalFunction* CreateExternalFunction(ExternalMethod entryPointer, Var nameId, Var signature, JavascriptTypeId prototypeTypeId, UINT64 flags);
JavascriptExternalFunction* CreateStdCallExternalFunction(StdCallJavascriptMethod entryPointer, PropertyId nameId, void *callbackState);
JavascriptExternalFunction* CreateStdCallExternalFunction(StdCallJavascriptMethod entryPointer, Var nameId, void *callbackState);
JavascriptPromiseAsyncSpawnExecutorFunction* CreatePromiseAsyncSpawnExecutorFunction(JavascriptMethod entryPoint, JavascriptGenerator* generator, Var target);
JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction* CreatePromiseAsyncSpawnStepArgumentExecutorFunction(JavascriptMethod entryPoint, JavascriptGenerator* generator, Var argument, Var resolve = nullptr, Var reject = nullptr, bool isReject = false);
JavascriptPromiseCapabilitiesExecutorFunction* CreatePromiseCapabilitiesExecutorFunction(JavascriptMethod entryPoint, JavascriptPromiseCapability* capability);
JavascriptPromiseResolveOrRejectFunction* CreatePromiseResolveOrRejectFunction(JavascriptMethod entryPoint, JavascriptPromise* promise, bool isReject, JavascriptPromiseResolveOrRejectFunctionAlreadyResolvedWrapper* alreadyResolvedRecord);
JavascriptPromiseReactionTaskFunction* CreatePromiseReactionTaskFunction(JavascriptMethod entryPoint, JavascriptPromiseReaction* reaction, Var argument);
JavascriptPromiseResolveThenableTaskFunction* CreatePromiseResolveThenableTaskFunction(JavascriptMethod entryPoint, JavascriptPromise* promise, RecyclableObject* thenable, RecyclableObject* thenFunction);
JavascriptPromiseAllResolveElementFunction* CreatePromiseAllResolveElementFunction(JavascriptMethod entryPoint, uint32 index, JavascriptArray* values, JavascriptPromiseCapability* capabilities, JavascriptPromiseAllResolveElementFunctionRemainingElementsWrapper* remainingElements);
JavascriptExternalFunction* CreateWrappedExternalFunction(JavascriptExternalFunction* wrappedFunction);
#if ENABLE_NATIVE_CODEGEN
#if !FLOATVAR
JavascriptNumber* CreateCodeGenNumber(CodeGenNumberAllocator *alloc, double value);
#endif
#endif
DynamicObject* CreateGeneratorConstructorPrototypeObject();
DynamicObject* CreateConstructorPrototypeObject(JavascriptFunction * constructor);
DynamicObject* CreateObject(const bool allowObjectHeaderInlining = false, const PropertyIndex requestedInlineSlotCapacity = 0);
DynamicObject* CreateObject(DynamicTypeHandler * typeHandler);
DynamicObject* CreateActivationObject();
DynamicObject* CreatePseudoActivationObject();
DynamicObject* CreateBlockActivationObject();
DynamicObject* CreateConsoleScopeActivationObject();
DynamicType* CreateObjectType(RecyclableObject* prototype, Js::TypeId typeId, uint16 requestedInlineSlotCapacity);
DynamicType* CreateObjectTypeNoCache(RecyclableObject* prototype, Js::TypeId typeId);
DynamicType* CreateObjectType(RecyclableObject* prototype, uint16 requestedInlineSlotCapacity);
DynamicObject* CreateObject(RecyclableObject* prototype, uint16 requestedInlineSlotCapacity = 0);
typedef JavascriptString* LibStringType; // used by diagnostics template
template< size_t N > JavascriptString* CreateStringFromCppLiteral(const char16 (&value)[N]) const;
template<> JavascriptString* CreateStringFromCppLiteral(const char16 (&value)[1]) const; // Specialization for empty string
template<> JavascriptString* CreateStringFromCppLiteral(const char16 (&value)[2]) const; // Specialization for single-char strings
PropertyString* CreatePropertyString(const Js::PropertyRecord* propertyRecord);
JavascriptVariantDate* CreateVariantDate(const double value);
JavascriptBooleanObject* CreateBooleanObject(BOOL value);
JavascriptBooleanObject* CreateBooleanObject();
JavascriptNumberObject* CreateNumberObjectWithCheck(double value);
JavascriptNumberObject* CreateNumberObject(Var number);
JavascriptSIMDObject* CreateSIMDObject(Var simdValue, TypeId typeDescriptor);
JavascriptStringObject* CreateStringObject(JavascriptString* value);
JavascriptStringObject* CreateStringObject(const char16* value, charcount_t length);
JavascriptSymbolObject* CreateSymbolObject(JavascriptSymbol* value);
JavascriptArrayIterator* CreateArrayIterator(Var iterable, JavascriptArrayIteratorKind kind);
JavascriptMapIterator* CreateMapIterator(JavascriptMap* map, JavascriptMapIteratorKind kind);
JavascriptSetIterator* CreateSetIterator(JavascriptSet* set, JavascriptSetIteratorKind kind);
JavascriptStringIterator* CreateStringIterator(JavascriptString* string);
JavascriptListIterator* CreateListIterator(ListForListIterator* list);
JavascriptRegExp* CreateRegExp(UnifiedRegex::RegexPattern* pattern);
DynamicObject* CreateIteratorResultObject(Var value, Var done);
DynamicObject* CreateIteratorResultObjectValueFalse(Var value);
DynamicObject* CreateIteratorResultObjectUndefinedTrue();
RecyclableObject* CreateThrowErrorObject(JavascriptError* error);
JavascriptFunction* EnsurePromiseResolveFunction();
JavascriptFunction* EnsurePromiseThenFunction();
JavascriptFunction* EnsureGeneratorNextFunction();
JavascriptFunction* EnsureGeneratorThrowFunction();
JavascriptFunction* EnsureArrayPrototypeForEachFunction();
JavascriptFunction* EnsureArrayPrototypeKeysFunction();
JavascriptFunction* EnsureArrayPrototypeEntriesFunction();
JavascriptFunction* EnsureArrayPrototypeValuesFunction();
JavascriptFunction* EnsureJSONStringifyFunction();
JavascriptFunction* EnsureObjectFreezeFunction();
void SetCrossSiteForSharedFunctionType(JavascriptFunction * function);
bool IsPRNGSeeded() { return isPRNGSeeded; }
uint64 GetRandSeed0() { return randSeed0; }
uint64 GetRandSeed1() { return randSeed1; }
void SetIsPRNGSeeded(bool val);
void SetRandSeed0(uint64 rs) { randSeed0 = rs;}
void SetRandSeed1(uint64 rs) { randSeed1 = rs; }
void SetProfileMode(bool fSet);
void SetDispatchProfile(bool fSet, JavascriptMethod dispatchInvoke);
HRESULT ProfilerRegisterBuiltIns();
#if ENABLE_COPYONACCESS_ARRAY
static bool IsCopyOnAccessArrayCallSite(JavascriptLibrary *lib, ArrayCallSiteInfo *arrayInfo, uint32 length);
static bool IsCachedCopyOnAccessArrayCallSite(const JavascriptLibrary *lib, ArrayCallSiteInfo *arrayInfo);
template <typename T>
static void CheckAndConvertCopyOnAccessNativeIntArray(const T instance);
#endif
void EnsureStringTemplateCallsiteObjectList();
void AddStringTemplateCallsiteObject(RecyclableObject* callsite);
RecyclableObject* TryGetStringTemplateCallsiteObject(ParseNodePtr pnode);
RecyclableObject* TryGetStringTemplateCallsiteObject(RecyclableObject* callsite);
static void CheckAndInvalidateIsConcatSpreadableCache(PropertyId propertyId, ScriptContext *scriptContext);
#if DBG_DUMP
static const char16* GetStringTemplateCallsiteObjectKey(Var callsite);
#endif
Field(JavascriptFunction*)* GetBuiltinFunctions();
INT_PTR* GetVTableAddresses();
static BuiltinFunction GetBuiltinFunctionForPropId(PropertyId id);
static BuiltinFunction GetBuiltInForFuncInfo(intptr_t funcInfoAddr, ThreadContextInfo *context);
#if DBG
static void CheckRegisteredBuiltIns(Field(JavascriptFunction*)* builtInFuncs, ScriptContext *scriptContext);
#endif
static BOOL CanFloatPreferenceFunc(BuiltinFunction index);
static BOOL IsFltFunc(BuiltinFunction index);
static bool IsFloatFunctionCallsite(BuiltinFunction index, size_t argc);
static bool IsFltBuiltInConst(PropertyId id);
static size_t GetArgCForBuiltIn(BuiltinFunction index)
{
Assert(index < _countof(JavascriptLibrary::LibraryFunctionArgC));
return JavascriptLibrary::LibraryFunctionArgC[index];
}
static BuiltInFlags GetFlagsForBuiltIn(BuiltinFunction index)
{
Assert(index < _countof(JavascriptLibrary::LibraryFunctionFlags));
return (BuiltInFlags)JavascriptLibrary::LibraryFunctionFlags[index];
}
static BuiltinFunction GetBuiltInInlineCandidateId(Js::OpCode opCode);
static BuiltInArgSpecializationType GetBuiltInArgType(BuiltInFlags flags, BuiltInArgShift argGroup);
static bool IsTypeSpecRequired(BuiltInFlags flags)
{
return GetBuiltInArgType(flags, BuiltInArgShift::BIAS_Src1) || GetBuiltInArgType(flags, BuiltInArgShift::BIAS_Src2) || GetBuiltInArgType(flags, BuiltInArgShift::BIAS_Dst);
}
#if ENABLE_DEBUG_CONFIG_OPTIONS
static char16 const * GetNameForBuiltIn(BuiltinFunction index)
{
Assert(index < _countof(JavascriptLibrary::LibraryFunctionName));
return JavascriptLibrary::LibraryFunctionName[index];
}
#endif
PropertyStringCacheMap* EnsurePropertyStringMap();
PropertyStringCacheMap* GetPropertyStringMap() { return this->propertyStringMap; }
void TypeAndPrototypesAreEnsuredToHaveOnlyWritableDataProperties(Type *const type);
void NoPrototypeChainsAreEnsuredToHaveOnlyWritableDataProperties();
static bool ArrayIteratorPrototypeHasUserDefinedNext(ScriptContext *scriptContext);
CharStringCache& GetCharStringCache() { return charStringCache; }
static JavascriptLibrary * FromCharStringCache(CharStringCache * cache)
{
return (JavascriptLibrary *)((uintptr_t)cache - offsetof(JavascriptLibrary, charStringCache));
}
bool GetArrayObjectHasUserDefinedSpecies() const { return arrayObjectHasUserDefinedSpecies; }
void SetArrayObjectHasUserDefinedSpecies(bool val) { arrayObjectHasUserDefinedSpecies = val; }
FunctionBody* GetFakeGlobalFuncForUndefer()const { return this->fakeGlobalFuncForUndefer; }
void SetFakeGlobalFuncForUndefer(FunctionBody* functionBody) { this->fakeGlobalFuncForUndefer = functionBody; }
ModuleRecordList* EnsureModuleRecordList();
SourceTextModuleRecord* GetModuleRecord(uint moduleId);
private:
#ifdef ENABLE_DEBUG_CONFIG_OPTIONS
// Declare fretest/debug properties here since otherwise it can cause
// a mismatch between fre mshtml and fretest jscript9 causing undefined behavior
Field(DynamicType *) debugDisposableObjectType;
Field(DynamicType *) debugFuncExecutorInDisposeObjectType;
#endif
void InitializePrototypes();
void InitializeTypes();
void InitializeGlobal(GlobalObject * globalObject);
static void PrecalculateArrayAllocationBuckets();
#define STANDARD_INIT(name) \
static void __cdecl Initialize##name##Constructor(DynamicObject* arrayConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode); \
static void __cdecl Initialize##name##Prototype(DynamicObject* arrayPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
STANDARD_INIT(Array);
STANDARD_INIT(SharedArrayBuffer);
STANDARD_INIT(ArrayBuffer);
STANDARD_INIT(DataView);
STANDARD_INIT(Error);
STANDARD_INIT(EvalError);
STANDARD_INIT(RangeError);
STANDARD_INIT(ReferenceError);
STANDARD_INIT(SyntaxError);
STANDARD_INIT(TypeError);
STANDARD_INIT(URIError);
STANDARD_INIT(RuntimeError);
STANDARD_INIT(TypedArray);
STANDARD_INIT(Int8Array);
STANDARD_INIT(Uint8Array);
STANDARD_INIT(Uint8ClampedArray);
STANDARD_INIT(Int16Array);
STANDARD_INIT(Uint16Array);
STANDARD_INIT(Int32Array);
STANDARD_INIT(Uint32Array);
STANDARD_INIT(Float32Array);
STANDARD_INIT(Float64Array);
STANDARD_INIT(Boolean);
STANDARD_INIT(Symbol);
STANDARD_INIT(Date);
STANDARD_INIT(Proxy);
STANDARD_INIT(Function);
STANDARD_INIT(Number);
STANDARD_INIT(Object);
STANDARD_INIT(Regex);
STANDARD_INIT(String);
STANDARD_INIT(Map);
STANDARD_INIT(Set);
STANDARD_INIT(WeakMap);
STANDARD_INIT(WeakSet);
STANDARD_INIT(Promise);
STANDARD_INIT(GeneratorFunction);
STANDARD_INIT(AsyncFunction);
STANDARD_INIT(WebAssemblyCompileError);
STANDARD_INIT(WebAssemblyRuntimeError);
STANDARD_INIT(WebAssemblyLinkError);
STANDARD_INIT(WebAssemblyMemory);
STANDARD_INIT(WebAssemblyModule);
STANDARD_INIT(WebAssemblyInstance);
STANDARD_INIT(WebAssemblyTable);
#undef STANDARD_INIT
static void __cdecl InitializeAtomicsObject(DynamicObject* atomicsObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
static void __cdecl InitializeInt64ArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
static void __cdecl InitializeUint64ArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
static void __cdecl InitializeBoolArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
static void __cdecl InitializeCharArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
void InitializeComplexThings();
void InitializeStaticValues();
static void __cdecl InitializeMathObject(DynamicObject* mathObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
#ifdef ENABLE_WASM
static void __cdecl InitializeWebAssemblyObject(DynamicObject* WasmObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
#endif
// SIMD_JS
static void __cdecl InitializeSIMDObject(DynamicObject* simdObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
static void __cdecl InitializeSIMDOpCodeMaps();
template<typename SIMDTypeName>
static void SIMDPrototypeInitHelper(DynamicObject* simdPrototype, JavascriptLibrary* library, JavascriptFunction* constructorFn, JavascriptString* strLiteral);
static void __cdecl InitializeSIMDBool8x16Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
static void __cdecl InitializeSIMDBool16x8Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
static void __cdecl InitializeSIMDBool32x4Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
static void __cdecl InitializeSIMDInt8x16Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
static void __cdecl InitializeSIMDInt16x8Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
static void __cdecl InitializeSIMDInt32x4Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
static void __cdecl InitializeSIMDUint8x16Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
static void __cdecl InitializeSIMDUint16x8Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
static void __cdecl InitializeSIMDUint32x4Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
static void __cdecl InitializeSIMDFloat32x4Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
static void __cdecl InitializeSIMDFloat64x2Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
static void __cdecl InitializeJSONObject(DynamicObject* JSONObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
static void __cdecl InitializeEngineInterfaceObject(DynamicObject* engineInterface, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
static void __cdecl InitializeReflectObject(DynamicObject* reflectObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
#ifdef ENABLE_INTL_OBJECT
static void __cdecl InitializeIntlObject(DynamicObject* IntlEngineObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
#endif
#ifdef ENABLE_PROJECTION
void InitializeWinRTPromiseConstructor();
#endif
static void __cdecl InitializeIteratorPrototype(DynamicObject* iteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
static void __cdecl InitializeArrayIteratorPrototype(DynamicObject* arrayIteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
static void __cdecl InitializeMapIteratorPrototype(DynamicObject* mapIteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
static void __cdecl InitializeSetIteratorPrototype(DynamicObject* setIteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
static void __cdecl InitializeStringIteratorPrototype(DynamicObject* stringIteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
static void __cdecl InitializeGeneratorPrototype(DynamicObject* generatorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
static void __cdecl InitializeAsyncFunction(DynamicObject *function, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
RuntimeFunction* CreateBuiltinConstructor(FunctionInfo * functionInfo, DynamicTypeHandler * typeHandler, DynamicObject* prototype = nullptr);
void JavascriptLibrary::DefaultCreateFunction(ParseableFunctionInfo * functionInfo, int length, DynamicObject * prototype, PropertyId nameId);
RuntimeFunction* DefaultCreateFunction(FunctionInfo * functionInfo, int length, DynamicObject * prototype, DynamicType * functionType, PropertyId nameId);
RuntimeFunction* DefaultCreateFunction(FunctionInfo * functionInfo, int length, DynamicObject * prototype, DynamicType * functionType, Var nameId);
JavascriptFunction* AddFunction(DynamicObject* object, PropertyId propertyId, RuntimeFunction* function);
void AddMember(DynamicObject* object, PropertyId propertyId, Var value);
void AddMember(DynamicObject* object, PropertyId propertyId, Var value, PropertyAttributes attributes);
JavascriptString* CreateEmptyString();
static void __cdecl InitializeGeneratorFunction(DynamicObject* function, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
template<bool addPrototype>
static void __cdecl InitializeFunction(DynamicObject* function, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
static size_t const LibraryFunctionArgC[BuiltinFunction::Count + 1];
static int const LibraryFunctionFlags[BuiltinFunction::Count + 1]; // returns enum BuiltInFlags.
#if ENABLE_DEBUG_CONFIG_OPTIONS
static char16 const * const LibraryFunctionName[BuiltinFunction::Count + 1];
#endif
public:
virtual void Finalize(bool isShutdown) override;
#if DBG
void DumpLibraryByteCode();
#endif
private:
typedef JsUtil::BaseHashSet<Js::PropertyRecord const *, Recycler, PowerOf2SizePolicy> ReferencedPropertyRecordHashSet;
Field(ReferencedPropertyRecordHashSet*) referencedPropertyRecords;
ReferencedPropertyRecordHashSet * EnsureReferencedPropertyRecordList()
{
ReferencedPropertyRecordHashSet* pidList = this->referencedPropertyRecords;
if (pidList == nullptr)
{
pidList = RecyclerNew(this->recycler, ReferencedPropertyRecordHashSet, this->recycler, 173);
this->referencedPropertyRecords = pidList;
}
return pidList;
}
ReferencedPropertyRecordHashSet * GetReferencedPropertyRecordList() const
{
return this->referencedPropertyRecords;
}
HRESULT ProfilerRegisterObject();
HRESULT ProfilerRegisterArray();
HRESULT ProfilerRegisterBoolean();
HRESULT ProfilerRegisterDate();
HRESULT ProfilerRegisterFunction();
HRESULT ProfilerRegisterMath();
HRESULT ProfilerRegisterNumber();
HRESULT ProfilerRegisterString();
HRESULT ProfilerRegisterRegExp();
HRESULT ProfilerRegisterJSON();
HRESULT ProfilerRegisterMap();
HRESULT ProfilerRegisterSet();
HRESULT ProfilerRegisterWeakMap();
HRESULT ProfilerRegisterWeakSet();
HRESULT ProfilerRegisterSymbol();
HRESULT ProfilerRegisterIterator();
HRESULT ProfilerRegisterArrayIterator();
HRESULT ProfilerRegisterMapIterator();
HRESULT ProfilerRegisterSetIterator();
HRESULT ProfilerRegisterStringIterator();
HRESULT ProfilerRegisterTypedArray();
HRESULT ProfilerRegisterPromise();
HRESULT ProfilerRegisterProxy();
HRESULT ProfilerRegisterReflect();
HRESULT ProfilerRegisterGenerator();
HRESULT ProfilerRegisterSIMD();
HRESULT ProfilerRegisterAtomics();
#ifdef IR_VIEWER
HRESULT ProfilerRegisterIRViewer();
#endif /* IR_VIEWER */
};
}