blob: 88ffb25384073ab18e67fc4bc620561a31f140ca [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 "RuntimeLibraryPch.h"
namespace Js
{
RuntimeFunction::RuntimeFunction(DynamicType * type)
: JavascriptFunction(type), functionNameId(nullptr)
{}
RuntimeFunction::RuntimeFunction(DynamicType * type, FunctionInfo * functionInfo)
: JavascriptFunction(type, functionInfo), functionNameId(nullptr)
{}
RuntimeFunction::RuntimeFunction(DynamicType * type, FunctionInfo * functionInfo, ConstructorCache* cache)
: JavascriptFunction(type, functionInfo, cache), functionNameId(nullptr)
{}
Var
RuntimeFunction::EnsureSourceString()
{
JavascriptLibrary* library = this->GetLibrary();
ScriptContext * scriptContext = library->GetScriptContext();
if (this->functionNameId == nullptr)
{
this->functionNameId = library->GetFunctionDisplayString();
}
else
{
if (TaggedInt::Is(this->functionNameId))
{
if (this->GetScriptContext()->GetConfig()->IsES6FunctionNameEnabled() && this->GetTypeHandler()->IsDeferredTypeHandler())
{
JavascriptString* functionName = nullptr;
DebugOnly(bool status = ) this->GetFunctionName(&functionName);
Assert(status);
this->SetPropertyWithAttributes(PropertyIds::name, functionName, PropertyConfigurable, nullptr);
}
this->functionNameId = GetNativeFunctionDisplayString(scriptContext, scriptContext->GetPropertyString(TaggedInt::ToInt32(this->functionNameId)));
}
}
Assert(JavascriptString::Is(this->functionNameId));
return this->functionNameId;
}
void
RuntimeFunction::SetFunctionNameId(Var nameId)
{
Assert(functionNameId == NULL);
Assert(TaggedInt::Is(nameId) || Js::JavascriptString::Is(nameId));
// We are only reference the propertyId, it needs to be tracked to stay alive
Assert(!TaggedInt::Is(nameId) || this->GetScriptContext()->IsTrackedPropertyId(TaggedInt::ToInt32(nameId)));
this->functionNameId = nameId;
}
#if ENABLE_TTD
void RuntimeFunction::MarkVisitKindSpecificPtrs(TTD::SnapshotExtractor* extractor)
{
if(this->functionNameId != nullptr)
{
extractor->MarkVisitVar(this->functionNameId);
}
Var revokableProxy = nullptr;
RuntimeFunction* function = const_cast<RuntimeFunction*>(this);
if(function->GetInternalProperty(function, Js::InternalPropertyIds::RevocableProxy, &revokableProxy, nullptr, this->GetScriptContext()))
{
extractor->MarkVisitVar(revokableProxy);
}
}
TTD::NSSnapObjects::SnapObjectType RuntimeFunction::GetSnapTag_TTD() const
{
Var revokableProxy = nullptr;
RuntimeFunction* function = const_cast<RuntimeFunction*>(this);
if(function->GetInternalProperty(function, Js::InternalPropertyIds::RevocableProxy, &revokableProxy, nullptr, this->GetScriptContext()))
{
return TTD::NSSnapObjects::SnapObjectType::SnapRuntimeRevokerFunctionObject;
}
else
{
return TTD::NSSnapObjects::SnapObjectType::SnapRuntimeFunctionObject;
}
}
void RuntimeFunction::ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc)
{
//
//TODO: need to add more promise support
//
Var revokableProxy = nullptr;
RuntimeFunction* function = const_cast<RuntimeFunction*>(this);
if(function->GetInternalProperty(function, Js::InternalPropertyIds::RevocableProxy, &revokableProxy, nullptr, this->GetScriptContext()))
{
TTD_PTR_ID* proxyId = alloc.SlabAllocateStruct<TTD_PTR_ID>();
*proxyId = (JavascriptOperators::GetTypeId(revokableProxy) != TypeIds_Null) ? TTD_CONVERT_VAR_TO_PTR_ID(revokableProxy) : TTD_INVALID_PTR_ID;
if(*proxyId == TTD_INVALID_PTR_ID)
{
TTD::NSSnapObjects::StdExtractSetKindSpecificInfo<TTD_PTR_ID*, TTD::NSSnapObjects::SnapObjectType::SnapRuntimeRevokerFunctionObject>(objData, proxyId);
}
else
{
TTDAssert(TTD::JsSupport::IsVarComplexKind(revokableProxy), "Huh, it looks like we need to check before adding this as a dep on.");
uint32 depOnCount = 1;
TTD_PTR_ID* depOnArray = alloc.SlabAllocateArray<TTD_PTR_ID>(1);
depOnArray[0] = TTD_CONVERT_VAR_TO_PTR_ID(revokableProxy);
TTD::NSSnapObjects::StdExtractSetKindSpecificInfo<TTD_PTR_ID*, TTD::NSSnapObjects::SnapObjectType::SnapRuntimeRevokerFunctionObject>(objData, proxyId, alloc, depOnCount, depOnArray);
}
}
else
{
TTD::NSSnapObjects::StdExtractSetKindSpecificInfo<void*, TTD::NSSnapObjects::SnapObjectType::SnapRuntimeFunctionObject>(objData, nullptr);
}
}
#endif
};