JavascriptLibrary.h 75 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195
  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. class MissingPropertyTypeHandler;
  27. typedef RecyclerFastAllocator<JavascriptNumber, LeafBit> RecyclerJavascriptNumberAllocator;
  28. class UndeclaredBlockVariable : public RecyclableObject
  29. {
  30. friend class JavascriptLibrary;
  31. UndeclaredBlockVariable(Type* type) : RecyclableObject(type) { }
  32. };
  33. #if ENABLE_COPYONACCESS_ARRAY
  34. struct CacheForCopyOnAccessArraySegments
  35. {
  36. static const uint32 MAX_SIZE = 31;
  37. SparseArraySegment<int32> *cache[MAX_SIZE];
  38. uint32 count;
  39. uint32 AddSegment(SparseArraySegment<int32> *segment)
  40. {
  41. cache[count++] = segment;
  42. return count;
  43. }
  44. SparseArraySegment<int32> *GetSegmentByIndex(byte index)
  45. {
  46. Assert(index <= MAX_SIZE);
  47. return cache[index - 1];
  48. }
  49. bool IsNotOverHardLimit()
  50. {
  51. return count < MAX_SIZE;
  52. }
  53. bool IsNotFull()
  54. {
  55. return count < (uint32) CONFIG_FLAG(CopyOnAccessArraySegmentCacheSize);
  56. }
  57. bool IsValidIndex(uint32 index)
  58. {
  59. return count && index && index <= count;
  60. }
  61. #if ENABLE_DEBUG_CONFIG_OPTIONS
  62. uint32 GetCount()
  63. {
  64. return count;
  65. }
  66. #endif
  67. };
  68. #endif
  69. template <typename T>
  70. struct StringTemplateCallsiteObjectComparer
  71. {
  72. static bool Equals(T x, T y)
  73. {
  74. static_assert(false, "Unexpected type T");
  75. }
  76. static hash_t GetHashCode(T i)
  77. {
  78. static_assert(false, "Unexpected type T");
  79. }
  80. };
  81. template <>
  82. struct StringTemplateCallsiteObjectComparer<ParseNodePtr>
  83. {
  84. static bool Equals(ParseNodePtr x, RecyclerWeakReference<Js::RecyclableObject>* y);
  85. static bool Equals(ParseNodePtr x, ParseNodePtr y);
  86. static hash_t GetHashCode(ParseNodePtr i);
  87. };
  88. template <>
  89. struct StringTemplateCallsiteObjectComparer<RecyclerWeakReference<Js::RecyclableObject>*>
  90. {
  91. static bool Equals(RecyclerWeakReference<Js::RecyclableObject>* x, RecyclerWeakReference<Js::RecyclableObject>* y);
  92. static bool Equals(RecyclerWeakReference<Js::RecyclableObject>* x, ParseNodePtr y);
  93. static hash_t GetHashCode(RecyclerWeakReference<Js::RecyclableObject>* o);
  94. };
  95. class JavascriptLibrary : public JavascriptLibraryBase
  96. {
  97. friend class EditAndContinue;
  98. friend class ScriptSite;
  99. friend class GlobalObject;
  100. friend class ScriptContext;
  101. friend class EngineInterfaceObject;
  102. friend class ExternalLibraryBase;
  103. friend class ActiveScriptExternalLibrary;
  104. friend class IntlEngineInterfaceExtensionObject;
  105. friend class ChakraHostScriptContext;
  106. #ifdef ENABLE_PROJECTION
  107. friend class ProjectionExternalLibrary;
  108. friend class Projection::WinRTPromiseEngineInterfaceExtensionObject;
  109. friend class Projection::ProjectionContext;
  110. #endif
  111. static const wchar_t* domBuiltinPropertyNames[];
  112. public:
  113. #if ENABLE_COPYONACCESS_ARRAY
  114. CacheForCopyOnAccessArraySegments *cacheForCopyOnAccessArraySegments;
  115. #endif
  116. static DWORD GetScriptContextOffset() { return offsetof(JavascriptLibrary, scriptContext); }
  117. static DWORD GetUndeclBlockVarOffset() { return offsetof(JavascriptLibrary, undeclBlockVarSentinel); }
  118. static DWORD GetEmptyStringOffset() { return offsetof(JavascriptLibrary, emptyString); }
  119. static DWORD GetUndefinedValueOffset() { return offsetof(JavascriptLibrary, undefinedValue); }
  120. static DWORD GetNullValueOffset() { return offsetof(JavascriptLibrary, nullValue); }
  121. static DWORD GetBooleanTrueOffset() { return offsetof(JavascriptLibrary, booleanTrue); }
  122. static DWORD GetBooleanFalseOffset() { return offsetof(JavascriptLibrary, booleanFalse); }
  123. static DWORD GetNegativeZeroOffset() { return offsetof(JavascriptLibrary, negativeZero); }
  124. static DWORD GetNumberTypeStaticOffset() { return offsetof(JavascriptLibrary, numberTypeStatic); }
  125. static DWORD GetStringTypeStaticOffset() { return offsetof(JavascriptLibrary, stringTypeStatic); }
  126. static DWORD GetObjectTypesOffset() { return offsetof(JavascriptLibrary, objectTypes); }
  127. static DWORD GetObjectHeaderInlinedTypesOffset() { return offsetof(JavascriptLibrary, objectHeaderInlinedTypes); }
  128. static DWORD GetRegexTypeOffset() { return offsetof(JavascriptLibrary, regexType); }
  129. static DWORD GetArrayConstructorOffset() { return offsetof(JavascriptLibrary, arrayConstructor); }
  130. static DWORD GetPositiveInfinityOffset() { return offsetof(JavascriptLibrary, positiveInfinite); }
  131. static DWORD GetNaNOffset() { return offsetof(JavascriptLibrary, nan); }
  132. static DWORD GetNativeIntArrayTypeOffset() { return offsetof(JavascriptLibrary, nativeIntArrayType); }
  133. #if ENABLE_COPYONACCESS_ARRAY
  134. static DWORD GetCopyOnAccessNativeIntArrayTypeOffset() { return offsetof(JavascriptLibrary, copyOnAccessNativeIntArrayType); }
  135. #endif
  136. static DWORD GetNativeFloatArrayTypeOffset() { return offsetof(JavascriptLibrary, nativeFloatArrayType); }
  137. static DWORD GetVTableAddressesOffset() { return offsetof(JavascriptLibrary, vtableAddresses); }
  138. static DWORD GetConstructorCacheDefaultInstanceOffset() { return offsetof(JavascriptLibrary, constructorCacheDefaultInstance); }
  139. static DWORD GetAbsDoubleCstOffset() { return offsetof(JavascriptLibrary, absDoubleCst); }
  140. static DWORD GetUintConvertConstOffset() { return offsetof(JavascriptLibrary, uintConvertConst); }
  141. static DWORD GetBuiltinFunctionsOffset() { return offsetof(JavascriptLibrary, builtinFunctions); }
  142. static DWORD GetCharStringCacheOffset() { return offsetof(JavascriptLibrary, charStringCache); }
  143. static DWORD GetCharStringCacheAOffset() { return GetCharStringCacheOffset() + CharStringCache::GetCharStringCacheAOffset(); }
  144. const JavascriptLibraryBase* GetLibraryBase() const { return static_cast<const JavascriptLibraryBase*>(this); }
  145. void SetGlobalObject(GlobalObject* globalObject) {globalObject = globalObject; }
  146. static DWORD GetRandSeed0Offset() { return offsetof(JavascriptLibrary, randSeed0); }
  147. static DWORD GetRandSeed1Offset() { return offsetof(JavascriptLibrary, randSeed1); }
  148. typedef bool (CALLBACK *PromiseContinuationCallback)(Var task, void *callbackState);
  149. Var GetUndeclBlockVar() const { return undeclBlockVarSentinel; }
  150. bool IsUndeclBlockVar(Var var) const { return var == undeclBlockVarSentinel; }
  151. static bool IsTypedArrayConstructor(Var constructor, ScriptContext* scriptContext);
  152. private:
  153. Recycler * recycler;
  154. ExternalLibraryBase* externalLibraryList;
  155. UndeclaredBlockVariable* undeclBlockVarSentinel;
  156. DynamicType * generatorConstructorPrototypeObjectType;
  157. DynamicType * constructorPrototypeObjectType;
  158. DynamicType * heapArgumentsType;
  159. DynamicType * activationObjectType;
  160. DynamicType * arrayType;
  161. DynamicType * nativeIntArrayType;
  162. #if ENABLE_COPYONACCESS_ARRAY
  163. DynamicType * copyOnAccessNativeIntArrayType;
  164. #endif
  165. DynamicType * nativeFloatArrayType;
  166. DynamicType * arrayBufferType;
  167. DynamicType * dataViewType;
  168. DynamicType * typedArrayType;
  169. DynamicType * int8ArrayType;
  170. DynamicType * uint8ArrayType;
  171. DynamicType * uint8ClampedArrayType;
  172. DynamicType * int16ArrayType;
  173. DynamicType * uint16ArrayType;
  174. DynamicType * int32ArrayType;
  175. DynamicType * uint32ArrayType;
  176. DynamicType * float32ArrayType;
  177. DynamicType * float64ArrayType;
  178. DynamicType * int64ArrayType;
  179. DynamicType * uint64ArrayType;
  180. DynamicType * boolArrayType;
  181. DynamicType * charArrayType;
  182. StaticType * booleanTypeStatic;
  183. DynamicType * booleanTypeDynamic;
  184. DynamicType * dateType;
  185. StaticType * variantDateType;
  186. DynamicType * symbolTypeDynamic;
  187. StaticType * symbolTypeStatic;
  188. DynamicType * iteratorResultType;
  189. DynamicType * arrayIteratorType;
  190. DynamicType * mapIteratorType;
  191. DynamicType * setIteratorType;
  192. DynamicType * stringIteratorType;
  193. DynamicType * promiseType;
  194. DynamicType * javascriptEnumeratorIteratorType;
  195. JavascriptFunction* builtinFunctions[BuiltinFunction::Count];
  196. typedef JsUtil::BaseDictionary<FunctionInfo *, BuiltinFunction, ArenaAllocator > FuncInfoToBuiltinIdMap;
  197. FuncInfoToBuiltinIdMap * funcInfoToBuiltinIdMap;
  198. INT_PTR vtableAddresses[VTableValue::Count];
  199. ConstructorCache *constructorCacheDefaultInstance;
  200. __declspec(align(16)) const BYTE *absDoubleCst;
  201. double const *uintConvertConst;
  202. // Function Types
  203. DynamicTypeHandler * anonymousFunctionTypeHandler;
  204. DynamicTypeHandler * anonymousFunctionWithPrototypeTypeHandler;
  205. DynamicTypeHandler * functionTypeHandler;
  206. DynamicTypeHandler * functionWithPrototypeTypeHandler;
  207. DynamicType * externalFunctionWithDeferredPrototypeType;
  208. DynamicType * wrappedFunctionWithDeferredPrototypeType;
  209. DynamicType * stdCallFunctionWithDeferredPrototypeType;
  210. DynamicType * idMappedFunctionWithPrototypeType;
  211. DynamicType * externalConstructorFunctionWithDeferredPrototypeType;
  212. DynamicType * boundFunctionType;
  213. DynamicType * regexConstructorType;
  214. DynamicType * crossSiteDeferredPrototypeFunctionType;
  215. DynamicType * crossSiteIdMappedFunctionWithPrototypeType;
  216. DynamicType * crossSiteExternalConstructFunctionWithPrototypeType;
  217. StaticType * enumeratorType;
  218. DynamicType * errorType;
  219. DynamicType * evalErrorType;
  220. DynamicType * rangeErrorType;
  221. DynamicType * referenceErrorType;
  222. DynamicType * syntaxErrorType;
  223. DynamicType * typeErrorType;
  224. DynamicType * uriErrorType;
  225. StaticType * numberTypeStatic;
  226. StaticType * int64NumberTypeStatic;
  227. StaticType * uint64NumberTypeStatic;
  228. // SIMD_JS
  229. StaticType * simdFloat32x4TypeStatic;
  230. StaticType * simdInt32x4TypeStatic;
  231. StaticType * simdInt8x16TypeStatic;
  232. StaticType * simdFloat64x2TypeStatic;
  233. StaticType * simdInt16x8TypeStatic;
  234. StaticType * simdBool32x4TypeStatic;
  235. StaticType * simdBool16x8TypeStatic;
  236. StaticType * simdBool8x16TypeStatic;
  237. StaticType * simdUint32x4TypeStatic;
  238. StaticType * simdUint16x8TypeStatic;
  239. StaticType * simdUint8x16TypeStatic;
  240. DynamicType * numberTypeDynamic;
  241. DynamicType * objectTypes[PreInitializedObjectTypeCount];
  242. DynamicType * objectHeaderInlinedTypes[PreInitializedObjectTypeCount];
  243. DynamicType * regexType;
  244. DynamicType * regexResultType;
  245. StaticType * stringTypeStatic;
  246. DynamicType * stringTypeDynamic;
  247. DynamicType * mapType;
  248. DynamicType * setType;
  249. DynamicType * weakMapType;
  250. DynamicType * weakSetType;
  251. DynamicType * proxyType;
  252. StaticType * withType;
  253. DynamicType * SpreadArgumentType;
  254. PropertyDescriptor defaultPropertyDescriptor;
  255. JavascriptString* nullString;
  256. JavascriptString* emptyString;
  257. JavascriptString* quotesString;
  258. JavascriptString* whackString;
  259. JavascriptString* objectDisplayString;
  260. JavascriptString* stringTypeDisplayString;
  261. JavascriptString* errorDisplayString;
  262. JavascriptString* functionPrefixString;
  263. JavascriptString* generatorFunctionPrefixString;
  264. JavascriptString* asyncFunctionPrefixString;
  265. JavascriptString* functionDisplayString;
  266. JavascriptString* xDomainFunctionDisplayString;
  267. JavascriptString* undefinedDisplayString;
  268. JavascriptString* nanDisplayString;
  269. JavascriptString* nullDisplayString;
  270. JavascriptString* unknownDisplayString;
  271. JavascriptString* commaDisplayString;
  272. JavascriptString* commaSpaceDisplayString;
  273. JavascriptString* trueDisplayString;
  274. JavascriptString* falseDisplayString;
  275. JavascriptString* lengthDisplayString;
  276. JavascriptString* invalidDateString;
  277. JavascriptString* objectTypeDisplayString;
  278. JavascriptString* functionTypeDisplayString;
  279. JavascriptString* booleanTypeDisplayString;
  280. JavascriptString* numberTypeDisplayString;
  281. // SIMD_JS
  282. JavascriptString* simdFloat32x4DisplayString;
  283. JavascriptString* simdFloat64x2DisplayString;
  284. JavascriptString* simdInt32x4DisplayString;
  285. JavascriptString* simdInt16x8DisplayString;
  286. JavascriptString* simdInt8x16DisplayString;
  287. JavascriptString* simdBool32x4DisplayString;
  288. JavascriptString* simdBool16x8DisplayString;
  289. JavascriptString* simdBool8x16DisplayString;
  290. JavascriptString* simdUint32x4DisplayString;
  291. JavascriptString* simdUint16x8DisplayString;
  292. JavascriptString* simdUint8x16DisplayString;
  293. JavascriptString* symbolTypeDisplayString;
  294. JavascriptString* debuggerDeadZoneBlockVariableString;
  295. DynamicObject* missingPropertyHolder;
  296. StaticType* throwErrorObjectType;
  297. NullEnumerator *nullEnumerator;
  298. PropertyStringCacheMap* propertyStringMap;
  299. RecyclerWeakReference<ForInObjectEnumerator>* cachedForInEnumerator;
  300. ConstructorCache* builtInConstructorCache;
  301. #ifdef ENABLE_DEBUG_CONFIG_OPTIONS
  302. JavascriptFunction* debugObjectFaultInjectionCookieGetterFunction;
  303. JavascriptFunction* debugObjectFaultInjectionCookieSetterFunction;
  304. #endif
  305. JavascriptFunction* evalFunctionObject;
  306. JavascriptFunction* arrayPrototypeValuesFunction;
  307. JavascriptFunction* parseIntFunctionObject;
  308. JavascriptFunction* parseFloatFunctionObject;
  309. JavascriptFunction* arrayPrototypeToStringFunction;
  310. JavascriptFunction* arrayPrototypeToLocaleStringFunction;
  311. JavascriptFunction* identityFunction;
  312. JavascriptFunction* throwerFunction;
  313. JavascriptFunction* hostPromiseContinuationFunction;
  314. JavascriptFunction* promiseResolveFunction;
  315. JavascriptFunction* objectValueOfFunction;
  316. JavascriptFunction* objectToStringFunction;
  317. // SIMD_JS
  318. JavascriptFunction* simdFloat32x4ToStringFunction;
  319. JavascriptFunction* simdFloat64x2ToStringFunction;
  320. JavascriptFunction* simdInt32x4ToStringFunction;
  321. JavascriptFunction* simdInt16x8ToStringFunction;
  322. JavascriptFunction* simdInt8x16ToStringFunction;
  323. JavascriptFunction* simdBool32x4ToStringFunction;
  324. JavascriptFunction* simdBool16x8ToStringFunction;
  325. JavascriptFunction* simdBool8x16ToStringFunction;
  326. JavascriptFunction* simdUint32x4ToStringFunction;
  327. JavascriptFunction* simdUint16x8ToStringFunction;
  328. JavascriptFunction* simdUint8x16ToStringFunction;
  329. JavascriptSymbol* symbolSearch;
  330. UnifiedRegex::RegexPattern * emptyRegexPattern;
  331. mutable CharStringCache charStringCache;
  332. PromiseContinuationCallback nativeHostPromiseContinuationFunction;
  333. void *nativeHostPromiseContinuationFunctionState;
  334. FinalizableObject* jsrtContextObject;
  335. typedef JsUtil::BaseHashSet<RecyclerWeakReference<RecyclableObject>*, Recycler, PowerOf2SizePolicy, RecyclerWeakReference<RecyclableObject>*, StringTemplateCallsiteObjectComparer> StringTemplateCallsiteObjectList;
  336. // Used to store a list of template callsite objects.
  337. // We use the raw strings in the callsite object (or a string template parse node) to identify unique callsite objects in the list.
  338. // See abstract operation GetTemplateObject in ES6 Spec (RC1) 12.2.8.3
  339. StringTemplateCallsiteObjectList* stringTemplateCallsiteObjectList;
  340. // This list contains types ensured to have only writable data properties in it and all objects in its prototype chain
  341. // (i.e., no readonly properties or accessors). Only prototype objects' types are stored in the list. When something
  342. // in the script context adds a readonly property or accessor to an object that is used as a prototype object, this
  343. // list is cleared. The list is also cleared before garbage collection so that it does not keep growing, and so, it can
  344. // hold strong references to the types.
  345. //
  346. // The cache is used by the type-without-property local inline cache. When setting a property on a type that doesn't
  347. // have the property, to determine whether to promote the object like an object of that type was last promoted, we need
  348. // to ensure that objects in the prototype chain have not acquired a readonly property or setter (ideally, only for that
  349. // property ID, but we just check for any such property). This cache is used to avoid doing this many times, especially
  350. // when the prototype chain is not short.
  351. //
  352. // This list is only used to invalidate the status of types. The type itself contains a boolean indicating whether it
  353. // and prototypes contain only writable data properties, which is reset upon invalidating the status.
  354. JsUtil::List<Type *> *typesEnsuredToHaveOnlyWritableDataPropertiesInItAndPrototypeChain;
  355. uint64 randSeed0, randSeed1;
  356. bool isPRNGSeeded;
  357. bool inProfileMode;
  358. bool inDispatchProfileMode;
  359. bool arrayObjectHasUserDefinedSpecies;
  360. JavascriptFunction * AddFunctionToLibraryObjectWithPrototype(GlobalObject * globalObject, PropertyId propertyId, FunctionInfo * functionInfo, int length, DynamicObject * prototype = nullptr, DynamicType * functionType = nullptr);
  361. JavascriptFunction * AddFunctionToLibraryObject(DynamicObject* object, PropertyId propertyId, FunctionInfo * functionInfo, int length, PropertyAttributes attributes = PropertyBuiltInMethodDefaults);
  362. JavascriptFunction * AddFunctionToLibraryObjectWithName(DynamicObject* object, PropertyId propertyId, PropertyId nameId, FunctionInfo * functionInfo, int length);
  363. void AddAccessorsToLibraryObject(DynamicObject* object, PropertyId propertyId, FunctionInfo * getterFunctionInfo, FunctionInfo * setterFunctionInfo);
  364. void AddAccessorsToLibraryObjectWithName(DynamicObject* object, PropertyId propertyId, PropertyId nameId, FunctionInfo * getterFunctionInfo, FunctionInfo * setterFunctionInfo);
  365. template <size_t N>
  366. JavascriptFunction * AddFunctionToLibraryObjectWithPropertyName(DynamicObject* object, const wchar_t(&propertyName)[N], FunctionInfo * functionInfo, int length);
  367. bool isHybridDebugging; // If this library is in hybrid debugging mode
  368. bool isLibraryReadyForHybridDebugging; // If this library is ready for hybrid debugging (library objects using deferred type handler have been un-deferred)
  369. bool IsHybridDebugging() const { return isHybridDebugging; }
  370. void EnsureLibraryReadyForHybridDebugging();
  371. DynamicObject* EnsureReadyIfHybridDebugging(DynamicObject* obj);
  372. template <class T> T* EnsureReadyIfHybridDebugging(T* obj)
  373. {
  374. DynamicObject * dynamicObject = obj;
  375. return (T*)EnsureReadyIfHybridDebugging(dynamicObject);
  376. }
  377. static SimpleTypeHandler<1> SharedPrototypeTypeHandler;
  378. static SimpleTypeHandler<1> SharedFunctionWithoutPrototypeTypeHandler;
  379. static SimpleTypeHandler<1> SharedFunctionWithPrototypeTypeHandlerV11;
  380. static SimpleTypeHandler<2> SharedFunctionWithPrototypeTypeHandler;
  381. static SimpleTypeHandler<1> SharedFunctionWithLengthTypeHandler;
  382. static SimpleTypeHandler<1> SharedIdMappedFunctionWithPrototypeTypeHandler;
  383. static MissingPropertyTypeHandler MissingPropertyHolderTypeHandler;
  384. static SimplePropertyDescriptor const SharedFunctionPropertyDescriptors[2];
  385. static SimplePropertyDescriptor const HeapArgumentsPropertyDescriptorsV11[2];
  386. static SimplePropertyDescriptor const HeapArgumentsPropertyDescriptors[3];
  387. static SimplePropertyDescriptor const FunctionWithLengthAndPrototypeTypeDescriptors[2];
  388. public:
  389. static const ObjectInfoBits EnumFunctionClass = EnumClass_1_Bit;
  390. static void InitializeProperties(ThreadContext * threadContext);
  391. JavascriptLibrary(GlobalObject* globalObject) :
  392. JavascriptLibraryBase(globalObject),
  393. inProfileMode(false),
  394. inDispatchProfileMode(false),
  395. propertyStringMap(nullptr),
  396. parseIntFunctionObject(nullptr),
  397. evalFunctionObject(nullptr),
  398. parseFloatFunctionObject(nullptr),
  399. arrayPrototypeToLocaleStringFunction(nullptr),
  400. arrayPrototypeToStringFunction(nullptr),
  401. identityFunction(nullptr),
  402. throwerFunction(nullptr),
  403. jsrtContextObject(nullptr),
  404. externalLibraryList(nullptr),
  405. cachedForInEnumerator(nullptr),
  406. #if ENABLE_COPYONACCESS_ARRAY
  407. cacheForCopyOnAccessArraySegments(nullptr),
  408. #endif
  409. isHybridDebugging(false),
  410. isLibraryReadyForHybridDebugging(false),
  411. referencedPropertyRecords(nullptr),
  412. stringTemplateCallsiteObjectList(nullptr)
  413. {
  414. globalObject = globalObject;
  415. }
  416. void Initialize(ScriptContext* scriptContext, GlobalObject * globalObject);
  417. void Uninitialize();
  418. GlobalObject* GetGlobalObject() const { return globalObject; }
  419. ScriptContext* GetScriptContext() const { return scriptContext; }
  420. Recycler * GetRecycler() const { return recycler; }
  421. Var GetPI() { return pi; }
  422. Var GetNaN() { return nan; }
  423. Var GetNegativeInfinite() { return negativeInfinite; }
  424. Var GetPositiveInfinite() { return positiveInfinite; }
  425. Var GetMaxValue() { return maxValue; }
  426. Var GetMinValue() { return minValue; }
  427. Var GetNegativeZero() { return negativeZero; }
  428. RecyclableObject* GetUndefined() { return undefinedValue; }
  429. RecyclableObject* GetNull() { return nullValue; }
  430. JavascriptBoolean* GetTrue() { return booleanTrue; }
  431. JavascriptBoolean* GetFalse() { return booleanFalse; }
  432. Var GetTrueOrFalse(BOOL value) { return value ? booleanTrue : booleanFalse; }
  433. JavascriptSymbol* GetSymbolHasInstance() { return symbolHasInstance; }
  434. JavascriptSymbol* GetSymbolIsConcatSpreadable() { return symbolIsConcatSpreadable; }
  435. JavascriptSymbol* GetSymbolIterator() { return symbolIterator; }
  436. JavascriptSymbol* GetSymbolSearch() { return symbolSearch; }
  437. JavascriptSymbol* GetSymbolSpecies() { return symbolSpecies; }
  438. JavascriptSymbol* GetSymbolToPrimitive() { return symbolToPrimitive; }
  439. JavascriptSymbol* GetSymbolToStringTag() { return symbolToStringTag; }
  440. JavascriptSymbol* GetSymbolUnscopables() { return symbolUnscopables; }
  441. JavascriptString* GetNullString() { return nullString; }
  442. JavascriptString* GetEmptyString() const;
  443. JavascriptString* GetWhackString() { return whackString; }
  444. JavascriptString* GetUndefinedDisplayString() { return undefinedDisplayString; }
  445. JavascriptString* GetNaNDisplayString() { return nanDisplayString; }
  446. JavascriptString* GetQuotesString() { return quotesString; }
  447. JavascriptString* GetNullDisplayString() { return nullDisplayString; }
  448. JavascriptString* GetUnknownDisplayString() { return unknownDisplayString; }
  449. JavascriptString* GetCommaDisplayString() { return commaDisplayString; }
  450. JavascriptString* GetCommaSpaceDisplayString() { return commaSpaceDisplayString; }
  451. JavascriptString* GetTrueDisplayString() { return trueDisplayString; }
  452. JavascriptString* GetFalseDisplayString() { return falseDisplayString; }
  453. JavascriptString* GetLengthDisplayString() { return lengthDisplayString; }
  454. JavascriptString* GetObjectDisplayString() { return objectDisplayString; }
  455. JavascriptString* GetStringTypeDisplayString() { return stringTypeDisplayString; }
  456. JavascriptString* GetErrorDisplayString() const { return errorDisplayString; }
  457. JavascriptString* GetFunctionPrefixString() { return functionPrefixString; }
  458. JavascriptString* GetGeneratorFunctionPrefixString() { return generatorFunctionPrefixString; }
  459. JavascriptString* GetAsyncFunctionPrefixString() { return asyncFunctionPrefixString; }
  460. JavascriptString* GetFunctionDisplayString() { return functionDisplayString; }
  461. JavascriptString* GetXDomainFunctionDisplayString() { return xDomainFunctionDisplayString; }
  462. JavascriptString* GetInvalidDateString() { return invalidDateString; }
  463. JavascriptString* GetObjectTypeDisplayString() const { return objectTypeDisplayString; }
  464. JavascriptString* GetFunctionTypeDisplayString() const { return functionTypeDisplayString; }
  465. JavascriptString* GetBooleanTypeDisplayString() const { return booleanTypeDisplayString; }
  466. JavascriptString* GetNumberTypeDisplayString() const { return numberTypeDisplayString; }
  467. // SIMD_JS
  468. JavascriptString* GetSIMDFloat32x4DisplayString() const { return simdFloat32x4DisplayString; }
  469. JavascriptString* GetSIMDFloat64x2DisplayString() const { return simdFloat64x2DisplayString; }
  470. JavascriptString* GetSIMDInt32x4DisplayString() const { return simdInt32x4DisplayString; }
  471. JavascriptString* GetSIMDInt16x8DisplayString() const { return simdInt16x8DisplayString; }
  472. JavascriptString* GetSIMDInt8x16DisplayString() const { return simdInt8x16DisplayString; }
  473. JavascriptString* GetSIMDBool32x4DisplayString() const { return simdBool32x4DisplayString; }
  474. JavascriptString* GetSIMDBool16x8DisplayString() const { return simdBool16x8DisplayString; }
  475. JavascriptString* GetSIMDBool8x16DisplayString() const { return simdBool8x16DisplayString; }
  476. JavascriptString* GetSIMDUint32x4DisplayString() const { return simdUint32x4DisplayString; }
  477. JavascriptString* GetSIMDUint16x8DisplayString() const { return simdUint16x8DisplayString; }
  478. JavascriptString* GetSIMDUint8x16DisplayString() const { return simdUint8x16DisplayString; }
  479. JavascriptString* GetSymbolTypeDisplayString() const { return symbolTypeDisplayString; }
  480. JavascriptString* GetDebuggerDeadZoneBlockVariableString() { Assert(debuggerDeadZoneBlockVariableString); return debuggerDeadZoneBlockVariableString; }
  481. JavascriptRegExp* CreateEmptyRegExp();
  482. JavascriptFunction* GetObjectConstructor() const {return objectConstructor; }
  483. JavascriptFunction* GetBooleanConstructor() const {return booleanConstructor; }
  484. JavascriptFunction* GetDateConstructor() const {return dateConstructor; }
  485. JavascriptFunction* GetFunctionConstructor() const {return functionConstructor; }
  486. JavascriptFunction* GetNumberConstructor() const {return numberConstructor; }
  487. JavascriptRegExpConstructor* GetRegExpConstructor() const {return regexConstructor; }
  488. JavascriptFunction* GetStringConstructor() const {return stringConstructor; }
  489. JavascriptFunction* GetArrayBufferConstructor() const {return arrayBufferConstructor; }
  490. JavascriptFunction* GetErrorConstructor() const { return errorConstructor; }
  491. JavascriptFunction* GetTypedArrayConstructor() const { return typedArrayConstructor; }
  492. JavascriptFunction* GetInt8ArrayConstructor() const {return Int8ArrayConstructor; }
  493. JavascriptFunction* GetUint8ArrayConstructor() const {return Uint8ArrayConstructor; }
  494. JavascriptFunction* GetInt16ArrayConstructor() const {return Int16ArrayConstructor; }
  495. JavascriptFunction* GetUint16ArrayConstructor() const {return Uint16ArrayConstructor; }
  496. JavascriptFunction* GetInt32ArrayConstructor() const {return Int32ArrayConstructor; }
  497. JavascriptFunction* GetUint32ArrayConstructor() const {return Uint32ArrayConstructor; }
  498. JavascriptFunction* GetFloat32ArrayConstructor() const {return Float32ArrayConstructor; }
  499. JavascriptFunction* GetFloat64ArrayConstructor() const {return Float64ArrayConstructor; }
  500. JavascriptFunction* GetWeakMapConstructor() const {return weakMapConstructor; }
  501. JavascriptFunction* GetMapConstructor() const {return mapConstructor; }
  502. JavascriptFunction* GetSetConstructor() const {return setConstructor; }
  503. JavascriptFunction* GetSymbolConstructor() const {return symbolConstructor; }
  504. JavascriptFunction* GetEvalFunctionObject() { return evalFunctionObject; }
  505. JavascriptFunction* GetArrayPrototypeValuesFunction() { return arrayPrototypeValuesFunction; }
  506. DynamicObject* GetMathObject() const {return mathObject; }
  507. DynamicObject* GetJSONObject() const {return JSONObject; }
  508. DynamicObject* GetReflectObject() const { return reflectObject; }
  509. const PropertyDescriptor* GetDefaultPropertyDescriptor() const { return &defaultPropertyDescriptor; }
  510. DynamicObject* GetMissingPropertyHolder() const { return missingPropertyHolder; }
  511. #ifdef ENABLE_INTL_OBJECT
  512. DynamicObject* GetINTLObject() const { return IntlObject; }
  513. void ResetIntlObject();
  514. void EnsureIntlObjectReady();
  515. template <class Fn>
  516. void InitializeIntlForProtototypes(Fn fn);
  517. void InitializeIntlForStringPrototype();
  518. void InitializeIntlForDatePrototype();
  519. void InitializeIntlForNumberPrototype();
  520. #endif
  521. #ifdef ENABLE_DEBUG_CONFIG_OPTIONS
  522. DynamicType * GetDebugDisposableObjectType() { return debugDisposableObjectType; }
  523. DynamicType * GetDebugFuncExecutorInDisposeObjectType() { return debugFuncExecutorInDisposeObjectType; }
  524. #endif
  525. StaticType * GetBooleanTypeStatic() const { return booleanTypeStatic; }
  526. DynamicType * GetBooleanTypeDynamic() const { return booleanTypeDynamic; }
  527. DynamicType * GetDateType() const { return dateType; }
  528. DynamicType * GetBoundFunctionType() const { return boundFunctionType; }
  529. DynamicType * GetRegExpConstructorType() const { return regexConstructorType; }
  530. StaticType * GetEnumeratorType() const { return enumeratorType; }
  531. DynamicType * GetSpreadArgumentType() const { return SpreadArgumentType; }
  532. StaticType * GetWithType() const { return withType; }
  533. DynamicType * GetErrorType() const { return errorType; }
  534. DynamicType * GetEvalErrorType() const { return evalErrorType; }
  535. DynamicType * GetRangeErrorType() const { return rangeErrorType; }
  536. DynamicType * GetReferenceErrorType() const { return referenceErrorType; }
  537. DynamicType * GetSyntaxErrorType() const { return syntaxErrorType; }
  538. DynamicType * GetTypeErrorType() const { return typeErrorType; }
  539. DynamicType * GetURIErrorType() const { return uriErrorType; }
  540. StaticType * GetNumberTypeStatic() const { return numberTypeStatic; }
  541. StaticType * GetInt64TypeStatic() const { return int64NumberTypeStatic; }
  542. StaticType * GetUInt64TypeStatic() const { return uint64NumberTypeStatic; }
  543. DynamicType * GetNumberTypeDynamic() const { return numberTypeDynamic; }
  544. DynamicType * GetPromiseType() const { return promiseType; }
  545. // SIMD_JS
  546. StaticType* GetSIMDFloat32x4TypeStatic() const { return simdFloat32x4TypeStatic; }
  547. StaticType* GetSIMDFloat64x2TypeStatic() const { return simdFloat64x2TypeStatic; }
  548. StaticType* GetSIMDInt32x4TypeStatic() const { return simdInt32x4TypeStatic; }
  549. StaticType* GetSIMDInt16x8TypeStatic() const { return simdInt16x8TypeStatic; }
  550. StaticType* GetSIMDInt8x16TypeStatic() const { return simdInt8x16TypeStatic; }
  551. StaticType* GetSIMDBool32x4TypeStatic() const { return simdBool32x4TypeStatic; }
  552. StaticType* GetSIMDBool16x8TypeStatic() const { return simdBool16x8TypeStatic; }
  553. StaticType* GetSIMDBool8x16TypeStatic() const { return simdBool8x16TypeStatic; }
  554. StaticType* GetSIMDUInt32x4TypeStatic() const { return simdUint32x4TypeStatic; }
  555. StaticType* GetSIMDUint16x8TypeStatic() const { return simdUint16x8TypeStatic; }
  556. StaticType* GetSIMDUint8x16TypeStatic() const { return simdUint8x16TypeStatic; }
  557. DynamicType * GetObjectLiteralType(uint16 requestedInlineSlotCapacity);
  558. DynamicType * GetObjectHeaderInlinedLiteralType(uint16 requestedInlineSlotCapacity);
  559. DynamicType * GetObjectType() const { return objectTypes[0]; }
  560. DynamicType * GetObjectHeaderInlinedType() const { return objectHeaderInlinedTypes[0]; }
  561. StaticType * GetSymbolTypeStatic() const { return symbolTypeStatic; }
  562. DynamicType * GetSymbolTypeDynamic() const { return symbolTypeDynamic; }
  563. DynamicType * GetProxyType() const { return proxyType; }
  564. DynamicType * GetJavascriptEnumeratorIteratorType() const { return javascriptEnumeratorIteratorType; }
  565. DynamicType * GetHeapArgumentsObjectType() const { return heapArgumentsType; }
  566. DynamicType * GetActivationObjectType() const { return activationObjectType; }
  567. DynamicType * GetArrayType() const { return arrayType; }
  568. DynamicType * GetNativeIntArrayType() const { return nativeIntArrayType; }
  569. #if ENABLE_COPYONACCESS_ARRAY
  570. DynamicType * GetCopyOnAccessNativeIntArrayType() const { return copyOnAccessNativeIntArrayType; }
  571. #endif
  572. DynamicType * GetNativeFloatArrayType() const { return nativeFloatArrayType; }
  573. DynamicType * GetRegexType() const { return regexType; }
  574. DynamicType * GetRegexResultType() const { return regexResultType; }
  575. DynamicType * GetArrayBufferType() const { return arrayBufferType; }
  576. StaticType * GetStringTypeStatic() const { AssertMsg(stringTypeStatic, "Where's stringTypeStatic?"); return stringTypeStatic; }
  577. DynamicType * GetStringTypeDynamic() const { return stringTypeDynamic; }
  578. StaticType * GetVariantDateType() const { return variantDateType; }
  579. void EnsureDebugObject(DynamicObject* newDebugObject);
  580. DynamicObject* GetDebugObject() const { Assert(debugObject != nullptr); return debugObject; }
  581. DynamicType * GetMapType() const { return mapType; }
  582. DynamicType * GetSetType() const { return setType; }
  583. DynamicType * GetWeakMapType() const { return weakMapType; }
  584. DynamicType * GetWeakSetType() const { return weakSetType; }
  585. DynamicType * GetArrayIteratorType() const { return arrayIteratorType; }
  586. DynamicType * GetMapIteratorType() const { return mapIteratorType; }
  587. DynamicType * GetSetIteratorType() const { return setIteratorType; }
  588. DynamicType * GetStringIteratorType() const { return stringIteratorType; }
  589. JavascriptFunction* GetDefaultAccessorFunction() const { return defaultAccessorFunction; }
  590. JavascriptFunction* GetStackTraceAccessorFunction() const { return stackTraceAccessorFunction; }
  591. JavascriptFunction* GetThrowTypeErrorAccessorFunction() const { return throwTypeErrorAccessorFunction; }
  592. JavascriptFunction* GetThrowTypeErrorCallerAccessorFunction() const { return throwTypeErrorCallerAccessorFunction; }
  593. JavascriptFunction* GetThrowTypeErrorCalleeAccessorFunction() const { return throwTypeErrorCalleeAccessorFunction; }
  594. JavascriptFunction* GetThrowTypeErrorArgumentsAccessorFunction() const { return throwTypeErrorArgumentsAccessorFunction; }
  595. JavascriptFunction* Get__proto__getterFunction() const { return __proto__getterFunction; }
  596. JavascriptFunction* Get__proto__setterFunction() const { return __proto__setterFunction; }
  597. JavascriptFunction* GetObjectValueOfFunction() const { return objectValueOfFunction; }
  598. JavascriptFunction* GetObjectToStringFunction() const { return objectToStringFunction; }
  599. // SIMD_JS
  600. JavascriptFunction* GetSIMDFloat32x4ToStringFunction() const { return simdFloat32x4ToStringFunction; }
  601. JavascriptFunction* GetSIMDFloat64x2ToStringFunction() const { return simdFloat64x2ToStringFunction; }
  602. JavascriptFunction* GetSIMDInt32x4ToStringFunction() const { return simdInt32x4ToStringFunction; }
  603. JavascriptFunction* GetSIMDInt16x8ToStringFunction() const { return simdInt16x8ToStringFunction; }
  604. JavascriptFunction* GetSIMDInt8x16ToStringFunction() const { return simdInt8x16ToStringFunction; }
  605. JavascriptFunction* GetSIMDBool32x4ToStringFunction() const { return simdBool32x4ToStringFunction; }
  606. JavascriptFunction* GetSIMDBool16x8ToStringFunction() const { return simdBool16x8ToStringFunction; }
  607. JavascriptFunction* GetSIMDBool8x16ToStringFunction() const { return simdBool8x16ToStringFunction; }
  608. JavascriptFunction* GetSIMDUint32x4ToStringFunction() const { return simdUint32x4ToStringFunction; }
  609. JavascriptFunction* GetSIMDUint16x8ToStringFunction() const { return simdUint16x8ToStringFunction; }
  610. JavascriptFunction* GetSIMDUint8x16ToStringFunction() const { return simdUint8x16ToStringFunction; }
  611. JavascriptFunction* GetDebugObjectNonUserGetterFunction() const { return debugObjectNonUserGetterFunction; }
  612. JavascriptFunction* GetDebugObjectNonUserSetterFunction() const { return debugObjectNonUserSetterFunction; }
  613. UnifiedRegex::RegexPattern * GetEmptyRegexPattern() const { return emptyRegexPattern; }
  614. void SetDebugObjectNonUserAccessor(FunctionInfo *funcGetter, FunctionInfo *funcSetter);
  615. JavascriptFunction* GetDebugObjectDebugModeGetterFunction() const { return debugObjectDebugModeGetterFunction; }
  616. void SetDebugObjectDebugModeAccessor(FunctionInfo *funcGetter);
  617. #ifdef ENABLE_DEBUG_CONFIG_OPTIONS
  618. JavascriptFunction* GetDebugObjectFaultInjectionCookieGetterFunction() const { return debugObjectFaultInjectionCookieGetterFunction; }
  619. JavascriptFunction* GetDebugObjectFaultInjectionCookieSetterFunction() const { return debugObjectFaultInjectionCookieSetterFunction; }
  620. void SetDebugObjectFaultInjectionCookieGetterAccessor(FunctionInfo *funcGetter, FunctionInfo *funcSetter);
  621. #endif
  622. JavascriptFunction* GetArrayPrototypeToStringFunction() const { return arrayPrototypeToStringFunction; }
  623. JavascriptFunction* GetArrayPrototypeToLocaleStringFunction() const { return arrayPrototypeToLocaleStringFunction; }
  624. JavascriptFunction* GetIdentityFunction() const { return identityFunction; }
  625. JavascriptFunction* GetThrowerFunction() const { return throwerFunction; }
  626. JavascriptFunction* GetHostPromiseContinuationFunction();
  627. void SetNativeHostPromiseContinuationFunction(PromiseContinuationCallback function, void *state);
  628. void PinJsrtContextObject(FinalizableObject* jsrtContext);
  629. FinalizableObject* GetPinnedJsrtContextObject();
  630. void EnqueueTask(Var taskVar);
  631. HeapArgumentsObject* CreateHeapArguments(Var frameObj, uint formalCount);
  632. JavascriptArray* CreateArray();
  633. JavascriptArray* CreateArray(uint32 length);
  634. JavascriptArray *CreateArrayOnStack(void *const stackAllocationPointer);
  635. JavascriptNativeIntArray* CreateNativeIntArray();
  636. JavascriptNativeIntArray* CreateNativeIntArray(uint32 length);
  637. #if ENABLE_COPYONACCESS_ARRAY
  638. JavascriptCopyOnAccessNativeIntArray* CreateCopyOnAccessNativeIntArray();
  639. JavascriptCopyOnAccessNativeIntArray* CreateCopyOnAccessNativeIntArray(uint32 length);
  640. #endif
  641. JavascriptNativeFloatArray* CreateNativeFloatArray();
  642. JavascriptNativeFloatArray* CreateNativeFloatArray(uint32 length);
  643. JavascriptArray* CreateArray(uint32 length, uint32 size);
  644. ArrayBuffer* CreateArrayBuffer(uint32 length);
  645. ArrayBuffer* CreateArrayBuffer(byte* buffer, uint32 length);
  646. ArrayBuffer* CreateProjectionArraybuffer(uint32 length);
  647. ArrayBuffer* CreateProjectionArraybuffer(byte* buffer, uint32 length);
  648. DataView* CreateDataView(ArrayBuffer* arrayBuffer, uint32 offSet, uint32 mappedLength);
  649. template <typename TypeName, bool clamped>
  650. inline DynamicType* GetTypedArrayType(TypeName);
  651. template<> inline DynamicType* GetTypedArrayType<int8,false>(int8) { return int8ArrayType; };
  652. template<> inline DynamicType* GetTypedArrayType<uint8,false>(uint8) { return uint8ArrayType; };
  653. template<> inline DynamicType* GetTypedArrayType<uint8,true>(uint8) { return uint8ClampedArrayType; };
  654. template<> inline DynamicType* GetTypedArrayType<int16,false>(int16) { return int16ArrayType; };
  655. template<> inline DynamicType* GetTypedArrayType<uint16,false>(uint16) { return uint16ArrayType; };
  656. template<> inline DynamicType* GetTypedArrayType<int32,false>(int32) { return int32ArrayType; };
  657. template<> inline DynamicType* GetTypedArrayType<uint32,false>(uint32) { return uint32ArrayType; };
  658. template<> inline DynamicType* GetTypedArrayType<float,false>(float) { return float32ArrayType; };
  659. template<> inline DynamicType* GetTypedArrayType<double,false>(double) { return float64ArrayType; };
  660. template<> inline DynamicType* GetTypedArrayType<int64,false>(int64) { return int64ArrayType; };
  661. template<> inline DynamicType* GetTypedArrayType<uint64,false>(uint64) { return uint64ArrayType; };
  662. template<> inline DynamicType* GetTypedArrayType<bool,false>(bool) { return boolArrayType; };
  663. DynamicType* GetCharArrayType() { return charArrayType; };
  664. //
  665. // This method would be used for creating array literals, when we really need to create a huge array
  666. // Avoids checks at runtime.
  667. //
  668. JavascriptArray* CreateArrayLiteral(uint32 length);
  669. JavascriptNativeIntArray* CreateNativeIntArrayLiteral(uint32 length);
  670. #if ENABLE_PROFILE_INFO
  671. JavascriptNativeIntArray* CreateCopyOnAccessNativeIntArrayLiteral(ArrayCallSiteInfo *arrayInfo, FunctionBody *functionBody, const Js::AuxArray<int32> *ints);
  672. #endif
  673. JavascriptNativeFloatArray* CreateNativeFloatArrayLiteral(uint32 length);
  674. JavascriptBoolean* CreateBoolean(BOOL value);
  675. JavascriptDate* CreateDate();
  676. JavascriptDate* CreateDate(double value);
  677. JavascriptDate* CreateDate(SYSTEMTIME* pst);
  678. JavascriptMap* CreateMap();
  679. JavascriptSet* CreateSet();
  680. JavascriptWeakMap* CreateWeakMap();
  681. JavascriptWeakSet* CreateWeakSet();
  682. JavascriptError* CreateError();
  683. JavascriptError* CreateError(DynamicType* errorType, BOOL isExternal = FALSE);
  684. JavascriptError* CreateExternalError(ErrorTypeEnum errorTypeEnum);
  685. JavascriptError* CreateEvalError();
  686. JavascriptError* CreateRangeError();
  687. JavascriptError* CreateReferenceError();
  688. JavascriptError* CreateSyntaxError();
  689. JavascriptError* CreateTypeError();
  690. JavascriptError* CreateURIError();
  691. JavascriptError* CreateStackOverflowError();
  692. JavascriptError* CreateOutOfMemoryError();
  693. JavascriptSymbol* CreateSymbol(JavascriptString* description);
  694. JavascriptSymbol* CreateSymbol(const wchar_t* description, int descriptionLength);
  695. JavascriptSymbol* CreateSymbol(const PropertyRecord* propertyRecord);
  696. JavascriptPromise* CreatePromise();
  697. JavascriptGenerator* CreateGenerator(Arguments& args, ScriptFunction* scriptFunction, RecyclableObject* prototype);
  698. JavascriptFunction* CreateNonProfiledFunction(FunctionInfo * functionInfo);
  699. template <class MethodType>
  700. JavascriptExternalFunction* CreateIdMappedExternalFunction(MethodType entryPoint, DynamicType *pPrototypeType);
  701. JavascriptExternalFunction* CreateExternalConstructor(Js::ExternalMethod entryPoint, PropertyId nameId, RecyclableObject * prototype);
  702. JavascriptExternalFunction* CreateExternalConstructor(Js::ExternalMethod entryPoint, PropertyId nameId, InitializeMethod method, unsigned short deferredTypeSlots, bool hasAccessors);
  703. static DynamicTypeHandler * GetDeferredPrototypeGeneratorFunctionTypeHandler(ScriptContext* scriptContext);
  704. DynamicType * CreateDeferredPrototypeGeneratorFunctionType(JavascriptMethod entrypoint, bool isAnonymousFunction, bool isShared = false);
  705. static DynamicTypeHandler * GetDeferredPrototypeFunctionTypeHandler(ScriptContext* scriptContext);
  706. static DynamicTypeHandler * GetDeferredAnonymousPrototypeFunctionTypeHandler();
  707. static DynamicTypeHandler * GetDeferredAnonymousPrototypeGeneratorFunctionTypeHandler();
  708. DynamicTypeHandler * GetDeferredFunctionTypeHandler();
  709. DynamicTypeHandler * ScriptFunctionTypeHandler(bool noPrototypeProperty, bool isAnonymousFunction);
  710. DynamicTypeHandler * GetDeferredAnonymousFunctionTypeHandler();
  711. template<bool isNameAvailable, bool isPrototypeAvailable = true>
  712. static DynamicTypeHandler * GetDeferredFunctionTypeHandlerBase();
  713. template<bool isNameAvailable, bool isPrototypeAvailable = true>
  714. static DynamicTypeHandler * GetDeferredGeneratorFunctionTypeHandlerBase();
  715. DynamicType * CreateDeferredPrototypeFunctionType(JavascriptMethod entrypoint);
  716. DynamicType * CreateDeferredPrototypeFunctionTypeNoProfileThunk(JavascriptMethod entrypoint, bool isShared = false);
  717. DynamicType * CreateFunctionType(JavascriptMethod entrypoint, RecyclableObject* prototype = nullptr);
  718. DynamicType * CreateFunctionWithLengthType(FunctionInfo * functionInfo);
  719. DynamicType * CreateFunctionWithLengthAndPrototypeType(FunctionInfo * functionInfo);
  720. DynamicType * CreateFunctionWithLengthType(DynamicObject * prototype, FunctionInfo * functionInfo);
  721. DynamicType * CreateFunctionWithLengthAndPrototypeType(DynamicObject * prototype, FunctionInfo * functionInfo);
  722. ScriptFunction * CreateScriptFunction(FunctionProxy* proxy);
  723. AsmJsScriptFunction * CreateAsmJsScriptFunction(FunctionProxy* proxy);
  724. ScriptFunctionWithInlineCache * CreateScriptFunctionWithInlineCache(FunctionProxy* proxy);
  725. GeneratorVirtualScriptFunction * CreateGeneratorVirtualScriptFunction(FunctionProxy* proxy);
  726. DynamicType * CreateGeneratorType(RecyclableObject* prototype);
  727. JavascriptEnumerator * GetNullEnumerator() const;
  728. #if 0
  729. JavascriptNumber* CreateNumber(double value);
  730. #endif
  731. JavascriptNumber* CreateNumber(double value, RecyclerJavascriptNumberAllocator * numberAllocator);
  732. JavascriptGeneratorFunction* CreateGeneratorFunction(JavascriptMethod entryPoint, GeneratorVirtualScriptFunction* scriptFunction);
  733. JavascriptExternalFunction* CreateExternalFunction(ExternalMethod entryPointer, PropertyId nameId, Var signature, JavascriptTypeId prototypeTypeId, UINT64 flags);
  734. JavascriptExternalFunction* CreateExternalFunction(ExternalMethod entryPointer, Var nameId, Var signature, JavascriptTypeId prototypeTypeId, UINT64 flags);
  735. JavascriptExternalFunction* CreateStdCallExternalFunction(StdCallJavascriptMethod entryPointer, PropertyId nameId, void *callbackState);
  736. JavascriptExternalFunction* CreateStdCallExternalFunction(StdCallJavascriptMethod entryPointer, Var nameId, void *callbackState);
  737. JavascriptPromiseAsyncSpawnExecutorFunction* CreatePromiseAsyncSpawnExecutorFunction(JavascriptMethod entryPoint, JavascriptGenerator* generatorFunction, Var target);
  738. JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction* CreatePromiseAsyncSpawnStepArgumentExecutorFunction(JavascriptMethod entryPoint, JavascriptGenerator* generator, Var argument, JavascriptFunction* resolve = NULL, JavascriptFunction* reject = NULL, bool isReject = false);
  739. JavascriptPromiseCapabilitiesExecutorFunction* CreatePromiseCapabilitiesExecutorFunction(JavascriptMethod entryPoint, JavascriptPromiseCapability* capability);
  740. JavascriptPromiseResolveOrRejectFunction* CreatePromiseResolveOrRejectFunction(JavascriptMethod entryPoint, JavascriptPromise* promise, bool isReject, JavascriptPromiseResolveOrRejectFunctionAlreadyResolvedWrapper* alreadyResolvedRecord);
  741. JavascriptPromiseReactionTaskFunction* CreatePromiseReactionTaskFunction(JavascriptMethod entryPoint, JavascriptPromiseReaction* reaction, Var argument);
  742. JavascriptPromiseResolveThenableTaskFunction* CreatePromiseResolveThenableTaskFunction(JavascriptMethod entryPoint, JavascriptPromise* promise, RecyclableObject* thenable, RecyclableObject* thenFunction);
  743. JavascriptPromiseAllResolveElementFunction* CreatePromiseAllResolveElementFunction(JavascriptMethod entryPoint, uint32 index, JavascriptArray* values, JavascriptPromiseCapability* capabilities, JavascriptPromiseAllResolveElementFunctionRemainingElementsWrapper* remainingElements);
  744. JavascriptExternalFunction* CreateWrappedExternalFunction(JavascriptExternalFunction* wrappedFunction);
  745. #if ENABLE_NATIVE_CODEGEN
  746. JavascriptNumber* CreateCodeGenNumber(CodeGenNumberAllocator *alloc, double value);
  747. #endif
  748. DynamicObject* CreateGeneratorConstructorPrototypeObject();
  749. DynamicObject* CreateConstructorPrototypeObject(JavascriptFunction * constructor);
  750. DynamicObject* CreateObject(const bool allowObjectHeaderInlining = false, const PropertyIndex requestedInlineSlotCapacity = 0);
  751. DynamicObject* CreateObject(DynamicTypeHandler * typeHandler);
  752. DynamicObject* CreateActivationObject();
  753. DynamicObject* CreatePseudoActivationObject();
  754. DynamicObject* CreateBlockActivationObject();
  755. DynamicObject* CreateConsoleScopeActivationObject();
  756. DynamicType* CreateObjectType(RecyclableObject* prototype, Js::TypeId typeId, uint16 requestedInlineSlotCapacity);
  757. DynamicType* CreateObjectTypeNoCache(RecyclableObject* prototype, Js::TypeId typeId);
  758. DynamicType* CreateObjectType(RecyclableObject* prototype, uint16 requestedInlineSlotCapacity);
  759. DynamicObject* CreateObject(RecyclableObject* prototype, uint16 requestedInlineSlotCapacity = 0);
  760. typedef JavascriptString* LibStringType; // used by diagnostics template
  761. template< size_t N > JavascriptString* CreateStringFromCppLiteral(const wchar_t (&value)[N]) const;
  762. template<> JavascriptString* CreateStringFromCppLiteral(const wchar_t (&value)[1]) const; // Specialization for empty string
  763. template<> JavascriptString* CreateStringFromCppLiteral(const wchar_t (&value)[2]) const; // Specialization for single-char strings
  764. PropertyString* CreatePropertyString(const Js::PropertyRecord* propertyRecord);
  765. PropertyString* CreatePropertyString(const Js::PropertyRecord* propertyRecord, ArenaAllocator *arena);
  766. JavascriptVariantDate* CreateVariantDate(const double value);
  767. JavascriptBooleanObject* CreateBooleanObject(BOOL value);
  768. JavascriptBooleanObject* CreateBooleanObject();
  769. JavascriptNumberObject* CreateNumberObjectWithCheck(double value);
  770. JavascriptNumberObject* CreateNumberObject(Var number);
  771. JavascriptStringObject* CreateStringObject(JavascriptString* value);
  772. JavascriptStringObject* CreateStringObject(const wchar_t* value, charcount_t length);
  773. JavascriptSymbolObject* CreateSymbolObject(JavascriptSymbol* value);
  774. JavascriptArrayIterator* CreateArrayIterator(Var iterable, JavascriptArrayIteratorKind kind);
  775. JavascriptMapIterator* CreateMapIterator(JavascriptMap* map, JavascriptMapIteratorKind kind);
  776. JavascriptSetIterator* CreateSetIterator(JavascriptSet* set, JavascriptSetIteratorKind kind);
  777. JavascriptStringIterator* CreateStringIterator(JavascriptString* string);
  778. JavascriptRegExp* CreateRegExp(UnifiedRegex::RegexPattern* pattern);
  779. DynamicObject* CreateIteratorResultObject(Var value, Var done);
  780. DynamicObject* CreateIteratorResultObjectValueFalse(Var value);
  781. DynamicObject* CreateIteratorResultObjectUndefinedTrue();
  782. RecyclableObject* CreateThrowErrorObject(JavascriptError* error);
  783. JavascriptFunction* EnsurePromiseResolveFunction();
  784. void SetCrossSiteForSharedFunctionType(JavascriptFunction * function);
  785. bool IsPRNGSeeded() { return isPRNGSeeded; }
  786. uint64 GetRandSeed0() { return randSeed0; }
  787. uint64 GetRandSeed1() { return randSeed1; }
  788. void SetIsPRNGSeeded(bool val) { isPRNGSeeded = val; }
  789. void SetRandSeed0(uint64 rs) { randSeed0 = rs;}
  790. void SetRandSeed1(uint64 rs) { randSeed1 = rs; }
  791. void SetProfileMode(bool fSet);
  792. void SetDispatchProfile(bool fSet, JavascriptMethod dispatchInvoke);
  793. HRESULT ProfilerRegisterBuiltIns();
  794. #if ENABLE_COPYONACCESS_ARRAY
  795. static bool IsCopyOnAccessArrayCallSite(JavascriptLibrary *lib, ArrayCallSiteInfo *arrayInfo, uint32 length);
  796. static bool IsCachedCopyOnAccessArrayCallSite(const JavascriptLibrary *lib, ArrayCallSiteInfo *arrayInfo);
  797. template <typename T>
  798. static void CheckAndConvertCopyOnAccessNativeIntArray(const T instance);
  799. #endif
  800. void EnsureStringTemplateCallsiteObjectList();
  801. void AddStringTemplateCallsiteObject(RecyclableObject* callsite);
  802. RecyclableObject* TryGetStringTemplateCallsiteObject(ParseNodePtr pnode);
  803. RecyclableObject* TryGetStringTemplateCallsiteObject(RecyclableObject* callsite);
  804. #if DBG_DUMP
  805. static const wchar_t* GetStringTemplateCallsiteObjectKey(Var callsite);
  806. #endif
  807. JavascriptFunction** GetBuiltinFunctions();
  808. INT_PTR* GetVTableAddresses();
  809. static BuiltinFunction GetBuiltinFunctionForPropId(PropertyId id);
  810. static BuiltinFunction GetBuiltInForFuncInfo(FunctionInfo* funcInfo, ScriptContext *scriptContext);
  811. #if DBG
  812. static void CheckRegisteredBuiltIns(JavascriptFunction** builtInFuncs, ScriptContext *scriptContext)
  813. {
  814. byte count = BuiltinFunction::Count;
  815. for(byte index = 0; index < count; index++)
  816. {
  817. Assert(!builtInFuncs[index] || (index == GetBuiltInForFuncInfo(builtInFuncs[index]->GetFunctionInfo(), scriptContext)));
  818. }
  819. }
  820. #endif
  821. static BOOL CanFloatPreferenceFunc(BuiltinFunction index);
  822. static BOOL IsFltFunc(BuiltinFunction index);
  823. static bool IsFloatFunctionCallsite(BuiltinFunction index, size_t argc);
  824. static bool IsFltBuiltInConst(PropertyId id);
  825. static size_t GetArgCForBuiltIn(BuiltinFunction index)
  826. {
  827. Assert(index < _countof(JavascriptLibrary::LibraryFunctionArgC));
  828. return JavascriptLibrary::LibraryFunctionArgC[index];
  829. }
  830. static BuiltInFlags GetFlagsForBuiltIn(BuiltinFunction index)
  831. {
  832. Assert(index < _countof(JavascriptLibrary::LibraryFunctionFlags));
  833. return (BuiltInFlags)JavascriptLibrary::LibraryFunctionFlags[index];
  834. }
  835. static BuiltinFunction GetBuiltInInlineCandidateId(Js::OpCode opCode);
  836. static BuiltInArgSpecizationType GetBuiltInArgType(BuiltInFlags flags, BuiltInArgShift argGroup);
  837. static bool IsTypeSpecRequired(BuiltInFlags flags)
  838. {
  839. return GetBuiltInArgType(flags, BuiltInArgShift::BIAS_Src1) || GetBuiltInArgType(flags, BuiltInArgShift::BIAS_Src2) || GetBuiltInArgType(flags, BuiltInArgShift::BIAS_Dst);
  840. }
  841. #if ENABLE_DEBUG_CONFIG_OPTIONS
  842. static wchar_t const * GetNameForBuiltIn(BuiltinFunction index)
  843. {
  844. Assert(index < _countof(JavascriptLibrary::LibraryFunctionName));
  845. return JavascriptLibrary::LibraryFunctionName[index];
  846. }
  847. #endif
  848. PropertyStringCacheMap* EnsurePropertyStringMap();
  849. PropertyStringCacheMap* GetPropertyStringMap() { return this->propertyStringMap; }
  850. ForInObjectEnumerator* JavascriptLibrary::GetAndClearForInEnumeratorCache();
  851. void SetForInEnumeratorCache(ForInObjectEnumerator* enumerator);
  852. void TypeAndPrototypesAreEnsuredToHaveOnlyWritableDataProperties(Type *const type);
  853. void NoPrototypeChainsAreEnsuredToHaveOnlyWritableDataProperties();
  854. HRESULT EnsureReadyIfHybridDebugging(bool isScriptEngineReady = true);
  855. CharStringCache& GetCharStringCache() { return charStringCache; }
  856. static JavascriptLibrary * FromCharStringCache(CharStringCache * cache)
  857. {
  858. return (JavascriptLibrary *)((uintptr_t)cache - offsetof(JavascriptLibrary, charStringCache));
  859. }
  860. bool GetArrayObjectHasUserDefinedSpecies() const { return arrayObjectHasUserDefinedSpecies; }
  861. void SetArrayObjectHasUserDefinedSpecies(bool val) { arrayObjectHasUserDefinedSpecies = val; }
  862. private:
  863. #ifdef ENABLE_DEBUG_CONFIG_OPTIONS
  864. // Declare fretest/debug properties here since otherwise it can cause
  865. // a mismatch between fre mshtml and fretest jscript9 causing undefined behavior
  866. DynamicType * debugDisposableObjectType;
  867. DynamicType * debugFuncExecutorInDisposeObjectType;
  868. #endif
  869. void InitializePrototypes();
  870. void InitializeTypes();
  871. void InitializeGlobal(GlobalObject * globalObject);
  872. static void __cdecl InitializeArrayConstructor(DynamicObject* arrayConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  873. static void __cdecl InitializeArrayPrototype(DynamicObject* arrayPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  874. static void __cdecl InitializeArrayBufferConstructor(DynamicObject* arrayBufferConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  875. static void __cdecl InitializeArrayBufferPrototype(DynamicObject* arrayBufferPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  876. static void __cdecl InitializeDataViewConstructor(DynamicObject* dataViewConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  877. static void __cdecl InitializeDataViewPrototype(DynamicObject* dataViewPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  878. static void __cdecl InitializeErrorConstructor(DynamicObject* constructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  879. static void __cdecl InitializeErrorPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  880. static void __cdecl InitializeEvalErrorConstructor(DynamicObject* constructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  881. static void __cdecl InitializeEvalErrorPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  882. static void __cdecl InitializeRangeErrorConstructor(DynamicObject* constructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  883. static void __cdecl InitializeRangeErrorPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  884. static void __cdecl InitializeReferenceErrorConstructor(DynamicObject* constructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  885. static void __cdecl InitializeReferenceErrorPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  886. static void __cdecl InitializeSyntaxErrorConstructor(DynamicObject* constructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  887. static void __cdecl InitializeSyntaxErrorPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  888. static void __cdecl InitializeTypeErrorConstructor(DynamicObject* constructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  889. static void __cdecl InitializeTypeErrorPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  890. static void __cdecl InitializeURIErrorConstructor(DynamicObject* constructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  891. static void __cdecl InitializeURIErrorPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  892. static void __cdecl InitializeTypedArrayConstructor(DynamicObject* typedArrayConsructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  893. static void __cdecl InitializeTypedArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  894. static void __cdecl InitializeInt8ArrayConstructor(DynamicObject* typedArrayConsructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  895. static void __cdecl InitializeInt8ArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  896. static void __cdecl InitializeUint8ArrayConstructor(DynamicObject* typedArrayConsructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  897. static void __cdecl InitializeUint8ArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  898. static void __cdecl InitializeUint8ClampedArrayConstructor(DynamicObject* typedArrayConsructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  899. static void __cdecl InitializeUint8ClampedArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  900. static void __cdecl InitializeInt16ArrayConstructor(DynamicObject* typedArrayConsructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  901. static void __cdecl InitializeInt16ArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  902. static void __cdecl InitializeUint16ArrayConstructor(DynamicObject* typedArrayConsructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  903. static void __cdecl InitializeUint16ArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  904. static void __cdecl InitializeInt32ArrayConstructor(DynamicObject* typedArrayConsructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  905. static void __cdecl InitializeInt32ArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  906. static void __cdecl InitializeUint32ArrayConstructor(DynamicObject* typedArrayConsructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  907. static void __cdecl InitializeUint32ArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  908. static void __cdecl InitializeFloat32ArrayConstructor(DynamicObject* typedArrayConsructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  909. static void __cdecl InitializeFloat32ArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  910. static void __cdecl InitializeFloat64ArrayConstructor(DynamicObject* typedArrayConsructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  911. static void __cdecl InitializeFloat64ArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  912. static void __cdecl InitializeInt64ArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  913. static void __cdecl InitializeUint64ArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  914. static void __cdecl InitializeBoolArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  915. static void __cdecl InitializeCharArrayPrototype(DynamicObject* prototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  916. static void __cdecl InitializeBooleanConstructor(DynamicObject* booleanConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  917. static void __cdecl InitializeBooleanPrototype(DynamicObject* booleanPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  918. static void __cdecl InitializeSymbolConstructor(DynamicObject* symbolConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  919. static void __cdecl InitializeSymbolPrototype(DynamicObject* symbolPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  920. static void __cdecl InitializeDateConstructor(DynamicObject* dateConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  921. static void __cdecl InitializeDatePrototype(DynamicObject* datePrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  922. static void __cdecl InitializeProxyConstructor(DynamicObject* proxyConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  923. static void __cdecl InitializeProxyPrototype(DynamicObject* proxyPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  924. static void __cdecl InitializeFunctionConstructor(DynamicObject* functionConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  925. static void __cdecl InitializeFunctionPrototype(DynamicObject* functionPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  926. void InitializeComplexThings();
  927. void InitializeStaticValues();
  928. static void __cdecl InitializeMathObject(DynamicObject* mathObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  929. // SIMD_JS
  930. static void __cdecl InitializeSIMDObject(DynamicObject* simdObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  931. static void __cdecl InitializeSIMDOpCodeMaps();
  932. static void __cdecl InitializeNumberConstructor(DynamicObject* numberConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  933. static void __cdecl InitializeNumberPrototype(DynamicObject* numberPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  934. static void __cdecl InitializeObjectConstructor(DynamicObject* objectConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  935. static void __cdecl InitializeObjectPrototype(DynamicObject* objectPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  936. static void __cdecl InitializeRegexConstructor(DynamicObject* regexConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  937. static void __cdecl InitializeRegexPrototype(DynamicObject* regexPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  938. static void __cdecl InitializeStringConstructor(DynamicObject* stringConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  939. static void __cdecl InitializeStringPrototype(DynamicObject* stringPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  940. static void __cdecl InitializeJSONObject(DynamicObject* JSONObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  941. static void __cdecl InitializeEngineInterfaceObject(DynamicObject* engineInterface, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  942. static void __cdecl InitializeReflectObject(DynamicObject* reflectObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  943. #ifdef ENABLE_INTL_OBJECT
  944. static void __cdecl InitializeIntlObject(DynamicObject* IntlEngineObject, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  945. #endif
  946. #ifdef ENABLE_PROJECTION
  947. void InitializeWinRTPromiseConstructor();
  948. #endif
  949. static void __cdecl InitializeMapConstructor(DynamicObject* mapConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  950. static void __cdecl InitializeMapPrototype(DynamicObject* mapPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  951. static void __cdecl InitializeSetConstructor(DynamicObject* setConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  952. static void __cdecl InitializeSetPrototype(DynamicObject* setPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  953. static void __cdecl InitializeWeakMapConstructor(DynamicObject* weakMapConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  954. static void __cdecl InitializeWeakMapPrototype(DynamicObject* weakMapPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  955. static void __cdecl InitializeWeakSetConstructor(DynamicObject* weakSetConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  956. static void __cdecl InitializeWeakSetPrototype(DynamicObject* weakSetPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  957. static void __cdecl InitializeIteratorPrototype(DynamicObject* iteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  958. static void __cdecl InitializeArrayIteratorPrototype(DynamicObject* arrayIteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  959. static void __cdecl InitializeMapIteratorPrototype(DynamicObject* mapIteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  960. static void __cdecl InitializeSetIteratorPrototype(DynamicObject* setIteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  961. static void __cdecl InitializeStringIteratorPrototype(DynamicObject* stringIteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  962. static void __cdecl InitializeJavascriptEnumeratorIteratorPrototype(DynamicObject* javascriptEnumeratorIteratorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  963. static void __cdecl InitializePromiseConstructor(DynamicObject* promiseConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  964. static void __cdecl InitializePromisePrototype(DynamicObject* promisePrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  965. static void __cdecl InitializeGeneratorFunctionConstructor(DynamicObject* generatorFunctionConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  966. static void __cdecl InitializeGeneratorFunctionPrototype(DynamicObject* generatorFunctionPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  967. static void __cdecl InitializeGeneratorPrototype(DynamicObject* generatorPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  968. static void __cdecl InitializeAsyncFunctionConstructor(DynamicObject* asyncFunctionConstructor, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  969. static void __cdecl InitializeAsyncFunctionPrototype(DynamicObject* asyncFunctionPrototype, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  970. RuntimeFunction* CreateBuiltinConstructor(FunctionInfo * functionInfo, DynamicTypeHandler * typeHandler, DynamicObject* prototype = nullptr);
  971. RuntimeFunction* DefaultCreateFunction(FunctionInfo * functionInfo, int length, DynamicObject * prototype, DynamicType * functionType, PropertyId nameId);
  972. RuntimeFunction* DefaultCreateFunction(FunctionInfo * functionInfo, int length, DynamicObject * prototype, DynamicType * functionType, Var nameId);
  973. JavascriptFunction* AddFunction(DynamicObject* object, PropertyId propertyId, RuntimeFunction* function);
  974. void AddMember(DynamicObject* object, PropertyId propertyId, Var value);
  975. void AddMember(DynamicObject* object, PropertyId propertyId, Var value, PropertyAttributes attributes);
  976. JavascriptString* CreateEmptyString();
  977. static void __cdecl InitializeGeneratorFunction(DynamicObject* function, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  978. template<bool addPrototype>
  979. static void __cdecl InitializeFunction(DynamicObject* function, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  980. static size_t const LibraryFunctionArgC[BuiltinFunction::Count + 1];
  981. static int const LibraryFunctionFlags[BuiltinFunction::Count + 1]; // returns enum BuiltInFlags.
  982. #if ENABLE_DEBUG_CONFIG_OPTIONS
  983. static wchar_t const * const LibraryFunctionName[BuiltinFunction::Count + 1];
  984. #endif
  985. public:
  986. virtual void Finalize(bool isShutdown) override
  987. {
  988. __super::Finalize(isShutdown);
  989. if (this->referencedPropertyRecords != nullptr)
  990. {
  991. RECYCLER_PERF_COUNTER_SUB(PropertyRecordBindReference, this->referencedPropertyRecords->Count());
  992. }
  993. }
  994. #if DBG
  995. void DumpLibraryByteCode();
  996. #endif
  997. private:
  998. typedef JsUtil::BaseHashSet<Js::PropertyRecord const *, Recycler, PowerOf2SizePolicy> ReferencedPropertyRecordHashSet;
  999. ReferencedPropertyRecordHashSet* referencedPropertyRecords;
  1000. ReferencedPropertyRecordHashSet * EnsureReferencedPropertyRecordList()
  1001. {
  1002. ReferencedPropertyRecordHashSet* pidList = this->referencedPropertyRecords;
  1003. if (pidList == nullptr)
  1004. {
  1005. pidList = RecyclerNew(this->recycler, ReferencedPropertyRecordHashSet, this->recycler, 173);
  1006. this->referencedPropertyRecords = pidList;
  1007. }
  1008. return pidList;
  1009. }
  1010. ReferencedPropertyRecordHashSet * GetReferencedPropertyRecordList() const
  1011. {
  1012. return this->referencedPropertyRecords;
  1013. }
  1014. HRESULT ProfilerRegisterObject();
  1015. HRESULT ProfilerRegisterArray();
  1016. HRESULT ProfilerRegisterBoolean();
  1017. HRESULT ProfilerRegisterDate();
  1018. HRESULT ProfilerRegisterFunction();
  1019. HRESULT ProfilerRegisterMath();
  1020. HRESULT ProfilerRegisterNumber();
  1021. HRESULT ProfilerRegisterString();
  1022. HRESULT ProfilerRegisterRegExp();
  1023. HRESULT ProfilerRegisterJSON();
  1024. HRESULT ProfilerRegisterMap();
  1025. HRESULT ProfilerRegisterSet();
  1026. HRESULT ProfilerRegisterWeakMap();
  1027. HRESULT ProfilerRegisterWeakSet();
  1028. HRESULT ProfilerRegisterSymbol();
  1029. HRESULT ProfilerRegisterIterator();
  1030. HRESULT ProfilerRegisterArrayIterator();
  1031. HRESULT ProfilerRegisterMapIterator();
  1032. HRESULT ProfilerRegisterSetIterator();
  1033. HRESULT ProfilerRegisterStringIterator();
  1034. HRESULT ProfilerRegisterEnumeratorIterator();
  1035. HRESULT ProfilerRegisterTypedArray();
  1036. HRESULT ProfilerRegisterPromise();
  1037. HRESULT ProfilerRegisterProxy();
  1038. HRESULT ProfilerRegisterReflect();
  1039. HRESULT ProfilerRegisterGenerator();
  1040. HRESULT ProfilerRegisterSIMD();
  1041. #ifdef IR_VIEWER
  1042. HRESULT ProfilerRegisterIRViewer();
  1043. #endif /* IR_VIEWER */
  1044. };
  1045. }