|
|
@@ -89,6 +89,7 @@ namespace Js
|
|
|
integerStringMapCacheMissCount(0),
|
|
|
integerStringMapCacheUseCount(0),
|
|
|
#endif
|
|
|
+ guestArena(nullptr),
|
|
|
#ifdef ENABLE_SCRIPT_DEBUGGING
|
|
|
diagnosticArena(nullptr),
|
|
|
raiseMessageToDebuggerFunctionType(nullptr),
|
|
|
@@ -798,6 +799,12 @@ namespace Js
|
|
|
interpreterArena = nullptr;
|
|
|
}
|
|
|
|
|
|
+ if (this->guestArena)
|
|
|
+ {
|
|
|
+ ReleaseGuestArena();
|
|
|
+ guestArena = nullptr;
|
|
|
+ }
|
|
|
+
|
|
|
builtInLibraryFunctions = nullptr;
|
|
|
|
|
|
pActiveScriptDirect = nullptr;
|
|
|
@@ -1298,6 +1305,8 @@ namespace Js
|
|
|
|
|
|
void ScriptContext::InitializePreGlobal()
|
|
|
{
|
|
|
+ this->guestArena = this->GetRecycler()->CreateGuestArena(_u("Guest"), Throw::OutOfMemory);
|
|
|
+
|
|
|
#if ENABLE_BACKGROUND_PARSING
|
|
|
if (PHASE_ON1(Js::ParallelParsePhase))
|
|
|
{
|
|
|
@@ -2751,6 +2760,17 @@ ExitTempAllocator:
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ void ScriptContext::ReleaseGuestArena()
|
|
|
+ {
|
|
|
+ AssertMsg(this->guestArena, "No guest arena to release");
|
|
|
+ if (this->guestArena)
|
|
|
+ {
|
|
|
+ this->GetRecycler()->DeleteGuestArena(this->guestArena);
|
|
|
+ this->guestArena = nullptr;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
void ScriptContext::SetScriptStartEventHandler(ScriptContext::EventHandler eventHandler)
|
|
|
{
|
|
|
AssertMsg(this->scriptStartEventHandler == nullptr, "Do not support multi-cast yet");
|
|
|
@@ -4955,6 +4975,7 @@ ExitTempAllocator:
|
|
|
void ScriptContext::BindReference(void * addr)
|
|
|
{
|
|
|
Assert(!this->isClosed);
|
|
|
+ Assert(this->guestArena);
|
|
|
Assert(recycler->IsValidObject(addr));
|
|
|
#if DBG
|
|
|
Assert(!bindRef.ContainsKey(addr)); // Make sure we don't bind the same pointer twice
|
|
|
@@ -5121,6 +5142,7 @@ ExitTempAllocator:
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
+ Assert(this->guestArena);
|
|
|
|
|
|
if (EnableEvalMapCleanup())
|
|
|
{
|