JavascriptLibrary.h 83 KB

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