JavascriptError.h 9.8 KB

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