2
0
mirror of https://github.com/Laupetin/OpenAssetTools.git synced 2025-05-31 13:37: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; 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, void LoadMember_Alloc(const StructureInformation* info,
const MemberInformation* member, const MemberInformation* member,
const DeclarationModifierComputations& modifier, const DeclarationModifierComputations& modifier,
@ -1077,9 +1083,7 @@ namespace
const auto typeDecl = MakeTypeDecl(member->m_member->m_type_declaration.get()); const auto typeDecl = MakeTypeDecl(member->m_member->m_type_declaration.get());
const auto followingReferences = MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()); const auto followingReferences = MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers());
const auto allocOutOfBlock = const auto allocOutOfBlock = ShouldAllocOutOfBlock(*member, loadType);
m_env.m_architecture_mismatch
&& ((member->m_type && !member->m_type->m_has_matching_cross_platform_structure) || loadType == MemberLoadType::POINTER_ARRAY);
LINE_STARTF("{0} = m_stream.", MakeMemberAccess(info, member, modifier)) LINE_STARTF("{0} = m_stream.", MakeMemberAccess(info, member, modifier))
if (allocOutOfBlock) if (allocOutOfBlock)
@ -1192,7 +1196,14 @@ namespace
LINE("{") LINE("{")
m_intendation++; 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--; m_intendation--;
LINE("}") LINE("}")
@ -1211,7 +1222,14 @@ namespace
LINE("{") LINE("{")
m_intendation++; 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--; m_intendation--;
LINE("}") LINE("}")
@ -1559,10 +1577,20 @@ namespace
if (inTemp) if (inTemp)
{ {
LINE("") 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)") LINE("if (zonePtrType == ZonePointerType::INSERT)")
m_intendation++; 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--; m_intendation--;
} }
@ -1602,9 +1630,14 @@ namespace
LINE("") LINE("")
} }
LINE("if (toInsert != nullptr)") LINE("if (zonePtrType == ZonePointerType::INSERT)")
m_intendation++; 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--; m_intendation--;
} }
@ -1622,7 +1655,7 @@ namespace
} }
else else
{ {
LINEF("*{0} = m_stream.ConvertOffsetToPointerRedirect(*{0});", MakeTypePtrVarName(info->m_definition)) LINEF("*{0} = m_stream.ConvertOffsetToAliasLookup(*{0});", MakeTypePtrVarName(info->m_definition))
} }
} }
else else