| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- //-------------------------------------------------------------------------------------------------------
- // Copyright (C) Microsoft. All rights reserved.
- // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
- //-------------------------------------------------------------------------------------------------------
- #include "RuntimeBasePch.h"
- #include "Exception.h"
- namespace Js
- {
- bool Exception::RaiseIfScriptActive(ScriptContext *scriptContext, unsigned kind, PVOID returnAddress)
- {
- ThreadContext *threadContext = ThreadContext::GetContextForCurrentThread();
- if (threadContext != nullptr)
- {
- if (kind == ExceptionKind_OutOfMemory &&
- CONFIG_FLAG(EnableFatalErrorOnOOM) && !threadContext->TestThreadContextFlag(ThreadContextFlagDisableFatalOnOOM))
- {
- OutOfMemory_fatal_error();
- }
- if (threadContext->IsScriptActive())
- {
- switch (kind) {
- case ExceptionKind_OutOfMemory:
- AssertMsg(returnAddress == NULL, "should not have returnAddress passed in");
- JavascriptError::ThrowOutOfMemoryError(scriptContext);
- case ExceptionKind_StackOverflow:
- JavascriptError::ThrowStackOverflowError(scriptContext, returnAddress);
- default:
- AssertMsg(false, "Invalid ExceptionKind");
- }
- }
- }
- return false;
- }
- // Recover/Release unused memory and give it back to OS.
- // The function doesn't throw if the attempt to recover memory fails, in which case it simply does nothing.
- // Useful when running out of memory e.g. for Arena but there is some recycler memory which has been committed but is unused.
- void Exception::RecoverUnusedMemory()
- {
- ThreadContext* threadContext = ThreadContext::GetContextForCurrentThread();
- if (threadContext)
- {
- Recycler* threadRecycler = threadContext->GetRecycler();
- if (threadRecycler)
- {
- try
- {
- threadRecycler->CollectNow<CollectOnRecoverFromOutOfMemory>();
- }
- catch (...)
- {
- // Technically, exception is a valid scenario: we asked to recover mem, and it couldn't.
- // Do not let the exception leak out.
- }
- }
- }
- }
- }
|