JavascriptError.h 10 KB

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