Runtime.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513
  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. #include "Common.h"
  7. //========================
  8. // Parser includes
  9. //========================
  10. #include "ParserCommon.h"
  11. #include "ParseFlags.h"
  12. #include "rterror.h"
  13. // Parser forward decl
  14. class FuncInfo;
  15. class Scope;
  16. class Symbol;
  17. struct Ident;
  18. typedef Ident *IdentPtr;
  19. enum SymbolType : byte;
  20. // Regex forward decl
  21. namespace UnifiedRegex
  22. {
  23. struct RegexPattern;
  24. template <typename T> class StandardChars; // Used by ThreadContext.h
  25. struct TrigramAlphabet;
  26. struct RegexStacks;
  27. #if ENABLE_REGEX_CONFIG_OPTIONS
  28. class DebugWriter;
  29. struct RegexStats;
  30. class RegexStatsDatabase;
  31. #endif
  32. };
  33. //========================
  34. #include "RuntimeCommon.h"
  35. #include <intsafe.h>
  36. #if !defined(UNREFERENCED_PARAMETER)
  37. #define UNREFERENCED_PARAMETER(x) (x)
  38. #endif
  39. class SRCINFO;
  40. class Lowerer;
  41. class LowererMD;
  42. class LowererMDArch;
  43. class ByteCodeGenerator;
  44. interface IActiveScriptDataCache;
  45. class ActiveScriptProfilerHeapEnum;
  46. namespace Js
  47. {
  48. //
  49. // Forward declarations
  50. //
  51. class CharClassifier;
  52. typedef int32 MessageId;
  53. /* enum */ struct PropertyIds;
  54. class DebugDocument;
  55. struct Utf8SourceInfo;
  56. struct CallInfo;
  57. struct InlineeCallInfo;
  58. struct InlineCache;
  59. struct PolymorphicInlineCache;
  60. struct Arguments;
  61. class StringDictionaryWrapper;
  62. struct ByteCodeDumper;
  63. struct ByteCodeReader;
  64. struct ByteCodeWriter;
  65. class JavascriptConversion;
  66. class JavascriptDate;
  67. class JavascriptVariantDate;
  68. class DateImplementation;
  69. class BufferString;
  70. class BufferStringBuilder;
  71. class ConcatString;
  72. class CompoundString;
  73. class JavascriptBoolean;
  74. class JavascriptBooleanObject;
  75. class JavascriptSymbol;
  76. class JavascriptSymbolObject;
  77. class JavascriptProxy;
  78. class JavascriptReflect;
  79. class JavascriptEnumeratorIterator;
  80. class JavascriptArrayIterator;
  81. enum class JavascriptArrayIteratorKind;
  82. class JavascriptMapIterator;
  83. enum class JavascriptMapIteratorKind;
  84. class JavascriptSetIterator;
  85. enum class JavascriptSetIteratorKind;
  86. class JavascriptStringIterator;
  87. class JavascriptPromise;
  88. class JavascriptPromiseCapability;
  89. class JavascriptPromiseReaction;
  90. class JavascriptPromiseAsyncSpawnExecutorFunction;
  91. class JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction;
  92. class JavascriptPromiseCapabilitiesExecutorFunction;
  93. class JavascriptPromiseResolveOrRejectFunction;
  94. class JavascriptPromiseReactionTaskFunction;
  95. class JavascriptPromiseResolveThenableTaskFunction;
  96. class JavascriptPromiseAllResolveElementFunction;
  97. struct JavascriptPromiseAllResolveElementFunctionRemainingElementsWrapper;
  98. struct JavascriptPromiseResolveOrRejectFunctionAlreadyResolvedWrapper;
  99. class JavascriptGenerator;
  100. class LiteralString;
  101. class ArenaLiteralString;
  102. class JavascriptStringObject;
  103. struct PropertyDescriptor;
  104. class Type;
  105. class DynamicType;
  106. class ScriptFunctionType;
  107. class DynamicTypeHandler;
  108. class DeferredTypeHandlerBase;
  109. template <bool IsPrototype> class NullTypeHandler;
  110. template<size_t size> class SimpleTypeHandler;
  111. class PathTypeHandler;
  112. class IndexPropertyDescriptor;
  113. class DynamicObject;
  114. class ArrayObject;
  115. class WithScopeObject;
  116. class SpreadArgument;
  117. class JavascriptString;
  118. class StringCopyInfo;
  119. class StringCopyInfoStack;
  120. class ObjectPrototypeObject;
  121. class PropertyString;
  122. class ArgumentsObject;
  123. class HeapArgumentsObject;
  124. class ActivationObject;
  125. class JavascriptNumber;
  126. class JavascriptNumberObject;
  127. class ES5ArgumentsObjectEnumerator;
  128. class ScriptContextProfiler;
  129. struct RestrictedErrorStrings;
  130. class JavascriptError;
  131. class NullEnumerator;
  132. //SIMD_JS
  133. // SIMD
  134. class SIMDFloat32x4Lib;
  135. class JavascriptSIMDFloat32x4;
  136. class SIMDFloat64x2Lib;
  137. class JavascriptSIMDFloat64x2;
  138. class SIMDInt32x4Lib;
  139. class JavascriptSIMDInt32x4;
  140. class SIMDInt8x16Lib;
  141. class JavascriptSIMDInt8x16;
  142. class RecyclableObject;
  143. class JavascriptRegExp;
  144. class JavascriptRegularExpressionResult;
  145. template<typename T> class SparseArraySegment;
  146. enum class DynamicObjectFlags : uint16;
  147. class JavascriptArray;
  148. class JavascriptNativeIntArray;
  149. #if ENABLE_COPYONACCESS_ARRAY
  150. class JavascriptCopyOnAccessNativeIntArray;
  151. #endif
  152. class JavascriptNativeFloatArray;
  153. class ES5Array;
  154. class JavascriptFunction;
  155. class ScriptFunction;
  156. class ScriptFunctionWithInlineCache;
  157. class StackScriptFunction;
  158. class GeneratorVirtualScriptFunction;
  159. class JavascriptGeneratorFunction;
  160. class AsmJsScriptFunction;
  161. class JavascriptRegExpConstructor;
  162. class JavascriptRegExpEnumerator;
  163. class BoundFunction;
  164. class JavascriptMap;
  165. class JavascriptSet;
  166. class JavascriptWeakMap;
  167. class JavascriptWeakSet;
  168. class DynamicObject;
  169. class HostObjectBase;
  170. class RootObjectBase;
  171. class ModuleRoot;
  172. class GlobalObject;
  173. class Math;
  174. class JavascriptOperators;
  175. class JavascriptLibrary;
  176. class JavascriptEncodeURI;
  177. class JavascriptEncodeURIComponent;
  178. class JavascriptDecodeURI;
  179. class JavascriptDecodeURIComponent;
  180. class DataView;
  181. struct ConstructorCache;
  182. enum class OpCode : ushort;
  183. enum class OpCodeAsmJs : ushort;
  184. /* enum */ struct OpLayoutType;
  185. /* enum */ struct OpLayoutTypeAsmJs;
  186. class ExceptionBase;
  187. class OutOfMemoryException;
  188. class ScriptDebug;
  189. class ScriptContext;
  190. struct NativeModule;
  191. template <class T> class RcRef;
  192. class TaggedInt;
  193. class TaggedNumber;
  194. struct InterpreterStackFrame;
  195. struct ScriptEntryExitRecord;
  196. class JavascriptStackWalker;
  197. struct AsmJsCallStackLayout;
  198. class JavascriptCallStackLayout;
  199. class Throw;
  200. struct Tick;
  201. struct TickDelta;
  202. class ByteBlock;
  203. class FunctionInfo;
  204. class FunctionBody;
  205. class ParseableFunctionInfo;
  206. struct StatementLocation;
  207. class EntryPointInfo;
  208. struct LoopHeader;
  209. class InternalString;
  210. /* enum */ struct JavascriptHint;
  211. /* enum */ struct BuiltinFunction;
  212. class EnterScriptObject;
  213. class PropertyRecord;
  214. struct IsInstInlineCache;
  215. class EntryPointInfo;
  216. class PolymorphicInlineCacheInfo;
  217. class PropertyGuard;
  218. // asm.js
  219. namespace ArrayBufferView
  220. {
  221. enum ViewType;
  222. }
  223. struct EmitExpressionInfo;
  224. struct AsmJsModuleMemory;
  225. namespace AsmJsLookupSource
  226. {
  227. enum Source;
  228. }
  229. struct AsmJsByteCodeWriter;
  230. class AsmJsArrayView;
  231. class AsmJsType;
  232. class AsmJsRetType;
  233. class AsmJsVarType;
  234. class AsmJsSymbol;
  235. class AsmJsVarBase;
  236. class AsmJsVar;
  237. class AsmJsConstantImport;
  238. class AsmJsArgument;
  239. class AsmJsFunc;
  240. class AsmJsFunctionDeclaration;
  241. class AsmJsFunctionInfo;
  242. class AsmJsModuleInfo;
  243. class AsmJsGlobals;
  244. class AsmJsImportFunction;
  245. class AsmJsTypedArrayFunction;
  246. class AsmJsMathFunction;
  247. class AsmJsMathConst;
  248. #ifdef ASMJS_PLAT
  249. Var AsmJsExternalEntryPoint(Js::RecyclableObject* entryObject, Js::CallInfo callInfo, ...);
  250. class AsmJsCodeGenerator;
  251. class AsmJsEncoder;
  252. #endif
  253. struct MathBuiltin;
  254. struct ExclusiveContext;
  255. class AsmJsModuleCompiler;
  256. class AsmJSCompiler;
  257. class AsmJSByteCodeGenerator;
  258. enum AsmJSMathBuiltinFunction;
  259. //////////////////////////////////////////////////////////////////////////
  260. typedef JsUtil::WeakReferenceDictionary<PropertyId, PropertyString, PowerOf2SizePolicy> PropertyStringCacheMap;
  261. extern const FrameDisplay NullFrameDisplay;
  262. extern const FrameDisplay StrictNullFrameDisplay;
  263. enum ImplicitCallFlags : BYTE
  264. {
  265. ImplicitCall_HasNoInfo = 0x00,
  266. ImplicitCall_None = 0x01,
  267. ImplicitCall_ToPrimitive = 0x02 | ImplicitCall_None,
  268. ImplicitCall_Accessor = 0x04 | ImplicitCall_None,
  269. ImplicitCall_NonProfiledAccessor = 0x08 | ImplicitCall_None,
  270. ImplicitCall_External = 0x10 | ImplicitCall_None,
  271. ImplicitCall_Exception = 0x20 | ImplicitCall_None,
  272. ImplicitCall_NoOpSet = 0x40 | ImplicitCall_None,
  273. ImplicitCall_All = 0x7F,
  274. // Implicit call that is not caused by operations for the instruction (e.g. QC and GC dispose)
  275. // where we left script and enter script again. (Also see BEGIN_LEAVE_SCRIPT_INTERNAL)
  276. // This doesn't count as an implicit call on the recorded profile, but if it happens on JIT'ed code
  277. // it will still cause a bailout. Should happen very rarely.
  278. ImplicitCall_AsyncHostOperation = 0x80
  279. };
  280. }
  281. #include "DataStructures\EvalMapString.h"
  282. bool IsMathLibraryId(Js::PropertyId propertyId);
  283. #include "ByteCode\PropertyIdArray.h"
  284. #include "ByteCode\AuxArray.h"
  285. #include "ByteCode\VarArrayVarCount.h"
  286. // module id
  287. const Js::ModuleID kmodGlobal = 0;
  288. class SourceContextInfo;
  289. #include "activdbg100.h"
  290. #ifndef NTDDI_WIN10
  291. // These are only defined for the Win10 SDK and above
  292. // Consider: Refactor to avoid needing these?
  293. typedef
  294. enum tagDEBUG_EVENT_INFO_TYPE
  295. {
  296. DEIT_GENERAL = 0,
  297. DEIT_ASMJS_IN_DEBUGGING = (DEIT_GENERAL + 1),
  298. DEIT_ASMJS_SUCCEEDED = (DEIT_ASMJS_IN_DEBUGGING + 1),
  299. DEIT_ASMJS_FAILED = (DEIT_ASMJS_SUCCEEDED + 1)
  300. } DEBUG_EVENT_INFO_TYPE;
  301. #define SDO_ENABLE_LIBRARY_STACK_FRAME ((SCRIPT_DEBUGGER_OPTIONS)0x8)
  302. #endif
  303. #include "Base\SourceHolder.h"
  304. #include "Base\Utf8SourceInfo.h"
  305. #include "Base\PropertyRecord.h"
  306. #include "Base\DelayLoadLibrary.h"
  307. #include "Base\CallInfo.h"
  308. #include "Language\ExecutionMode.h"
  309. #include "BackEndAPI.h"
  310. #include "DetachedStateBase.h"
  311. #include "Base\Constants.h"
  312. #include "ByteCode\OpLayoutsCommon.h"
  313. #include "ByteCode\OpLayouts.h"
  314. #include "ByteCode\OpLayoutsAsmJs.h"
  315. #include "ByteCode\OpCodeUtil.h"
  316. #include "Language\Arguments.h"
  317. #include "Types\TypeId.h"
  318. #include "Types\RecyclableObject.h"
  319. #include "Base\ExpirableObject.h"
  320. #include "Types\Type.h"
  321. #include "Types\StaticType.h"
  322. #include "Base\CrossSite.h"
  323. #include "Base\CrossSiteObject.h"
  324. #include "Base\CrossSiteEnumerator.h"
  325. #include "Types\JavascriptEnumerator.h"
  326. #include "Types\DynamicObject.h"
  327. #include "Types\ArrayObject.h"
  328. #include "Types\TypePath.h"
  329. #include "Types\TypeHandler.h"
  330. #include "Types\SimplePropertyDescriptor.h"
  331. #include "Types\DynamicType.h"
  332. #include "Language\StackTraceArguments.h"
  333. #include "Types\PropertyDescriptor.h"
  334. #include "Types\ActivationObject.h"
  335. #include "Base\TempArenaAllocatorObject.h"
  336. #include "Language\ValueType.h"
  337. #include "Language\DynamicProfileInfo.h"
  338. #include "Debug\SourceContextInfo.h"
  339. #include "Language\InlineCache.h"
  340. #include "Language\InlineCachePointerArray.h"
  341. #include "Base\FunctionInfo.h"
  342. #include "Base\FunctionBody.h"
  343. #include "Language\JavascriptExceptionContext.h"
  344. #include "Language\JavascriptExceptionObject.h"
  345. #include "Base\PerfHint.h"
  346. #include "ByteCode\ByteBlock.h"
  347. #include "Library\JavascriptBuiltInFunctions.h"
  348. #include "Library\JavascriptString.h"
  349. #include "Library\StringCopyInfo.h"
  350. #include "Library\JavascriptNumber.h"
  351. #include "Library\JavascriptFunction.h"
  352. #include "Library\RuntimeFunction.h"
  353. #include "Library\JavascriptExternalFunction.h"
  354. #include "Base\CharStringCache.h"
  355. #include "Library\JavascriptObject.h"
  356. #include "Library\BuiltInFlags.h"
  357. #include "Library\ExternalLibraryBase.h"
  358. #include "Library\JavascriptLibraryBase.h"
  359. #include "Library\JavascriptLibrary.h"
  360. #include "Language\JavascriptExceptionOperators.h"
  361. #include "Language\JavascriptOperators.h"
  362. #include "Library\MathLibrary.h"
  363. #include "Base\HiResTimer.h"
  364. #include "Base\WindowsGlobalizationAdapter.h"
  365. #include "Base\WindowsFoundationAdapter.h"
  366. #include "Base\Debug.h"
  367. #ifdef _M_X64
  368. #include "Language\amd64\stackframe.h"
  369. #endif
  370. #include "Base\Entropy.h"
  371. #ifdef ENABLE_BASIC_TELEMETRY
  372. #include "DirectCall.h"
  373. #include "LanguageTelemetry.h"
  374. #else
  375. #define CHAKRATEL_LANGSTATS_INC_BUILTINCOUNT(builtin)
  376. #define CHAKRATEL_LANGSTATS_INC_LANGFEATURECOUNT(feature, m_scriptContext)
  377. #endif
  378. #include "Base\ThreadContext.h"
  379. #include "Base\StackProber.h"
  380. #include "Language\EvalMapRecord.h"
  381. #include "Base\RegexPatternMruMap.h"
  382. #include "Language\JavascriptConversion.h"
  383. #include "Base\ScriptContextOptimizationOverrideInfo.h"
  384. #include "Base\scriptContextbase.h"
  385. #include "Base\ScriptContext.h"
  386. #include "Base\LeaveScriptObject.h"
  387. #include "Base\PropertyRecord.h"
  388. #include "ByteCode\ByteCodeReader.h"
  389. #include "Language\TaggedInt.h"
  390. #include "Library\RootObjectBase.h"
  391. #include "Library\GlobalObject.h"
  392. #include "Library\LiteralString.h"
  393. #include "Library\ConcatString.h"
  394. #include "Library\CompoundString.h"
  395. #include "Library\PropertyString.h"
  396. #include "Library\JavascriptTypedNumber.h"
  397. #include "Library\SparseArraySegment.h"
  398. #include "Library\JavascriptError.h"
  399. #include "Library\JavascriptArray.h"
  400. #include "Library\ArrayBuffer.h"
  401. #include "Library\TypedArray.h"
  402. #include "Library\JavascriptBoolean.h"
  403. #include "Types\ScriptFunctionType.h"
  404. #include "Library\ScriptFunction.h"
  405. //
  406. // .inl files
  407. //
  408. #include "commoninl.h"
  409. #include "Language\JavascriptConversion.inl"
  410. #include "Types\RecyclableObject.inl"
  411. #include "Types\DynamicObject.inl"
  412. #include "Library\JavascriptBoolean.inl"
  413. #include "Library\JavascriptArray.inl"
  414. #include "Library\SparseArraySegment.inl"
  415. #include "Library\JavascriptNumber.inl"
  416. #include "Library\JavascriptLibrary.inl"
  417. #include "Language\InlineCache.inl"
  418. #include "Language\InlineCachePointerArray.inl"
  419. #include "Language\JavascriptOperators.inl"
  420. #include "Language\TaggedInt.inl"
  421. #ifndef USED_IN_STATIC_LIB
  422. #ifdef ENABLE_INTL_OBJECT
  423. //The "helper" methods below are to resolve external symbol references to our delay-loaded libraries.
  424. inline HRESULT WindowsCreateString(_In_reads_opt_(length) const WCHAR * sourceString, UINT32 length, _Outptr_result_maybenull_ _Result_nullonfailure_ HSTRING * string)
  425. {
  426. return ThreadContext::GetContextForCurrentThread()->GetWindowsGlobalizationLibrary()->WindowsCreateString(sourceString, length, string);
  427. }
  428. inline HRESULT WindowsCreateStringReference(_In_reads_opt_(length + 1) const WCHAR * sourceString, UINT32 length, _Out_ HSTRING_HEADER * header, _Outptr_result_maybenull_ _Result_nullonfailure_ HSTRING * string)
  429. {
  430. return ThreadContext::GetContextForCurrentThread()->GetWindowsGlobalizationLibrary()->WindowsCreateStringReference(sourceString, length, header, string);
  431. }
  432. inline HRESULT WindowsDeleteString(_In_opt_ HSTRING string)
  433. {
  434. return ThreadContext::GetContextForCurrentThread()->GetWindowsGlobalizationLibrary()->WindowsDeleteString(string);
  435. }
  436. inline PCWSTR WindowsGetStringRawBuffer(_In_opt_ HSTRING string, _Out_opt_ UINT32 * length)
  437. {
  438. return ThreadContext::GetContextForCurrentThread()->GetWindowsGlobalizationLibrary()->WindowsGetStringRawBuffer(string, length);
  439. }
  440. inline HRESULT WindowsCompareStringOrdinal(_In_opt_ HSTRING string1, _In_opt_ HSTRING string2, _Out_ INT32 * result)
  441. {
  442. return ThreadContext::GetContextForCurrentThread()->GetWindowsGlobalizationLibrary()->WindowsCompareStringOrdinal(string1, string2, result);
  443. }
  444. inline HRESULT WindowsDuplicateString(_In_opt_ HSTRING original, _Outptr_result_maybenull_ _Result_nullonfailure_ HSTRING *newString)
  445. {
  446. return ThreadContext::GetContextForCurrentThread()->GetWindowsGlobalizationLibrary()->WindowsDuplicateString(original, newString);
  447. }
  448. #endif
  449. #endif