JavascriptError.h 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  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. namespace Js
  7. {
  8. struct RestrictedErrorStrings
  9. {
  10. BSTR restrictedErrStr;
  11. BSTR referenceStr;
  12. BSTR capabilitySid;
  13. };
  14. class JavascriptError : public DynamicObject
  15. {
  16. private:
  17. DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(JavascriptError);
  18. Field(ErrorTypeEnum) m_errorType;
  19. protected:
  20. DEFINE_VTABLE_CTOR(JavascriptError, DynamicObject);
  21. public:
  22. JavascriptError(DynamicType* type, BOOL isExternalError = FALSE, BOOL isPrototype = FALSE) :
  23. DynamicObject(type), originalRuntimeErrorMessage(nullptr), isExternalError(isExternalError), isPrototype(isPrototype), isStackPropertyRedefined(false)
  24. {
  25. Assert(type->GetTypeId() == TypeIds_Error);
  26. exceptionObject = nullptr;
  27. m_errorType = kjstCustomError;
  28. }
  29. static bool IsRemoteError(Var aValue);
  30. ErrorTypeEnum GetErrorType() { return m_errorType; }
  31. virtual bool HasDebugInfo();
  32. void SetNotEnumerable(PropertyId propertyId);
  33. static Var NewInstance(RecyclableObject* function, JavascriptError* pError, CallInfo callInfo, Var newTarget, Var message);
  34. class EntryInfo
  35. {
  36. public:
  37. static FunctionInfo NewErrorInstance;
  38. static FunctionInfo NewEvalErrorInstance;
  39. static FunctionInfo NewRangeErrorInstance;
  40. static FunctionInfo NewReferenceErrorInstance;
  41. static FunctionInfo NewSyntaxErrorInstance;
  42. static FunctionInfo NewTypeErrorInstance;
  43. static FunctionInfo NewURIErrorInstance;
  44. static FunctionInfo NewWebAssemblyCompileErrorInstance;
  45. static FunctionInfo NewWebAssemblyRuntimeErrorInstance;
  46. static FunctionInfo NewWebAssemblyLinkErrorInstance;
  47. static FunctionInfo ToString;
  48. };
  49. static Var NewErrorInstance(RecyclableObject* function, CallInfo callInfo, ...);
  50. static Var NewEvalErrorInstance(RecyclableObject* function, CallInfo callInfo, ...);
  51. static Var NewRangeErrorInstance(RecyclableObject* function, CallInfo callInfo, ...);
  52. static Var NewReferenceErrorInstance(RecyclableObject* function, CallInfo callInfo, ...);
  53. static Var NewSyntaxErrorInstance(RecyclableObject* function, CallInfo callInfo, ...);
  54. static Var NewTypeErrorInstance(RecyclableObject* function, CallInfo callInfo, ...);
  55. static Var NewURIErrorInstance(RecyclableObject* function, CallInfo callInfo, ...);
  56. static Var NewWebAssemblyCompileErrorInstance(RecyclableObject* function, CallInfo callInfo, ...);
  57. static Var NewWebAssemblyRuntimeErrorInstance(RecyclableObject* function, CallInfo callInfo, ...);
  58. static Var NewWebAssemblyLinkErrorInstance(RecyclableObject* function, CallInfo callInfo, ...);
  59. static Var EntryToString(RecyclableObject* function, CallInfo callInfo, ...);
  60. static void __declspec(noreturn) MapAndThrowError(ScriptContext* scriptContext, HRESULT hr);
  61. static void __declspec(noreturn) MapAndThrowError(ScriptContext* scriptContext, HRESULT hr, ErrorTypeEnum errorType, EXCEPINFO *ei);
  62. static void __declspec(noreturn) SetMessageAndThrowError(ScriptContext* scriptContext, JavascriptError *pError, int32 hCode, EXCEPINFO* pei);
  63. static JavascriptError* MapError(ScriptContext* scriptContext, ErrorTypeEnum errorType);
  64. //HELPERCALL needs a non-overloaded function pointer
  65. static void __declspec(noreturn) ThrowUnreachable(ScriptContext* scriptContext);
  66. #define THROW_ERROR_DECL(err_method) \
  67. static void __declspec(noreturn) err_method(ScriptContext* scriptContext, int32 hCode, EXCEPINFO* ei); \
  68. static void __declspec(noreturn) err_method(ScriptContext* scriptContext, int32 hCode, PCWSTR varName = nullptr); \
  69. static void __declspec(noreturn) err_method(ScriptContext* scriptContext, int32 hCode, JavascriptString* varName); \
  70. static void __declspec(noreturn) err_method##Var(ScriptContext* scriptContext, int32 hCode, ...);
  71. THROW_ERROR_DECL(ThrowError)
  72. THROW_ERROR_DECL(ThrowRangeError)
  73. THROW_ERROR_DECL(ThrowReferenceError)
  74. THROW_ERROR_DECL(ThrowSyntaxError)
  75. THROW_ERROR_DECL(ThrowTypeError)
  76. THROW_ERROR_DECL(ThrowURIError)
  77. THROW_ERROR_DECL(ThrowWebAssemblyCompileError)
  78. THROW_ERROR_DECL(ThrowWebAssemblyRuntimeError)
  79. THROW_ERROR_DECL(ThrowWebAssemblyLinkError)
  80. #undef THROW_ERROR_DECL
  81. static void __declspec(noreturn) ThrowDispatchError(ScriptContext* scriptContext, HRESULT hCode, PCWSTR message);
  82. static void __declspec(noreturn) ThrowOutOfMemoryError(ScriptContext *scriptContext);
  83. static void __declspec(noreturn) ThrowParserError(ScriptContext* scriptContext, HRESULT hrParser, CompileScriptException* se);
  84. static ErrorTypeEnum MapParseError(int32 hCode);
  85. static JavascriptError* MapParseError(ScriptContext* scriptContext, int32 hCode);
  86. static HRESULT GetRuntimeError(RecyclableObject* errorObject, __out_opt LPCWSTR * pMessage);
  87. static HRESULT GetRuntimeErrorWithScriptEnter(RecyclableObject* errorObject, __out_opt LPCWSTR * pMessage);
  88. static void __declspec(noreturn) ThrowStackOverflowError(ScriptContext *scriptContext, PVOID returnAddress = nullptr);
  89. static void SetErrorMessageProperties(JavascriptError *pError, HRESULT errCode, PCWSTR message, ScriptContext* scriptContext);
  90. static void SetErrorMessage(JavascriptError *pError, HRESULT errCode, PCWSTR varName, ScriptContext* scriptContext);
  91. static void SetErrorMessage(JavascriptError *pError, HRESULT hr, ScriptContext* scriptContext, va_list argList);
  92. static void SetErrorType(JavascriptError *pError, ErrorTypeEnum errorType);
  93. static bool ThrowCantAssign(PropertyOperationFlags flags, ScriptContext* scriptContext, PropertyId propertyId);
  94. static bool ThrowCantAssign(PropertyOperationFlags flags, ScriptContext* scriptContext, uint32 index);
  95. static bool ThrowCantAssignIfStrictMode(PropertyOperationFlags flags, ScriptContext* scriptContext);
  96. static bool ThrowCantExtendIfStrictMode(PropertyOperationFlags flags, ScriptContext* scriptContext);
  97. static bool ThrowCantDeleteIfStrictMode(PropertyOperationFlags flags, ScriptContext* scriptContext, PCWSTR varName);
  98. static bool ThrowCantDeleteIfStrictModeOrNonconfigurable(PropertyOperationFlags flags, ScriptContext* scriptContext, PCWSTR varName);
  99. static bool ThrowIfStrictModeUndefinedSetter(PropertyOperationFlags flags, Var setterValue, ScriptContext* scriptContext);
  100. static bool ThrowIfNotExtensibleUndefinedSetter(PropertyOperationFlags flags, Var setterValue, ScriptContext* scriptContext);
  101. BOOL IsExternalError() const { return isExternalError; }
  102. BOOL IsPrototype() const { return isPrototype; }
  103. bool IsStackPropertyRedefined() const { return isStackPropertyRedefined; }
  104. void SetStackPropertyRedefined(const bool value) { isStackPropertyRedefined = value; }
  105. virtual BOOL GetDiagValueString(StringBuilder<ArenaAllocator>* stringBuilder, ScriptContext* requestContext) override;
  106. virtual BOOL GetDiagTypeString(StringBuilder<ArenaAllocator>* stringBuilder, ScriptContext* requestContext) override;
  107. void SetJavascriptExceptionObject(JavascriptExceptionObject *exceptionObject)
  108. {
  109. Assert(exceptionObject);
  110. this->exceptionObject = exceptionObject;
  111. }
  112. JavascriptExceptionObject *GetJavascriptExceptionObject() { return exceptionObject; }
  113. static DWORD GetAdjustedResourceStringHr(DWORD hr, bool isFormatString);
  114. static int32 GetErrorNumberFromResourceID(int32 resourceId);
  115. static bool ShouldTypeofErrorBeReThrown(Var errorObject);
  116. virtual JavascriptError* CreateNewErrorOfSameType(JavascriptLibrary* targetJavascriptLibrary);
  117. JavascriptError* CloneErrorMsgAndNumber(JavascriptLibrary* targetJavascriptLibrary);
  118. static void TryThrowTypeError(ScriptContext * checkScriptContext, ScriptContext * scriptContext, int32 hCode, PCWSTR varName = nullptr);
  119. static JavascriptError* CreateFromCompileScriptException(ScriptContext* scriptContext, CompileScriptException* cse, const WCHAR * sourceUrl = nullptr);
  120. private:
  121. Field(BOOL) isExternalError;
  122. Field(BOOL) isPrototype;
  123. Field(bool) isStackPropertyRedefined;
  124. Field(char16 const *) originalRuntimeErrorMessage;
  125. Field(JavascriptExceptionObject *) exceptionObject;
  126. #ifdef ERROR_TRACE
  127. static void Trace(const char16 *form, ...) // const
  128. {
  129. if (Js::Configuration::Global.flags.Trace.IsEnabled(Js::ErrorPhase))
  130. {
  131. va_list argptr;
  132. va_start(argptr, form);
  133. Output::Print(_u("Error: "));
  134. Output::VPrint(form, argptr);
  135. Output::Flush();
  136. }
  137. }
  138. #endif
  139. #if ENABLE_TTD
  140. public:
  141. virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override;
  142. virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override;
  143. #endif
  144. };
  145. template <> inline bool VarIsImpl<JavascriptError>(RecyclableObject* obj)
  146. {
  147. return JavascriptOperators::GetTypeId(obj) == TypeIds_Error;
  148. }
  149. }