blob: d1d9f5ad3ae1938283a1750a6667c478c644ebc0 [file]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
#include "CommonExceptionsPch.h"
#ifdef EXCEPTION_CHECK
#include "ExceptionCheck.h"
THREAD_LOCAL ExceptionCheck::Data ExceptionCheck::data;
BOOL ExceptionCheck::IsEmpty()
{
return (data.handledExceptionType == ExceptionType_None);
}
ExceptionCheck::Data ExceptionCheck::Save()
{
ExceptionCheck::Data savedData = data;
data = ExceptionCheck::Data();
return savedData;
}
void ExceptionCheck::Restore(ExceptionCheck::Data& savedData)
{
Assert(IsEmpty());
data = savedData;
}
ExceptionCheck::Data ExceptionCheck::GetData()
{
return data;
}
BOOL ExceptionCheck::CanHandleOutOfMemory()
{
return (data.handledExceptionType == ExceptionType_DisableCheck) ||
JsUtil::ExternalApi::IsScriptActiveOnCurrentThreadContext() ||
(data.handledExceptionType & ExceptionType_OutOfMemory);
}
BOOL ExceptionCheck::HasStackProbe()
{
return (data.handledExceptionType & ExceptionType_HasStackProbe);
}
BOOL ExceptionCheck::CanHandleStackOverflow(bool isExternal)
{
return (JsUtil::ExternalApi::IsScriptActiveOnCurrentThreadContext() || isExternal) ||
(data.handledExceptionType & ExceptionType_StackOverflow) ||
(data.handledExceptionType == ExceptionType_DisableCheck);
}
void ExceptionCheck::SetHandledExceptionType(ExceptionType e)
{
Assert((e & ExceptionType_DisableCheck) == 0 || e == ExceptionType_DisableCheck);
Assert(IsEmpty());
#if DBG
if(!(e == ExceptionType_None ||
e == ExceptionType_DisableCheck ||
!JsUtil::ExternalApi::IsScriptActiveOnCurrentThreadContext() ||
(e & ExceptionType_JavascriptException) == ExceptionType_JavascriptException ||
e == ExceptionType_HasStackProbe))
{
Assert(false);
}
#endif
data.handledExceptionType = e;
}
ExceptionType ExceptionCheck::ClearHandledExceptionType()
{
ExceptionType exceptionType = data.handledExceptionType;
data.handledExceptionType = ExceptionType_None;
Assert(IsEmpty());
return exceptionType;
}
AutoHandledExceptionType::AutoHandledExceptionType(ExceptionType e)
{
ExceptionCheck::SetHandledExceptionType(e);
}
AutoHandledExceptionType::~AutoHandledExceptionType()
{
Assert(ExceptionCheck::GetData().handledExceptionType == ExceptionType_DisableCheck ||
!JsUtil::ExternalApi::IsScriptActiveOnCurrentThreadContext() ||
ExceptionCheck::GetData().handledExceptionType == ExceptionType_HasStackProbe ||
(ExceptionCheck::GetData().handledExceptionType & ExceptionType_JavascriptException) == ExceptionType_JavascriptException);
ExceptionCheck::ClearHandledExceptionType();
}
AutoNestedHandledExceptionType::AutoNestedHandledExceptionType(ExceptionType e)
{
savedData = ExceptionCheck::Save();
ExceptionCheck::SetHandledExceptionType(e);
}
AutoNestedHandledExceptionType::~AutoNestedHandledExceptionType()
{
Assert(ExceptionCheck::GetData().handledExceptionType == ExceptionType_DisableCheck ||
!JsUtil::ExternalApi::IsScriptActiveOnCurrentThreadContext() ||
ExceptionCheck::GetData().handledExceptionType == ExceptionType_HasStackProbe ||
(ExceptionCheck::GetData().handledExceptionType & ExceptionType_JavascriptException) == ExceptionType_JavascriptException);
ExceptionCheck::ClearHandledExceptionType();
ExceptionCheck::Restore(savedData);
}
AutoFilterExceptionRegion::AutoFilterExceptionRegion(ExceptionType e)
{
savedData = ExceptionCheck::Save();
ExceptionCheck::SetHandledExceptionType((ExceptionType)(~e & savedData.handledExceptionType));
}
AutoFilterExceptionRegion::~AutoFilterExceptionRegion()
{
ExceptionCheck::ClearHandledExceptionType();
ExceptionCheck::Restore(savedData);
}
#endif