JavascriptLibrary.h 82 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Copyright (c) 2021 ChakraCore Project Contributors. All rights reserved.
  4. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  5. //-------------------------------------------------------------------------------------------------------
  6. #pragma once
  7. #define InlineSlotCountIncrement (HeapConstants::ObjectGranularity / sizeof(Var))
  8. #define MaxPreInitializedObjectTypeInlineSlotCount 16
  9. #define MaxPreInitializedObjectHeaderInlinedTypeInlineSlotCount \
  10. (Js::DynamicTypeHandler::GetObjectHeaderInlinableSlotCapacity() + MaxPreInitializedObjectTypeInlineSlotCount)
  11. #define PreInitializedObjectTypeCount ((MaxPreInitializedObjectTypeInlineSlotCount / InlineSlotCountIncrement) + 1)
  12. CompileAssert(MaxPreInitializedObjectTypeInlineSlotCount <= USHRT_MAX);
  13. #include "StringCache.h"
  14. #include "Library/JavascriptGenerator.h"
  15. #include "Library/JavascriptAsyncGenerator.h"
  16. class ScriptSite;
  17. class ActiveScriptExternalLibrary;
  18. class EditAndContinue;
  19. class ChakraHostScriptContext;
  20. class JsrtExternalType;
  21. namespace Js
  22. {
  23. class RefCountedBuffer;
  24. static const unsigned int EvalMRUSize = 15;
  25. typedef JsUtil::BaseDictionary<DWORD_PTR, SourceContextInfo *, Recycler, PowerOf2SizePolicy> SourceContextInfoMap;
  26. typedef JsUtil::BaseDictionary<uint, SourceContextInfo *, Recycler, PowerOf2SizePolicy> DynamicSourceContextInfoMap;
  27. typedef JsUtil::BaseDictionary<EvalMapString, ScriptFunction*, RecyclerNonLeafAllocator, PrimeSizePolicy> SecondLevelEvalCache;
  28. typedef TwoLevelHashRecord<FastEvalMapString, ScriptFunction*, SecondLevelEvalCache, EvalMapString> EvalMapRecord;
  29. typedef JsUtil::Cache<FastEvalMapString, EvalMapRecord*, RecyclerNonLeafAllocator, PrimeSizePolicy, JsUtil::MRURetentionPolicy<FastEvalMapString, EvalMRUSize>, FastEvalMapStringComparer> EvalCacheTopLevelDictionary;
  30. typedef JsUtil::Cache<EvalMapString, FunctionInfo*, RecyclerNonLeafAllocator, PrimeSizePolicy, JsUtil::MRURetentionPolicy<EvalMapString, EvalMRUSize>> NewFunctionCache;
  31. typedef JsUtil::BaseDictionary<ParseableFunctionInfo*, ParseableFunctionInfo*, Recycler, PrimeSizePolicy, RecyclerPointerComparer> ParseableFunctionInfoMap;
  32. // This is the dictionary used by script context to cache the eval.
  33. typedef TwoLevelHashDictionary<FastEvalMapString, ScriptFunction*, EvalMapRecord, EvalCacheTopLevelDictionary, EvalMapString> EvalCacheDictionary;
  34. typedef JsUtil::BaseDictionary<JavascriptMethod, JavascriptFunction*, Recycler, PrimeSizePolicy> BuiltInLibraryFunctionMap;
  35. typedef JsUtil::BaseDictionary<uint, JavascriptString *, Recycler> StringMap;
  36. // valid if object!= NULL
  37. struct EnumeratedObjectCache
  38. {
  39. static const int kMaxCachedPropStrings = 16;
  40. Field(DynamicObject*) object;
  41. Field(DynamicType*) type;
  42. Field(PropertyString*) propertyStrings[kMaxCachedPropStrings];
  43. Field(int) validPropStrings;
  44. };
  45. struct PropertyStringMap
  46. {
  47. Field(PropertyString*) strLen2[80];
  48. inline static uint PStrMapIndex(char16 ch)
  49. {
  50. Assert(ch >= '0' && ch <= 'z');
  51. return ch - '0';
  52. }
  53. };
  54. struct Cache
  55. {
  56. static const uint AssignCacheSize = 16;
  57. static const uint StringifyCacheSize = 16;
  58. static const uint CreateKeysCacheSize = 16;
  59. Field(PropertyStringMap*) propertyStrings[80];
  60. Field(JavascriptString *) lastNumberToStringRadix10String;
  61. Field(EnumeratedObjectCache) enumObjCache;
  62. Field(JavascriptString *) lastUtcTimeFromStrString;
  63. Field(EvalCacheDictionary*) evalCacheDictionary;
  64. Field(EvalCacheDictionary*) indirectEvalCacheDictionary;
  65. Field(NewFunctionCache*) newFunctionCache;
  66. Field(StringMap *) integerStringMap;
  67. Field(RegexPatternMruMap *) dynamicRegexMap;
  68. Field(SourceContextInfoMap*) sourceContextInfoMap; // maps host provided context cookie to the URL of the script buffer passed.
  69. Field(DynamicSourceContextInfoMap*) dynamicSourceContextInfoMap;
  70. Field(SourceContextInfo*) noContextSourceContextInfo;
  71. Field(SRCINFO*) noContextGlobalSourceInfo;
  72. Field(Field(SRCINFO const *)*) moduleSrcInfo;
  73. Field(BuiltInLibraryFunctionMap*) builtInLibraryFunctions;
  74. Field(ScriptContextPolymorphicInlineCache*) toStringTagCache;
  75. Field(ScriptContextPolymorphicInlineCache*) toJSONCache;
  76. Field(EnumeratorCache*) assignCache;
  77. Field(EnumeratorCache*) stringifyCache;
  78. Field(EnumeratorCache*) createKeysCache;
  79. #if ENABLE_PROFILE_INFO
  80. #if DBG_DUMP || defined(DYNAMIC_PROFILE_STORAGE) || defined(RUNTIME_DATA_COLLECTION)
  81. Field(DynamicProfileInfoList*) profileInfoList;
  82. #endif
  83. #endif
  84. Cache() : toStringTagCache(nullptr), toJSONCache(nullptr), assignCache(nullptr), stringifyCache(nullptr) { }
  85. };
  86. class MissingPropertyTypeHandler;
  87. class SourceTextModuleRecord;
  88. class ArrayBufferBase;
  89. class SharedContents;
  90. typedef RecyclerFastAllocator<JavascriptNumber, LeafBit> RecyclerJavascriptNumberAllocator;
  91. typedef JsUtil::List<Var, Recycler> ListForListIterator;
  92. class UndeclaredBlockVariable : public RecyclableObject
  93. {
  94. friend class JavascriptLibrary;
  95. UndeclaredBlockVariable(Type* type) : RecyclableObject(type) { }
  96. };
  97. class SourceTextModuleRecord;
  98. typedef JsUtil::List<SourceTextModuleRecord*> ModuleRecordList;
  99. #if ENABLE_COPYONACCESS_ARRAY
  100. struct CacheForCopyOnAccessArraySegments
  101. {
  102. static const uint32 MAX_SIZE = 31;
  103. Field(SparseArraySegment<int32> *) cache[MAX_SIZE];
  104. Field(uint32) count;
  105. uint32 AddSegment(SparseArraySegment<int32> *segment)
  106. {
  107. cache[count++] = segment;
  108. return count;
  109. }
  110. SparseArraySegment<int32> *GetSegmentByIndex(byte index)
  111. {
  112. Assert(index <= MAX_SIZE);
  113. return cache[index - 1];
  114. }
  115. bool IsNotOverHardLimit()
  116. {
  117. return count < MAX_SIZE;
  118. }
  119. bool IsNotFull()
  120. {
  121. return count < (uint32) CONFIG_FLAG(CopyOnAccessArraySegmentCacheSize);
  122. }
  123. bool IsValidIndex(uint32 index)
  124. {
  125. return count && index && index <= count;
  126. }
  127. #if ENABLE_DEBUG_CONFIG_OPTIONS
  128. uint32 GetCount()
  129. {
  130. return count;
  131. }
  132. #endif
  133. };
  134. #endif
  135. class JavascriptLibrary : public JavascriptLibraryBase
  136. {
  137. friend class EditAndContinue;
  138. friend class ScriptSite;
  139. friend class GlobalObject;
  140. friend class ScriptContext;
  141. friend class EngineInterfaceObject;
  142. friend class ExternalLibraryBase;
  143. friend class ActiveScriptExternalLibrary;
  144. friend class IntlEngineInterfaceExtensionObject;
  145. #ifdef ENABLE_JS_BUILTINS
  146. friend class JsBuiltInEngineInterfaceExtensionObject;
  147. #endif
  148. friend class ChakraHostScriptContext;
  149. static const char16* domBuiltinPropertyNames[];
  150. public:
  151. #if ENABLE_COPYONACCESS_ARRAY
  152. Field(CacheForCopyOnAccessArraySegments *) cacheForCopyOnAccessArraySegments;
  153. #endif
  154. static DWORD GetScriptContextOffset() { return offsetof(JavascriptLibrary, scriptContext); }
  155. static DWORD GetUndeclBlockVarOffset() { return offsetof(JavascriptLibrary, undeclBlockVarSentinel); }
  156. static DWORD GetEmptyStringOffset() { return offsetof(JavascriptLibrary, emptyString); }
  157. static DWORD GetUndefinedValueOffset() { return offsetof(JavascriptLibrary, undefinedValue); }
  158. static DWORD GetNullValueOffset() { return offsetof(JavascriptLibrary, nullValue); }
  159. static DWORD GetBooleanTrueOffset() { return offsetof(JavascriptLibrary, booleanTrue); }
  160. static DWORD GetBooleanFalseOffset() { return offsetof(JavascriptLibrary, booleanFalse); }
  161. static DWORD GetNegativeZeroOffset() { return offsetof(JavascriptLibrary, negativeZero); }
  162. static DWORD GetNumberTypeStaticOffset() { return offsetof(JavascriptLibrary, numberTypeStatic); }
  163. static DWORD GetBigIntTypeStaticOffset() { return offsetof(JavascriptLibrary, bigintTypeStatic); }
  164. static DWORD GetObjectTypesOffset() { return offsetof(JavascriptLibrary, objectTypes); }
  165. static DWORD GetObjectHeaderInlinedTypesOffset() { return offsetof(JavascriptLibrary, objectHeaderInlinedTypes); }
  166. static DWORD GetRegexTypeOffset() { return offsetof(JavascriptLibrary, regexType); }
  167. static DWORD GetArrayConstructorOffset() { return offsetof(JavascriptLibrary, arrayConstructor); }
  168. static DWORD GetPositiveInfinityOffset() { return offsetof(JavascriptLibrary, positiveInfinite); }
  169. static DWORD GetNaNOffset() { return offsetof(JavascriptLibrary, nan); }
  170. static DWORD GetNativeIntArrayTypeOffset() { return offsetof(JavascriptLibrary, nativeIntArrayType); }
  171. #if ENABLE_COPYONACCESS_ARRAY
  172. static DWORD GetCopyOnAccessNativeIntArrayTypeOffset() { return offsetof(JavascriptLibrary, copyOnAccessNativeIntArrayType); }
  173. #endif
  174. static DWORD GetNativeFloatArrayTypeOffset() { return offsetof(JavascriptLibrary, nativeFloatArrayType); }
  175. static DWORD GetVTableAddressesOffset() { return offsetof(JavascriptLibrary, vtableAddresses); }
  176. static DWORD GetConstructorCacheDefaultInstanceOffset() { return offsetof(JavascriptLibrary, constructorCacheDefaultInstance); }
  177. static DWORD GetAbsDoubleCstOffset() { return offsetof(JavascriptLibrary, absDoubleCst); }
  178. static DWORD GetUintConvertConstOffset() { return offsetof(JavascriptLibrary, uintConvertConst); }
  179. static DWORD GetBuiltinFunctionsOffset() { return offsetof(JavascriptLibrary, builtinFunctions); }
  180. static DWORD GetCharStringCacheOffset() { return offsetof(JavascriptLibrary, charStringCache); }
  181. static DWORD GetCharStringCacheAOffset() { return GetCharStringCacheOffset() + CharStringCache::GetCharStringCacheAOffset(); }
  182. PolymorphicInlineCache *GetToStringTagCache() const { return cache.toStringTagCache; }
  183. const JavascriptLibraryBase* GetLibraryBase() const { return static_cast<const JavascriptLibraryBase*>(this); }
  184. void SetGlobalObject(GlobalObject* globalObject) {this->globalObject = globalObject; }
  185. static DWORD GetRandSeed0Offset() { return offsetof(JavascriptLibrary, randSeed0); }
  186. static DWORD GetRandSeed1Offset() { return offsetof(JavascriptLibrary, randSeed1); }
  187. static DWORD GetTypeDisplayStringsOffset() { return offsetof(JavascriptLibrary, typeDisplayStrings); }
  188. typedef bool (CALLBACK *PromiseContinuationCallback)(Var task, void *callbackState);
  189. Var GetUndeclBlockVar() const { return undeclBlockVarSentinel; }
  190. bool IsUndeclBlockVar(Var var) const { return var == undeclBlockVarSentinel; }
  191. static bool IsTypedArrayConstructor(Var constructor, ScriptContext* scriptContext);
  192. private:
  193. FieldNoBarrier(Recycler *) recycler;
  194. Field(ExternalLibraryBase*) externalLibraryList;
  195. Field(UndeclaredBlockVariable*) undeclBlockVarSentinel;
  196. Field(DynamicType *) generatorConstructorPrototypeObjectType;
  197. Field(DynamicType *) asyncGeneratorConstructorPrototypeObjectType;
  198. Field(DynamicType *) constructorPrototypeObjectType;
  199. Field(DynamicType *) heapArgumentsType;
  200. Field(DynamicType *) strictHeapArgumentsType;
  201. Field(DynamicType *) activationObjectType;
  202. Field(DynamicType *) arrayType;
  203. Field(DynamicType *) nativeIntArrayType;
  204. #if ENABLE_COPYONACCESS_ARRAY
  205. Field(DynamicType *) copyOnAccessNativeIntArrayType;
  206. #endif
  207. Field(DynamicType *) nativeFloatArrayType;
  208. Field(DynamicType *) arrayBufferType;
  209. Field(DynamicType *) sharedArrayBufferType;
  210. Field(DynamicType *) dataViewType;
  211. Field(DynamicType *) int8ArrayType;
  212. Field(DynamicType *) uint8ArrayType;
  213. Field(DynamicType *) uint8ClampedArrayType;
  214. Field(DynamicType *) int16ArrayType;
  215. Field(DynamicType *) uint16ArrayType;
  216. Field(DynamicType *) int32ArrayType;
  217. Field(DynamicType *) uint32ArrayType;
  218. Field(DynamicType *) float32ArrayType;
  219. Field(DynamicType *) float64ArrayType;
  220. Field(DynamicType *) int64ArrayType;
  221. Field(DynamicType *) uint64ArrayType;
  222. Field(DynamicType *) boolArrayType;
  223. Field(DynamicType *) charArrayType;
  224. Field(StaticType *) booleanTypeStatic;
  225. Field(DynamicType *) booleanTypeDynamic;
  226. Field(DynamicType *) bigintTypeDynamic;
  227. Field(StaticType *) bigintTypeStatic;
  228. Field(DynamicType *) dateType;
  229. Field(DynamicType *) symbolTypeDynamic;
  230. Field(StaticType *) symbolTypeStatic;
  231. Field(DynamicType *) iteratorResultType;
  232. Field(DynamicType *) awaitObjectType;
  233. Field(DynamicType *) resumeYieldObjectType;
  234. Field(DynamicType *) arrayIteratorType;
  235. Field(DynamicType *) mapIteratorType;
  236. Field(DynamicType *) setIteratorType;
  237. Field(DynamicType *) stringIteratorType;
  238. Field(DynamicType *) promiseType;
  239. Field(DynamicType *) listIteratorType;
  240. Field(JavascriptFunction*) builtinFunctions[BuiltinFunction::Count];
  241. Field(INT_PTR) vtableAddresses[VTableValue::Count];
  242. Field(JavascriptString*) typeDisplayStrings[TypeIds_Limit];
  243. Field(ConstructorCache *) constructorCacheDefaultInstance;
  244. __declspec(align(16)) Field(const BYTE *) absDoubleCst;
  245. Field(double const *) uintConvertConst;
  246. // Function Types
  247. Field(DynamicTypeHandler *) anonymousFunctionTypeHandler;
  248. Field(DynamicTypeHandler *) anonymousFunctionWithPrototypeTypeHandler;
  249. Field(DynamicTypeHandler *) functionTypeHandler;
  250. Field(DynamicTypeHandler *) functionTypeHandlerWithLength;
  251. Field(DynamicTypeHandler *) functionWithPrototypeAndLengthTypeHandler;
  252. Field(DynamicTypeHandler *) functionWithPrototypeTypeHandler;
  253. Field(DynamicTypeHandler *) classPrototypeTypeHandler;
  254. Field(DynamicType *) externalFunctionWithDeferredPrototypeType;
  255. Field(DynamicType *) externalFunctionWithLengthAndDeferredPrototypeType;
  256. Field(DynamicType *) wrappedFunctionWithDeferredPrototypeType;
  257. Field(DynamicType *) stdCallFunctionWithDeferredPrototypeType;
  258. Field(DynamicType *) idMappedFunctionWithPrototypeType;
  259. Field(DynamicType *) externalConstructorFunctionWithDeferredPrototypeType;
  260. Field(DynamicType *) defaultExternalConstructorFunctionWithDeferredPrototypeType;
  261. Field(DynamicType *) boundFunctionType;
  262. Field(DynamicType *) regexConstructorType;
  263. Field(DynamicType *) crossSiteDeferredFunctionType;
  264. Field(DynamicType *) crossSiteDeferredPrototypeFunctionType;
  265. Field(DynamicType *) crossSiteIdMappedFunctionWithPrototypeType;
  266. Field(DynamicType *) crossSiteExternalConstructFunctionWithPrototypeType;
  267. Field(StaticType *) enumeratorType;
  268. Field(DynamicType *) errorType;
  269. Field(DynamicType *) evalErrorType;
  270. Field(DynamicType *) rangeErrorType;
  271. Field(DynamicType *) referenceErrorType;
  272. Field(DynamicType *) syntaxErrorType;
  273. Field(DynamicType *) typeErrorType;
  274. Field(DynamicType *) uriErrorType;
  275. Field(DynamicType *) webAssemblyCompileErrorType;
  276. Field(DynamicType *) webAssemblyRuntimeErrorType;
  277. Field(DynamicType *) webAssemblyLinkErrorType;
  278. Field(StaticType *) numberTypeStatic;
  279. Field(StaticType *) int64NumberTypeStatic;
  280. Field(StaticType *) uint64NumberTypeStatic;
  281. Field(DynamicType *) webAssemblyModuleType;
  282. Field(DynamicType *) webAssemblyInstanceType;
  283. Field(DynamicType *) webAssemblyMemoryType;
  284. Field(DynamicType *) webAssemblyTableType;
  285. Field(DynamicType *) numberTypeDynamic;
  286. Field(DynamicType *) objectTypes[PreInitializedObjectTypeCount];
  287. Field(DynamicType *) objectHeaderInlinedTypes[PreInitializedObjectTypeCount];
  288. Field(DynamicType *) nullPrototypeObjectType;
  289. Field(DynamicType *) regexPrototypeType;
  290. Field(DynamicType *) regexType;
  291. Field(DynamicType *) regexResultType;
  292. Field(DynamicType *) stringTypeDynamic;
  293. Field(DynamicType *) mapType;
  294. Field(DynamicType *) setType;
  295. Field(DynamicType *) weakMapType;
  296. Field(DynamicType *) weakSetType;
  297. Field(DynamicType *) proxyType;
  298. Field(StaticType *) withType;
  299. Field(DynamicType *) SpreadArgumentType;
  300. Field(DynamicType *) moduleNamespaceType;
  301. Field(PropertyDescriptor) defaultPropertyDescriptor;
  302. Field(StringCache) stringCache; // cache string variables once they are used
  303. // no late caching is needed
  304. Field(JavascriptString*) nullString;
  305. Field(JavascriptString*) emptyString;
  306. // used implicitly by ChakraFull - don't late cache
  307. Field(JavascriptString*) symbolTypeDisplayString;
  308. Field(JavascriptString*) debuggerDeadZoneBlockVariableString;
  309. Field(DynamicObject*) missingPropertyHolder;
  310. Field(StaticType*) throwErrorObjectType;
  311. Field(PropertyStringCacheMap*) propertyStringMap;
  312. Field(SymbolCacheMap*) symbolMap;
  313. Field(ConstructorCache*) builtInConstructorCache;
  314. Field(DynamicObject*) chakraLibraryObject;
  315. #ifdef ENABLE_DEBUG_CONFIG_OPTIONS
  316. Field(JavascriptFunction*) debugObjectFaultInjectionCookieGetterFunction;
  317. Field(JavascriptFunction*) debugObjectFaultInjectionCookieSetterFunction;
  318. #endif
  319. Field(JavascriptFunction*) evalFunctionObject;
  320. Field(JavascriptFunction*) arrayPrototypeValuesFunction;
  321. Field(JavascriptFunction*) parseIntFunctionObject;
  322. Field(JavascriptFunction*) parseFloatFunctionObject;
  323. Field(JavascriptFunction*) arrayPrototypeToStringFunction;
  324. Field(JavascriptFunction*) arrayPrototypeToLocaleStringFunction;
  325. Field(JavascriptFunction*) identityFunction;
  326. Field(JavascriptFunction*) throwerFunction;
  327. Field(JavascriptFunction*) generatorReturnFunction;
  328. Field(JavascriptFunction*) generatorNextFunction;
  329. Field(JavascriptFunction*) generatorThrowFunction;
  330. Field(JavascriptFunction*) asyncGeneratorNextFunction;
  331. Field(JavascriptFunction*) asyncGeneratorReturnFunction;
  332. Field(JavascriptFunction*) asyncGeneratorThrowFunction;
  333. Field(JavascriptFunction*) asyncFromSyncIteratorNextFunction;
  334. Field(JavascriptFunction*) asyncFromSyncIteratorReturnFunction;
  335. Field(JavascriptFunction*) asyncFromSyncIteratorThrowFunction;
  336. Field(RuntimeFunction*) asyncFromSyncIteratorValueUnwrapFalseFunction;
  337. Field(RuntimeFunction*) asyncFromSyncIteratorValueUnwrapTrueFunction;
  338. Field(JavascriptFunction*) objectValueOfFunction;
  339. Field(JavascriptFunction*) objectToStringFunction;
  340. #ifdef ENABLE_JS_BUILTINS
  341. Field(JavascriptFunction*) isArrayFunction;
  342. #endif
  343. #ifdef ENABLE_WASM
  344. Field(DynamicObject*) webAssemblyObject;
  345. Field(JavascriptFunction*) webAssemblyQueryResponseFunction;
  346. Field(JavascriptFunction*) webAssemblyCompileFunction;
  347. Field(JavascriptFunction*) webAssemblyInstantiateBoundFunction;
  348. #endif
  349. Field(JavascriptSymbol*) symbolMatch;
  350. Field(JavascriptSymbol*) symbolReplace;
  351. Field(JavascriptSymbol*) symbolSearch;
  352. Field(JavascriptSymbol*) symbolSplit;
  353. Field(UnifiedRegex::RegexPattern *) emptyRegexPattern;
  354. Field(JavascriptFunction*) regexExecFunction;
  355. Field(JavascriptFunction*) regexFlagsGetterFunction;
  356. Field(JavascriptFunction*) regexGlobalGetterFunction;
  357. Field(JavascriptFunction*) regexStickyGetterFunction;
  358. Field(JavascriptFunction*) regexDotAllGetterFunction;
  359. Field(JavascriptFunction*) regexUnicodeGetterFunction;
  360. Field(RuntimeFunction*) sharedArrayBufferConstructor;
  361. Field(DynamicObject*) sharedArrayBufferPrototype;
  362. Field(DynamicObject*) atomicsObject;
  363. Field(DynamicObject*) webAssemblyCompileErrorPrototype;
  364. Field(RuntimeFunction*) webAssemblyCompileErrorConstructor;
  365. Field(DynamicObject*) webAssemblyRuntimeErrorPrototype;
  366. Field(RuntimeFunction*) webAssemblyRuntimeErrorConstructor;
  367. Field(DynamicObject*) webAssemblyLinkErrorPrototype;
  368. Field(RuntimeFunction*) webAssemblyLinkErrorConstructor;
  369. Field(DynamicObject*) webAssemblyMemoryPrototype;
  370. Field(RuntimeFunction*) webAssemblyMemoryConstructor;
  371. Field(DynamicObject*) webAssemblyModulePrototype;
  372. Field(RuntimeFunction*) webAssemblyModuleConstructor;
  373. Field(DynamicObject*) webAssemblyInstancePrototype;
  374. Field(RuntimeFunction*) webAssemblyInstanceConstructor;
  375. Field(DynamicObject*) webAssemblyTablePrototype;
  376. Field(RuntimeFunction*) webAssemblyTableConstructor;
  377. Field(int) regexConstructorSlotIndex;
  378. Field(int) regexExecSlotIndex;
  379. Field(int) regexFlagsGetterSlotIndex;
  380. Field(int) regexGlobalGetterSlotIndex;
  381. Field(int) regexStickyGetterSlotIndex;
  382. Field(int) regexDotAllGetterSlotIndex;
  383. Field(int) regexUnicodeGetterSlotIndex;
  384. mutable Field(CharStringCache) charStringCache;
  385. FieldNoBarrier(PromiseContinuationCallback) nativeHostPromiseContinuationFunction;
  386. Field(void *) nativeHostPromiseContinuationFunctionState;
  387. typedef SList<Js::FunctionProxy*, Recycler> FunctionReferenceList;
  388. #ifdef _CHAKRACOREBUILD
  389. struct JsrtExternalCallbacks
  390. {
  391. JsrtExternalCallbacks() : traceCallback(0), finalizeCallback(0), prototype(0) {}
  392. JsrtExternalCallbacks(uintptr_t traceCallback, uintptr_t finalizeCallback, uintptr_t prototype) : traceCallback(traceCallback), finalizeCallback(finalizeCallback), prototype(prototype) {}
  393. uintptr_t traceCallback;
  394. uintptr_t finalizeCallback;
  395. uintptr_t prototype;
  396. operator hash_t() const { return (hash_t)(traceCallback ^ finalizeCallback ^ prototype); }
  397. };
  398. #else
  399. struct JsrtExternalCallbacks
  400. {
  401. JsrtExternalCallbacks() : finalizeCallback(0), prototype(0) {}
  402. JsrtExternalCallbacks(uintptr_t finalizeCallback, uintptr_t prototype) : finalizeCallback(finalizeCallback), prototype(prototype) {}
  403. uintptr_t finalizeCallback;
  404. uintptr_t prototype;
  405. operator hash_t() const { return (hash_t)(finalizeCallback ^ prototype); }
  406. };
  407. #endif
  408. typedef JsUtil::WeakReferenceDictionary<JsrtExternalCallbacks, DynamicType, DictionarySizePolicy<PowerOf2Policy, 1>> JsrtExternalTypesCache;
  409. Field(void *) bindRefChunkBegin;
  410. Field(Field(void*)*) bindRefChunkCurrent;
  411. Field(Field(void*)*) bindRefChunkEnd;
  412. Field(TypePath*) rootPath; // this should be in library instead of ScriptContext::Cache
  413. Field(Js::Cache) cache;
  414. Field(FunctionReferenceList*) dynamicFunctionReference;
  415. Field(uint) dynamicFunctionReferenceDepth;
  416. Field(FinalizableObject*) jsrtContextObject;
  417. Field(JsrtExternalTypesCache*) jsrtExternalTypesCache;
  418. Field(FunctionBody*) fakeGlobalFuncForUndefer;
  419. struct CustomExternalWrapperCallbacks
  420. {
  421. CustomExternalWrapperCallbacks() : traceCallback(0), finalizeCallback(0), interceptors(0), prototype(0) {}
  422. CustomExternalWrapperCallbacks(uintptr_t traceCallback, uintptr_t finalizeCallback, uintptr_t interceptors, uintptr_t prototype) : traceCallback(traceCallback), finalizeCallback(finalizeCallback), interceptors(interceptors), prototype(prototype) {}
  423. uintptr_t traceCallback;
  424. uintptr_t finalizeCallback;
  425. uintptr_t interceptors;
  426. uintptr_t prototype;
  427. operator hash_t() const { return (hash_t)(traceCallback ^ finalizeCallback ^ interceptors ^ prototype); }
  428. };
  429. typedef JsUtil::WeakReferenceDictionary<CustomExternalWrapperCallbacks, DynamicType, DictionarySizePolicy<PowerOf2Policy, 1>> CustomExternalWrapperTypesCache;
  430. Field(CustomExternalWrapperTypesCache*) customExternalWrapperTypesCache;
  431. Field(ModuleRecordList*) moduleRecordList;
  432. Field(OnlyWritablePropertyProtoChainCache) typesWithOnlyWritablePropertyProtoChain;
  433. Field(NoSpecialPropertyProtoChainCache) typesWithNoSpecialPropertyProtoChain;
  434. Field(uint64) randSeed0, randSeed1;
  435. Field(bool) isPRNGSeeded;
  436. Field(bool) inProfileMode;
  437. Field(bool) inDispatchProfileMode;
  438. Field(bool) arrayObjectHasUserDefinedSpecies;
  439. JavascriptFunction * AddFunctionToLibraryObjectWithPrototype(DynamicObject * object, PropertyId propertyId, FunctionInfo * functionInfo, int length, DynamicObject * prototype = nullptr, DynamicType * functionType = nullptr);
  440. JavascriptFunction * AddFunctionToLibraryObject(DynamicObject* object, PropertyId propertyId, FunctionInfo * functionInfo, int length, PropertyAttributes attributes = PropertyBuiltInMethodDefaults);
  441. JavascriptFunction * AddFunctionToLibraryObjectWithName(DynamicObject* object, PropertyId propertyId, PropertyId nameId, FunctionInfo * functionInfo, int length);
  442. RuntimeFunction* AddGetterToLibraryObject(DynamicObject* object, PropertyId propertyId, FunctionInfo* functionInfo);
  443. void AddAccessorsToLibraryObject(DynamicObject* object, PropertyId propertyId, FunctionInfo * getterFunctionInfo, FunctionInfo * setterFunctionInfo);
  444. void AddAccessorsToLibraryObject(DynamicObject* object, PropertyId propertyId, RecyclableObject * getterFunction, RecyclableObject * setterFunction);
  445. void AddAccessorsToLibraryObjectWithName(DynamicObject* object, PropertyId propertyId, PropertyId nameId, FunctionInfo * getterFunctionInfo, FunctionInfo * setterFunction);
  446. void AddSpeciesAccessorsToLibraryObject(DynamicObject* object, FunctionInfo * getterFunctionInfo);
  447. RuntimeFunction * CreateGetterFunction(PropertyId nameId, FunctionInfo* functionInfo);
  448. RuntimeFunction * CreateSetterFunction(PropertyId nameId, FunctionInfo* functionInfo);
  449. template <size_t N>
  450. JavascriptFunction * AddFunctionToLibraryObjectWithPropertyName(DynamicObject* object, const char16(&propertyName)[N], FunctionInfo * functionInfo, int length);
  451. static SimpleTypeHandler<1> SharedPrototypeTypeHandler;
  452. static SimpleTypeHandler<1> SharedFunctionWithoutPrototypeTypeHandler;
  453. static SimpleTypeHandler<1> SharedFunctionWithPrototypeTypeHandlerV11;
  454. static SimpleTypeHandler<2> SharedFunctionWithPrototypeTypeHandler;
  455. static SimpleTypeHandler<1> SharedFunctionWithConfigurableLengthTypeHandler;
  456. static SimpleTypeHandler<1> SharedFunctionWithLengthTypeHandler;
  457. static SimpleTypeHandler<2> SharedFunctionWithLengthAndNameTypeHandler;
  458. static SimpleTypeHandler<2> SharedIdMappedFunctionWithPrototypeTypeHandler;
  459. static SimpleTypeHandler<1> SharedNamespaceSymbolTypeHandler;
  460. static SimpleTypeHandler<3> SharedFunctionWithPrototypeLengthAndNameTypeHandler;
  461. static SimpleTypeHandler<2> SharedFunctionWithPrototypeAndLengthTypeHandler;
  462. static SimpleTypeHandler<2> SharedFunctionWithNonWritablePrototypeAndLengthTypeHandler;
  463. static SimpleTypeHandler<3> SharedFunctionWithNonWritablePrototypeLengthAndNameTypeHandler;
  464. static MissingPropertyTypeHandler MissingPropertyHolderTypeHandler;
  465. static SimplePropertyDescriptor const SharedFunctionPropertyDescriptors[2];
  466. static SimplePropertyDescriptor const SharedIdMappedFunctionPropertyDescriptors[2];
  467. static SimplePropertyDescriptor const HeapArgumentsPropertyDescriptors[3];
  468. static SimplePropertyDescriptor const FunctionWithLengthAndPrototypeTypeDescriptors[2];
  469. static SimplePropertyDescriptor const FunctionWithLengthAndNameTypeDescriptors[2];
  470. static SimplePropertyDescriptor const FunctionWithPrototypeLengthAndNameTypeDescriptors[3];
  471. static SimplePropertyDescriptor const FunctionWithPrototypeAndLengthTypeDescriptors[2];
  472. static SimplePropertyDescriptor const FunctionWithNonWritablePrototypeAndLengthTypeDescriptors[2];
  473. static SimplePropertyDescriptor const FunctionWithNonWritablePrototypeLengthAndNameTypeDescriptors[3];
  474. static SimplePropertyDescriptor const ModuleNamespaceTypeDescriptors[1];
  475. static SimplePropertyDescriptor const ClassPrototypePropertyDescriptors[1];
  476. public:
  477. static const ObjectInfoBits EnumFunctionClass = EnumClass_1_Bit;
  478. static void InitializeProperties(ThreadContext * threadContext);
  479. JavascriptLibrary(GlobalObject* globalObject, Recycler * recycler) :
  480. JavascriptLibraryBase(globalObject),
  481. inProfileMode(false),
  482. inDispatchProfileMode(false),
  483. propertyStringMap(nullptr),
  484. symbolMap(nullptr),
  485. parseIntFunctionObject(nullptr),
  486. evalFunctionObject(nullptr),
  487. parseFloatFunctionObject(nullptr),
  488. arrayPrototypeToLocaleStringFunction(nullptr),
  489. arrayPrototypeToStringFunction(nullptr),
  490. identityFunction(nullptr),
  491. throwerFunction(nullptr),
  492. jsrtContextObject(nullptr),
  493. jsrtExternalTypesCache(nullptr),
  494. customExternalWrapperTypesCache(nullptr),
  495. fakeGlobalFuncForUndefer(nullptr),
  496. externalLibraryList(nullptr),
  497. #if ENABLE_COPYONACCESS_ARRAY
  498. cacheForCopyOnAccessArraySegments(nullptr),
  499. #endif
  500. referencedPropertyRecords(nullptr),
  501. moduleRecordList(nullptr),
  502. rootPath(nullptr),
  503. bindRefChunkBegin(nullptr),
  504. bindRefChunkCurrent(nullptr),
  505. bindRefChunkEnd(nullptr),
  506. dynamicFunctionReference(nullptr),
  507. typesWithOnlyWritablePropertyProtoChain(recycler),
  508. typesWithNoSpecialPropertyProtoChain(recycler)
  509. {
  510. this->globalObject = globalObject;
  511. }
  512. void Initialize(ScriptContext* scriptContext, GlobalObject * globalObject);
  513. void Uninitialize();
  514. GlobalObject* GetGlobalObject() const { return globalObject; }
  515. ScriptContext* GetScriptContext() const { return scriptContext; }
  516. Recycler * GetRecycler() const { return recycler; }
  517. Var GetTrueOrFalse(BOOL value) { return value ? booleanTrue : booleanFalse; }
  518. JavascriptSymbol* GetSymbolMatch() { return symbolMatch; }
  519. JavascriptSymbol* GetSymbolReplace() { return symbolReplace; }
  520. JavascriptSymbol* GetSymbolSearch() { return symbolSearch; }
  521. JavascriptSymbol* GetSymbolSplit() { return symbolSplit; }
  522. JavascriptSymbol* GetSymbolSpecies() { return symbolSpecies; }
  523. JavascriptString* GetNullString() { return nullString; }
  524. JavascriptString* GetEmptyString() const;
  525. #define STRING(name, str) JavascriptString* Get##name##String() { return stringCache.Get##name(); }
  526. #define PROPERTY_STRING(name, str) STRING(name, str)
  527. #include "StringCacheList.h"
  528. #undef PROPERTY_STRING
  529. #undef STRING
  530. JavascriptString* GetSymbolTypeDisplayString() const { return symbolTypeDisplayString; }
  531. JavascriptString* GetDebuggerDeadZoneBlockVariableString() { Assert(debuggerDeadZoneBlockVariableString); return debuggerDeadZoneBlockVariableString; }
  532. JavascriptRegExp* CreateEmptyRegExp();
  533. JavascriptFunction* GetEvalFunctionObject() { return evalFunctionObject; }
  534. JavascriptFunction* GetArrayIteratorPrototypeBuiltinNextFunction() { return arrayIteratorPrototypeBuiltinNextFunction; }
  535. DynamicObject* GetReflectObject() const { return reflectObject; }
  536. const PropertyDescriptor* GetDefaultPropertyDescriptor() const { return &defaultPropertyDescriptor; }
  537. DynamicObject* GetMissingPropertyHolder() const { return missingPropertyHolder; }
  538. JavascriptFunction* GetSharedArrayBufferConstructor() { return sharedArrayBufferConstructor; }
  539. DynamicObject* GetAtomicsObject() { return atomicsObject; }
  540. DynamicObject* GetWebAssemblyCompileErrorPrototype() const { return webAssemblyCompileErrorPrototype; }
  541. DynamicObject* GetWebAssemblyCompileErrorConstructor() const { return webAssemblyCompileErrorConstructor; }
  542. DynamicObject* GetWebAssemblyRuntimeErrorPrototype() const { return webAssemblyRuntimeErrorPrototype; }
  543. DynamicObject* GetWebAssemblyRuntimeErrorConstructor() const { return webAssemblyRuntimeErrorConstructor; }
  544. DynamicObject* GetWebAssemblyLinkErrorPrototype() const { return webAssemblyLinkErrorPrototype; }
  545. DynamicObject* GetWebAssemblyLinkErrorConstructor() const { return webAssemblyLinkErrorConstructor; }
  546. DynamicObject* GetChakraLib() const { return chakraLibraryObject; }
  547. #if ENABLE_TTD
  548. Js::PropertyId ExtractPrimitveSymbolId_TTD(Var value);
  549. Js::RecyclableObject* CreatePrimitveSymbol_TTD(Js::PropertyId pid);
  550. Js::RecyclableObject* CreatePrimitveSymbol_TTD(Js::JavascriptString* str);
  551. Js::RecyclableObject* CreateDefaultBoxedObject_TTD(Js::TypeId kind);
  552. void SetBoxedObjectValue_TTD(Js::RecyclableObject* obj, Js::Var value);
  553. Js::RecyclableObject* CreateDate_TTD(double value);
  554. Js::RecyclableObject* CreateRegex_TTD(const char16* patternSource, uint32 patternLength, UnifiedRegex::RegexFlags flags, CharCount lastIndex, Js::Var lastVar);
  555. Js::RecyclableObject* CreateError_TTD();
  556. Js::RecyclableObject* CreateES5Array_TTD();
  557. static void SetLengthWritableES5Array_TTD(Js::RecyclableObject* es5Array, bool isLengthWritable);
  558. Js::RecyclableObject* CreateSet_TTD();
  559. Js::RecyclableObject* CreateWeakSet_TTD();
  560. static void AddSetElementInflate_TTD(Js::JavascriptSet* set, Var value);
  561. static void AddWeakSetElementInflate_TTD(Js::JavascriptWeakSet* set, Var value);
  562. Js::RecyclableObject* CreateMap_TTD();
  563. Js::RecyclableObject* CreateWeakMap_TTD();
  564. static void AddMapElementInflate_TTD(Js::JavascriptMap* map, Var key, Var value);
  565. static void AddWeakMapElementInflate_TTD(Js::JavascriptWeakMap* map, Var key, Var value);
  566. Js::RecyclableObject* CreateExternalFunction_TTD(Js::Var fname);
  567. Js::RecyclableObject* CreateBoundFunction_TTD(
  568. RecyclableObject* function, Var bThis, uint32 ct, Field(Var)* args);
  569. Js::RecyclableObject* CreateProxy_TTD(RecyclableObject* handler, RecyclableObject* target);
  570. Js::RecyclableObject* CreateRevokeFunction_TTD(RecyclableObject* proxy);
  571. Js::RecyclableObject* CreateHeapArguments_TTD(uint32 numOfArguments, uint32 formalCount, ActivationObject* frameObject, byte* deletedArray);
  572. Js::RecyclableObject* CreateES5HeapArguments_TTD(uint32 numOfArguments, uint32 formalCount, ActivationObject* frameObject, byte* deletedArray);
  573. Js::JavascriptPromiseCapability* CreatePromiseCapability_TTD(Var promise, Var resolve, Var reject);
  574. Js::JavascriptPromiseReaction* CreatePromiseReaction_TTD(RecyclableObject* handler, JavascriptPromiseCapability* capabilities);
  575. Js::RecyclableObject* CreatePromise_TTD(uint32 status, bool isHandled, Var result, SList<Js::JavascriptPromiseReaction*, HeapAllocator>& resolveReactions, SList<Js::JavascriptPromiseReaction*, HeapAllocator>& rejectReactions);
  576. JavascriptPromiseResolveOrRejectFunctionAlreadyResolvedWrapper* CreateAlreadyDefinedWrapper_TTD(bool alreadyDefined);
  577. Js::RecyclableObject* CreatePromiseResolveOrRejectFunction_TTD(RecyclableObject* promise, bool isReject, JavascriptPromiseResolveOrRejectFunctionAlreadyResolvedWrapper* alreadyResolved);
  578. Js::RecyclableObject* CreatePromiseReactionTaskFunction_TTD(JavascriptPromiseReaction* reaction, Var argument);
  579. Js::JavascriptPromiseAllResolveElementFunctionRemainingElementsWrapper* CreateRemainingElementsWrapper_TTD(Js::ScriptContext* ctx, uint32 value);
  580. Js::JavascriptPromiseResolveOrRejectFunctionAlreadyResolvedWrapper* CreateAlreadyCalledWrapper_TTD(Js::ScriptContext* ctx, bool value);
  581. Js::RecyclableObject* CreatePromiseAllResolveElementFunction_TTD(Js::JavascriptPromiseCapability* capabilities, uint32 index, Js::JavascriptPromiseAllResolveElementFunctionRemainingElementsWrapper* wrapper, Js::RecyclableObject* values, bool alreadyCalled);
  582. Js::RecyclableObject* CreatePromiseAllSettledResolveOrRejectElementFunction_TTD(Js::JavascriptPromiseCapability* capabilities, uint32 index, Js::JavascriptPromiseAllResolveElementFunctionRemainingElementsWrapper* wrapper, Js::RecyclableObject* values, JavascriptPromiseResolveOrRejectFunctionAlreadyResolvedWrapper* alreadyCalledWrapper, bool isRejecting);
  583. Js::RecyclableObject* CreateJavascriptGenerator_TTD(Js::ScriptContext *ctx,
  584. Js::RecyclableObject *prototype, Js::Arguments &arguments,
  585. Js::JavascriptGenerator::GeneratorState generatorState);
  586. #endif
  587. #ifdef ENABLE_INTL_OBJECT
  588. void ResetIntlObject();
  589. void EnsureIntlObjectReady();
  590. template <class Fn>
  591. void InitializeIntlForPrototypes(Fn fn);
  592. void InitializeIntlForStringPrototype();
  593. void InitializeIntlForDatePrototype();
  594. void InitializeIntlForNumberPrototype();
  595. #endif
  596. #ifdef ENABLE_JS_BUILTINS
  597. void EnsureArrayBuiltInsAreReady();
  598. void EnsureMathBuiltInsAreReady();
  599. static bool __cdecl InitializeChakraLibraryObject(DynamicObject* chakraLibraryObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  600. #endif
  601. #ifdef ENABLE_DEBUG_CONFIG_OPTIONS
  602. DynamicType * GetDebugDisposableObjectType() { return debugDisposableObjectType; }
  603. DynamicType * GetDebugFuncExecutorInDisposeObjectType() { return debugFuncExecutorInDisposeObjectType; }
  604. #endif
  605. DynamicType* GetErrorType(ErrorTypeEnum typeToCreate) const;
  606. StaticType * GetBooleanTypeStatic() const { return booleanTypeStatic; }
  607. DynamicType * GetBooleanTypeDynamic() const { return booleanTypeDynamic; }
  608. DynamicType * GetDateType() const { return dateType; }
  609. StaticType * GetBigIntTypeStatic() const { return bigintTypeStatic; }
  610. DynamicType * GetBigIntTypeDynamic() const { return bigintTypeDynamic; }
  611. DynamicType * GetBoundFunctionType() const { return boundFunctionType; }
  612. DynamicType * GetRegExpConstructorType() const { return regexConstructorType; }
  613. StaticType * GetEnumeratorType() const { return enumeratorType; }
  614. DynamicType * GetSpreadArgumentType() const { return SpreadArgumentType; }
  615. StaticType * GetWithType() const { return withType; }
  616. DynamicType * GetErrorType() const { return errorType; }
  617. DynamicType * GetEvalErrorType() const { return evalErrorType; }
  618. DynamicType * GetRangeErrorType() const { return rangeErrorType; }
  619. DynamicType * GetReferenceErrorType() const { return referenceErrorType; }
  620. DynamicType * GetSyntaxErrorType() const { return syntaxErrorType; }
  621. DynamicType * GetTypeErrorType() const { return typeErrorType; }
  622. DynamicType * GetURIErrorType() const { return uriErrorType; }
  623. DynamicType * GetWebAssemblyCompileErrorType() const { return webAssemblyCompileErrorType; }
  624. DynamicType * GetWebAssemblyRuntimeErrorType() const { return webAssemblyRuntimeErrorType; }
  625. DynamicType * GetWebAssemblyLinkErrorType() const { return webAssemblyLinkErrorType; }
  626. StaticType * GetNumberTypeStatic() const { return numberTypeStatic; }
  627. StaticType * GetInt64TypeStatic() const { return int64NumberTypeStatic; }
  628. StaticType * GetUInt64TypeStatic() const { return uint64NumberTypeStatic; }
  629. DynamicType * GetNumberTypeDynamic() const { return numberTypeDynamic; }
  630. DynamicType * GetPromiseType() const { return promiseType; }
  631. DynamicType * GetWebAssemblyModuleType() const { return webAssemblyModuleType; }
  632. DynamicType * GetWebAssemblyInstanceType() const { return webAssemblyInstanceType; }
  633. DynamicType * GetWebAssemblyMemoryType() const { return webAssemblyMemoryType; }
  634. DynamicType * GetWebAssemblyTableType() const { return webAssemblyTableType; }
  635. DynamicType * GetGeneratorConstructorPrototypeObjectType() const { return generatorConstructorPrototypeObjectType; }
  636. DynamicType * GetAsyncGeneratorConstructorPrototypeObjectType() const { return asyncGeneratorConstructorPrototypeObjectType; }
  637. DynamicType * GetResumeYieldObjectType() const { return resumeYieldObjectType; }
  638. DynamicType * GetAwaitObjectType() const { return awaitObjectType; }
  639. #ifdef ENABLE_WASM
  640. JavascriptFunction* GetWebAssemblyQueryResponseFunction() const { return webAssemblyQueryResponseFunction; }
  641. JavascriptFunction* GetWebAssemblyCompileFunction() const { return webAssemblyCompileFunction; }
  642. JavascriptFunction* GetWebAssemblyInstantiateBoundFunction() const { return webAssemblyInstantiateBoundFunction; }
  643. #endif
  644. DynamicType * GetObjectLiteralType(uint16 requestedInlineSlotCapacity);
  645. DynamicType * GetObjectHeaderInlinedLiteralType(uint16 requestedInlineSlotCapacity);
  646. DynamicType * GetObjectType() const { return objectTypes[0]; }
  647. DynamicType * GetNullPrototypeObjectType() const { return nullPrototypeObjectType; }
  648. DynamicType * GetObjectHeaderInlinedType() const { return objectHeaderInlinedTypes[0]; }
  649. StaticType * GetSymbolTypeStatic() const { return symbolTypeStatic; }
  650. DynamicType * GetSymbolTypeDynamic() const { return symbolTypeDynamic; }
  651. DynamicType * GetProxyType() const { return proxyType; }
  652. DynamicType * GetHeapArgumentsObjectType() const { return heapArgumentsType; }
  653. DynamicType * GetActivationObjectType() const { return activationObjectType; }
  654. DynamicType * GetModuleNamespaceType() const { return moduleNamespaceType; }
  655. DynamicType * GetArrayType() const { return arrayType; }
  656. DynamicType * GetNativeIntArrayType() const { return nativeIntArrayType; }
  657. #if ENABLE_COPYONACCESS_ARRAY
  658. DynamicType * GetCopyOnAccessNativeIntArrayType() const { return copyOnAccessNativeIntArrayType; }
  659. #endif
  660. DynamicType * GetNativeFloatArrayType() const { return nativeFloatArrayType; }
  661. DynamicType * GetRegexPrototypeType() const { return regexPrototypeType; }
  662. DynamicType * GetRegexType() const { return regexType; }
  663. DynamicType * GetRegexResultType() const { return regexResultType; }
  664. DynamicType * GetArrayBufferType() const { return arrayBufferType; }
  665. StaticType * GetStringTypeStatic() const { return stringCache.GetStringTypeStatic(); }
  666. DynamicType * GetStringTypeDynamic() const { return stringTypeDynamic; }
  667. void EnsureDebugObject(DynamicObject* newDebugObject);
  668. DynamicObject* GetDebugObject() const { Assert(debugObject != nullptr); return debugObject; }
  669. DynamicType * GetMapType() const { return mapType; }
  670. DynamicType * GetSetType() const { return setType; }
  671. DynamicType * GetWeakMapType() const { return weakMapType; }
  672. DynamicType * GetWeakSetType() const { return weakSetType; }
  673. DynamicType * GetArrayIteratorType() const { return arrayIteratorType; }
  674. DynamicType * GetMapIteratorType() const { return mapIteratorType; }
  675. DynamicType * GetSetIteratorType() const { return setIteratorType; }
  676. DynamicType * GetStringIteratorType() const { return stringIteratorType; }
  677. DynamicType * GetListIteratorType() const { return listIteratorType; }
  678. JavascriptFunction* GetDefaultAccessorFunction() const { return defaultAccessorFunction; }
  679. JavascriptFunction* GetStackTraceAccessorFunction() const { return stackTraceAccessorFunction; }
  680. JavascriptFunction* GetThrowTypeErrorRestrictedPropertyAccessorFunction() const { return throwTypeErrorRestrictedPropertyAccessorFunction; }
  681. JavascriptFunction* Get__proto__getterFunction() const { return __proto__getterFunction; }
  682. JavascriptFunction* Get__proto__setterFunction() const { return __proto__setterFunction; }
  683. JavascriptFunction* GetObjectValueOfFunction() const { return objectValueOfFunction; }
  684. JavascriptFunction* GetObjectToStringFunction() const { return objectToStringFunction; }
  685. JavascriptFunction* GetDebugObjectNonUserGetterFunction() const { return debugObjectNonUserGetterFunction; }
  686. JavascriptFunction* GetDebugObjectNonUserSetterFunction() const { return debugObjectNonUserSetterFunction; }
  687. UnifiedRegex::RegexPattern * GetEmptyRegexPattern() const { return emptyRegexPattern; }
  688. JavascriptFunction* GetRegexExecFunction() const { return regexExecFunction; }
  689. JavascriptFunction* GetRegexFlagsGetterFunction() const { return regexFlagsGetterFunction; }
  690. JavascriptFunction* GetRegexGlobalGetterFunction() const { return regexGlobalGetterFunction; }
  691. JavascriptFunction* GetRegexStickyGetterFunction() const { return regexStickyGetterFunction; }
  692. JavascriptFunction* GetRegexDotAllGetterFunction() const { return regexDotAllGetterFunction; }
  693. JavascriptFunction* GetRegexUnicodeGetterFunction() const { return regexUnicodeGetterFunction; }
  694. int GetRegexConstructorSlotIndex() const { return regexConstructorSlotIndex; }
  695. int GetRegexExecSlotIndex() const { return regexExecSlotIndex; }
  696. int GetRegexFlagsGetterSlotIndex() const { return regexFlagsGetterSlotIndex; }
  697. int GetRegexGlobalGetterSlotIndex() const { return regexGlobalGetterSlotIndex; }
  698. int GetRegexStickyGetterSlotIndex() const { return regexStickyGetterSlotIndex; }
  699. int GetRegexDotAllGetterSlotIndex() const { return regexDotAllGetterSlotIndex; }
  700. int GetRegexUnicodeGetterSlotIndex() const { return regexUnicodeGetterSlotIndex; }
  701. TypePath* GetRootPath() const { return rootPath; }
  702. void BindReference(void * addr);
  703. void CleanupForClose();
  704. void BeginDynamicFunctionReferences();
  705. void EndDynamicFunctionReferences();
  706. void RegisterDynamicFunctionReference(FunctionProxy* func);
  707. void SetDebugObjectNonUserAccessor(FunctionInfo *funcGetter, FunctionInfo *funcSetter);
  708. JavascriptFunction* GetDebugObjectDebugModeGetterFunction() const { return debugObjectDebugModeGetterFunction; }
  709. void SetDebugObjectDebugModeAccessor(FunctionInfo *funcGetter);
  710. #ifdef ENABLE_DEBUG_CONFIG_OPTIONS
  711. JavascriptFunction* GetDebugObjectFaultInjectionCookieGetterFunction() const { return debugObjectFaultInjectionCookieGetterFunction; }
  712. JavascriptFunction* GetDebugObjectFaultInjectionCookieSetterFunction() const { return debugObjectFaultInjectionCookieSetterFunction; }
  713. void SetDebugObjectFaultInjectionCookieGetterAccessor(FunctionInfo *funcGetter, FunctionInfo *funcSetter);
  714. #endif
  715. JavascriptFunction* GetArrayPrototypeToStringFunction() const { return arrayPrototypeToStringFunction; }
  716. JavascriptFunction* GetArrayPrototypeToLocaleStringFunction() const { return arrayPrototypeToLocaleStringFunction; }
  717. JavascriptFunction* GetIdentityFunction() const { return identityFunction; }
  718. JavascriptFunction* GetThrowerFunction() const { return throwerFunction; }
  719. void SetNativeHostPromiseContinuationFunction(PromiseContinuationCallback function, void *state);
  720. void CallNativeHostPromiseRejectionTracker(Var promise, Var reason, bool handled);
  721. void SetJsrtContext(FinalizableObject* jsrtContext);
  722. FinalizableObject* GetJsrtContext();
  723. void EnqueueTask(Var taskVar);
  724. HeapArgumentsObject* CreateHeapArguments(Var frameObj, uint formalCount, bool isStrictMode = false);
  725. JavascriptArray* CreateArray();
  726. JavascriptArray* CreateArray(uint32 length);
  727. JavascriptArray *CreateArrayOnStack(void *const stackAllocationPointer);
  728. JavascriptNativeIntArray* CreateNativeIntArray();
  729. JavascriptNativeIntArray* CreateNativeIntArray(uint32 length);
  730. #if ENABLE_COPYONACCESS_ARRAY
  731. JavascriptCopyOnAccessNativeIntArray* CreateCopyOnAccessNativeIntArray();
  732. JavascriptCopyOnAccessNativeIntArray* CreateCopyOnAccessNativeIntArray(uint32 length);
  733. #endif
  734. JavascriptNativeFloatArray* CreateNativeFloatArray();
  735. JavascriptNativeFloatArray* CreateNativeFloatArray(uint32 length);
  736. JavascriptArray* CreateArray(uint32 length, uint32 size);
  737. ArrayBuffer* CreateArrayBuffer(uint32 length);
  738. ArrayBuffer* CreateArrayBuffer(byte* buffer, uint32 length);
  739. ArrayBuffer* CreateArrayBuffer(RefCountedBuffer* buffer, uint32 length);
  740. #ifdef ENABLE_WASM
  741. class WebAssemblyArrayBuffer* CreateWebAssemblyArrayBuffer(uint32 length);
  742. class WebAssemblyArrayBuffer* CreateWebAssemblyArrayBuffer(byte* buffer, uint32 length);
  743. #ifdef ENABLE_WASM_THREADS
  744. class WebAssemblySharedArrayBuffer* CreateWebAssemblySharedArrayBuffer(uint32 length, uint32 maxLength);
  745. class WebAssemblySharedArrayBuffer* CreateWebAssemblySharedArrayBuffer(SharedContents *contents);
  746. #endif
  747. #endif
  748. SharedArrayBuffer* CreateSharedArrayBuffer(uint32 length);
  749. SharedArrayBuffer* CreateSharedArrayBuffer(SharedContents *contents);
  750. ArrayBuffer* CreateProjectionArraybuffer(uint32 length);
  751. ArrayBuffer* CreateProjectionArraybuffer(byte* buffer, uint32 length);
  752. ArrayBuffer* CreateProjectionArraybuffer(RefCountedBuffer* buffer, uint32 length);
  753. ArrayBuffer* CreateExternalArrayBuffer(RefCountedBuffer* buffer, uint32 length);
  754. DataView* CreateDataView(ArrayBufferBase* arrayBuffer, uint32 offSet, uint32 mappedLength);
  755. template <typename TypeName, bool clamped>
  756. inline DynamicType* GetTypedArrayType(TypeName);
  757. template<> inline DynamicType* GetTypedArrayType<int8,false>(int8) { return int8ArrayType; };
  758. template<> inline DynamicType* GetTypedArrayType<uint8,false>(uint8) { return uint8ArrayType; };
  759. template<> inline DynamicType* GetTypedArrayType<uint8,true>(uint8) { return uint8ClampedArrayType; };
  760. template<> inline DynamicType* GetTypedArrayType<int16,false>(int16) { return int16ArrayType; };
  761. template<> inline DynamicType* GetTypedArrayType<uint16,false>(uint16) { return uint16ArrayType; };
  762. template<> inline DynamicType* GetTypedArrayType<int32,false>(int32) { return int32ArrayType; };
  763. template<> inline DynamicType* GetTypedArrayType<uint32,false>(uint32) { return uint32ArrayType; };
  764. template<> inline DynamicType* GetTypedArrayType<float,false>(float) { return float32ArrayType; };
  765. template<> inline DynamicType* GetTypedArrayType<double,false>(double) { return float64ArrayType; };
  766. template<> inline DynamicType* GetTypedArrayType<int64,false>(int64) { return int64ArrayType; };
  767. template<> inline DynamicType* GetTypedArrayType<uint64,false>(uint64) { return uint64ArrayType; };
  768. template<> inline DynamicType* GetTypedArrayType<bool,false>(bool) { return boolArrayType; };
  769. DynamicType* GetCharArrayType() { return charArrayType; };
  770. //
  771. // This method would be used for creating array literals, when we really need to create a huge array
  772. // Avoids checks at runtime.
  773. //
  774. JavascriptArray* CreateArrayLiteral(uint32 length);
  775. JavascriptNativeIntArray* CreateNativeIntArrayLiteral(uint32 length);
  776. #if ENABLE_PROFILE_INFO
  777. JavascriptNativeIntArray* CreateCopyOnAccessNativeIntArrayLiteral(ArrayCallSiteInfo *arrayInfo, FunctionBody *functionBody, const Js::AuxArray<int32> *ints);
  778. #endif
  779. JavascriptNativeFloatArray* CreateNativeFloatArrayLiteral(uint32 length);
  780. JavascriptBoolean* CreateBoolean(BOOL value);
  781. JavascriptDate* CreateDate();
  782. JavascriptDate* CreateDate(double value);
  783. JavascriptDate* CreateDate(SYSTEMTIME* pst);
  784. JavascriptMap* CreateMap();
  785. JavascriptSet* CreateSet();
  786. JavascriptWeakMap* CreateWeakMap();
  787. JavascriptWeakSet* CreateWeakSet();
  788. JavascriptError* CreateError();
  789. JavascriptError* CreateError(DynamicType* errorType, BOOL isExternal = FALSE);
  790. JavascriptError* CreateExternalError(ErrorTypeEnum errorTypeEnum);
  791. JavascriptError* CreateEvalError();
  792. JavascriptError* CreateRangeError();
  793. JavascriptError* CreateReferenceError();
  794. JavascriptError* CreateSyntaxError();
  795. JavascriptError* CreateTypeError();
  796. JavascriptError* CreateURIError();
  797. JavascriptError* CreateStackOverflowError();
  798. JavascriptError* CreateOutOfMemoryError();
  799. JavascriptError* CreateWebAssemblyCompileError();
  800. JavascriptError* CreateWebAssemblyRuntimeError();
  801. JavascriptError* CreateWebAssemblyLinkError();
  802. JavascriptSymbol* CreateSymbol(JavascriptString* description);
  803. JavascriptSymbol* CreateSymbol(const char16* description, int descriptionLength);
  804. JavascriptSymbol* CreateSymbol(const PropertyRecord* propertyRecord);
  805. JavascriptPromise* CreatePromise();
  806. JavascriptGenerator* CreateGenerator(Arguments& args, ScriptFunction* scriptFunction, RecyclableObject* prototype);
  807. JavascriptAsyncGenerator* CreateAsyncGenerator(Arguments& args, ScriptFunction* scriptFunction, RecyclableObject* prototype);
  808. JavascriptAsyncFromSyncIterator* CreateAsyncFromSyncIterator(RecyclableObject* syncIterator);
  809. JavascriptFunction* CreateNonProfiledFunction(FunctionInfo * functionInfo);
  810. template <class MethodType>
  811. JavascriptExternalFunction* CreateIdMappedExternalFunction(MethodType entryPoint, DynamicType *pPrototypeType);
  812. JavascriptExternalFunction* CreateExternalConstructor(Js::ExternalMethod entryPoint, PropertyId nameId, RecyclableObject * prototype);
  813. JavascriptExternalFunction* CreateExternalConstructor(Js::ExternalMethod entryPoint, PropertyId nameId, InitializeMethod method, unsigned short deferredTypeSlots, bool hasAccessors);
  814. #ifdef _CHAKRACOREBUILD
  815. DynamicType* GetCachedCustomExternalWrapperType(uintptr_t traceCallback, uintptr_t finalizeCallback, uintptr_t interceptors, uintptr_t prototype);
  816. void CacheCustomExternalWrapperType(uintptr_t traceCallback, uintptr_t finalizeCallback, uintptr_t interceptors, uintptr_t prototype, DynamicType* dynamicType);
  817. JsrtExternalType* GetCachedJsrtExternalType(uintptr_t traceCallback, uintptr_t finalizeCallback, uintptr_t prototype);
  818. void CacheJsrtExternalType(uintptr_t traceCallback, uintptr_t finalizeCallback, uintptr_t prototype, JsrtExternalType* dynamicType);
  819. #else
  820. JsrtExternalType* GetCachedJsrtExternalType(uintptr_t finalizeCallback, uintptr_t prototype);
  821. void CacheJsrtExternalType(uintptr_t finalizeCallback, uintptr_t prototype, JsrtExternalType* dynamicType);
  822. #endif
  823. static DynamicTypeHandler * GetDeferredPrototypeGeneratorFunctionTypeHandler(ScriptContext* scriptContext);
  824. static DynamicTypeHandler * GetDeferredPrototypeAsyncFunctionTypeHandler(ScriptContext* scriptContext);
  825. DynamicType * CreateDeferredPrototypeAsyncGeneratorFunctionType(JavascriptMethod entrypoint, bool isAnonymousFunction, bool isShared = false);
  826. DynamicType * CreateDeferredPrototypeGeneratorFunctionType(JavascriptMethod entrypoint, bool isAnonymousFunction, bool isShared = false);
  827. DynamicType * CreateDeferredPrototypeAsyncFunctionType(JavascriptMethod entrypoint, bool isAnonymousFunction, bool isShared = false);
  828. static DynamicTypeHandler * GetDeferredPrototypeFunctionTypeHandler(ScriptContext* scriptContext);
  829. static DynamicTypeHandler * GetDeferredPrototypeFunctionWithLengthTypeHandler(ScriptContext* scriptContext);
  830. static DynamicTypeHandler * GetDeferredPrototypeAsyncGeneratorFunctionTypeHandler();
  831. static DynamicTypeHandler * GetDeferredAnonymousPrototypeFunctionWithLengthTypeHandler();
  832. static DynamicTypeHandler * GetDeferredAnonymousPrototypeGeneratorFunctionTypeHandler();
  833. static DynamicTypeHandler * GetDeferredAnonymousPrototypeAsyncFunctionTypeHandler();
  834. static DynamicTypeHandler * GetDeferredAnonymousPrototypeAsyncGeneratorFunctionTypeHandler();
  835. DynamicTypeHandler * GetDeferredFunctionTypeHandler();
  836. DynamicTypeHandler * GetDeferredFunctionWithLengthTypeHandler();
  837. DynamicTypeHandler* GetDeferredFunctionWithLengthUnsetTypeHandler();
  838. DynamicTypeHandler * GetDeferredPrototypeFunctionWithNameAndLengthTypeHandler();
  839. DynamicTypeHandler * ScriptFunctionTypeHandler(bool noPrototypeProperty, bool isAnonymousFunction);
  840. DynamicTypeHandler * ClassConstructorTypeHandler();
  841. DynamicTypeHandler * AnonymousClassConstructorTypeHandler();
  842. DynamicTypeHandler * GetDeferredAnonymousFunctionWithLengthTypeHandler();
  843. DynamicTypeHandler * GetDeferredAnonymousFunctionTypeHandler();
  844. template<bool isNameAvailable, bool isPrototypeAvailable = true, bool isLengthAvailable = false, bool addLength = isLengthAvailable>
  845. static DynamicTypeHandler * GetDeferredFunctionTypeHandlerBase();
  846. template<bool isNameAvailable, bool isPrototypeAvailable = true>
  847. static DynamicTypeHandler * GetDeferredGeneratorFunctionTypeHandlerBase();
  848. template<bool isNameAvailable, bool isPrototypeAvailable = true>
  849. static DynamicTypeHandler * GetDeferredAsyncGeneratorFunctionTypeHandlerBase();
  850. template<bool isNameAvailable>
  851. static DynamicTypeHandler * GetDeferredAsyncFunctionTypeHandlerBase();
  852. DynamicType * CreateDeferredFunctionType(JavascriptMethod entrypoint);
  853. DynamicType * CreateDeferredPrototypeFunctionType(JavascriptMethod entrypoint);
  854. DynamicType * CreateDeferredPrototypeFunctionTypeNoProfileThunk(JavascriptMethod entrypoint, bool isShared = false);
  855. DynamicType * CreateDeferredFunctionTypeNoProfileThunk(JavascriptMethod entrypoint, bool isShared = false);
  856. DynamicType * CreateDeferredLengthPrototypeFunctionTypeNoProfileThunk(JavascriptMethod entrypoint, bool isShared = false);
  857. DynamicType * CreateDeferredLengthFunctionTypeNoProfileThunk(JavascriptMethod entrypoint, bool isShared = false);
  858. template<bool isLengthAvailable, bool isPrototypeAvailable> DynamicType * CreateDeferredFunctionTypeNoProfileThunk_Internal(JavascriptMethod entrypoint, bool isShared);
  859. DynamicType * CreateFunctionType(JavascriptMethod entrypoint, RecyclableObject* prototype = nullptr);
  860. DynamicType * CreateFunctionWithConfigurableLengthType(FunctionInfo * functionInfo);
  861. DynamicType * CreateFunctionWithLengthType(FunctionInfo * functionInfo);
  862. DynamicType * CreateFunctionWithLengthAndNameType(FunctionInfo * functionInfo);
  863. DynamicType * CreateFunctionWithLengthAndPrototypeType(FunctionInfo * functionInfo);
  864. DynamicType * CreateFunctionWithConfigurableLengthType(DynamicObject * prototype, FunctionInfo * functionInfo);
  865. DynamicType * CreateFunctionWithLengthType(DynamicObject * prototype, FunctionInfo * functionInfo);
  866. DynamicType * CreateFunctionWithLengthAndNameType(DynamicObject * prototype, FunctionInfo * functionInfo);
  867. DynamicType * CreateFunctionWithLengthAndPrototypeType(DynamicObject * prototype, FunctionInfo * functionInfo);
  868. ScriptFunction * CreateScriptFunction(FunctionProxy* proxy);
  869. AsmJsScriptFunction * CreateAsmJsScriptFunction(FunctionProxy* proxy);
  870. #ifdef ENABLE_WASM
  871. WasmScriptFunction * CreateWasmScriptFunction(FunctionProxy* proxy);
  872. #endif
  873. ScriptFunctionWithInlineCache * CreateScriptFunctionWithInlineCache(FunctionProxy* proxy);
  874. GeneratorVirtualScriptFunction * CreateGeneratorVirtualScriptFunction(FunctionProxy* proxy);
  875. DynamicType* CreateGeneratorType(RecyclableObject* prototype);
  876. DynamicType* CreateAsyncGeneratorType(RecyclableObject* prototype);
  877. DynamicType* CreateAsyncFromSyncIteratorType();
  878. #if 0
  879. JavascriptNumber* CreateNumber(double value);
  880. #endif
  881. JavascriptNumber* CreateNumber(double value, RecyclerJavascriptNumberAllocator * numberAllocator);
  882. JavascriptGeneratorFunction* CreateGeneratorFunction(JavascriptMethod entryPoint, GeneratorVirtualScriptFunction* scriptFunction);
  883. JavascriptGeneratorFunction* CreateGeneratorFunction(JavascriptMethod entryPoint, bool isAnonymousFunction);
  884. JavascriptAsyncGeneratorFunction* CreateAsyncGeneratorFunction(JavascriptMethod entryPoint, GeneratorVirtualScriptFunction* scriptFunction);
  885. AsyncGeneratorCallbackFunction* CreateAsyncGeneratorCallbackFunction(JavascriptMethod entryPoint, JavascriptAsyncGenerator* generator);
  886. RuntimeFunction* CreateAsyncModuleCallbackFunction(JavascriptMethod entryPoint, SourceTextModuleRecord* module);
  887. JavascriptAsyncFunction* CreateAsyncFunction(JavascriptMethod entryPoint, GeneratorVirtualScriptFunction* scriptFunction);
  888. JavascriptAsyncFunction* CreateAsyncFunction(JavascriptMethod entryPoint, bool isAnonymousFunction);
  889. JavascriptAsyncSpawnStepFunction* CreateAsyncSpawnStepFunction(JavascriptMethod entryPoint, JavascriptGenerator* generator, Var argument, Var resolve = nullptr, Var reject = nullptr, bool isReject = false);
  890. JavascriptExternalFunction* CreateExternalFunction(ExternalMethod entryPointer, PropertyId nameId, Var signature, UINT64 flags, bool isLengthAvailable = false);
  891. JavascriptExternalFunction* CreateExternalFunction(ExternalMethod entryPointer, Var nameId, Var signature, UINT64 flags, bool isLengthAvailable = false);
  892. JavascriptExternalFunction* CreateStdCallExternalFunction(StdCallJavascriptMethod entryPointer, Var name, void *callbackState);
  893. JavascriptPromiseCapabilitiesExecutorFunction* CreatePromiseCapabilitiesExecutorFunction(JavascriptMethod entryPoint, JavascriptPromiseCapability* capability);
  894. JavascriptPromiseResolveOrRejectFunction* CreatePromiseResolveOrRejectFunction(JavascriptMethod entryPoint, JavascriptPromise* promise, bool isReject, JavascriptPromiseResolveOrRejectFunctionAlreadyResolvedWrapper* alreadyResolvedRecord);
  895. JavascriptPromiseReactionTaskFunction* CreatePromiseReactionTaskFunction(JavascriptMethod entryPoint, JavascriptPromiseReaction* reaction, Var argument);
  896. JavascriptPromiseResolveThenableTaskFunction* CreatePromiseResolveThenableTaskFunction(JavascriptMethod entryPoint, JavascriptPromise* promise, RecyclableObject* thenable, RecyclableObject* thenFunction);
  897. JavascriptPromiseAllResolveElementFunction* CreatePromiseAllResolveElementFunction(JavascriptMethod entryPoint, uint32 index, JavascriptArray* values, JavascriptPromiseCapability* capabilities, JavascriptPromiseAllResolveElementFunctionRemainingElementsWrapper* remainingElements);
  898. JavascriptPromiseAllSettledResolveOrRejectElementFunction* CreatePromiseAllSettledResolveOrRejectElementFunction(JavascriptMethod entryPoint, uint32 index, JavascriptArray* values, JavascriptPromiseCapability* capabilities, JavascriptPromiseAllResolveElementFunctionRemainingElementsWrapper* remainingElements, JavascriptPromiseResolveOrRejectFunctionAlreadyResolvedWrapper* alreadyCalledWrapper, bool isRejecting);
  899. JavascriptPromiseThenFinallyFunction* CreatePromiseThenFinallyFunction(JavascriptMethod entryPoint, RecyclableObject* OnFinally, RecyclableObject* Constructor, bool shouldThrow);
  900. JavascriptPromiseThunkFinallyFunction* CreatePromiseThunkFinallyFunction(JavascriptMethod entryPoint, Var value, bool shouldThrow);
  901. JavascriptExternalFunction* CreateWrappedExternalFunction(JavascriptExternalFunction* wrappedFunction);
  902. #if ENABLE_NATIVE_CODEGEN
  903. #if !FLOATVAR
  904. JavascriptNumber* CreateCodeGenNumber(CodeGenNumberAllocator *alloc, double value);
  905. #endif
  906. #endif
  907. DynamicObject* CreateGeneratorConstructorPrototypeObject();
  908. DynamicObject* CreateAsyncGeneratorConstructorPrototypeObject();
  909. DynamicObject* CreateConstructorPrototypeObject(JavascriptFunction * constructor);
  910. DynamicObject* CreateClassPrototypeObject(RecyclableObject * protoParent);
  911. DynamicObject* CreateObject(const bool allowObjectHeaderInlining = false, const PropertyIndex requestedInlineSlotCapacity = 0);
  912. DynamicObject* CreateObject(DynamicTypeHandler * typeHandler);
  913. DynamicObject* CreateActivationObject();
  914. DynamicObject* CreatePseudoActivationObject();
  915. DynamicObject* CreateBlockActivationObject();
  916. DynamicObject* CreateConsoleScopeActivationObject();
  917. DynamicType* CreateObjectType(RecyclableObject* prototype, Js::TypeId typeId, uint16 requestedInlineSlotCapacity);
  918. DynamicType* CreateObjectTypeNoCache(RecyclableObject* prototype, Js::TypeId typeId);
  919. DynamicType* CreateObjectType(RecyclableObject* prototype, uint16 requestedInlineSlotCapacity);
  920. DynamicObject* CreateObject(RecyclableObject* prototype, uint16 requestedInlineSlotCapacity = 0);
  921. typedef JavascriptString* LibStringType; // used by diagnostics template
  922. template< size_t N > JavascriptString* CreateStringFromCppLiteral(const char16 (&value)[N]) const;
  923. template<> JavascriptString* CreateStringFromCppLiteral(const char16 (&value)[1]) const; // Specialization for empty string
  924. template<> JavascriptString* CreateStringFromCppLiteral(const char16 (&value)[2]) const; // Specialization for single-char strings
  925. PropertyString* CreatePropertyString(const Js::PropertyRecord* propertyRecord);
  926. JavascriptBooleanObject* CreateBooleanObject(BOOL value);
  927. JavascriptBooleanObject* CreateBooleanObject();
  928. JavascriptNumberObject* CreateNumberObjectWithCheck(double value);
  929. JavascriptNumberObject* CreateNumberObject(Var number);
  930. JavascriptStringObject* CreateStringObject(JavascriptString* value);
  931. JavascriptStringObject* CreateStringObject(const char16* value, charcount_t length);
  932. JavascriptSymbolObject* CreateSymbolObject(JavascriptSymbol* value);
  933. JavascriptArrayIterator* CreateArrayIterator(Var iterable, JavascriptArrayIteratorKind kind);
  934. JavascriptMapIterator* CreateMapIterator(JavascriptMap* map, JavascriptMapIteratorKind kind);
  935. JavascriptSetIterator* CreateSetIterator(JavascriptSet* set, JavascriptSetIteratorKind kind);
  936. JavascriptStringIterator* CreateStringIterator(JavascriptString* string);
  937. JavascriptListIterator* CreateListIterator(ListForListIterator* list);
  938. JavascriptRegExp* CreateRegExp(UnifiedRegex::RegexPattern* pattern);
  939. DynamicObject* CreateIteratorResultObject(Var value, Var done);
  940. DynamicObject* CreateIteratorResultObject(Var value, bool done = false);
  941. DynamicObject* CreateIteratorResultObjectDone();
  942. RecyclableObject* CreateThrowErrorObject(JavascriptError* error);
  943. JavascriptFunction* EnsurePromiseResolveFunction();
  944. JavascriptFunction* EnsurePromiseThenFunction();
  945. JavascriptFunction* EnsureGeneratorReturnFunction();
  946. JavascriptFunction* EnsureGeneratorNextFunction();
  947. JavascriptFunction* EnsureGeneratorThrowFunction();
  948. JavascriptFunction* EnsureAsyncGeneratorNextFunction();
  949. JavascriptFunction* EnsureAsyncGeneratorReturnFunction();
  950. JavascriptFunction* EnsureAsyncGeneratorThrowFunction();
  951. JavascriptFunction* EnsureAsyncFromSyncIteratorNextFunction();
  952. JavascriptFunction* EnsureAsyncFromSyncIteratorThrowFunction();
  953. JavascriptFunction* EnsureAsyncFromSyncIteratorReturnFunction();
  954. RuntimeFunction* EnsureAsyncFromSyncIteratorValueUnwrapTrueFunction();
  955. RuntimeFunction* EnsureAsyncFromSyncIteratorValueUnwrapFalseFunction();
  956. JavascriptFunction* EnsureArrayPrototypeForEachFunction();
  957. JavascriptFunction* EnsureArrayPrototypeKeysFunction();
  958. JavascriptFunction* EnsureArrayPrototypeEntriesFunction();
  959. JavascriptFunction* EnsureArrayPrototypeValuesFunction();
  960. JavascriptFunction* EnsureJSONStringifyFunction();
  961. JavascriptFunction* EnsureObjectFreezeFunction();
  962. void SetCrossSiteForLockedFunctionType(JavascriptFunction * function);
  963. void SetCrossSiteForLockedNonBuiltInFunctionType(JavascriptFunction * function);
  964. bool IsPRNGSeeded() { return isPRNGSeeded; }
  965. uint64 GetRandSeed0() { return randSeed0; }
  966. uint64 GetRandSeed1() { return randSeed1; }
  967. void SetIsPRNGSeeded(bool val);
  968. void SetRandSeed0(uint64 rs) { randSeed0 = rs;}
  969. void SetRandSeed1(uint64 rs) { randSeed1 = rs; }
  970. void SetProfileMode(bool fSet);
  971. void SetDispatchProfile(bool fSet, JavascriptMethod dispatchInvoke);
  972. HRESULT ProfilerRegisterBuiltIns();
  973. #if ENABLE_COPYONACCESS_ARRAY
  974. static bool IsCopyOnAccessArrayCallSite(JavascriptLibrary *lib, ArrayCallSiteInfo *arrayInfo, uint32 length);
  975. static bool IsCachedCopyOnAccessArrayCallSite(const JavascriptLibrary *lib, ArrayCallSiteInfo *arrayInfo);
  976. template <typename T>
  977. static void CheckAndConvertCopyOnAccessNativeIntArray(const T instance);
  978. #endif
  979. static void CheckAndInvalidateIsConcatSpreadableCache(PropertyId propertyId, ScriptContext *scriptContext);
  980. #if DBG_DUMP
  981. static const char16* GetStringTemplateCallsiteObjectKey(Var callsite);
  982. #endif
  983. Field(JavascriptFunction*)* GetBuiltinFunctions();
  984. INT_PTR* GetVTableAddresses();
  985. static BuiltinFunction GetBuiltinFunctionForPropId(PropertyId id);
  986. static BuiltinFunction GetBuiltInForFuncInfo(LocalFunctionId localFuncId);
  987. #if DBG
  988. static void CheckRegisteredBuiltIns(Field(JavascriptFunction*)* builtInFuncs, ScriptContext *scriptContext);
  989. #endif
  990. static BOOL CanFloatPreferenceFunc(BuiltinFunction index);
  991. static BOOL IsFltFunc(BuiltinFunction index);
  992. static bool IsFloatFunctionCallsite(BuiltinFunction index, size_t argc);
  993. static bool IsFltBuiltInConst(PropertyId id);
  994. static size_t GetArgCForBuiltIn(BuiltinFunction index)
  995. {
  996. Assert(index < _countof(JavascriptLibrary::LibraryFunctionArgC));
  997. return JavascriptLibrary::LibraryFunctionArgC[index];
  998. }
  999. static BuiltInFlags GetFlagsForBuiltIn(BuiltinFunction index)
  1000. {
  1001. Assert(index < _countof(JavascriptLibrary::LibraryFunctionFlags));
  1002. return (BuiltInFlags)JavascriptLibrary::LibraryFunctionFlags[index];
  1003. }
  1004. static BuiltinFunction GetBuiltInInlineCandidateId(Js::OpCode opCode);
  1005. static BuiltInArgSpecializationType GetBuiltInArgType(BuiltInFlags flags, BuiltInArgShift argGroup);
  1006. static bool IsTypeSpecRequired(BuiltInFlags flags)
  1007. {
  1008. return GetBuiltInArgType(flags, BuiltInArgShift::BIAS_Src1) || GetBuiltInArgType(flags, BuiltInArgShift::BIAS_Src2) || GetBuiltInArgType(flags, BuiltInArgShift::BIAS_Dst);
  1009. }
  1010. #if ENABLE_DEBUG_CONFIG_OPTIONS
  1011. static char16 const * GetNameForBuiltIn(BuiltinFunction index)
  1012. {
  1013. Assert(index < _countof(JavascriptLibrary::LibraryFunctionName));
  1014. return JavascriptLibrary::LibraryFunctionName[index];
  1015. }
  1016. #endif
  1017. PropertyStringCacheMap* EnsurePropertyStringMap();
  1018. SymbolCacheMap* EnsureSymbolMap();
  1019. template <typename TProperty> WeakPropertyIdMap<TProperty>* GetPropertyMap();
  1020. template <> PropertyStringCacheMap* GetPropertyMap<PropertyString>() { return this->propertyStringMap; }
  1021. template <> SymbolCacheMap* GetPropertyMap<JavascriptSymbol>() { return this->symbolMap; }
  1022. Field(OnlyWritablePropertyProtoChainCache*) GetTypesWithOnlyWritablePropertyProtoChainCache() { return &this->typesWithOnlyWritablePropertyProtoChain; }
  1023. Field(NoSpecialPropertyProtoChainCache*) GetTypesWithNoSpecialPropertyProtoChainCache() { return &this->typesWithNoSpecialPropertyProtoChain; }
  1024. static bool IsDefaultArrayValuesFunction(RecyclableObject * function, ScriptContext *scriptContext);
  1025. static bool ArrayIteratorPrototypeHasUserDefinedNext(ScriptContext *scriptContext);
  1026. CharStringCache& GetCharStringCache() { return charStringCache; }
  1027. static JavascriptLibrary * FromCharStringCache(CharStringCache * cache)
  1028. {
  1029. return (JavascriptLibrary *)((uintptr_t)cache - offsetof(JavascriptLibrary, charStringCache));
  1030. }
  1031. EnumeratorCache* GetObjectAssignCache(Type* type);
  1032. EnumeratorCache* GetCreateKeysCache(Type* type);
  1033. EnumeratorCache* GetStringifyCache(Type* type);
  1034. bool GetArrayObjectHasUserDefinedSpecies() const { return arrayObjectHasUserDefinedSpecies; }
  1035. void SetArrayObjectHasUserDefinedSpecies(bool val) { arrayObjectHasUserDefinedSpecies = val; }
  1036. FunctionBody* GetFakeGlobalFuncForUndefer()const { return this->fakeGlobalFuncForUndefer; }
  1037. void SetFakeGlobalFuncForUndefer(FunctionBody* functionBody) { this->fakeGlobalFuncForUndefer = functionBody; }
  1038. ModuleRecordList* EnsureModuleRecordList();
  1039. ModuleRecordList* GetModuleRecordList() const { return this->moduleRecordList; }
  1040. SourceTextModuleRecord* GetModuleRecord(uint moduleId);
  1041. private:
  1042. #ifdef ENABLE_DEBUG_CONFIG_OPTIONS
  1043. // Declare fretest/debug properties here since otherwise it can cause
  1044. // a mismatch between fre mshtml and fretest jscript9 causing undefined behavior
  1045. Field(DynamicType *) debugDisposableObjectType;
  1046. Field(DynamicType *) debugFuncExecutorInDisposeObjectType;
  1047. #endif
  1048. void InitializePrototypes();
  1049. void InitializeTypes();
  1050. void InitializeGlobal(GlobalObject * globalObject);
  1051. static void PrecalculateArrayAllocationBuckets();
  1052. #define STANDARD_INIT(name) \
  1053. static bool __cdecl Initialize##name##Constructor(DynamicObject* arrayConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode); \
  1054. static bool __cdecl Initialize##name##Prototype(DynamicObject* arrayPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1055. STANDARD_INIT(Array);
  1056. STANDARD_INIT(SharedArrayBuffer);
  1057. STANDARD_INIT(ArrayBuffer);
  1058. STANDARD_INIT(DataView);
  1059. STANDARD_INIT(Error);
  1060. STANDARD_INIT(EvalError);
  1061. STANDARD_INIT(RangeError);
  1062. STANDARD_INIT(ReferenceError);
  1063. STANDARD_INIT(SyntaxError);
  1064. STANDARD_INIT(TypeError);
  1065. STANDARD_INIT(URIError);
  1066. STANDARD_INIT(RuntimeError);
  1067. STANDARD_INIT(TypedArray);
  1068. STANDARD_INIT(Int8Array);
  1069. STANDARD_INIT(Uint8Array);
  1070. STANDARD_INIT(Uint8ClampedArray);
  1071. STANDARD_INIT(Int16Array);
  1072. STANDARD_INIT(Uint16Array);
  1073. STANDARD_INIT(Int32Array);
  1074. STANDARD_INIT(Uint32Array);
  1075. STANDARD_INIT(Float32Array);
  1076. STANDARD_INIT(Float64Array);
  1077. STANDARD_INIT(Boolean);
  1078. STANDARD_INIT(Symbol);
  1079. STANDARD_INIT(Date);
  1080. STANDARD_INIT(Proxy);
  1081. STANDARD_INIT(Function);
  1082. STANDARD_INIT(Number);
  1083. STANDARD_INIT(BigInt);
  1084. STANDARD_INIT(Object);
  1085. STANDARD_INIT(Regex);
  1086. STANDARD_INIT(String);
  1087. STANDARD_INIT(Map);
  1088. STANDARD_INIT(Set);
  1089. STANDARD_INIT(WeakMap);
  1090. STANDARD_INIT(WeakSet);
  1091. STANDARD_INIT(Promise);
  1092. STANDARD_INIT(GeneratorFunction);
  1093. STANDARD_INIT(AsyncFunction);
  1094. STANDARD_INIT(AsyncGeneratorFunction);
  1095. STANDARD_INIT(WebAssemblyCompileError);
  1096. STANDARD_INIT(WebAssemblyRuntimeError);
  1097. STANDARD_INIT(WebAssemblyLinkError);
  1098. STANDARD_INIT(WebAssemblyMemory);
  1099. STANDARD_INIT(WebAssemblyModule);
  1100. STANDARD_INIT(WebAssemblyInstance);
  1101. STANDARD_INIT(WebAssemblyTable);
  1102. #undef STANDARD_INIT
  1103. static bool __cdecl InitializeAtomicsObject(DynamicObject* atomicsObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1104. static bool __cdecl InitializeInt64ArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1105. static bool __cdecl InitializeUint64ArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1106. static bool __cdecl InitializeBoolArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1107. static bool __cdecl InitializeCharArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1108. void InitializeComplexThings();
  1109. void InitializeStaticValues();
  1110. static bool __cdecl InitializeMathObject(DynamicObject* mathObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1111. #ifdef ENABLE_WASM
  1112. static bool __cdecl InitializeWebAssemblyObject(DynamicObject* WasmObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1113. #endif
  1114. static bool __cdecl InitializeJSONObject(DynamicObject* JSONObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1115. static bool __cdecl InitializeEngineInterfaceObject(DynamicObject* engineInterface, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1116. static bool __cdecl InitializeReflectObject(DynamicObject* reflectObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1117. #ifdef ENABLE_INTL_OBJECT
  1118. static bool __cdecl InitializeIntlObject(DynamicObject* IntlEngineObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1119. #endif
  1120. static bool __cdecl JavascriptLibrary::InitializeAsyncIteratorPrototype(DynamicObject* asyncIteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1121. static bool __cdecl InitializeIteratorPrototype(DynamicObject* iteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1122. static bool __cdecl InitializeArrayIteratorPrototype(DynamicObject* arrayIteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1123. static bool __cdecl InitializeMapIteratorPrototype(DynamicObject* mapIteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1124. static bool __cdecl InitializeSetIteratorPrototype(DynamicObject* setIteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1125. static bool __cdecl InitializeStringIteratorPrototype(DynamicObject* stringIteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1126. static bool __cdecl InitializeGeneratorPrototype(DynamicObject* generatorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1127. static bool __cdecl InitializeAsyncGeneratorPrototype(DynamicObject* asyncGeneratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1128. static bool __cdecl InitializeAsyncFromSyncIteratorPrototype(DynamicObject* asyncFromSyncIteratorProtototype, DeferredTypeHandlerBase* typeHandler, DeferredInitializeMode mode);
  1129. static bool __cdecl InitializeAsyncFunction(DynamicObject *function, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1130. RuntimeFunction* CreateBuiltinConstructor(FunctionInfo * functionInfo, DynamicTypeHandler * typeHandler, DynamicObject* prototype = nullptr);
  1131. void DefaultCreateFunction(ParseableFunctionInfo * functionInfo, int length, DynamicObject * prototype, PropertyId nameId);
  1132. RuntimeFunction* DefaultCreateFunction(FunctionInfo * functionInfo, int length, DynamicObject * prototype, DynamicType * functionType, PropertyId nameId);
  1133. RuntimeFunction* DefaultCreateFunction(FunctionInfo * functionInfo, int length, DynamicObject * prototype, DynamicType * functionType, Var nameId);
  1134. JavascriptFunction* AddFunction(DynamicObject* object, PropertyId propertyId, RuntimeFunction* function);
  1135. void AddMember(DynamicObject* object, PropertyId propertyId, Var value);
  1136. void AddMember(DynamicObject* object, PropertyId propertyId, Var value, PropertyAttributes attributes);
  1137. JavascriptString* CreateEmptyString();
  1138. template<uint cacheSlotCount> EnumeratorCache* GetEnumeratorCache(Type* type, Field(EnumeratorCache*)* cacheSlots);
  1139. static bool __cdecl InitializeAsyncGeneratorFunction(DynamicObject* function, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1140. static bool __cdecl InitializeGeneratorFunction(DynamicObject* function, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1141. static size_t const LibraryFunctionArgC[BuiltinFunction::Count + 1];
  1142. static int const LibraryFunctionFlags[BuiltinFunction::Count + 1]; // returns enum BuiltInFlags.
  1143. #if ENABLE_DEBUG_CONFIG_OPTIONS
  1144. static char16 const * const LibraryFunctionName[BuiltinFunction::Count + 1];
  1145. #endif
  1146. public:
  1147. template<bool addPrototype, bool addName, bool useLengthType, bool addLength>
  1148. static bool __cdecl InitializeFunction(DynamicObject* function, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1149. virtual void Finalize(bool isShutdown) override;
  1150. #if DBG
  1151. void DumpLibraryByteCode();
  1152. #endif
  1153. private:
  1154. typedef JsUtil::BaseHashSet<Js::PropertyRecord const *, Recycler, PowerOf2SizePolicy> ReferencedPropertyRecordHashSet;
  1155. Field(ReferencedPropertyRecordHashSet*) referencedPropertyRecords;
  1156. ReferencedPropertyRecordHashSet * EnsureReferencedPropertyRecordList()
  1157. {
  1158. ReferencedPropertyRecordHashSet* pidList = this->referencedPropertyRecords;
  1159. if (pidList == nullptr)
  1160. {
  1161. pidList = RecyclerNew(this->recycler, ReferencedPropertyRecordHashSet, this->recycler, 173);
  1162. this->referencedPropertyRecords = pidList;
  1163. }
  1164. return pidList;
  1165. }
  1166. ReferencedPropertyRecordHashSet * GetReferencedPropertyRecordList() const
  1167. {
  1168. return this->referencedPropertyRecords;
  1169. }
  1170. HRESULT ProfilerRegisterObject();
  1171. HRESULT ProfilerRegisterArray();
  1172. HRESULT ProfilerRegisterBoolean();
  1173. HRESULT ProfilerRegisterDate();
  1174. HRESULT ProfilerRegisterFunction();
  1175. HRESULT ProfilerRegisterMath();
  1176. HRESULT ProfilerRegisterNumber();
  1177. HRESULT ProfilerRegisterBigInt();
  1178. HRESULT ProfilerRegisterString();
  1179. HRESULT ProfilerRegisterRegExp();
  1180. HRESULT ProfilerRegisterJSON();
  1181. HRESULT ProfilerRegisterMap();
  1182. HRESULT ProfilerRegisterSet();
  1183. HRESULT ProfilerRegisterWeakMap();
  1184. HRESULT ProfilerRegisterWeakSet();
  1185. HRESULT ProfilerRegisterSymbol();
  1186. HRESULT ProfilerRegisterIterator();
  1187. HRESULT ProfilerRegisterArrayIterator();
  1188. HRESULT ProfilerRegisterMapIterator();
  1189. HRESULT ProfilerRegisterSetIterator();
  1190. HRESULT ProfilerRegisterStringIterator();
  1191. HRESULT ProfilerRegisterTypedArray();
  1192. HRESULT ProfilerRegisterPromise();
  1193. HRESULT ProfilerRegisterProxy();
  1194. HRESULT ProfilerRegisterReflect();
  1195. HRESULT ProfilerRegisterGenerator();
  1196. HRESULT ProfilerRegisterAtomics();
  1197. #ifdef IR_VIEWER
  1198. HRESULT ProfilerRegisterIRViewer();
  1199. #endif /* IR_VIEWER */
  1200. };
  1201. }