JavascriptLibrary.h 82 KB

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