non-handler static initialization for runtime assets is made recursive on dependencies

Signed-off-by: carlitosan <82187351+carlitosan@users.noreply.github.com>
This commit is contained in:
carlitosan
2021-11-26 10:17:14 -08:00
parent e3f7b777ab
commit 5794fa6c9d
3 changed files with 42 additions and 36 deletions
@@ -501,43 +501,53 @@ namespace ScriptCanvas
return lua_gettop(lua);
}
void InitializeInterpretedStatics(const RuntimeData& runtimeData)
void InitializeInterpretedStatics(RuntimeData& runtimeData)
{
#if defined(AZ_PROFILE_BUILD) || defined(AZ_DEBUG_BUILD)
Execution::InitializeFromLuaStackFunctions(const_cast<Grammar::DebugSymbolMap&>(runtimeData.m_debugMap));
#endif
AZ_WarningOnce("ScriptCanvas", !runtimeData.m_areStaticsInitialized, "ScriptCanvas runtime data already initalized");
if (runtimeData.RequiresStaticInitialization())
if (!runtimeData.m_areStaticsInitialized)
{
AZ::ScriptLoadResult result{};
AZ::ScriptSystemRequestBus::BroadcastResult(result, &AZ::ScriptSystemRequests::LoadAndGetNativeContext, runtimeData.m_script, AZ::k_scriptLoadBinary, AZ::ScriptContextIds::DefaultScriptContextId);
AZ_Assert(result.status == AZ::ScriptLoadResult::Status::Initial, "ExecutionStateInterpreted script asset was valid but failed to load.");
AZ_Assert(result.lua, "Must have a default script context and a lua_State");
AZ_Assert(lua_istable(result.lua, -1), "No run-time execution was available for this script");
runtimeData.m_areStaticsInitialized = true;
auto lua = result.lua;
// Lua: table
lua_getfield(lua, -1, Grammar::k_InitializeStaticsName);
// Lua: table, ?
if (lua_isfunction(lua, -1))
for (auto& dependency : runtimeData.m_requiredAssets)
{
// Lua: table, function
lua_pushvalue(lua, -2);
// Lua: table, function, table
for (auto& clonerSource : runtimeData.m_cloneSources)
{
lua_pushlightuserdata(lua, const_cast<void*>(reinterpret_cast<const void*>(&clonerSource)));
}
// Lua: table, function, table, cloners...
AZ::Internal::LuaSafeCall(lua, aznumeric_caster(runtimeData.m_cloneSources.size() + 1), 0);
// Lua: table
lua_pop(lua, 1);
InitializeInterpretedStatics(dependency.Get()->GetData());
}
else
#if defined(AZ_PROFILE_BUILD) || defined(AZ_DEBUG_BUILD)
Execution::InitializeFromLuaStackFunctions(const_cast<Grammar::DebugSymbolMap&>(runtimeData.m_debugMap));
#endif
AZ_WarningOnce("ScriptCanvas", !runtimeData.m_areStaticsInitialized, "ScriptCanvas runtime data already initalized");
if (runtimeData.RequiresStaticInitialization())
{
AZ::ScriptLoadResult result{};
AZ::ScriptSystemRequestBus::BroadcastResult(result, &AZ::ScriptSystemRequests::LoadAndGetNativeContext, runtimeData.m_script, AZ::k_scriptLoadBinary, AZ::ScriptContextIds::DefaultScriptContextId);
AZ_Assert(result.status == AZ::ScriptLoadResult::Status::Initial, "ExecutionStateInterpreted script asset was valid but failed to load.");
AZ_Assert(result.lua, "Must have a default script context and a lua_State");
AZ_Assert(lua_istable(result.lua, -1), "No run-time execution was available for this script");
auto lua = result.lua;
// Lua: table
lua_getfield(lua, -1, Grammar::k_InitializeStaticsName);
// Lua: table, ?
lua_pop(lua, 2);
if (lua_isfunction(lua, -1))
{
// Lua: table, function
lua_pushvalue(lua, -2);
// Lua: table, function, table
for (auto& clonerSource : runtimeData.m_cloneSources)
{
lua_pushlightuserdata(lua, const_cast<void*>(reinterpret_cast<const void*>(&clonerSource)));
}
// Lua: table, function, table, cloners...
AZ::Internal::LuaSafeCall(lua, aznumeric_caster(runtimeData.m_cloneSources.size() + 1), 0);
// Lua: table
lua_pop(lua, 1);
}
else
{
// Lua: table, ?
lua_pop(lua, 2);
}
}
}
}
@@ -43,7 +43,7 @@ namespace ScriptCanvas
void InterpretedUnloadData(RuntimeData& runtimeData);
void InitializeInterpretedStatics(const RuntimeData& runtimeData);
void InitializeInterpretedStatics(RuntimeData& runtimeData);
int InitializeNodeableOutKeys(lua_State* lua);
@@ -49,11 +49,7 @@ namespace ScriptCanvas
, config.asset.GetId().ToString<AZStd::string>().data());
#endif
if (!runtimeAsset->GetData().m_areStaticsInitialized)
{
runtimeAsset->GetData().m_areStaticsInitialized = true;
Execution::InitializeInterpretedStatics(runtimeAsset->GetData());
}
Execution::InitializeInterpretedStatics(runtimeAsset->GetData());
}
void ExecutionStateInterpreted::ClearLuaRegistryIndex()