diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp index 9c91187e..0049413b 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneLoadTemplate.cpp @@ -532,6 +532,13 @@ namespace LINEF("fillAccessor.FillPtr({0}, {1});", MakeMemberAccess(&structInfo, &memberInfo, modifier), OffsetForMemberModifier(memberInfo, modifier, nestedBaseOffset)) + + if (memberInfo.m_is_reusable) + { + LINEF("fillAccessor.InsertPointerRedirect(m_stream.AllocRedirectEntry({0}), {1});", + MakeMemberAccess(&structInfo, &memberInfo, modifier), + OffsetForMemberModifier(memberInfo, modifier, nestedBaseOffset)) + } } else if (modifier.IsPointerArray()) { @@ -1492,7 +1499,7 @@ namespace } m_intendation--; } - else + else if (!m_env.m_architecture_mismatch) { LINE("assert(atStreamStart);") } diff --git a/src/ZoneLoading/Zone/Stream/ZoneInputStream.cpp b/src/ZoneLoading/Zone/Stream/ZoneInputStream.cpp index 5d9abc07..a63425df 100644 --- a/src/ZoneLoading/Zone/Stream/ZoneInputStream.cpp +++ b/src/ZoneLoading/Zone/Stream/ZoneInputStream.cpp @@ -403,10 +403,10 @@ namespace if (lookupEntry == 0) return nullptr; - if (lookupEntry > m_alias_lookup.size()) - throw InvalidAliasLookupException(lookupEntry - 1, m_alias_lookup.size()); + if (lookupEntry > m_pointer_redirect_lookup.size()) + throw InvalidAliasLookupException(lookupEntry - 1, m_pointer_redirect_lookup.size()); - return m_alias_lookup[lookupEntry - 1]; + return *m_pointer_redirect_lookup[lookupEntry - 1]; } private: diff --git a/src/ZoneLoading/Zone/Stream/ZoneInputStream.h b/src/ZoneLoading/Zone/Stream/ZoneInputStream.h index e56d631e..260d6627 100644 --- a/src/ZoneLoading/Zone/Stream/ZoneInputStream.h +++ b/src/ZoneLoading/Zone/Stream/ZoneInputStream.h @@ -8,6 +8,7 @@ #include #include #include +#include #include class ZoneStreamFillReadAccessor @@ -148,7 +149,7 @@ public: template uintptr_t AllocRedirectEntry(T*& offset) { - return AllocRedirectEntry(reinterpret_cast(&offset)); + return AllocRedirectEntry(reinterpret_cast(const_cast**>(&offset))); } virtual void* ConvertOffsetToPointerRedirect(const void* offset) = 0;