ExceptionCheck.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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. #include "CommonExceptionsPch.h"
  6. #ifdef EXCEPTION_CHECK
  7. #include "ExceptionCheck.h"
  8. THREAD_LOCAL ExceptionCheck::Data ExceptionCheck::data;
  9. BOOL ExceptionCheck::IsEmpty()
  10. {
  11. return (data.handledExceptionType == ExceptionType_None);
  12. }
  13. ExceptionCheck::Data ExceptionCheck::Save()
  14. {
  15. ExceptionCheck::Data savedData = data;
  16. data = ExceptionCheck::Data();
  17. return savedData;
  18. }
  19. void ExceptionCheck::Restore(ExceptionCheck::Data& savedData)
  20. {
  21. Assert(IsEmpty());
  22. data = savedData;
  23. }
  24. ExceptionCheck::Data ExceptionCheck::GetData()
  25. {
  26. return data;
  27. }
  28. BOOL ExceptionCheck::CanHandleOutOfMemory()
  29. {
  30. return (data.handledExceptionType == ExceptionType_DisableCheck) ||
  31. JsUtil::ExternalApi::IsScriptActiveOnCurrentThreadContext() ||
  32. (data.handledExceptionType & ExceptionType_OutOfMemory);
  33. }
  34. BOOL ExceptionCheck::HasStackProbe()
  35. {
  36. return (data.handledExceptionType & ExceptionType_HasStackProbe);
  37. }
  38. BOOL ExceptionCheck::CanHandleStackOverflow(bool isExternal)
  39. {
  40. return (JsUtil::ExternalApi::IsScriptActiveOnCurrentThreadContext() || isExternal) ||
  41. (data.handledExceptionType & ExceptionType_StackOverflow) ||
  42. (data.handledExceptionType == ExceptionType_DisableCheck);
  43. }
  44. void ExceptionCheck::SetHandledExceptionType(ExceptionType e)
  45. {
  46. Assert((e & ExceptionType_DisableCheck) == 0 || e == ExceptionType_DisableCheck);
  47. Assert(IsEmpty());
  48. #if DBG
  49. if(!(e == ExceptionType_None ||
  50. e == ExceptionType_DisableCheck ||
  51. !JsUtil::ExternalApi::IsScriptActiveOnCurrentThreadContext() ||
  52. (e & ExceptionType_JavascriptException) == ExceptionType_JavascriptException ||
  53. e == ExceptionType_HasStackProbe))
  54. {
  55. Assert(false);
  56. }
  57. #endif
  58. data.handledExceptionType = e;
  59. }
  60. ExceptionType ExceptionCheck::ClearHandledExceptionType()
  61. {
  62. ExceptionType exceptionType = data.handledExceptionType;
  63. data.handledExceptionType = ExceptionType_None;
  64. Assert(IsEmpty());
  65. return exceptionType;
  66. }
  67. AutoHandledExceptionType::AutoHandledExceptionType(ExceptionType e)
  68. {
  69. ExceptionCheck::SetHandledExceptionType(e);
  70. }
  71. AutoHandledExceptionType::~AutoHandledExceptionType()
  72. {
  73. Assert(ExceptionCheck::GetData().handledExceptionType == ExceptionType_DisableCheck ||
  74. !JsUtil::ExternalApi::IsScriptActiveOnCurrentThreadContext() ||
  75. ExceptionCheck::GetData().handledExceptionType == ExceptionType_HasStackProbe ||
  76. (ExceptionCheck::GetData().handledExceptionType & ExceptionType_JavascriptException) == ExceptionType_JavascriptException);
  77. ExceptionCheck::ClearHandledExceptionType();
  78. }
  79. AutoNestedHandledExceptionType::AutoNestedHandledExceptionType(ExceptionType e)
  80. {
  81. savedData = ExceptionCheck::Save();
  82. ExceptionCheck::SetHandledExceptionType(e);
  83. }
  84. AutoNestedHandledExceptionType::~AutoNestedHandledExceptionType()
  85. {
  86. Assert(ExceptionCheck::GetData().handledExceptionType == ExceptionType_DisableCheck ||
  87. !JsUtil::ExternalApi::IsScriptActiveOnCurrentThreadContext() ||
  88. ExceptionCheck::GetData().handledExceptionType == ExceptionType_HasStackProbe ||
  89. (ExceptionCheck::GetData().handledExceptionType & ExceptionType_JavascriptException) == ExceptionType_JavascriptException);
  90. ExceptionCheck::ClearHandledExceptionType();
  91. ExceptionCheck::Restore(savedData);
  92. }
  93. AutoFilterExceptionRegion::AutoFilterExceptionRegion(ExceptionType e)
  94. {
  95. savedData = ExceptionCheck::Save();
  96. ExceptionCheck::SetHandledExceptionType((ExceptionType)(~e & savedData.handledExceptionType));
  97. }
  98. AutoFilterExceptionRegion::~AutoFilterExceptionRegion()
  99. {
  100. ExceptionCheck::ClearHandledExceptionType();
  101. ExceptionCheck::Restore(savedData);
  102. }
  103. #endif