2
0

JavascriptLibrary.h 84 KB

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