Added some handling of array vs field data attributes.
This commit is contained in:
@@ -153,10 +153,11 @@ public class Reader {
|
||||
fldInfo.GetCustomAttributes().OfType<DNAArrayAttribute>().FirstOrDefault()?.IsPointer ?? false));
|
||||
|
||||
// for each pointer field
|
||||
foreach (var f in list) {
|
||||
foreach (var f in list)
|
||||
{
|
||||
int fieldIndex = f.GetCustomAttribute<DNAAttribute>()!.OriginalIndex;
|
||||
// get the pointer value
|
||||
var addr = GetBlockFieldDataOffset(obj.Key.Item1, f.GetCustomAttribute<DNAFieldAttribute>()!.OriginalIndex,
|
||||
fieldInfo);
|
||||
var addr = GetBlockFieldDataOffset(obj.Key.Item1, fieldIndex, fieldInfo);
|
||||
// dereference the pointer
|
||||
addr = pointers.GetValueOrDefault(addr);
|
||||
if (addr == IntPtr.Zero) continue; // null pointer
|
||||
@@ -206,9 +207,17 @@ public class Reader {
|
||||
/// <param name="fieldMetadata"><see cref="FieldInfo"/> array of metadata</param>
|
||||
/// <returns></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private long GetFieldDataOffset(int fieldIndex, FieldInfo[] fieldMetadata) =>
|
||||
fieldMetadata.First(x => x.GetCustomAttribute<DNAAttribute>()!.OriginalIndex == fieldIndex)
|
||||
.GetCustomAttribute<DNAFieldAttribute>()!.MemoryOffset;
|
||||
private long GetFieldDataOffset(int fieldIndex, FieldInfo[] fieldMetadata)
|
||||
{
|
||||
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>
|
||||
/// Creates an instance of a given type
|
||||
|
||||
Reference in New Issue
Block a user