JavascriptLibrary.h 83 KB

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