JavascriptLibrary.h 82 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391
  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. class ScriptSite;
  13. class ActiveScriptExternalLibrary;
  14. class ProjectionExternalLibrary;
  15. class EditAndContinue;
  16. class ChakraHostScriptContext;
  17. #ifdef ENABLE_PROJECTION
  18. namespace Projection
  19. {
  20. class ProjectionContext;
  21. class WinRTPromiseEngineInterfaceExtensionObject;
  22. }
  23. #endif
  24. namespace Js
  25. {
  26. static const unsigned int EvalMRUSize = 15;
  27. typedef JsUtil::BaseDictionary<DWORD_PTR, SourceContextInfo *, Recycler, PowerOf2SizePolicy> SourceContextInfoMap;
  28. typedef JsUtil::BaseDictionary<uint, SourceContextInfo *, Recycler, PowerOf2SizePolicy> DynamicSourceContextInfoMap;
  29. typedef JsUtil::BaseDictionary<EvalMapString, ScriptFunction*, RecyclerNonLeafAllocator, PrimeSizePolicy> SecondLevelEvalCache;
  30. typedef TwoLevelHashRecord<FastEvalMapString, ScriptFunction*, SecondLevelEvalCache, EvalMapString> EvalMapRecord;
  31. typedef JsUtil::Cache<FastEvalMapString, EvalMapRecord*, RecyclerNonLeafAllocator, PrimeSizePolicy, JsUtil::MRURetentionPolicy<FastEvalMapString, EvalMRUSize>, FastEvalMapStringComparer> EvalCacheTopLevelDictionary;
  32. typedef JsUtil::Cache<EvalMapString, FunctionInfo*, RecyclerNonLeafAllocator, PrimeSizePolicy, JsUtil::MRURetentionPolicy<EvalMapString, EvalMRUSize>> NewFunctionCache;
  33. typedef JsUtil::BaseDictionary<ParseableFunctionInfo*, ParseableFunctionInfo*, Recycler, PrimeSizePolicy, RecyclerPointerComparer> ParseableFunctionInfoMap;
  34. // This is the dictionary used by script context to cache the eval.
  35. typedef TwoLevelHashDictionary<FastEvalMapString, ScriptFunction*, EvalMapRecord, EvalCacheTopLevelDictionary, EvalMapString> EvalCacheDictionary;
  36. typedef JsUtil::BaseDictionary<JavascriptMethod, JavascriptFunction*, Recycler, PowerOf2SizePolicy> BuiltInLibraryFunctionMap;
  37. // valid if object!= NULL
  38. struct EnumeratedObjectCache
  39. {
  40. static const int kMaxCachedPropStrings = 16;
  41. Field(DynamicObject*) object;
  42. Field(DynamicType*) type;
  43. Field(PropertyString*) propertyStrings[kMaxCachedPropStrings];
  44. Field(int) validPropStrings;
  45. };
  46. struct Cache
  47. {
  48. Field(JavascriptString *) lastNumberToStringRadix10String;
  49. Field(EnumeratedObjectCache) enumObjCache;
  50. Field(JavascriptString *) lastUtcTimeFromStrString;
  51. Field(EvalCacheDictionary*) evalCacheDictionary;
  52. Field(EvalCacheDictionary*) indirectEvalCacheDictionary;
  53. Field(NewFunctionCache*) newFunctionCache;
  54. Field(RegexPatternMruMap *) dynamicRegexMap;
  55. Field(SourceContextInfoMap*) sourceContextInfoMap; // maps host provided context cookie to the URL of the script buffer passed.
  56. Field(DynamicSourceContextInfoMap*) dynamicSourceContextInfoMap;
  57. Field(SourceContextInfo*) noContextSourceContextInfo;
  58. Field(SRCINFO*) noContextGlobalSourceInfo;
  59. Field(Field(SRCINFO const *)*) moduleSrcInfo;
  60. Field(BuiltInLibraryFunctionMap*) builtInLibraryFunctions;
  61. #if ENABLE_PROFILE_INFO
  62. #if DBG_DUMP || defined(DYNAMIC_PROFILE_STORAGE) || defined(RUNTIME_DATA_COLLECTION)
  63. Field(DynamicProfileInfoList*) profileInfoList;
  64. #endif
  65. #endif
  66. };
  67. class MissingPropertyTypeHandler;
  68. class SourceTextModuleRecord;
  69. class ArrayBufferBase;
  70. class SharedContents;
  71. typedef RecyclerFastAllocator<JavascriptNumber, LeafBit> RecyclerJavascriptNumberAllocator;
  72. typedef JsUtil::List<Var, Recycler> ListForListIterator;
  73. class UndeclaredBlockVariable : public RecyclableObject
  74. {
  75. friend class JavascriptLibrary;
  76. UndeclaredBlockVariable(Type* type) : RecyclableObject(type) { }
  77. };
  78. class SourceTextModuleRecord;
  79. typedef JsUtil::List<SourceTextModuleRecord*> ModuleRecordList;
  80. #if ENABLE_COPYONACCESS_ARRAY
  81. struct CacheForCopyOnAccessArraySegments
  82. {
  83. static const uint32 MAX_SIZE = 31;
  84. Field(SparseArraySegment<int32> *) cache[MAX_SIZE];
  85. Field(uint32) count;
  86. uint32 AddSegment(SparseArraySegment<int32> *segment)
  87. {
  88. cache[count++] = segment;
  89. return count;
  90. }
  91. SparseArraySegment<int32> *GetSegmentByIndex(byte index)
  92. {
  93. Assert(index <= MAX_SIZE);
  94. return cache[index - 1];
  95. }
  96. bool IsNotOverHardLimit()
  97. {
  98. return count < MAX_SIZE;
  99. }
  100. bool IsNotFull()
  101. {
  102. return count < (uint32) CONFIG_FLAG(CopyOnAccessArraySegmentCacheSize);
  103. }
  104. bool IsValidIndex(uint32 index)
  105. {
  106. return count && index && index <= count;
  107. }
  108. #if ENABLE_DEBUG_CONFIG_OPTIONS
  109. uint32 GetCount()
  110. {
  111. return count;
  112. }
  113. #endif
  114. };
  115. #endif
  116. template <typename T>
  117. struct StringTemplateCallsiteObjectComparer
  118. {
  119. static bool Equals(T x, T y)
  120. {
  121. static_assert(false, "Unexpected type T");
  122. }
  123. static hash_t GetHashCode(T i)
  124. {
  125. static_assert(false, "Unexpected type T");
  126. }
  127. };
  128. template <>
  129. struct StringTemplateCallsiteObjectComparer<ParseNodePtr>
  130. {
  131. static bool Equals(ParseNodePtr x, RecyclerWeakReference<Js::RecyclableObject>* y);
  132. static bool Equals(ParseNodePtr x, ParseNodePtr y);
  133. static hash_t GetHashCode(ParseNodePtr i);
  134. };
  135. template <>
  136. struct StringTemplateCallsiteObjectComparer<RecyclerWeakReference<Js::RecyclableObject>*>
  137. {
  138. static bool Equals(RecyclerWeakReference<Js::RecyclableObject>* x, RecyclerWeakReference<Js::RecyclableObject>* y);
  139. static bool Equals(RecyclerWeakReference<Js::RecyclableObject>* x, ParseNodePtr y);
  140. static hash_t GetHashCode(RecyclerWeakReference<Js::RecyclableObject>* o);
  141. };
  142. class JavascriptLibrary : public JavascriptLibraryBase
  143. {
  144. friend class EditAndContinue;
  145. friend class ScriptSite;
  146. friend class GlobalObject;
  147. friend class ScriptContext;
  148. friend class EngineInterfaceObject;
  149. friend class ExternalLibraryBase;
  150. friend class ActiveScriptExternalLibrary;
  151. friend class IntlEngineInterfaceExtensionObject;
  152. friend class ChakraHostScriptContext;
  153. #ifdef ENABLE_PROJECTION
  154. friend class ProjectionExternalLibrary;
  155. friend class Projection::WinRTPromiseEngineInterfaceExtensionObject;
  156. friend class Projection::ProjectionContext;
  157. #endif
  158. static const char16* domBuiltinPropertyNames[];
  159. public:
  160. #if ENABLE_COPYONACCESS_ARRAY
  161. Field(CacheForCopyOnAccessArraySegments *) cacheForCopyOnAccessArraySegments;
  162. #endif
  163. static DWORD GetScriptContextOffset() { return offsetof(JavascriptLibrary, scriptContext); }
  164. static DWORD GetUndeclBlockVarOffset() { return offsetof(JavascriptLibrary, undeclBlockVarSentinel); }
  165. static DWORD GetEmptyStringOffset() { return offsetof(JavascriptLibrary, emptyString); }
  166. static DWORD GetUndefinedValueOffset() { return offsetof(JavascriptLibrary, undefinedValue); }
  167. static DWORD GetNullValueOffset() { return offsetof(JavascriptLibrary, nullValue); }
  168. static DWORD GetBooleanTrueOffset() { return offsetof(JavascriptLibrary, booleanTrue); }
  169. static DWORD GetBooleanFalseOffset() { return offsetof(JavascriptLibrary, booleanFalse); }
  170. static DWORD GetNegativeZeroOffset() { return offsetof(JavascriptLibrary, negativeZero); }
  171. static DWORD GetNumberTypeStaticOffset() { return offsetof(JavascriptLibrary, numberTypeStatic); }
  172. static DWORD GetStringTypeStaticOffset() { return offsetof(JavascriptLibrary, stringTypeStatic); }
  173. static DWORD GetObjectTypesOffset() { return offsetof(JavascriptLibrary, objectTypes); }
  174. static DWORD GetObjectHeaderInlinedTypesOffset() { return offsetof(JavascriptLibrary, objectHeaderInlinedTypes); }
  175. static DWORD GetRegexTypeOffset() { return offsetof(JavascriptLibrary, regexType); }
  176. static DWORD GetArrayConstructorOffset() { return offsetof(JavascriptLibrary, arrayConstructor); }
  177. static DWORD GetPositiveInfinityOffset() { return offsetof(JavascriptLibrary, positiveInfinite); }
  178. static DWORD GetNaNOffset() { return offsetof(JavascriptLibrary, nan); }
  179. static DWORD GetNativeIntArrayTypeOffset() { return offsetof(JavascriptLibrary, nativeIntArrayType); }
  180. #if ENABLE_COPYONACCESS_ARRAY
  181. static DWORD GetCopyOnAccessNativeIntArrayTypeOffset() { return offsetof(JavascriptLibrary, copyOnAccessNativeIntArrayType); }
  182. #endif
  183. static DWORD GetNativeFloatArrayTypeOffset() { return offsetof(JavascriptLibrary, nativeFloatArrayType); }
  184. static DWORD GetVTableAddressesOffset() { return offsetof(JavascriptLibrary, vtableAddresses); }
  185. static DWORD GetConstructorCacheDefaultInstanceOffset() { return offsetof(JavascriptLibrary, constructorCacheDefaultInstance); }
  186. static DWORD GetAbsDoubleCstOffset() { return offsetof(JavascriptLibrary, absDoubleCst); }
  187. static DWORD GetUintConvertConstOffset() { return offsetof(JavascriptLibrary, uintConvertConst); }
  188. static DWORD GetBuiltinFunctionsOffset() { return offsetof(JavascriptLibrary, builtinFunctions); }
  189. static DWORD GetCharStringCacheOffset() { return offsetof(JavascriptLibrary, charStringCache); }
  190. static DWORD GetCharStringCacheAOffset() { return GetCharStringCacheOffset() + CharStringCache::GetCharStringCacheAOffset(); }
  191. const JavascriptLibraryBase* GetLibraryBase() const { return static_cast<const JavascriptLibraryBase*>(this); }
  192. void SetGlobalObject(GlobalObject* globalObject) {this->globalObject = globalObject; }
  193. static DWORD GetRandSeed0Offset() { return offsetof(JavascriptLibrary, randSeed0); }
  194. static DWORD GetRandSeed1Offset() { return offsetof(JavascriptLibrary, randSeed1); }
  195. static DWORD GetTypeDisplayStringsOffset() { return offsetof(JavascriptLibrary, typeDisplayStrings); }
  196. typedef bool (CALLBACK *PromiseContinuationCallback)(Var task, void *callbackState);
  197. Var GetUndeclBlockVar() const { return undeclBlockVarSentinel; }
  198. bool IsUndeclBlockVar(Var var) const { return var == undeclBlockVarSentinel; }
  199. static bool IsTypedArrayConstructor(Var constructor, ScriptContext* scriptContext);
  200. private:
  201. FieldNoBarrier(Recycler *) recycler;
  202. Field(ExternalLibraryBase*) externalLibraryList;
  203. Field(UndeclaredBlockVariable*) undeclBlockVarSentinel;
  204. Field(DynamicType *) generatorConstructorPrototypeObjectType;
  205. Field(DynamicType *) constructorPrototypeObjectType;
  206. Field(DynamicType *) heapArgumentsType;
  207. Field(DynamicType *) activationObjectType;
  208. Field(DynamicType *) arrayType;
  209. Field(DynamicType *) nativeIntArrayType;
  210. #if ENABLE_COPYONACCESS_ARRAY
  211. Field(DynamicType *) copyOnAccessNativeIntArrayType;
  212. #endif
  213. Field(DynamicType *) nativeFloatArrayType;
  214. Field(DynamicType *) arrayBufferType;
  215. Field(DynamicType *) sharedArrayBufferType;
  216. Field(DynamicType *) dataViewType;
  217. Field(DynamicType *) typedArrayType;
  218. Field(DynamicType *) int8ArrayType;
  219. Field(DynamicType *) uint8ArrayType;
  220. Field(DynamicType *) uint8ClampedArrayType;
  221. Field(DynamicType *) int16ArrayType;
  222. Field(DynamicType *) uint16ArrayType;
  223. Field(DynamicType *) int32ArrayType;
  224. Field(DynamicType *) uint32ArrayType;
  225. Field(DynamicType *) float32ArrayType;
  226. Field(DynamicType *) float64ArrayType;
  227. Field(DynamicType *) int64ArrayType;
  228. Field(DynamicType *) uint64ArrayType;
  229. Field(DynamicType *) boolArrayType;
  230. Field(DynamicType *) charArrayType;
  231. Field(StaticType *) booleanTypeStatic;
  232. Field(DynamicType *) booleanTypeDynamic;
  233. Field(DynamicType *) dateType;
  234. Field(StaticType *) variantDateType;
  235. Field(DynamicType *) symbolTypeDynamic;
  236. Field(StaticType *) symbolTypeStatic;
  237. Field(DynamicType *) iteratorResultType;
  238. Field(DynamicType *) arrayIteratorType;
  239. Field(DynamicType *) mapIteratorType;
  240. Field(DynamicType *) setIteratorType;
  241. Field(DynamicType *) stringIteratorType;
  242. Field(DynamicType *) promiseType;
  243. Field(DynamicType *) listIteratorType;
  244. Field(JavascriptFunction*) builtinFunctions[BuiltinFunction::Count];
  245. Field(INT_PTR) vtableAddresses[VTableValue::Count];
  246. Field(JavascriptString*) typeDisplayStrings[TypeIds_Limit];
  247. Field(ConstructorCache *) constructorCacheDefaultInstance;
  248. __declspec(align(16)) Field(const BYTE *) absDoubleCst;
  249. Field(double const *) uintConvertConst;
  250. // Function Types
  251. Field(DynamicTypeHandler *) anonymousFunctionTypeHandler;
  252. Field(DynamicTypeHandler *) anonymousFunctionWithPrototypeTypeHandler;
  253. Field(DynamicTypeHandler *) functionTypeHandler;
  254. Field(DynamicTypeHandler *) functionWithPrototypeTypeHandler;
  255. Field(DynamicType *) externalFunctionWithDeferredPrototypeType;
  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 *) 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. // SIMD_JS
  285. Field(DynamicType *) simdBool8x16TypeDynamic;
  286. Field(DynamicType *) simdBool16x8TypeDynamic;
  287. Field(DynamicType *) simdBool32x4TypeDynamic;
  288. Field(DynamicType *) simdInt8x16TypeDynamic;
  289. Field(DynamicType *) simdInt16x8TypeDynamic;
  290. Field(DynamicType *) simdInt32x4TypeDynamic;
  291. Field(DynamicType *) simdUint8x16TypeDynamic;
  292. Field(DynamicType *) simdUint16x8TypeDynamic;
  293. Field(DynamicType *) simdUint32x4TypeDynamic;
  294. Field(DynamicType *) simdFloat32x4TypeDynamic;
  295. Field(StaticType *) simdFloat32x4TypeStatic;
  296. Field(StaticType *) simdInt32x4TypeStatic;
  297. Field(StaticType *) simdInt8x16TypeStatic;
  298. Field(StaticType *) simdFloat64x2TypeStatic;
  299. Field(StaticType *) simdInt16x8TypeStatic;
  300. Field(StaticType *) simdBool32x4TypeStatic;
  301. Field(StaticType *) simdBool16x8TypeStatic;
  302. Field(StaticType *) simdBool8x16TypeStatic;
  303. Field(StaticType *) simdUint32x4TypeStatic;
  304. Field(StaticType *) simdUint16x8TypeStatic;
  305. Field(StaticType *) simdUint8x16TypeStatic;
  306. Field(DynamicType *) numberTypeDynamic;
  307. Field(DynamicType *) objectTypes[PreInitializedObjectTypeCount];
  308. Field(DynamicType *) objectHeaderInlinedTypes[PreInitializedObjectTypeCount];
  309. Field(DynamicType *) regexPrototypeType;
  310. Field(DynamicType *) regexType;
  311. Field(DynamicType *) regexResultType;
  312. Field(StaticType *) stringTypeStatic;
  313. Field(DynamicType *) stringTypeDynamic;
  314. Field(DynamicType *) mapType;
  315. Field(DynamicType *) setType;
  316. Field(DynamicType *) weakMapType;
  317. Field(DynamicType *) weakSetType;
  318. Field(DynamicType *) proxyType;
  319. Field(StaticType *) withType;
  320. Field(DynamicType *) SpreadArgumentType;
  321. Field(DynamicType *) moduleNamespaceType;
  322. Field(PropertyDescriptor) defaultPropertyDescriptor;
  323. Field(JavascriptString*) nullString;
  324. Field(JavascriptString*) emptyString;
  325. Field(JavascriptString*) quotesString;
  326. Field(JavascriptString*) whackString;
  327. Field(JavascriptString*) objectDisplayString;
  328. Field(JavascriptString*) stringTypeDisplayString;
  329. Field(JavascriptString*) errorDisplayString;
  330. Field(JavascriptString*) functionPrefixString;
  331. Field(JavascriptString*) generatorFunctionPrefixString;
  332. Field(JavascriptString*) asyncFunctionPrefixString;
  333. Field(JavascriptString*) functionDisplayString;
  334. Field(JavascriptString*) xDomainFunctionDisplayString;
  335. Field(JavascriptString*) undefinedDisplayString;
  336. Field(JavascriptString*) nanDisplayString;
  337. Field(JavascriptString*) nullDisplayString;
  338. Field(JavascriptString*) unknownDisplayString;
  339. Field(JavascriptString*) commaDisplayString;
  340. Field(JavascriptString*) commaSpaceDisplayString;
  341. Field(JavascriptString*) trueDisplayString;
  342. Field(JavascriptString*) falseDisplayString;
  343. Field(JavascriptString*) lengthDisplayString;
  344. Field(JavascriptString*) invalidDateString;
  345. Field(JavascriptString*) objectTypeDisplayString;
  346. Field(JavascriptString*) functionTypeDisplayString;
  347. Field(JavascriptString*) booleanTypeDisplayString;
  348. Field(JavascriptString*) numberTypeDisplayString;
  349. Field(JavascriptString*) moduleTypeDisplayString;
  350. Field(JavascriptString*) variantDateTypeDisplayString;
  351. // SIMD_JS
  352. Field(JavascriptString*) simdFloat32x4DisplayString;
  353. Field(JavascriptString*) simdFloat64x2DisplayString;
  354. Field(JavascriptString*) simdInt32x4DisplayString;
  355. Field(JavascriptString*) simdInt16x8DisplayString;
  356. Field(JavascriptString*) simdInt8x16DisplayString;
  357. Field(JavascriptString*) simdBool32x4DisplayString;
  358. Field(JavascriptString*) simdBool16x8DisplayString;
  359. Field(JavascriptString*) simdBool8x16DisplayString;
  360. Field(JavascriptString*) simdUint32x4DisplayString;
  361. Field(JavascriptString*) simdUint16x8DisplayString;
  362. Field(JavascriptString*) simdUint8x16DisplayString;
  363. Field(JavascriptString*) symbolTypeDisplayString;
  364. Field(JavascriptString*) debuggerDeadZoneBlockVariableString;
  365. Field(DynamicObject*) missingPropertyHolder;
  366. Field(StaticType*) throwErrorObjectType;
  367. Field(PropertyStringCacheMap*) propertyStringMap;
  368. Field(ConstructorCache*) builtInConstructorCache;
  369. #ifdef ENABLE_DEBUG_CONFIG_OPTIONS
  370. Field(JavascriptFunction*) debugObjectFaultInjectionCookieGetterFunction;
  371. Field(JavascriptFunction*) debugObjectFaultInjectionCookieSetterFunction;
  372. #endif
  373. Field(JavascriptFunction*) evalFunctionObject;
  374. Field(JavascriptFunction*) arrayPrototypeValuesFunction;
  375. Field(JavascriptFunction*) parseIntFunctionObject;
  376. Field(JavascriptFunction*) parseFloatFunctionObject;
  377. Field(JavascriptFunction*) arrayPrototypeToStringFunction;
  378. Field(JavascriptFunction*) arrayPrototypeToLocaleStringFunction;
  379. Field(JavascriptFunction*) identityFunction;
  380. Field(JavascriptFunction*) throwerFunction;
  381. Field(JavascriptFunction*) generatorNextFunction;
  382. Field(JavascriptFunction*) generatorThrowFunction;
  383. Field(JavascriptFunction*) objectValueOfFunction;
  384. Field(JavascriptFunction*) objectToStringFunction;
  385. #ifdef ENABLE_WASM
  386. Field(DynamicObject*) webAssemblyObject;
  387. #endif
  388. // SIMD_JS
  389. Field(JavascriptFunction*) simdFloat32x4ToStringFunction;
  390. Field(JavascriptFunction*) simdFloat64x2ToStringFunction;
  391. Field(JavascriptFunction*) simdInt32x4ToStringFunction;
  392. Field(JavascriptFunction*) simdInt16x8ToStringFunction;
  393. Field(JavascriptFunction*) simdInt8x16ToStringFunction;
  394. Field(JavascriptFunction*) simdBool32x4ToStringFunction;
  395. Field(JavascriptFunction*) simdBool16x8ToStringFunction;
  396. Field(JavascriptFunction*) simdBool8x16ToStringFunction;
  397. Field(JavascriptFunction*) simdUint32x4ToStringFunction;
  398. Field(JavascriptFunction*) simdUint16x8ToStringFunction;
  399. Field(JavascriptFunction*) simdUint8x16ToStringFunction;
  400. Field(JavascriptSymbol*) symbolMatch;
  401. Field(JavascriptSymbol*) symbolReplace;
  402. Field(JavascriptSymbol*) symbolSearch;
  403. Field(JavascriptSymbol*) symbolSplit;
  404. Field(UnifiedRegex::RegexPattern *) emptyRegexPattern;
  405. Field(JavascriptFunction*) regexExecFunction;
  406. Field(JavascriptFunction*) regexFlagsGetterFunction;
  407. Field(JavascriptFunction*) regexGlobalGetterFunction;
  408. Field(JavascriptFunction*) regexStickyGetterFunction;
  409. Field(JavascriptFunction*) regexUnicodeGetterFunction;
  410. Field(RuntimeFunction*) sharedArrayBufferConstructor;
  411. Field(DynamicObject*) sharedArrayBufferPrototype;
  412. Field(DynamicObject*) atomicsObject;
  413. Field(DynamicObject*) webAssemblyCompileErrorPrototype;
  414. Field(RuntimeFunction*) webAssemblyCompileErrorConstructor;
  415. Field(DynamicObject*) webAssemblyRuntimeErrorPrototype;
  416. Field(RuntimeFunction*) webAssemblyRuntimeErrorConstructor;
  417. Field(DynamicObject*) webAssemblyLinkErrorPrototype;
  418. Field(RuntimeFunction*) webAssemblyLinkErrorConstructor;
  419. Field(DynamicObject*) webAssemblyMemoryPrototype;
  420. Field(RuntimeFunction*) webAssemblyMemoryConstructor;
  421. Field(DynamicObject*) webAssemblyModulePrototype;
  422. Field(RuntimeFunction*) webAssemblyModuleConstructor;
  423. Field(DynamicObject*) webAssemblyInstancePrototype;
  424. Field(RuntimeFunction*) webAssemblyInstanceConstructor;
  425. Field(DynamicObject*) webAssemblyTablePrototype;
  426. Field(RuntimeFunction*) webAssemblyTableConstructor;
  427. Field(int) regexConstructorSlotIndex;
  428. Field(int) regexExecSlotIndex;
  429. Field(int) regexFlagsGetterSlotIndex;
  430. Field(int) regexGlobalGetterSlotIndex;
  431. Field(int) regexStickyGetterSlotIndex;
  432. Field(int) regexUnicodeGetterSlotIndex;
  433. mutable Field(CharStringCache) charStringCache;
  434. FieldNoBarrier(PromiseContinuationCallback) nativeHostPromiseContinuationFunction;
  435. Field(void *) nativeHostPromiseContinuationFunctionState;
  436. typedef SList<Js::FunctionProxy*, Recycler> FunctionReferenceList;
  437. typedef JsUtil::WeakReferenceDictionary<uintptr_t, DynamicType, DictionarySizePolicy<PowerOf2Policy, 1>> JsrtExternalTypesCache;
  438. Field(void *) bindRefChunkBegin;
  439. Field(Field(void*)*) bindRefChunkCurrent;
  440. Field(Field(void*)*) bindRefChunkEnd;
  441. Field(TypePath*) rootPath; // this should be in library instead of ScriptContext::Cache
  442. Field(Js::Cache) cache;
  443. Field(FunctionReferenceList*) dynamicFunctionReference;
  444. Field(uint) dynamicFunctionReferenceDepth;
  445. Field(FinalizableObject*) jsrtContextObject;
  446. Field(JsrtExternalTypesCache*) jsrtExternalTypesCache;
  447. Field(FunctionBody*) fakeGlobalFuncForUndefer;
  448. typedef JsUtil::BaseHashSet<RecyclerWeakReference<RecyclableObject>*, Recycler, PowerOf2SizePolicy, RecyclerWeakReference<RecyclableObject>*, StringTemplateCallsiteObjectComparer> StringTemplateCallsiteObjectList;
  449. // Used to store a list of template callsite objects.
  450. // We use the raw strings in the callsite object (or a string template parse node) to identify unique callsite objects in the list.
  451. // See abstract operation GetTemplateObject in ES6 Spec (RC1) 12.2.8.3
  452. Field(StringTemplateCallsiteObjectList*) stringTemplateCallsiteObjectList;
  453. Field(ModuleRecordList*) moduleRecordList;
  454. // This list contains types ensured to have only writable data properties in it and all objects in its prototype chain
  455. // (i.e., no readonly properties or accessors). Only prototype objects' types are stored in the list. When something
  456. // in the script context adds a readonly property or accessor to an object that is used as a prototype object, this
  457. // list is cleared. The list is also cleared before garbage collection so that it does not keep growing, and so, it can
  458. // hold strong references to the types.
  459. //
  460. // The cache is used by the type-without-property local inline cache. When setting a property on a type that doesn't
  461. // have the property, to determine whether to promote the object like an object of that type was last promoted, we need
  462. // to ensure that objects in the prototype chain have not acquired a readonly property or setter (ideally, only for that
  463. // property ID, but we just check for any such property). This cache is used to avoid doing this many times, especially
  464. // when the prototype chain is not short.
  465. //
  466. // This list is only used to invalidate the status of types. The type itself contains a boolean indicating whether it
  467. // and prototypes contain only writable data properties, which is reset upon invalidating the status.
  468. Field(JsUtil::List<Type *> *) typesEnsuredToHaveOnlyWritableDataPropertiesInItAndPrototypeChain;
  469. Field(uint64) randSeed0, randSeed1;
  470. Field(bool) isPRNGSeeded;
  471. Field(bool) inProfileMode;
  472. Field(bool) inDispatchProfileMode;
  473. Field(bool) arrayObjectHasUserDefinedSpecies;
  474. JavascriptFunction * AddFunctionToLibraryObjectWithPrototype(DynamicObject * object, PropertyId propertyId, FunctionInfo * functionInfo, int length, DynamicObject * prototype = nullptr, DynamicType * functionType = nullptr);
  475. JavascriptFunction * AddFunctionToLibraryObject(DynamicObject* object, PropertyId propertyId, FunctionInfo * functionInfo, int length, PropertyAttributes attributes = PropertyBuiltInMethodDefaults);
  476. JavascriptFunction * AddFunctionToLibraryObjectWithName(DynamicObject* object, PropertyId propertyId, PropertyId nameId, FunctionInfo * functionInfo, int length);
  477. RuntimeFunction* AddGetterToLibraryObject(DynamicObject* object, PropertyId propertyId, FunctionInfo* functionInfo);
  478. void AddAccessorsToLibraryObject(DynamicObject* object, PropertyId propertyId, FunctionInfo * getterFunctionInfo, FunctionInfo * setterFunctionInfo);
  479. void AddAccessorsToLibraryObject(DynamicObject* object, PropertyId propertyId, RecyclableObject * getterFunction, RecyclableObject * setterFunction);
  480. void AddAccessorsToLibraryObjectWithName(DynamicObject* object, PropertyId propertyId, PropertyId nameId, FunctionInfo * getterFunctionInfo, FunctionInfo * setterFunction);
  481. RuntimeFunction * CreateGetterFunction(PropertyId nameId, FunctionInfo* functionInfo);
  482. RuntimeFunction * CreateSetterFunction(PropertyId nameId, FunctionInfo* functionInfo);
  483. template <size_t N>
  484. JavascriptFunction * AddFunctionToLibraryObjectWithPropertyName(DynamicObject* object, const char16(&propertyName)[N], FunctionInfo * functionInfo, int length);
  485. static SimpleTypeHandler<1> SharedPrototypeTypeHandler;
  486. static SimpleTypeHandler<1> SharedFunctionWithoutPrototypeTypeHandler;
  487. static SimpleTypeHandler<1> SharedFunctionWithPrototypeTypeHandlerV11;
  488. static SimpleTypeHandler<2> SharedFunctionWithPrototypeTypeHandler;
  489. static SimpleTypeHandler<1> SharedFunctionWithLengthTypeHandler;
  490. static SimpleTypeHandler<2> SharedFunctionWithLengthAndNameTypeHandler;
  491. static SimpleTypeHandler<1> SharedIdMappedFunctionWithPrototypeTypeHandler;
  492. static SimpleTypeHandler<2> SharedNamespaceSymbolTypeHandler;
  493. static MissingPropertyTypeHandler MissingPropertyHolderTypeHandler;
  494. static SimplePropertyDescriptor const SharedFunctionPropertyDescriptors[2];
  495. static SimplePropertyDescriptor const HeapArgumentsPropertyDescriptors[3];
  496. static SimplePropertyDescriptor const FunctionWithLengthAndPrototypeTypeDescriptors[2];
  497. static SimplePropertyDescriptor const FunctionWithLengthAndNameTypeDescriptors[2];
  498. static SimplePropertyDescriptor const ModuleNamespaceTypeDescriptors[2];
  499. public:
  500. static const ObjectInfoBits EnumFunctionClass = EnumClass_1_Bit;
  501. static void InitializeProperties(ThreadContext * threadContext);
  502. JavascriptLibrary(GlobalObject* globalObject) :
  503. JavascriptLibraryBase(globalObject),
  504. inProfileMode(false),
  505. inDispatchProfileMode(false),
  506. propertyStringMap(nullptr),
  507. parseIntFunctionObject(nullptr),
  508. evalFunctionObject(nullptr),
  509. parseFloatFunctionObject(nullptr),
  510. arrayPrototypeToLocaleStringFunction(nullptr),
  511. arrayPrototypeToStringFunction(nullptr),
  512. identityFunction(nullptr),
  513. throwerFunction(nullptr),
  514. jsrtContextObject(nullptr),
  515. jsrtExternalTypesCache(nullptr),
  516. fakeGlobalFuncForUndefer(nullptr),
  517. externalLibraryList(nullptr),
  518. #if ENABLE_COPYONACCESS_ARRAY
  519. cacheForCopyOnAccessArraySegments(nullptr),
  520. #endif
  521. referencedPropertyRecords(nullptr),
  522. stringTemplateCallsiteObjectList(nullptr),
  523. moduleRecordList(nullptr),
  524. rootPath(nullptr),
  525. bindRefChunkBegin(nullptr),
  526. bindRefChunkCurrent(nullptr),
  527. bindRefChunkEnd(nullptr),
  528. dynamicFunctionReference(nullptr)
  529. {
  530. this->globalObject = globalObject;
  531. }
  532. void Initialize(ScriptContext* scriptContext, GlobalObject * globalObject);
  533. void Uninitialize();
  534. GlobalObject* GetGlobalObject() const { return globalObject; }
  535. ScriptContext* GetScriptContext() const { return scriptContext; }
  536. Recycler * GetRecycler() const { return recycler; }
  537. Var GetTrueOrFalse(BOOL value) { return value ? booleanTrue : booleanFalse; }
  538. JavascriptSymbol* GetSymbolMatch() { return symbolMatch; }
  539. JavascriptSymbol* GetSymbolReplace() { return symbolReplace; }
  540. JavascriptSymbol* GetSymbolSearch() { return symbolSearch; }
  541. JavascriptSymbol* GetSymbolSplit() { return symbolSplit; }
  542. JavascriptSymbol* GetSymbolSpecies() { return symbolSpecies; }
  543. JavascriptString* GetNullString() { return nullString; }
  544. JavascriptString* GetEmptyString() const;
  545. JavascriptString* GetWhackString() { return whackString; }
  546. JavascriptString* GetUndefinedDisplayString() { return undefinedDisplayString; }
  547. JavascriptString* GetNaNDisplayString() { return nanDisplayString; }
  548. JavascriptString* GetQuotesString() { return quotesString; }
  549. JavascriptString* GetNullDisplayString() { return nullDisplayString; }
  550. JavascriptString* GetUnknownDisplayString() { return unknownDisplayString; }
  551. JavascriptString* GetCommaDisplayString() { return commaDisplayString; }
  552. JavascriptString* GetCommaSpaceDisplayString() { return commaSpaceDisplayString; }
  553. JavascriptString* GetTrueDisplayString() { return trueDisplayString; }
  554. JavascriptString* GetFalseDisplayString() { return falseDisplayString; }
  555. JavascriptString* GetLengthDisplayString() { return lengthDisplayString; }
  556. JavascriptString* GetObjectDisplayString() { return objectDisplayString; }
  557. JavascriptString* GetStringTypeDisplayString() { return stringTypeDisplayString; }
  558. JavascriptString* GetErrorDisplayString() const { return errorDisplayString; }
  559. JavascriptString* GetFunctionPrefixString() { return functionPrefixString; }
  560. JavascriptString* GetGeneratorFunctionPrefixString() { return generatorFunctionPrefixString; }
  561. JavascriptString* GetAsyncFunctionPrefixString() { return asyncFunctionPrefixString; }
  562. JavascriptString* GetFunctionDisplayString() { return functionDisplayString; }
  563. JavascriptString* GetXDomainFunctionDisplayString() { return xDomainFunctionDisplayString; }
  564. JavascriptString* GetInvalidDateString() { return invalidDateString; }
  565. JavascriptString* GetObjectTypeDisplayString() const { return objectTypeDisplayString; }
  566. JavascriptString* GetFunctionTypeDisplayString() const { return functionTypeDisplayString; }
  567. JavascriptString* GetBooleanTypeDisplayString() const { return booleanTypeDisplayString; }
  568. JavascriptString* GetNumberTypeDisplayString() const { return numberTypeDisplayString; }
  569. JavascriptString* GetModuleTypeDisplayString() const { return moduleTypeDisplayString; }
  570. JavascriptString* GetVariantDateTypeDisplayString() const { return variantDateTypeDisplayString; }
  571. // SIMD_JS
  572. JavascriptString* GetSIMDFloat32x4DisplayString() const { return simdFloat32x4DisplayString; }
  573. JavascriptString* GetSIMDFloat64x2DisplayString() const { return simdFloat64x2DisplayString; }
  574. JavascriptString* GetSIMDInt32x4DisplayString() const { return simdInt32x4DisplayString; }
  575. JavascriptString* GetSIMDInt16x8DisplayString() const { return simdInt16x8DisplayString; }
  576. JavascriptString* GetSIMDInt8x16DisplayString() const { return simdInt8x16DisplayString; }
  577. JavascriptString* GetSIMDBool32x4DisplayString() const { return simdBool32x4DisplayString; }
  578. JavascriptString* GetSIMDBool16x8DisplayString() const { return simdBool16x8DisplayString; }
  579. JavascriptString* GetSIMDBool8x16DisplayString() const { return simdBool8x16DisplayString; }
  580. JavascriptString* GetSIMDUint32x4DisplayString() const { return simdUint32x4DisplayString; }
  581. JavascriptString* GetSIMDUint16x8DisplayString() const { return simdUint16x8DisplayString; }
  582. JavascriptString* GetSIMDUint8x16DisplayString() const { return simdUint8x16DisplayString; }
  583. JavascriptString* GetSymbolTypeDisplayString() const { return symbolTypeDisplayString; }
  584. JavascriptString* GetDebuggerDeadZoneBlockVariableString() { Assert(debuggerDeadZoneBlockVariableString); return debuggerDeadZoneBlockVariableString; }
  585. JavascriptRegExp* CreateEmptyRegExp();
  586. JavascriptFunction* GetEvalFunctionObject() { return evalFunctionObject; }
  587. JavascriptFunction* GetArrayPrototypeValuesFunction() { return EnsureArrayPrototypeValuesFunction(); }
  588. JavascriptFunction* GetArrayIteratorPrototypeBuiltinNextFunction() { return arrayIteratorPrototypeBuiltinNextFunction; }
  589. DynamicObject* GetReflectObject() const { return reflectObject; }
  590. const PropertyDescriptor* GetDefaultPropertyDescriptor() const { return &defaultPropertyDescriptor; }
  591. DynamicObject* GetMissingPropertyHolder() const { return missingPropertyHolder; }
  592. JavascriptFunction* GetSharedArrayBufferConstructor() { return sharedArrayBufferConstructor; }
  593. DynamicObject* GetAtomicsObject() { return atomicsObject; }
  594. DynamicObject* GetWebAssemblyCompileErrorPrototype() const { return webAssemblyCompileErrorPrototype; }
  595. DynamicObject* GetWebAssemblyCompileErrorConstructor() const { return webAssemblyCompileErrorConstructor; }
  596. DynamicObject* GetWebAssemblyRuntimeErrorPrototype() const { return webAssemblyRuntimeErrorPrototype; }
  597. DynamicObject* GetWebAssemblyRuntimeErrorConstructor() const { return webAssemblyRuntimeErrorConstructor; }
  598. DynamicObject* GetWebAssemblyLinkErrorPrototype() const { return webAssemblyLinkErrorPrototype; }
  599. DynamicObject* GetWebAssemblyLinkErrorConstructor() const { return webAssemblyLinkErrorConstructor; }
  600. #if ENABLE_TTD
  601. Js::PropertyId ExtractPrimitveSymbolId_TTD(Var value);
  602. Js::RecyclableObject* CreatePrimitveSymbol_TTD(Js::PropertyId pid);
  603. Js::RecyclableObject* CreatePrimitveSymbol_TTD(Js::JavascriptString* str);
  604. Js::RecyclableObject* CreateDefaultBoxedObject_TTD(Js::TypeId kind);
  605. void SetBoxedObjectValue_TTD(Js::RecyclableObject* obj, Js::Var value);
  606. Js::RecyclableObject* CreateDate_TTD(double value);
  607. Js::RecyclableObject* CreateRegex_TTD(const char16* patternSource, uint32 patternLength, UnifiedRegex::RegexFlags flags, CharCount lastIndex, Js::Var lastVar);
  608. Js::RecyclableObject* CreateError_TTD();
  609. Js::RecyclableObject* CreateES5Array_TTD();
  610. static void SetLengthWritableES5Array_TTD(Js::RecyclableObject* es5Array, bool isLengthWritable);
  611. Js::RecyclableObject* CreateSet_TTD();
  612. Js::RecyclableObject* CreateWeakSet_TTD();
  613. static void AddSetElementInflate_TTD(Js::JavascriptSet* set, Var value);
  614. static void AddWeakSetElementInflate_TTD(Js::JavascriptWeakSet* set, Var value);
  615. Js::RecyclableObject* CreateMap_TTD();
  616. Js::RecyclableObject* CreateWeakMap_TTD();
  617. static void AddMapElementInflate_TTD(Js::JavascriptMap* map, Var key, Var value);
  618. static void AddWeakMapElementInflate_TTD(Js::JavascriptWeakMap* map, Var key, Var value);
  619. Js::RecyclableObject* CreateExternalFunction_TTD(Js::Var fname);
  620. Js::RecyclableObject* CreateBoundFunction_TTD(RecyclableObject* function, Var bThis, uint32 ct, Var* args);
  621. Js::RecyclableObject* CreateProxy_TTD(RecyclableObject* handler, RecyclableObject* target);
  622. Js::RecyclableObject* CreateRevokeFunction_TTD(RecyclableObject* proxy);
  623. Js::RecyclableObject* CreateHeapArguments_TTD(uint32 numOfArguments, uint32 formalCount, ActivationObject* frameObject, byte* deletedArray);
  624. Js::RecyclableObject* CreateES5HeapArguments_TTD(uint32 numOfArguments, uint32 formalCount, ActivationObject* frameObject, byte* deletedArray);
  625. Js::JavascriptPromiseCapability* CreatePromiseCapability_TTD(Var promise, Var resolve, Var reject);
  626. Js::JavascriptPromiseReaction* CreatePromiseReaction_TTD(RecyclableObject* handler, JavascriptPromiseCapability* capabilities);
  627. Js::RecyclableObject* CreatePromise_TTD(uint32 status, Var result, JsUtil::List<Js::JavascriptPromiseReaction*, HeapAllocator>& resolveReactions, JsUtil::List<Js::JavascriptPromiseReaction*, HeapAllocator>& rejectReactions);
  628. JavascriptPromiseResolveOrRejectFunctionAlreadyResolvedWrapper* CreateAlreadyDefinedWrapper_TTD(bool alreadyDefined);
  629. Js::RecyclableObject* CreatePromiseResolveOrRejectFunction_TTD(RecyclableObject* promise, bool isReject, JavascriptPromiseResolveOrRejectFunctionAlreadyResolvedWrapper* alreadyResolved);
  630. Js::RecyclableObject* CreatePromiseReactionTaskFunction_TTD(JavascriptPromiseReaction* reaction, Var argument);
  631. Js::JavascriptPromiseAllResolveElementFunctionRemainingElementsWrapper* CreateRemainingElementsWrapper_TTD(Js::ScriptContext* ctx, uint32 value);
  632. Js::RecyclableObject* CreatePromiseAllResolveElementFunction_TTD(Js::JavascriptPromiseCapability* capabilities, uint32 index, Js::JavascriptPromiseAllResolveElementFunctionRemainingElementsWrapper* wrapper, Js::RecyclableObject* values, bool alreadyCalled);
  633. #endif
  634. #ifdef ENABLE_INTL_OBJECT
  635. void ResetIntlObject();
  636. void EnsureIntlObjectReady();
  637. template <class Fn>
  638. void InitializeIntlForPrototypes(Fn fn);
  639. void InitializeIntlForStringPrototype();
  640. void InitializeIntlForDatePrototype();
  641. void InitializeIntlForNumberPrototype();
  642. #endif
  643. #ifdef ENABLE_DEBUG_CONFIG_OPTIONS
  644. DynamicType * GetDebugDisposableObjectType() { return debugDisposableObjectType; }
  645. DynamicType * GetDebugFuncExecutorInDisposeObjectType() { return debugFuncExecutorInDisposeObjectType; }
  646. #endif
  647. DynamicType* GetErrorType(ErrorTypeEnum typeToCreate) const;
  648. StaticType * GetBooleanTypeStatic() const { return booleanTypeStatic; }
  649. DynamicType * GetBooleanTypeDynamic() const { return booleanTypeDynamic; }
  650. DynamicType * GetDateType() const { return dateType; }
  651. DynamicType * GetBoundFunctionType() const { return boundFunctionType; }
  652. DynamicType * GetRegExpConstructorType() const { return regexConstructorType; }
  653. StaticType * GetEnumeratorType() const { return enumeratorType; }
  654. DynamicType * GetSpreadArgumentType() const { return SpreadArgumentType; }
  655. StaticType * GetWithType() const { return withType; }
  656. DynamicType * GetErrorType() const { return errorType; }
  657. DynamicType * GetEvalErrorType() const { return evalErrorType; }
  658. DynamicType * GetRangeErrorType() const { return rangeErrorType; }
  659. DynamicType * GetReferenceErrorType() const { return referenceErrorType; }
  660. DynamicType * GetSyntaxErrorType() const { return syntaxErrorType; }
  661. DynamicType * GetTypeErrorType() const { return typeErrorType; }
  662. DynamicType * GetURIErrorType() const { return uriErrorType; }
  663. DynamicType * GetWebAssemblyCompileErrorType() const { return webAssemblyCompileErrorType; }
  664. DynamicType * GetWebAssemblyRuntimeErrorType() const { return webAssemblyRuntimeErrorType; }
  665. DynamicType * GetWebAssemblyLinkErrorType() const { return webAssemblyLinkErrorType; }
  666. StaticType * GetNumberTypeStatic() const { return numberTypeStatic; }
  667. StaticType * GetInt64TypeStatic() const { return int64NumberTypeStatic; }
  668. StaticType * GetUInt64TypeStatic() const { return uint64NumberTypeStatic; }
  669. DynamicType * GetNumberTypeDynamic() const { return numberTypeDynamic; }
  670. DynamicType * GetPromiseType() const { return promiseType; }
  671. DynamicType * GetWebAssemblyModuleType() const { return webAssemblyModuleType; }
  672. DynamicType * GetWebAssemblyInstanceType() const { return webAssemblyInstanceType; }
  673. DynamicType * GetWebAssemblyMemoryType() const { return webAssemblyMemoryType; }
  674. DynamicType * GetWebAssemblyTableType() const { return webAssemblyTableType; }
  675. // SIMD_JS
  676. DynamicType * GetSIMDBool8x16TypeDynamic() const { return simdBool8x16TypeDynamic; }
  677. DynamicType * GetSIMDBool16x8TypeDynamic() const { return simdBool16x8TypeDynamic; }
  678. DynamicType * GetSIMDBool32x4TypeDynamic() const { return simdBool32x4TypeDynamic; }
  679. DynamicType * GetSIMDInt8x16TypeDynamic() const { return simdInt8x16TypeDynamic; }
  680. DynamicType * GetSIMDInt16x8TypeDynamic() const { return simdInt16x8TypeDynamic; }
  681. DynamicType * GetSIMDInt32x4TypeDynamic() const { return simdInt32x4TypeDynamic; }
  682. DynamicType * GetSIMDUint8x16TypeDynamic() const { return simdUint8x16TypeDynamic; }
  683. DynamicType * GetSIMDUint16x8TypeDynamic() const { return simdUint16x8TypeDynamic; }
  684. DynamicType * GetSIMDUint32x4TypeDynamic() const { return simdUint32x4TypeDynamic; }
  685. DynamicType * GetSIMDFloat32x4TypeDynamic() const { return simdFloat32x4TypeDynamic; }
  686. StaticType* GetSIMDFloat32x4TypeStatic() const { return simdFloat32x4TypeStatic; }
  687. StaticType* GetSIMDFloat64x2TypeStatic() const { return simdFloat64x2TypeStatic; }
  688. StaticType* GetSIMDInt32x4TypeStatic() const { return simdInt32x4TypeStatic; }
  689. StaticType* GetSIMDInt16x8TypeStatic() const { return simdInt16x8TypeStatic; }
  690. StaticType* GetSIMDInt8x16TypeStatic() const { return simdInt8x16TypeStatic; }
  691. StaticType* GetSIMDBool32x4TypeStatic() const { return simdBool32x4TypeStatic; }
  692. StaticType* GetSIMDBool16x8TypeStatic() const { return simdBool16x8TypeStatic; }
  693. StaticType* GetSIMDBool8x16TypeStatic() const { return simdBool8x16TypeStatic; }
  694. StaticType* GetSIMDUInt32x4TypeStatic() const { return simdUint32x4TypeStatic; }
  695. StaticType* GetSIMDUint16x8TypeStatic() const { return simdUint16x8TypeStatic; }
  696. StaticType* GetSIMDUint8x16TypeStatic() const { return simdUint8x16TypeStatic; }
  697. DynamicType * GetObjectLiteralType(uint16 requestedInlineSlotCapacity);
  698. DynamicType * GetObjectHeaderInlinedLiteralType(uint16 requestedInlineSlotCapacity);
  699. DynamicType * GetObjectType() const { return objectTypes[0]; }
  700. DynamicType * GetObjectHeaderInlinedType() const { return objectHeaderInlinedTypes[0]; }
  701. StaticType * GetSymbolTypeStatic() const { return symbolTypeStatic; }
  702. DynamicType * GetSymbolTypeDynamic() const { return symbolTypeDynamic; }
  703. DynamicType * GetProxyType() const { return proxyType; }
  704. DynamicType * GetHeapArgumentsObjectType() const { return heapArgumentsType; }
  705. DynamicType * GetActivationObjectType() const { return activationObjectType; }
  706. DynamicType * GetModuleNamespaceType() const { return moduleNamespaceType; }
  707. DynamicType * GetArrayType() const { return arrayType; }
  708. DynamicType * GetNativeIntArrayType() const { return nativeIntArrayType; }
  709. #if ENABLE_COPYONACCESS_ARRAY
  710. DynamicType * GetCopyOnAccessNativeIntArrayType() const { return copyOnAccessNativeIntArrayType; }
  711. #endif
  712. DynamicType * GetNativeFloatArrayType() const { return nativeFloatArrayType; }
  713. DynamicType * GetRegexPrototypeType() const { return regexPrototypeType; }
  714. DynamicType * GetRegexType() const { return regexType; }
  715. DynamicType * GetRegexResultType() const { return regexResultType; }
  716. DynamicType * GetArrayBufferType() const { return arrayBufferType; }
  717. StaticType * GetStringTypeStatic() const { AssertMsg(stringTypeStatic, "Where's stringTypeStatic?"); return stringTypeStatic; }
  718. DynamicType * GetStringTypeDynamic() const { return stringTypeDynamic; }
  719. StaticType * GetVariantDateType() const { return variantDateType; }
  720. void EnsureDebugObject(DynamicObject* newDebugObject);
  721. DynamicObject* GetDebugObject() const { Assert(debugObject != nullptr); return debugObject; }
  722. DynamicType * GetMapType() const { return mapType; }
  723. DynamicType * GetSetType() const { return setType; }
  724. DynamicType * GetWeakMapType() const { return weakMapType; }
  725. DynamicType * GetWeakSetType() const { return weakSetType; }
  726. DynamicType * GetArrayIteratorType() const { return arrayIteratorType; }
  727. DynamicType * GetMapIteratorType() const { return mapIteratorType; }
  728. DynamicType * GetSetIteratorType() const { return setIteratorType; }
  729. DynamicType * GetStringIteratorType() const { return stringIteratorType; }
  730. DynamicType * GetListIteratorType() const { return listIteratorType; }
  731. JavascriptFunction* GetDefaultAccessorFunction() const { return defaultAccessorFunction; }
  732. JavascriptFunction* GetStackTraceAccessorFunction() const { return stackTraceAccessorFunction; }
  733. JavascriptFunction* GetThrowTypeErrorRestrictedPropertyAccessorFunction() const { return throwTypeErrorRestrictedPropertyAccessorFunction; }
  734. JavascriptFunction* Get__proto__getterFunction() const { return __proto__getterFunction; }
  735. JavascriptFunction* Get__proto__setterFunction() const { return __proto__setterFunction; }
  736. JavascriptFunction* GetObjectValueOfFunction() const { return objectValueOfFunction; }
  737. JavascriptFunction* GetObjectToStringFunction() const { return objectToStringFunction; }
  738. // SIMD_JS
  739. JavascriptFunction* GetSIMDFloat32x4ToStringFunction() const { return simdFloat32x4ToStringFunction; }
  740. JavascriptFunction* GetSIMDFloat64x2ToStringFunction() const { return simdFloat64x2ToStringFunction; }
  741. JavascriptFunction* GetSIMDInt32x4ToStringFunction() const { return simdInt32x4ToStringFunction; }
  742. JavascriptFunction* GetSIMDInt16x8ToStringFunction() const { return simdInt16x8ToStringFunction; }
  743. JavascriptFunction* GetSIMDInt8x16ToStringFunction() const { return simdInt8x16ToStringFunction; }
  744. JavascriptFunction* GetSIMDBool32x4ToStringFunction() const { return simdBool32x4ToStringFunction; }
  745. JavascriptFunction* GetSIMDBool16x8ToStringFunction() const { return simdBool16x8ToStringFunction; }
  746. JavascriptFunction* GetSIMDBool8x16ToStringFunction() const { return simdBool8x16ToStringFunction; }
  747. JavascriptFunction* GetSIMDUint32x4ToStringFunction() const { return simdUint32x4ToStringFunction; }
  748. JavascriptFunction* GetSIMDUint16x8ToStringFunction() const { return simdUint16x8ToStringFunction; }
  749. JavascriptFunction* GetSIMDUint8x16ToStringFunction() const { return simdUint8x16ToStringFunction; }
  750. JavascriptFunction* GetDebugObjectNonUserGetterFunction() const { return debugObjectNonUserGetterFunction; }
  751. JavascriptFunction* GetDebugObjectNonUserSetterFunction() const { return debugObjectNonUserSetterFunction; }
  752. UnifiedRegex::RegexPattern * GetEmptyRegexPattern() const { return emptyRegexPattern; }
  753. JavascriptFunction* GetRegexExecFunction() const { return regexExecFunction; }
  754. JavascriptFunction* GetRegexFlagsGetterFunction() const { return regexFlagsGetterFunction; }
  755. JavascriptFunction* GetRegexGlobalGetterFunction() const { return regexGlobalGetterFunction; }
  756. JavascriptFunction* GetRegexStickyGetterFunction() const { return regexStickyGetterFunction; }
  757. JavascriptFunction* GetRegexUnicodeGetterFunction() const { return regexUnicodeGetterFunction; }
  758. int GetRegexConstructorSlotIndex() const { return regexConstructorSlotIndex; }
  759. int GetRegexExecSlotIndex() const { return regexExecSlotIndex; }
  760. int GetRegexFlagsGetterSlotIndex() const { return regexFlagsGetterSlotIndex; }
  761. int GetRegexGlobalGetterSlotIndex() const { return regexGlobalGetterSlotIndex; }
  762. int GetRegexStickyGetterSlotIndex() const { return regexStickyGetterSlotIndex; }
  763. int GetRegexUnicodeGetterSlotIndex() const { return regexUnicodeGetterSlotIndex; }
  764. TypePath* GetRootPath() const { return rootPath; }
  765. void BindReference(void * addr);
  766. void CleanupForClose();
  767. void BeginDynamicFunctionReferences();
  768. void EndDynamicFunctionReferences();
  769. void RegisterDynamicFunctionReference(FunctionProxy* func);
  770. void SetDebugObjectNonUserAccessor(FunctionInfo *funcGetter, FunctionInfo *funcSetter);
  771. JavascriptFunction* GetDebugObjectDebugModeGetterFunction() const { return debugObjectDebugModeGetterFunction; }
  772. void SetDebugObjectDebugModeAccessor(FunctionInfo *funcGetter);
  773. #ifdef ENABLE_DEBUG_CONFIG_OPTIONS
  774. JavascriptFunction* GetDebugObjectFaultInjectionCookieGetterFunction() const { return debugObjectFaultInjectionCookieGetterFunction; }
  775. JavascriptFunction* GetDebugObjectFaultInjectionCookieSetterFunction() const { return debugObjectFaultInjectionCookieSetterFunction; }
  776. void SetDebugObjectFaultInjectionCookieGetterAccessor(FunctionInfo *funcGetter, FunctionInfo *funcSetter);
  777. #endif
  778. JavascriptFunction* GetArrayPrototypeToStringFunction() const { return arrayPrototypeToStringFunction; }
  779. JavascriptFunction* GetArrayPrototypeToLocaleStringFunction() const { return arrayPrototypeToLocaleStringFunction; }
  780. JavascriptFunction* GetIdentityFunction() const { return identityFunction; }
  781. JavascriptFunction* GetThrowerFunction() const { return throwerFunction; }
  782. void SetNativeHostPromiseContinuationFunction(PromiseContinuationCallback function, void *state);
  783. void SetJsrtContext(FinalizableObject* jsrtContext);
  784. FinalizableObject* GetJsrtContext();
  785. void EnqueueTask(Var taskVar);
  786. HeapArgumentsObject* CreateHeapArguments(Var frameObj, uint formalCount, bool isStrictMode = false);
  787. JavascriptArray* CreateArray();
  788. JavascriptArray* CreateArray(uint32 length);
  789. JavascriptArray *CreateArrayOnStack(void *const stackAllocationPointer);
  790. JavascriptNativeIntArray* CreateNativeIntArray();
  791. JavascriptNativeIntArray* CreateNativeIntArray(uint32 length);
  792. #if ENABLE_COPYONACCESS_ARRAY
  793. JavascriptCopyOnAccessNativeIntArray* CreateCopyOnAccessNativeIntArray();
  794. JavascriptCopyOnAccessNativeIntArray* CreateCopyOnAccessNativeIntArray(uint32 length);
  795. #endif
  796. JavascriptNativeFloatArray* CreateNativeFloatArray();
  797. JavascriptNativeFloatArray* CreateNativeFloatArray(uint32 length);
  798. JavascriptArray* CreateArray(uint32 length, uint32 size);
  799. ArrayBuffer* CreateArrayBuffer(uint32 length);
  800. ArrayBuffer* CreateArrayBuffer(byte* buffer, uint32 length);
  801. ArrayBuffer* CreateWebAssemblyArrayBuffer(uint32 length);
  802. ArrayBuffer* CreateWebAssemblyArrayBuffer(byte* buffer, uint32 length);
  803. SharedArrayBuffer* CreateSharedArrayBuffer(uint32 length);
  804. SharedArrayBuffer* CreateSharedArrayBuffer(SharedContents *contents);
  805. ArrayBuffer* CreateProjectionArraybuffer(uint32 length);
  806. ArrayBuffer* CreateProjectionArraybuffer(byte* buffer, uint32 length);
  807. DataView* CreateDataView(ArrayBufferBase* arrayBuffer, uint32 offSet, uint32 mappedLength);
  808. template <typename TypeName, bool clamped>
  809. inline DynamicType* GetTypedArrayType(TypeName);
  810. template<> inline DynamicType* GetTypedArrayType<int8,false>(int8) { return int8ArrayType; };
  811. template<> inline DynamicType* GetTypedArrayType<uint8,false>(uint8) { return uint8ArrayType; };
  812. template<> inline DynamicType* GetTypedArrayType<uint8,true>(uint8) { return uint8ClampedArrayType; };
  813. template<> inline DynamicType* GetTypedArrayType<int16,false>(int16) { return int16ArrayType; };
  814. template<> inline DynamicType* GetTypedArrayType<uint16,false>(uint16) { return uint16ArrayType; };
  815. template<> inline DynamicType* GetTypedArrayType<int32,false>(int32) { return int32ArrayType; };
  816. template<> inline DynamicType* GetTypedArrayType<uint32,false>(uint32) { return uint32ArrayType; };
  817. template<> inline DynamicType* GetTypedArrayType<float,false>(float) { return float32ArrayType; };
  818. template<> inline DynamicType* GetTypedArrayType<double,false>(double) { return float64ArrayType; };
  819. template<> inline DynamicType* GetTypedArrayType<int64,false>(int64) { return int64ArrayType; };
  820. template<> inline DynamicType* GetTypedArrayType<uint64,false>(uint64) { return uint64ArrayType; };
  821. template<> inline DynamicType* GetTypedArrayType<bool,false>(bool) { return boolArrayType; };
  822. DynamicType* GetCharArrayType() { return charArrayType; };
  823. //
  824. // This method would be used for creating array literals, when we really need to create a huge array
  825. // Avoids checks at runtime.
  826. //
  827. JavascriptArray* CreateArrayLiteral(uint32 length);
  828. JavascriptNativeIntArray* CreateNativeIntArrayLiteral(uint32 length);
  829. #if ENABLE_PROFILE_INFO
  830. JavascriptNativeIntArray* CreateCopyOnAccessNativeIntArrayLiteral(ArrayCallSiteInfo *arrayInfo, FunctionBody *functionBody, const Js::AuxArray<int32> *ints);
  831. #endif
  832. JavascriptNativeFloatArray* CreateNativeFloatArrayLiteral(uint32 length);
  833. JavascriptBoolean* CreateBoolean(BOOL value);
  834. JavascriptDate* CreateDate();
  835. JavascriptDate* CreateDate(double value);
  836. JavascriptDate* CreateDate(SYSTEMTIME* pst);
  837. JavascriptMap* CreateMap();
  838. JavascriptSet* CreateSet();
  839. JavascriptWeakMap* CreateWeakMap();
  840. JavascriptWeakSet* CreateWeakSet();
  841. JavascriptError* CreateError();
  842. JavascriptError* CreateError(DynamicType* errorType, BOOL isExternal = FALSE);
  843. JavascriptError* CreateExternalError(ErrorTypeEnum errorTypeEnum);
  844. JavascriptError* CreateEvalError();
  845. JavascriptError* CreateRangeError();
  846. JavascriptError* CreateReferenceError();
  847. JavascriptError* CreateSyntaxError();
  848. JavascriptError* CreateTypeError();
  849. JavascriptError* CreateURIError();
  850. JavascriptError* CreateStackOverflowError();
  851. JavascriptError* CreateOutOfMemoryError();
  852. JavascriptError* CreateWebAssemblyCompileError();
  853. JavascriptError* CreateWebAssemblyRuntimeError();
  854. JavascriptError* CreateWebAssemblyLinkError();
  855. JavascriptSymbol* CreateSymbol(JavascriptString* description);
  856. JavascriptSymbol* CreateSymbol(const char16* description, int descriptionLength);
  857. JavascriptSymbol* CreateSymbol(const PropertyRecord* propertyRecord);
  858. JavascriptPromise* CreatePromise();
  859. JavascriptGenerator* CreateGenerator(Arguments& args, ScriptFunction* scriptFunction, RecyclableObject* prototype);
  860. JavascriptFunction* CreateNonProfiledFunction(FunctionInfo * functionInfo);
  861. template <class MethodType>
  862. JavascriptExternalFunction* CreateIdMappedExternalFunction(MethodType entryPoint, DynamicType *pPrototypeType);
  863. JavascriptExternalFunction* CreateExternalConstructor(Js::ExternalMethod entryPoint, PropertyId nameId, RecyclableObject * prototype);
  864. JavascriptExternalFunction* CreateExternalConstructor(Js::ExternalMethod entryPoint, PropertyId nameId, InitializeMethod method, unsigned short deferredTypeSlots, bool hasAccessors);
  865. DynamicType* GetCachedJsrtExternalType(uintptr_t finalizeCallback);
  866. void CacheJsrtExternalType(uintptr_t finalizeCallback, DynamicType* dynamicType);
  867. static DynamicTypeHandler * GetDeferredPrototypeGeneratorFunctionTypeHandler(ScriptContext* scriptContext);
  868. static DynamicTypeHandler * GetDeferredPrototypeAsyncFunctionTypeHandler(ScriptContext* scriptContext);
  869. DynamicType * CreateDeferredPrototypeGeneratorFunctionType(JavascriptMethod entrypoint, bool isAnonymousFunction, bool isShared = false);
  870. DynamicType * CreateDeferredPrototypeAsyncFunctionType(JavascriptMethod entrypoint, bool isAnonymousFunction, bool isShared = false);
  871. static DynamicTypeHandler * GetDeferredPrototypeFunctionTypeHandler(ScriptContext* scriptContext);
  872. static DynamicTypeHandler * GetDeferredAnonymousPrototypeFunctionTypeHandler();
  873. static DynamicTypeHandler * GetDeferredAnonymousPrototypeGeneratorFunctionTypeHandler();
  874. static DynamicTypeHandler * GetDeferredAnonymousPrototypeAsyncFunctionTypeHandler();
  875. DynamicTypeHandler * GetDeferredFunctionTypeHandler();
  876. DynamicTypeHandler * ScriptFunctionTypeHandler(bool noPrototypeProperty, bool isAnonymousFunction);
  877. DynamicTypeHandler * GetDeferredAnonymousFunctionTypeHandler();
  878. template<bool isNameAvailable, bool isPrototypeAvailable = true>
  879. static DynamicTypeHandler * GetDeferredFunctionTypeHandlerBase();
  880. template<bool isNameAvailable, bool isPrototypeAvailable = true>
  881. static DynamicTypeHandler * GetDeferredGeneratorFunctionTypeHandlerBase();
  882. template<bool isNameAvailable>
  883. static DynamicTypeHandler * GetDeferredAsyncFunctionTypeHandlerBase();
  884. DynamicType * CreateDeferredPrototypeFunctionType(JavascriptMethod entrypoint);
  885. DynamicType * CreateDeferredPrototypeFunctionTypeNoProfileThunk(JavascriptMethod entrypoint, bool isShared = false);
  886. DynamicType * CreateFunctionType(JavascriptMethod entrypoint, RecyclableObject* prototype = nullptr);
  887. DynamicType * CreateFunctionWithLengthType(FunctionInfo * functionInfo);
  888. DynamicType * CreateFunctionWithLengthAndNameType(FunctionInfo * functionInfo);
  889. DynamicType * CreateFunctionWithLengthAndPrototypeType(FunctionInfo * functionInfo);
  890. DynamicType * CreateFunctionWithLengthType(DynamicObject * prototype, FunctionInfo * functionInfo);
  891. DynamicType * CreateFunctionWithLengthAndNameType(DynamicObject * prototype, FunctionInfo * functionInfo);
  892. DynamicType * CreateFunctionWithLengthAndPrototypeType(DynamicObject * prototype, FunctionInfo * functionInfo);
  893. ScriptFunction * CreateScriptFunction(FunctionProxy* proxy);
  894. AsmJsScriptFunction * CreateAsmJsScriptFunction(FunctionProxy* proxy);
  895. ScriptFunctionWithInlineCache * CreateScriptFunctionWithInlineCache(FunctionProxy* proxy);
  896. GeneratorVirtualScriptFunction * CreateGeneratorVirtualScriptFunction(FunctionProxy* proxy);
  897. DynamicType * CreateGeneratorType(RecyclableObject* prototype);
  898. #if 0
  899. JavascriptNumber* CreateNumber(double value);
  900. #endif
  901. JavascriptNumber* CreateNumber(double value, RecyclerJavascriptNumberAllocator * numberAllocator);
  902. JavascriptGeneratorFunction* CreateGeneratorFunction(JavascriptMethod entryPoint, GeneratorVirtualScriptFunction* scriptFunction);
  903. JavascriptAsyncFunction* CreateAsyncFunction(JavascriptMethod entryPoint, GeneratorVirtualScriptFunction* scriptFunction);
  904. JavascriptExternalFunction* CreateExternalFunction(ExternalMethod entryPointer, PropertyId nameId, Var signature, JavascriptTypeId prototypeTypeId, UINT64 flags);
  905. JavascriptExternalFunction* CreateExternalFunction(ExternalMethod entryPointer, Var nameId, Var signature, JavascriptTypeId prototypeTypeId, UINT64 flags);
  906. JavascriptExternalFunction* CreateStdCallExternalFunction(StdCallJavascriptMethod entryPointer, PropertyId nameId, void *callbackState);
  907. JavascriptExternalFunction* CreateStdCallExternalFunction(StdCallJavascriptMethod entryPointer, Var nameId, void *callbackState);
  908. JavascriptPromiseAsyncSpawnExecutorFunction* CreatePromiseAsyncSpawnExecutorFunction(JavascriptMethod entryPoint, JavascriptGenerator* generator, Var target);
  909. JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction* CreatePromiseAsyncSpawnStepArgumentExecutorFunction(JavascriptMethod entryPoint, JavascriptGenerator* generator, Var argument, Var resolve = nullptr, Var reject = nullptr, bool isReject = false);
  910. JavascriptPromiseCapabilitiesExecutorFunction* CreatePromiseCapabilitiesExecutorFunction(JavascriptMethod entryPoint, JavascriptPromiseCapability* capability);
  911. JavascriptPromiseResolveOrRejectFunction* CreatePromiseResolveOrRejectFunction(JavascriptMethod entryPoint, JavascriptPromise* promise, bool isReject, JavascriptPromiseResolveOrRejectFunctionAlreadyResolvedWrapper* alreadyResolvedRecord);
  912. JavascriptPromiseReactionTaskFunction* CreatePromiseReactionTaskFunction(JavascriptMethod entryPoint, JavascriptPromiseReaction* reaction, Var argument);
  913. JavascriptPromiseResolveThenableTaskFunction* CreatePromiseResolveThenableTaskFunction(JavascriptMethod entryPoint, JavascriptPromise* promise, RecyclableObject* thenable, RecyclableObject* thenFunction);
  914. JavascriptPromiseAllResolveElementFunction* CreatePromiseAllResolveElementFunction(JavascriptMethod entryPoint, uint32 index, JavascriptArray* values, JavascriptPromiseCapability* capabilities, JavascriptPromiseAllResolveElementFunctionRemainingElementsWrapper* remainingElements);
  915. JavascriptExternalFunction* CreateWrappedExternalFunction(JavascriptExternalFunction* wrappedFunction);
  916. #if ENABLE_NATIVE_CODEGEN
  917. #if !FLOATVAR
  918. JavascriptNumber* CreateCodeGenNumber(CodeGenNumberAllocator *alloc, double value);
  919. #endif
  920. #endif
  921. DynamicObject* CreateGeneratorConstructorPrototypeObject();
  922. DynamicObject* CreateConstructorPrototypeObject(JavascriptFunction * constructor);
  923. DynamicObject* CreateObject(const bool allowObjectHeaderInlining = false, const PropertyIndex requestedInlineSlotCapacity = 0);
  924. DynamicObject* CreateObject(DynamicTypeHandler * typeHandler);
  925. DynamicObject* CreateActivationObject();
  926. DynamicObject* CreatePseudoActivationObject();
  927. DynamicObject* CreateBlockActivationObject();
  928. DynamicObject* CreateConsoleScopeActivationObject();
  929. DynamicType* CreateObjectType(RecyclableObject* prototype, Js::TypeId typeId, uint16 requestedInlineSlotCapacity);
  930. DynamicType* CreateObjectTypeNoCache(RecyclableObject* prototype, Js::TypeId typeId);
  931. DynamicType* CreateObjectType(RecyclableObject* prototype, uint16 requestedInlineSlotCapacity);
  932. DynamicObject* CreateObject(RecyclableObject* prototype, uint16 requestedInlineSlotCapacity = 0);
  933. typedef JavascriptString* LibStringType; // used by diagnostics template
  934. template< size_t N > JavascriptString* CreateStringFromCppLiteral(const char16 (&value)[N]) const;
  935. template<> JavascriptString* CreateStringFromCppLiteral(const char16 (&value)[1]) const; // Specialization for empty string
  936. template<> JavascriptString* CreateStringFromCppLiteral(const char16 (&value)[2]) const; // Specialization for single-char strings
  937. PropertyString* CreatePropertyString(const Js::PropertyRecord* propertyRecord);
  938. PropertyString* CreatePropertyString(const Js::PropertyRecord* propertyRecord, ArenaAllocator *arena);
  939. JavascriptVariantDate* CreateVariantDate(const double value);
  940. JavascriptBooleanObject* CreateBooleanObject(BOOL value);
  941. JavascriptBooleanObject* CreateBooleanObject();
  942. JavascriptNumberObject* CreateNumberObjectWithCheck(double value);
  943. JavascriptNumberObject* CreateNumberObject(Var number);
  944. JavascriptSIMDObject* CreateSIMDObject(Var simdValue, TypeId typeDescriptor);
  945. JavascriptStringObject* CreateStringObject(JavascriptString* value);
  946. JavascriptStringObject* CreateStringObject(const char16* value, charcount_t length);
  947. JavascriptSymbolObject* CreateSymbolObject(JavascriptSymbol* value);
  948. JavascriptArrayIterator* CreateArrayIterator(Var iterable, JavascriptArrayIteratorKind kind);
  949. JavascriptMapIterator* CreateMapIterator(JavascriptMap* map, JavascriptMapIteratorKind kind);
  950. JavascriptSetIterator* CreateSetIterator(JavascriptSet* set, JavascriptSetIteratorKind kind);
  951. JavascriptStringIterator* CreateStringIterator(JavascriptString* string);
  952. JavascriptListIterator* CreateListIterator(ListForListIterator* list);
  953. JavascriptRegExp* CreateRegExp(UnifiedRegex::RegexPattern* pattern);
  954. DynamicObject* CreateIteratorResultObject(Var value, Var done);
  955. DynamicObject* CreateIteratorResultObjectValueFalse(Var value);
  956. DynamicObject* CreateIteratorResultObjectUndefinedTrue();
  957. RecyclableObject* CreateThrowErrorObject(JavascriptError* error);
  958. JavascriptFunction* EnsurePromiseResolveFunction();
  959. JavascriptFunction* EnsurePromiseThenFunction();
  960. JavascriptFunction* EnsureGeneratorNextFunction();
  961. JavascriptFunction* EnsureGeneratorThrowFunction();
  962. JavascriptFunction* EnsureJSONStringifyFunction();
  963. JavascriptFunction* EnsureObjectFreezeFunction();
  964. void SetCrossSiteForSharedFunctionType(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. void EnsureStringTemplateCallsiteObjectList();
  981. void AddStringTemplateCallsiteObject(RecyclableObject* callsite);
  982. RecyclableObject* TryGetStringTemplateCallsiteObject(ParseNodePtr pnode);
  983. RecyclableObject* TryGetStringTemplateCallsiteObject(RecyclableObject* callsite);
  984. static void CheckAndInvalidateIsConcatSpreadableCache(PropertyId propertyId, ScriptContext *scriptContext);
  985. #if DBG_DUMP
  986. static const char16* GetStringTemplateCallsiteObjectKey(Var callsite);
  987. #endif
  988. Field(JavascriptFunction*)* GetBuiltinFunctions();
  989. INT_PTR* GetVTableAddresses();
  990. static BuiltinFunction GetBuiltinFunctionForPropId(PropertyId id);
  991. static BuiltinFunction GetBuiltInForFuncInfo(intptr_t funcInfoAddr, ThreadContextInfo *context);
  992. #if DBG
  993. static void CheckRegisteredBuiltIns(Field(JavascriptFunction*)* builtInFuncs, ScriptContext *scriptContext);
  994. #endif
  995. static BOOL CanFloatPreferenceFunc(BuiltinFunction index);
  996. static BOOL IsFltFunc(BuiltinFunction index);
  997. static bool IsFloatFunctionCallsite(BuiltinFunction index, size_t argc);
  998. static bool IsFltBuiltInConst(PropertyId id);
  999. static size_t GetArgCForBuiltIn(BuiltinFunction index)
  1000. {
  1001. Assert(index < _countof(JavascriptLibrary::LibraryFunctionArgC));
  1002. return JavascriptLibrary::LibraryFunctionArgC[index];
  1003. }
  1004. static BuiltInFlags GetFlagsForBuiltIn(BuiltinFunction index)
  1005. {
  1006. Assert(index < _countof(JavascriptLibrary::LibraryFunctionFlags));
  1007. return (BuiltInFlags)JavascriptLibrary::LibraryFunctionFlags[index];
  1008. }
  1009. static BuiltinFunction GetBuiltInInlineCandidateId(Js::OpCode opCode);
  1010. static BuiltInArgSpecializationType GetBuiltInArgType(BuiltInFlags flags, BuiltInArgShift argGroup);
  1011. static bool IsTypeSpecRequired(BuiltInFlags flags)
  1012. {
  1013. return GetBuiltInArgType(flags, BuiltInArgShift::BIAS_Src1) || GetBuiltInArgType(flags, BuiltInArgShift::BIAS_Src2) || GetBuiltInArgType(flags, BuiltInArgShift::BIAS_Dst);
  1014. }
  1015. #if ENABLE_DEBUG_CONFIG_OPTIONS
  1016. static char16 const * GetNameForBuiltIn(BuiltinFunction index)
  1017. {
  1018. Assert(index < _countof(JavascriptLibrary::LibraryFunctionName));
  1019. return JavascriptLibrary::LibraryFunctionName[index];
  1020. }
  1021. #endif
  1022. PropertyStringCacheMap* EnsurePropertyStringMap();
  1023. PropertyStringCacheMap* GetPropertyStringMap() { return this->propertyStringMap; }
  1024. void TypeAndPrototypesAreEnsuredToHaveOnlyWritableDataProperties(Type *const type);
  1025. void NoPrototypeChainsAreEnsuredToHaveOnlyWritableDataProperties();
  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. bool GetArrayObjectHasUserDefinedSpecies() const { return arrayObjectHasUserDefinedSpecies; }
  1033. void SetArrayObjectHasUserDefinedSpecies(bool val) { arrayObjectHasUserDefinedSpecies = val; }
  1034. FunctionBody* GetFakeGlobalFuncForUndefer()const { return this->fakeGlobalFuncForUndefer; }
  1035. void SetFakeGlobalFuncForUndefer(FunctionBody* functionBody) { this->fakeGlobalFuncForUndefer = functionBody; }
  1036. ModuleRecordList* EnsureModuleRecordList();
  1037. SourceTextModuleRecord* GetModuleRecord(uint moduleId);
  1038. private:
  1039. #ifdef ENABLE_DEBUG_CONFIG_OPTIONS
  1040. // Declare fretest/debug properties here since otherwise it can cause
  1041. // a mismatch between fre mshtml and fretest jscript9 causing undefined behavior
  1042. Field(DynamicType *) debugDisposableObjectType;
  1043. Field(DynamicType *) debugFuncExecutorInDisposeObjectType;
  1044. #endif
  1045. void InitializePrototypes();
  1046. void InitializeTypes();
  1047. void InitializeGlobal(GlobalObject * globalObject);
  1048. static void PrecalculateArrayAllocationBuckets();
  1049. #define STANDARD_INIT(name) \
  1050. static void __cdecl Initialize##name##Constructor(DynamicObject* arrayConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode); \
  1051. static void __cdecl Initialize##name##Prototype(DynamicObject* arrayPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1052. STANDARD_INIT(Array);
  1053. STANDARD_INIT(SharedArrayBuffer);
  1054. STANDARD_INIT(ArrayBuffer);
  1055. STANDARD_INIT(DataView);
  1056. STANDARD_INIT(Error);
  1057. STANDARD_INIT(EvalError);
  1058. STANDARD_INIT(RangeError);
  1059. STANDARD_INIT(ReferenceError);
  1060. STANDARD_INIT(SyntaxError);
  1061. STANDARD_INIT(TypeError);
  1062. STANDARD_INIT(URIError);
  1063. STANDARD_INIT(RuntimeError);
  1064. STANDARD_INIT(TypedArray);
  1065. STANDARD_INIT(Int8Array);
  1066. STANDARD_INIT(Uint8Array);
  1067. STANDARD_INIT(Uint8ClampedArray);
  1068. STANDARD_INIT(Int16Array);
  1069. STANDARD_INIT(Uint16Array);
  1070. STANDARD_INIT(Int32Array);
  1071. STANDARD_INIT(Uint32Array);
  1072. STANDARD_INIT(Float32Array);
  1073. STANDARD_INIT(Float64Array);
  1074. STANDARD_INIT(Boolean);
  1075. STANDARD_INIT(Symbol);
  1076. STANDARD_INIT(Date);
  1077. STANDARD_INIT(Proxy);
  1078. STANDARD_INIT(Function);
  1079. STANDARD_INIT(Number);
  1080. STANDARD_INIT(Object);
  1081. STANDARD_INIT(Regex);
  1082. STANDARD_INIT(String);
  1083. STANDARD_INIT(Map);
  1084. STANDARD_INIT(Set);
  1085. STANDARD_INIT(WeakMap);
  1086. STANDARD_INIT(WeakSet);
  1087. STANDARD_INIT(Promise);
  1088. STANDARD_INIT(GeneratorFunction);
  1089. STANDARD_INIT(AsyncFunction);
  1090. STANDARD_INIT(WebAssemblyCompileError);
  1091. STANDARD_INIT(WebAssemblyRuntimeError);
  1092. STANDARD_INIT(WebAssemblyLinkError);
  1093. STANDARD_INIT(WebAssemblyMemory);
  1094. STANDARD_INIT(WebAssemblyModule);
  1095. STANDARD_INIT(WebAssemblyInstance);
  1096. STANDARD_INIT(WebAssemblyTable);
  1097. #undef STANDARD_INIT
  1098. static void __cdecl InitializeAtomicsObject(DynamicObject* atomicsObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1099. static void __cdecl InitializeInt64ArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1100. static void __cdecl InitializeUint64ArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1101. static void __cdecl InitializeBoolArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1102. static void __cdecl InitializeCharArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1103. void InitializeComplexThings();
  1104. void InitializeStaticValues();
  1105. static void __cdecl InitializeMathObject(DynamicObject* mathObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1106. #ifdef ENABLE_WASM
  1107. static void __cdecl InitializeWebAssemblyObject(DynamicObject* WasmObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1108. #endif
  1109. // SIMD_JS
  1110. static void __cdecl InitializeSIMDObject(DynamicObject* simdObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1111. static void __cdecl InitializeSIMDOpCodeMaps();
  1112. template<typename SIMDTypeName>
  1113. static void SIMDPrototypeInitHelper(DynamicObject* simdPrototype, JavascriptLibrary* library, JavascriptFunction* constructorFn, JavascriptString* strLiteral);
  1114. static void __cdecl InitializeSIMDBool8x16Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1115. static void __cdecl InitializeSIMDBool16x8Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1116. static void __cdecl InitializeSIMDBool32x4Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1117. static void __cdecl InitializeSIMDInt8x16Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1118. static void __cdecl InitializeSIMDInt16x8Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1119. static void __cdecl InitializeSIMDInt32x4Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1120. static void __cdecl InitializeSIMDUint8x16Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1121. static void __cdecl InitializeSIMDUint16x8Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1122. static void __cdecl InitializeSIMDUint32x4Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1123. static void __cdecl InitializeSIMDFloat32x4Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1124. static void __cdecl InitializeSIMDFloat64x2Prototype(DynamicObject* simdPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1125. static void __cdecl InitializeJSONObject(DynamicObject* JSONObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1126. static void __cdecl InitializeEngineInterfaceObject(DynamicObject* engineInterface, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1127. static void __cdecl InitializeReflectObject(DynamicObject* reflectObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1128. #ifdef ENABLE_INTL_OBJECT
  1129. static void __cdecl InitializeIntlObject(DynamicObject* IntlEngineObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1130. #endif
  1131. #ifdef ENABLE_PROJECTION
  1132. void InitializeWinRTPromiseConstructor();
  1133. #endif
  1134. static void __cdecl InitializeIteratorPrototype(DynamicObject* iteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1135. static void __cdecl InitializeArrayIteratorPrototype(DynamicObject* arrayIteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1136. static void __cdecl InitializeMapIteratorPrototype(DynamicObject* mapIteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1137. static void __cdecl InitializeSetIteratorPrototype(DynamicObject* setIteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1138. static void __cdecl InitializeStringIteratorPrototype(DynamicObject* stringIteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1139. static void __cdecl InitializeGeneratorPrototype(DynamicObject* generatorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1140. static void __cdecl InitializeAsyncFunction(DynamicObject *function, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1141. RuntimeFunction* CreateBuiltinConstructor(FunctionInfo * functionInfo, DynamicTypeHandler * typeHandler, DynamicObject* prototype = nullptr);
  1142. RuntimeFunction* DefaultCreateFunction(FunctionInfo * functionInfo, int length, DynamicObject * prototype, DynamicType * functionType, PropertyId nameId);
  1143. RuntimeFunction* DefaultCreateFunction(FunctionInfo * functionInfo, int length, DynamicObject * prototype, DynamicType * functionType, Var nameId);
  1144. JavascriptFunction* AddFunction(DynamicObject* object, PropertyId propertyId, RuntimeFunction* function);
  1145. void AddMember(DynamicObject* object, PropertyId propertyId, Var value);
  1146. void AddMember(DynamicObject* object, PropertyId propertyId, Var value, PropertyAttributes attributes);
  1147. JavascriptString* CreateEmptyString();
  1148. static void __cdecl InitializeGeneratorFunction(DynamicObject* function, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1149. template<bool addPrototype>
  1150. static void __cdecl InitializeFunction(DynamicObject* function, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  1151. static size_t const LibraryFunctionArgC[BuiltinFunction::Count + 1];
  1152. static int const LibraryFunctionFlags[BuiltinFunction::Count + 1]; // returns enum BuiltInFlags.
  1153. #if ENABLE_DEBUG_CONFIG_OPTIONS
  1154. static char16 const * const LibraryFunctionName[BuiltinFunction::Count + 1];
  1155. #endif
  1156. JavascriptFunction* EnsureArrayPrototypeValuesFunction();
  1157. public:
  1158. virtual void Finalize(bool isShutdown) override;
  1159. #if DBG
  1160. void DumpLibraryByteCode();
  1161. #endif
  1162. private:
  1163. typedef JsUtil::BaseHashSet<Js::PropertyRecord const *, Recycler, PowerOf2SizePolicy> ReferencedPropertyRecordHashSet;
  1164. Field(ReferencedPropertyRecordHashSet*) referencedPropertyRecords;
  1165. ReferencedPropertyRecordHashSet * EnsureReferencedPropertyRecordList()
  1166. {
  1167. ReferencedPropertyRecordHashSet* pidList = this->referencedPropertyRecords;
  1168. if (pidList == nullptr)
  1169. {
  1170. pidList = RecyclerNew(this->recycler, ReferencedPropertyRecordHashSet, this->recycler, 173);
  1171. this->referencedPropertyRecords = pidList;
  1172. }
  1173. return pidList;
  1174. }
  1175. ReferencedPropertyRecordHashSet * GetReferencedPropertyRecordList() const
  1176. {
  1177. return this->referencedPropertyRecords;
  1178. }
  1179. HRESULT ProfilerRegisterObject();
  1180. HRESULT ProfilerRegisterArray();
  1181. HRESULT ProfilerRegisterBoolean();
  1182. HRESULT ProfilerRegisterDate();
  1183. HRESULT ProfilerRegisterFunction();
  1184. HRESULT ProfilerRegisterMath();
  1185. HRESULT ProfilerRegisterNumber();
  1186. HRESULT ProfilerRegisterString();
  1187. HRESULT ProfilerRegisterRegExp();
  1188. HRESULT ProfilerRegisterJSON();
  1189. HRESULT ProfilerRegisterMap();
  1190. HRESULT ProfilerRegisterSet();
  1191. HRESULT ProfilerRegisterWeakMap();
  1192. HRESULT ProfilerRegisterWeakSet();
  1193. HRESULT ProfilerRegisterSymbol();
  1194. HRESULT ProfilerRegisterIterator();
  1195. HRESULT ProfilerRegisterArrayIterator();
  1196. HRESULT ProfilerRegisterMapIterator();
  1197. HRESULT ProfilerRegisterSetIterator();
  1198. HRESULT ProfilerRegisterStringIterator();
  1199. HRESULT ProfilerRegisterTypedArray();
  1200. HRESULT ProfilerRegisterPromise();
  1201. HRESULT ProfilerRegisterProxy();
  1202. HRESULT ProfilerRegisterReflect();
  1203. HRESULT ProfilerRegisterGenerator();
  1204. HRESULT ProfilerRegisterSIMD();
  1205. HRESULT ProfilerRegisterAtomics();
  1206. #ifdef IR_VIEWER
  1207. HRESULT ProfilerRegisterIRViewer();
  1208. #endif /* IR_VIEWER */
  1209. };
  1210. }