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:
parent
a98adc9d59
commit
6aa548d226
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user