JavascriptLibraryBase.h 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  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. // JavascriptLibraryBase.h is used by static lib shared between Trident and Chakra. We need to keep
  6. // the size consistent and try not to change its size. We need to have matching mshtml.dll
  7. // if the size changed here.
  8. #pragma once
  9. class ChakraEngine;
  10. namespace Js
  11. {
  12. class EngineInterfaceObject;
  13. class JavascriptLibraryBase : public FinalizableObject
  14. {
  15. friend class JavascriptLibrary;
  16. friend class ScriptSite;
  17. public:
  18. JavascriptLibraryBase(GlobalObject* globalObject):
  19. globalObject(globalObject),
  20. chakraEngine(nullptr)
  21. {
  22. }
  23. Var GetPI() { return pi; }
  24. Var GetNaN() { return nan; }
  25. Var GetNegativeInfinite() { return negativeInfinite; }
  26. Var GetPositiveInfinite() { return positiveInfinite; }
  27. Var GetMaxValue() { return maxValue; }
  28. Var GetMinValue() { return minValue; }
  29. Var GetNegativeZero() { return negativeZero; }
  30. RecyclableObject* GetUndefined() { return undefinedValue; }
  31. RecyclableObject* GetNull() { return nullValue; }
  32. JavascriptBoolean* GetTrue() { return booleanTrue; }
  33. JavascriptBoolean* GetFalse() { return booleanFalse; }
  34. JavascriptSymbol* GetSymbolHasInstance() { return symbolHasInstance; }
  35. JavascriptSymbol* GetSymbolIsConcatSpreadable() { return symbolIsConcatSpreadable; }
  36. JavascriptSymbol* GetSymbolAsyncIterator() { return symbolAsyncIterator; }
  37. JavascriptSymbol* GetSymbolIterator() { return symbolIterator; }
  38. JavascriptSymbol* GetSymbolToPrimitive() { return symbolToPrimitive; }
  39. JavascriptSymbol* GetSymbolToStringTag() { return symbolToStringTag; }
  40. JavascriptSymbol* GetSymbolUnscopables() { return symbolUnscopables; }
  41. JavascriptFunction* GetObjectConstructor() { return objectConstructor; }
  42. JavascriptFunction* GetArrayConstructor() { return arrayConstructor; }
  43. JavascriptFunction* GetBooleanConstructor() { return booleanConstructor; }
  44. JavascriptFunction* GetDateConstructor() { return dateConstructor; }
  45. JavascriptFunction* GetFunctionConstructor() { return functionConstructor; }
  46. JavascriptFunction* GetNumberConstructor() { return numberConstructor; }
  47. JavascriptFunction* GetBigIntConstructor() { return bigIntConstructor; }
  48. JavascriptRegExpConstructor* GetRegExpConstructor() { return regexConstructor; }
  49. JavascriptFunction* GetStringConstructor() { return stringConstructor; }
  50. JavascriptFunction* GetArrayBufferConstructor() { return arrayBufferConstructor; }
  51. JavascriptFunction* GetPixelArrayConstructor() { return pixelArrayConstructor; }
  52. JavascriptFunction* GetTypedArrayConstructor() const { return typedArrayConstructor; }
  53. JavascriptFunction* GetInt8ArrayConstructor() { return Int8ArrayConstructor; }
  54. JavascriptFunction* GetUint8ArrayConstructor() { return Uint8ArrayConstructor; }
  55. JavascriptFunction* GetUint8ClampedArrayConstructor() { return Uint8ClampedArrayConstructor; }
  56. JavascriptFunction* GetInt16ArrayConstructor() { return Int16ArrayConstructor; }
  57. JavascriptFunction* GetUint16ArrayConstructor() { return Uint16ArrayConstructor; }
  58. JavascriptFunction* GetInt32ArrayConstructor() { return Int32ArrayConstructor; }
  59. JavascriptFunction* GetUint32ArrayConstructor() { return Uint32ArrayConstructor; }
  60. JavascriptFunction* GetFloat32ArrayConstructor() { return Float32ArrayConstructor; }
  61. JavascriptFunction* GetFloat64ArrayConstructor() { return Float64ArrayConstructor; }
  62. JavascriptFunction* GetMapConstructor() { return mapConstructor; }
  63. JavascriptFunction* GetSetConstructor() { return setConstructor; }
  64. JavascriptFunction* GetWeakMapConstructor() { return weakMapConstructor; }
  65. JavascriptFunction* GetWeakSetConstructor() { return weakSetConstructor; }
  66. JavascriptFunction* GetSymbolConstructor() { return symbolConstructor; }
  67. JavascriptFunction* GetProxyConstructor() const { return proxyConstructor; }
  68. JavascriptFunction* GetPromiseConstructor() const { return promiseConstructor; }
  69. JavascriptFunction* GetGeneratorFunctionConstructor() const { return generatorFunctionConstructor; }
  70. JavascriptFunction* GetAsyncFunctionConstructor() const { return asyncFunctionConstructor; }
  71. JavascriptFunction* GetAsyncGeneratorFunctionConstructor() const { return asyncGeneratorFunctionConstructor; }
  72. JavascriptFunction* GetErrorConstructor() const { return errorConstructor; }
  73. JavascriptFunction* GetEvalErrorConstructor() const { return evalErrorConstructor; }
  74. JavascriptFunction* GetRangeErrorConstructor() const { return rangeErrorConstructor; }
  75. JavascriptFunction* GetReferenceErrorConstructor() const { return referenceErrorConstructor; }
  76. JavascriptFunction* GetSyntaxErrorConstructor() const { return syntaxErrorConstructor; }
  77. JavascriptFunction* GetTypeErrorConstructor() const { return typeErrorConstructor; }
  78. JavascriptFunction* GetURIErrorConstructor() const { return uriErrorConstructor; }
  79. JavascriptFunction* GetPromiseResolve() const { return promiseResolveFunction; }
  80. JavascriptFunction* GetPromiseThen() const { return promiseThenFunction; }
  81. JavascriptFunction* GetJSONStringify() const { return jsonStringifyFunction; }
  82. JavascriptFunction* GetObjectFreeze() const { return objectFreezeFunction; }
  83. JavascriptFunction* GetDebugEval() const { return debugEval; }
  84. JavascriptFunction* GetStackTraceFunction() const { return getStackTrace; }
  85. #ifdef EDIT_AND_CONTINUE
  86. JavascriptFunction* GetEditSource() const { return editSource; }
  87. #endif
  88. JavascriptFunction* GetArrayPrototypeForEachFunction() const { return arrayPrototypeForEachFunction; }
  89. JavascriptFunction* GetArrayPrototypeKeysFunction() const { return arrayPrototypeKeysFunction; }
  90. JavascriptFunction* GetArrayPrototypeValuesFunction() const { return arrayPrototypeValuesFunction; }
  91. JavascriptFunction* GetArrayPrototypeEntriesFunction() const { return arrayPrototypeEntriesFunction; }
  92. DynamicObject* GetMathObject() { return mathObject; }
  93. DynamicObject* GetJSONObject() { return JSONObject; }
  94. #ifdef ENABLE_INTL_OBJECT
  95. DynamicObject* GetIntlObject() { return IntlObject; }
  96. #endif
  97. #if defined(ENABLE_INTL_OBJECT) || defined(ENABLE_JS_BUILTINS)
  98. EngineInterfaceObject* GetEngineInterfaceObject() { return engineInterfaceObject; }
  99. #endif
  100. DynamicObject* GetArrayPrototype() { return arrayPrototype; }
  101. DynamicObject* GetBooleanPrototype() { return booleanPrototype; }
  102. DynamicObject* GetDatePrototype() { return datePrototype; }
  103. DynamicObject* GetFunctionPrototype() { return functionPrototype; }
  104. DynamicObject* GetNumberPrototype() { return numberPrototype; }
  105. DynamicObject* GetBigIntPrototype() { return bigintPrototype; }
  106. DynamicObject* GetSIMDBool8x16Prototype() { return simdBool8x16Prototype; }
  107. DynamicObject* GetSIMDBool16x8Prototype() { return simdBool16x8Prototype; }
  108. DynamicObject* GetSIMDBool32x4Prototype() { return simdBool32x4Prototype; }
  109. DynamicObject* GetSIMDInt8x16Prototype() { return simdInt8x16Prototype; }
  110. DynamicObject* GetSIMDInt16x8Prototype() { return simdInt16x8Prototype; }
  111. DynamicObject* GetSIMDInt32x4Prototype() { return simdInt32x4Prototype; }
  112. DynamicObject* GetSIMDUint8x16Prototype() { return simdUint8x16Prototype; }
  113. DynamicObject* GetSIMDUint16x8Prototype() { return simdUint16x8Prototype; }
  114. DynamicObject* GetSIMDUint32x4Prototype() { return simdUint32x4Prototype; }
  115. DynamicObject* GetSIMDFloat32x4Prototype() { return simdFloat32x4Prototype; }
  116. DynamicObject* GetSIMDFloat64x2Prototype() { return simdFloat64x2Prototype; }
  117. ObjectPrototypeObject* GetObjectPrototypeObject() { return objectPrototype; }
  118. DynamicObject* GetObjectPrototype();
  119. DynamicObject* GetRegExpPrototype() { return regexPrototype; }
  120. DynamicObject* GetStringPrototype() { return stringPrototype; }
  121. DynamicObject* GetMapPrototype() { return mapPrototype; }
  122. DynamicObject* GetSetPrototype() { return setPrototype; }
  123. DynamicObject* GetWeakMapPrototype() { return weakMapPrototype; }
  124. DynamicObject* GetWeakSetPrototype() { return weakSetPrototype; }
  125. DynamicObject* GetSymbolPrototype() { return symbolPrototype; }
  126. DynamicObject* GetAsyncIteratorPrototype() const { return asyncIteratorPrototype; }
  127. DynamicObject* GetArrayIteratorPrototype() const { return arrayIteratorPrototype; }
  128. DynamicObject* GetMapIteratorPrototype() const { return mapIteratorPrototype; }
  129. DynamicObject* GetSetIteratorPrototype() const { return setIteratorPrototype; }
  130. DynamicObject* GetStringIteratorPrototype() const { return stringIteratorPrototype; }
  131. DynamicObject* GetIteratorPrototype() const { return iteratorPrototype; }
  132. DynamicObject* GetPromisePrototype() const { return promisePrototype; }
  133. DynamicObject* GetGeneratorFunctionPrototype() const { return generatorFunctionPrototype; }
  134. DynamicObject* GetGeneratorPrototype() const { return generatorPrototype; }
  135. DynamicObject* GetAsyncFunctionPrototype() const { return asyncFunctionPrototype; }
  136. DynamicObject* GetAsyncGeneratorFunctionPrototype() const { return asyncGeneratorFunctionPrototype; }
  137. DynamicObject* GetErrorPrototype() const { return errorPrototype; }
  138. DynamicObject* GetEvalErrorPrototype() const { return evalErrorPrototype; }
  139. DynamicObject* GetRangeErrorPrototype() const { return rangeErrorPrototype; }
  140. DynamicObject* GetReferenceErrorPrototype() const { return referenceErrorPrototype; }
  141. DynamicObject* GetSyntaxErrorPrototype() const { return syntaxErrorPrototype; }
  142. DynamicObject* GetTypeErrorPrototype() const { return typeErrorPrototype; }
  143. DynamicObject* GetURIErrorPrototype() const { return uriErrorPrototype; }
  144. PropertyId GetPropertyIdSymbolIterator() { return PropertyIds::_symbolIterator; };
  145. PropertyId GetPropertyIdSymbolToStringTag() { return PropertyIds::_symbolToStringTag; };
  146. PropertyId GetPropertyIdSymbolUnscopables() { return PropertyIds::_symbolUnscopables; };
  147. bool IsChakraEngine() const { return chakraEngine != nullptr; }
  148. protected:
  149. Field(GlobalObject*) globalObject;
  150. Field(RuntimeFunction*) mapConstructor;
  151. Field(RuntimeFunction*) setConstructor;
  152. Field(RuntimeFunction*) weakMapConstructor;
  153. Field(RuntimeFunction*) weakSetConstructor;
  154. Field(RuntimeFunction*) arrayConstructor;
  155. Field(RuntimeFunction*) typedArrayConstructor;
  156. Field(RuntimeFunction*) Int8ArrayConstructor;
  157. Field(RuntimeFunction*) Uint8ArrayConstructor;
  158. Field(RuntimeFunction*) Uint8ClampedArrayConstructor;
  159. Field(RuntimeFunction*) Int16ArrayConstructor;
  160. Field(RuntimeFunction*) Uint16ArrayConstructor;
  161. Field(RuntimeFunction*) Int32ArrayConstructor;
  162. Field(RuntimeFunction*) Uint32ArrayConstructor;
  163. Field(RuntimeFunction*) Float32ArrayConstructor;
  164. Field(RuntimeFunction*) Float64ArrayConstructor;
  165. Field(RuntimeFunction*) arrayBufferConstructor;
  166. Field(RuntimeFunction*) dataViewConstructor;
  167. Field(RuntimeFunction*) booleanConstructor;
  168. Field(RuntimeFunction*) dateConstructor;
  169. Field(RuntimeFunction*) functionConstructor;
  170. Field(RuntimeFunction*) numberConstructor;
  171. Field(RuntimeFunction*) bigIntConstructor;
  172. Field(RuntimeFunction*) objectConstructor;
  173. Field(RuntimeFunction*) symbolConstructor;
  174. Field(JavascriptRegExpConstructor*) regexConstructor;
  175. Field(RuntimeFunction*) stringConstructor;
  176. Field(RuntimeFunction*) pixelArrayConstructor;
  177. Field(RuntimeFunction*) errorConstructor;
  178. Field(RuntimeFunction*) evalErrorConstructor;
  179. Field(RuntimeFunction*) rangeErrorConstructor;
  180. Field(RuntimeFunction*) referenceErrorConstructor;
  181. Field(RuntimeFunction*) syntaxErrorConstructor;
  182. Field(RuntimeFunction*) typeErrorConstructor;
  183. Field(RuntimeFunction*) uriErrorConstructor;
  184. Field(RuntimeFunction*) proxyConstructor;
  185. Field(RuntimeFunction*) promiseConstructor;
  186. Field(RuntimeFunction*) generatorFunctionConstructor;
  187. Field(RuntimeFunction*) asyncFunctionConstructor;
  188. Field(RuntimeFunction*) asyncGeneratorFunctionConstructor;
  189. Field(JavascriptFunction*) defaultAccessorFunction;
  190. Field(JavascriptFunction*) stackTraceAccessorFunction;
  191. Field(JavascriptFunction*) throwTypeErrorRestrictedPropertyAccessorFunction;
  192. Field(JavascriptFunction*) debugObjectNonUserGetterFunction;
  193. Field(JavascriptFunction*) debugObjectNonUserSetterFunction;
  194. Field(JavascriptFunction*) debugObjectDebugModeGetterFunction;
  195. Field(JavascriptFunction*) __proto__getterFunction;
  196. Field(JavascriptFunction*) __proto__setterFunction;
  197. Field(JavascriptFunction*) arrayIteratorPrototypeBuiltinNextFunction;
  198. Field(JavascriptFunction*) promiseResolveFunction;
  199. Field(JavascriptFunction*) promiseThenFunction;
  200. Field(JavascriptFunction*) jsonStringifyFunction;
  201. Field(JavascriptFunction*) objectFreezeFunction;
  202. Field(DynamicObject*) mathObject;
  203. // SIMD_JS
  204. Field(DynamicObject*) simdObject;
  205. Field(DynamicObject*) debugObject;
  206. Field(DynamicObject*) JSONObject;
  207. #ifdef ENABLE_INTL_OBJECT
  208. Field(DynamicObject*) IntlObject;
  209. #endif
  210. #if defined(ENABLE_INTL_OBJECT) || defined(ENABLE_JS_BUILTINS)
  211. Field(EngineInterfaceObject*) engineInterfaceObject;
  212. #endif
  213. Field(DynamicObject*) reflectObject;
  214. Field(DynamicObject*) arrayPrototype;
  215. Field(DynamicObject*) typedArrayPrototype;
  216. Field(DynamicObject*) Int8ArrayPrototype;
  217. Field(DynamicObject*) Uint8ArrayPrototype;
  218. Field(DynamicObject*) Uint8ClampedArrayPrototype;
  219. Field(DynamicObject*) Int16ArrayPrototype;
  220. Field(DynamicObject*) Uint16ArrayPrototype;
  221. Field(DynamicObject*) Int32ArrayPrototype;
  222. Field(DynamicObject*) Uint32ArrayPrototype;
  223. Field(DynamicObject*) Float32ArrayPrototype;
  224. Field(DynamicObject*) Float64ArrayPrototype;
  225. Field(DynamicObject*) Int64ArrayPrototype;
  226. Field(DynamicObject*) Uint64ArrayPrototype;
  227. Field(DynamicObject*) BoolArrayPrototype;
  228. Field(DynamicObject*) CharArrayPrototype;
  229. Field(DynamicObject*) arrayBufferPrototype;
  230. Field(DynamicObject*) dataViewPrototype;
  231. Field(DynamicObject*) pixelArrayPrototype;
  232. Field(DynamicObject*) booleanPrototype;
  233. Field(DynamicObject*) datePrototype;
  234. Field(DynamicObject*) functionPrototype;
  235. Field(DynamicObject*) numberPrototype;
  236. Field(DynamicObject*) bigintPrototype;
  237. Field(ObjectPrototypeObject*) objectPrototype;
  238. Field(DynamicObject*) regexPrototype;
  239. Field(DynamicObject*) stringPrototype;
  240. Field(DynamicObject*) mapPrototype;
  241. Field(DynamicObject*) setPrototype;
  242. Field(DynamicObject*) weakMapPrototype;
  243. Field(DynamicObject*) weakSetPrototype;
  244. Field(DynamicObject*) symbolPrototype;
  245. Field(DynamicObject*) asyncIteratorPrototype; // aka %AsyncIteratorPrototype%
  246. Field(DynamicObject*) iteratorPrototype; // aka %IteratorPrototype%
  247. Field(DynamicObject*) arrayIteratorPrototype;
  248. Field(DynamicObject*) mapIteratorPrototype;
  249. Field(DynamicObject*) setIteratorPrototype;
  250. Field(DynamicObject*) stringIteratorPrototype;
  251. Field(DynamicObject*) promisePrototype;
  252. Field(DynamicObject*) generatorFunctionPrototype; // aka %Generator%
  253. Field(DynamicObject*) generatorPrototype; // aka %GeneratorPrototype%
  254. Field(DynamicObject*) asyncFunctionPrototype; // aka %AsyncFunctionPrototype%
  255. Field(DynamicObject*) asyncGeneratorPrototype; // aka %AsyncGeneratorPrototype%
  256. Field(DynamicObject*) asyncGeneratorFunctionPrototype; // aka %AsyncGeneratorFunctionPrototype%
  257. Field(DynamicObject*) asyncFromSyncIteratorProtototype;
  258. Field(DynamicObject*) errorPrototype;
  259. Field(DynamicObject*) evalErrorPrototype;
  260. Field(DynamicObject*) rangeErrorPrototype;
  261. Field(DynamicObject*) referenceErrorPrototype;
  262. Field(DynamicObject*) syntaxErrorPrototype;
  263. Field(DynamicObject*) typeErrorPrototype;
  264. Field(DynamicObject*) uriErrorPrototype;
  265. //SIMD Prototypes
  266. Field(DynamicObject*) simdBool8x16Prototype;
  267. Field(DynamicObject*) simdBool16x8Prototype;
  268. Field(DynamicObject*) simdBool32x4Prototype;
  269. Field(DynamicObject*) simdInt8x16Prototype;
  270. Field(DynamicObject*) simdInt16x8Prototype;
  271. Field(DynamicObject*) simdInt32x4Prototype;
  272. Field(DynamicObject*) simdUint8x16Prototype;
  273. Field(DynamicObject*) simdUint16x8Prototype;
  274. Field(DynamicObject*) simdUint32x4Prototype;
  275. Field(DynamicObject*) simdFloat32x4Prototype;
  276. Field(DynamicObject*) simdFloat64x2Prototype;
  277. Field(JavascriptBoolean*) booleanTrue;
  278. Field(JavascriptBoolean*) booleanFalse;
  279. Field(Var) nan;
  280. Field(Var) negativeInfinite;
  281. Field(Var) positiveInfinite;
  282. Field(Var) pi;
  283. Field(Var) minValue;
  284. Field(Var) maxValue;
  285. Field(Var) negativeZero;
  286. Field(RecyclableObject*) undefinedValue;
  287. Field(RecyclableObject*) nullValue;
  288. Field(JavascriptSymbol*) symbolAsyncIterator;
  289. Field(JavascriptSymbol*) symbolHasInstance;
  290. Field(JavascriptSymbol*) symbolIsConcatSpreadable;
  291. Field(JavascriptSymbol*) symbolIterator;
  292. Field(JavascriptSymbol*) symbolSpecies;
  293. Field(JavascriptSymbol*) symbolToPrimitive;
  294. Field(JavascriptSymbol*) symbolToStringTag;
  295. Field(JavascriptSymbol*) symbolUnscopables;
  296. public:
  297. typedef void (CALLBACK *HostPromiseRejectionTrackerCallback)(Var promise, Var reason, bool handled, void *callbackState);
  298. void SetNativeHostPromiseRejectionTrackerCallback(HostPromiseRejectionTrackerCallback function, void *state)
  299. {
  300. this->nativeHostPromiseRejectionTracker = function;
  301. this->nativeHostPromiseRejectionTrackerState = state;
  302. }
  303. private:
  304. FieldNoBarrier(HostPromiseRejectionTrackerCallback) nativeHostPromiseRejectionTracker = nullptr;
  305. Field(void *) nativeHostPromiseRejectionTrackerState = nullptr;
  306. public:
  307. Field(ScriptContext*) scriptContext;
  308. Field(ChakraEngine*) chakraEngine;
  309. private:
  310. virtual void Dispose(bool isShutdown) override;
  311. virtual void Finalize(bool isShutdown) override;
  312. virtual void Mark(Recycler *recycler) override { AssertMsg(false, "Mark called on object that isn't TrackableObject"); }
  313. protected:
  314. Field(JavascriptFunction*) arrayPrototypeForEachFunction;
  315. Field(JavascriptFunction*) arrayPrototypeKeysFunction;
  316. Field(JavascriptFunction*) arrayPrototypeValuesFunction;
  317. Field(JavascriptFunction*) arrayPrototypeEntriesFunction;
  318. Field(JavascriptFunction*) debugEval;
  319. Field(JavascriptFunction*) getStackTrace;
  320. #ifdef EDIT_AND_CONTINUE
  321. Field(JavascriptFunction*) editSource;
  322. #endif
  323. Field(JavascriptFunction*) mathMin;
  324. Field(JavascriptFunction*) mathMax;
  325. #ifdef ENABLE_JS_BUILTINS
  326. public:
  327. JavascriptFunction* GetMathMinFunction() const { return mathMin; }
  328. JavascriptFunction* GetMathMaxFunction() const { return mathMax; }
  329. #endif
  330. };
  331. }