2
0
mirror of https://github.com/Laupetin/OpenAssetTools.git synced 2025-05-30 13:07:41 +00:00

fix: not properly inserting pointer in x64 zone loading

This commit is contained in:
Jan 2025-05-28 17:35:49 +01:00
parent a98adc9d59
commit 6aa548d226
No known key found for this signature in database
GPG Key ID: 44B581F78FF5C57C

View File

@ -1063,6 +1063,12 @@ namespace
return true;
}
[[nodiscard]] bool ShouldAllocOutOfBlock(const MemberInformation& member, const MemberLoadType loadType) const
{
return m_env.m_architecture_mismatch
&& ((member.m_type && !member.m_type->m_has_matching_cross_platform_structure) || loadType == MemberLoadType::POINTER_ARRAY);
}
void LoadMember_Alloc(const StructureInformation* info,
const MemberInformation* member,
const DeclarationModifierComputations& modifier,
@ -1077,9 +1083,7 @@ namespace
const auto typeDecl = MakeTypeDecl(member->m_member->m_type_declaration.get());
const auto followingReferences = MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers());
const auto allocOutOfBlock =
m_env.m_architecture_mismatch
&& ((member->m_type && !member->m_type->m_has_matching_cross_platform_structure) || loadType == MemberLoadType::POINTER_ARRAY);
const auto allocOutOfBlock = ShouldAllocOutOfBlock(*member, loadType);
LINE_STARTF("{0} = m_stream.", MakeMemberAccess(info, member, modifier))
if (allocOutOfBlock)
@ -1192,7 +1196,14 @@ namespace
LINE("{")
m_intendation++;
LINEF("{0} = m_stream.ConvertOffsetToAliasNative({0});", MakeMemberAccess(info, member, modifier))
if (info->m_has_matching_cross_platform_structure)
{
LINEF("{0} = m_stream.ConvertOffsetToAliasNative({0});", MakeMemberAccess(info, member, modifier))
}
else
{
LINEF("{0} = m_stream.ConvertOffsetToAliasLookup({0});", MakeMemberAccess(info, member, modifier))
}
m_intendation--;
LINE("}")
@ -1211,7 +1222,14 @@ namespace
LINE("{")
m_intendation++;
LINEF("{0} = m_stream.ConvertOffsetToPointerNative({0});", MakeMemberAccess(info, member, modifier))
if (ShouldAllocOutOfBlock(*member, loadType))
{
LINEF("{0} = m_stream.ConvertOffsetToPointerRedirect({0});", MakeMemberAccess(info, member, modifier))
}
else
{
LINEF("{0} = m_stream.ConvertOffsetToPointerNative({0});", MakeMemberAccess(info, member, modifier))
}
m_intendation--;
LINE("}")
@ -1559,10 +1577,20 @@ namespace
if (inTemp)
{
LINE("")
LINEF("{0}** toInsert = nullptr;", info->m_definition->GetFullName())
if (m_env.m_architecture_mismatch)
LINE("uintptr_t toInsertLookupEntry = 0;")
else
LINEF("{0}** toInsert = nullptr;", info->m_definition->GetFullName())
LINE("if (zonePtrType == ZonePointerType::INSERT)")
m_intendation++;
LINEF("toInsert = m_stream.InsertPointerNative<{0}>();", info->m_definition->GetFullName())
if (m_env.m_architecture_mismatch)
LINE("toInsertLookupEntry = m_stream.InsertPointerAliasLookup();")
else
LINEF("toInsert = m_stream.InsertPointerNative<{0}>();", info->m_definition->GetFullName())
m_intendation--;
}
@ -1602,9 +1630,14 @@ namespace
LINE("")
}
LINE("if (toInsert != nullptr)")
LINE("if (zonePtrType == ZonePointerType::INSERT)")
m_intendation++;
LINEF("*toInsert = *{0};", MakeTypePtrVarName(info->m_definition))
if (m_env.m_architecture_mismatch)
LINEF("m_stream.SetInsertedPointerAliasLookup(toInsertLookupEntry, *{0});", MakeTypePtrVarName(info->m_definition))
else
LINEF("*toInsert = *{0};", MakeTypePtrVarName(info->m_definition))
m_intendation--;
}
@ -1622,7 +1655,7 @@ namespace
}
else
{
LINEF("*{0} = m_stream.ConvertOffsetToPointerRedirect(*{0});", MakeTypePtrVarName(info->m_definition))
LINEF("*{0} = m_stream.ConvertOffsetToAliasLookup(*{0});", MakeTypePtrVarName(info->m_definition))
}
}
else