Added some handling of array vs field data attributes.

This commit is contained in:
Samuele Lorefice
2025-05-09 17:11:25 +02:00
parent 3657d34746
commit bc53e27647

View File

@@ -153,10 +153,11 @@ public class Reader {
fldInfo.GetCustomAttributes().OfType<DNAArrayAttribute>().FirstOrDefault()?.IsPointer ?? false)); fldInfo.GetCustomAttributes().OfType<DNAArrayAttribute>().FirstOrDefault()?.IsPointer ?? false));
// for each pointer field // for each pointer field
foreach (var f in list) { foreach (var f in list)
{
int fieldIndex = f.GetCustomAttribute<DNAAttribute>()!.OriginalIndex;
// get the pointer value // get the pointer value
var addr = GetBlockFieldDataOffset(obj.Key.Item1, f.GetCustomAttribute<DNAFieldAttribute>()!.OriginalIndex, var addr = GetBlockFieldDataOffset(obj.Key.Item1, fieldIndex, fieldInfo);
fieldInfo);
// dereference the pointer // dereference the pointer
addr = pointers.GetValueOrDefault(addr); addr = pointers.GetValueOrDefault(addr);
if (addr == IntPtr.Zero) continue; // null pointer if (addr == IntPtr.Zero) continue; // null pointer
@@ -206,9 +207,17 @@ public class Reader {
/// <param name="fieldMetadata"><see cref="FieldInfo"/> array of metadata</param> /// <param name="fieldMetadata"><see cref="FieldInfo"/> array of metadata</param>
/// <returns></returns> /// <returns></returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
private long GetFieldDataOffset(int fieldIndex, FieldInfo[] fieldMetadata) => private long GetFieldDataOffset(int fieldIndex, FieldInfo[] fieldMetadata)
fieldMetadata.First(x => x.GetCustomAttribute<DNAAttribute>()!.OriginalIndex == fieldIndex) {
.GetCustomAttribute<DNAFieldAttribute>()!.MemoryOffset; var fi = fieldMetadata.First(x => x.GetCustomAttribute<DNAAttribute>()!.OriginalIndex == fieldIndex);
//get the attribute from the field
var attrib = fi.GetCustomAttribute<DNAAttribute>();
return attrib switch {
DNAFieldAttribute fieldAttribute => fieldAttribute.MemoryOffset,
DNAArrayAttribute arrayAttribute => arrayAttribute.MemoryOffset,
_ => 0
};
}
/// <summary> /// <summary>
/// Creates an instance of a given type /// Creates an instance of a given type