blob: d3c21fee54f319011162e17042c3215f180616fc [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 "RuntimeDebugPch.h"
#include "Language/SourceDynamicProfileManager.h"
using namespace Js;
// The general idea is that nextLocalFunctionId is assigned sequentially during parse
// EnsureInitialized does one things:
// - It ensures that the startup function bit vector on the profile manager has sufficient capacity
// The startup function bitvector might have to be resized when we call this function
void SourceContextInfo::EnsureInitialized()
{
#if ENABLE_PROFILE_INFO
uint oldFunctionBodyArraySize = (this->sourceDynamicProfileManager ? this->sourceDynamicProfileManager->GetStartupFunctionsLength() : 0);
if (oldFunctionBodyArraySize >= this->nextLocalFunctionId)
{
return;
}
// Match the dictionaries resize policy in calculating the amount to grow by
uint newFunctionBodyCount = max(this->nextLocalFunctionId, UInt32Math::Add(oldFunctionBodyArraySize, oldFunctionBodyArraySize / 3));
if(sourceDynamicProfileManager)
{
sourceDynamicProfileManager->EnsureStartupFunctions(newFunctionBodyCount);
}
#endif
}
bool SourceContextInfo::IsSourceProfileLoaded() const
{
#if ENABLE_PROFILE_INFO
return sourceDynamicProfileManager != nullptr && sourceDynamicProfileManager->IsProfileLoaded();
#else
return false;
#endif
}
SourceContextInfo* SourceContextInfo::Clone(Js::ScriptContext* scriptContext) const
{
IActiveScriptDataCache* profileCache = NULL;
#if ENABLE_PROFILE_INFO
if (this->sourceDynamicProfileManager != NULL)
{
profileCache = this->sourceDynamicProfileManager->GetProfileCache();
}
#endif
SourceContextInfo * newSourceContextInfo = scriptContext->GetSourceContextInfo(dwHostSourceContext, profileCache);
if (newSourceContextInfo == nullptr)
{
char16 const * oldUrl = this->url;
char16 const * oldSourceMapUrl = this->sourceMapUrl;
newSourceContextInfo = scriptContext->CreateSourceContextInfo(
dwHostSourceContext,
oldUrl,
oldUrl? wcslen(oldUrl) : 0,
NULL,
oldSourceMapUrl,
oldSourceMapUrl ? wcslen(oldSourceMapUrl) : 0);
newSourceContextInfo->nextLocalFunctionId = this->nextLocalFunctionId;
newSourceContextInfo->sourceContextId = this->sourceContextId;
newSourceContextInfo->EnsureInitialized();
}
return newSourceContextInfo;
}