JavascriptError.h 10 KB

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