1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-15 23:04:09 +02:00

Enumerate through base types, respect .DeclaredOnly

This commit is contained in:
Brian Fiete 2021-10-25 10:29:04 -07:00
parent 076be19488
commit 38c5bd747e
2 changed files with 26 additions and 49 deletions

View file

@ -20,53 +20,13 @@ namespace System.Reflection
mFieldData = fieldData; mFieldData = fieldData;
} }
public int32 MemberOffset public TypeInstance DeclaringType => mTypeInstance;
{ public int32 MemberOffset => (int32)mFieldData.mData;
get public Type FieldType => Type.[Friend]GetType(mFieldData.mFieldTypeId);
{ public bool IsConst => mFieldData.mFlags.HasFlag(.Const);
return (int32)mFieldData.mData; public bool IsStatic => mFieldData.mFlags.HasFlag(.Static);
} public bool IsInstanceField => !mFieldData.mFlags.HasFlag(.Static) && !mFieldData.mFlags.HasFlag(.Const);
} public StringView Name => mFieldData.mName;
public Type FieldType
{
get
{
return Type.[Friend]GetType(mFieldData.mFieldTypeId);
}
}
public bool IsConst
{
get
{
return mFieldData.mFlags.HasFlag(.Const);
}
}
public bool IsStatic
{
get
{
return mFieldData.mFlags.HasFlag(.Static);
}
}
public bool IsInstanceField
{
get
{
return !mFieldData.mFlags.HasFlag(.Static) && !mFieldData.mFlags.HasFlag(.Const);
}
}
public StringView Name
{
get
{
return mFieldData.mName;
}
}
public Result<void, Error> SetValue(Object obj, Object value) public Result<void, Error> SetValue(Object obj, Object value)
{ {
@ -525,7 +485,15 @@ namespace System.Reflection
{ {
mIdx++; mIdx++;
if (mIdx == mTypeInstance.[Friend]mFieldDataCount) if (mIdx == mTypeInstance.[Friend]mFieldDataCount)
{
if (mBindingFlags.HasFlag(.DeclaredOnly))
return false; return false;
if (mTypeInstance.[Friend]mBaseType == 0)
return false;
mTypeInstance = Type.[Friend]GetType(mTypeInstance.[Friend]mBaseType) as TypeInstance;
mIdx = -1;
continue;
}
var fieldData = &mTypeInstance.[Friend]mFieldDataPtr[mIdx]; var fieldData = &mTypeInstance.[Friend]mFieldDataPtr[mIdx];
bool matches = (mBindingFlags.HasFlag(BindingFlags.Static) && (fieldData.mFlags.HasFlag(FieldFlags.Static))); bool matches = (mBindingFlags.HasFlag(BindingFlags.Static) && (fieldData.mFlags.HasFlag(FieldFlags.Static)));
matches |= (mBindingFlags.HasFlag(BindingFlags.Instance) && (!fieldData.mFlags.HasFlag(FieldFlags.Static))); matches |= (mBindingFlags.HasFlag(BindingFlags.Instance) && (!fieldData.mFlags.HasFlag(FieldFlags.Static)));

View file

@ -18,6 +18,7 @@ namespace System.Reflection
mMethodData = methodData; mMethodData = methodData;
} }
public TypeInstance DeclaringType => mTypeInstance;
public bool IsInitialized => mMethodData != null; public bool IsInitialized => mMethodData != null;
public StringView Name => mMethodData.[Friend]mName; public StringView Name => mMethodData.[Friend]mName;
public int ParamCount => mMethodData.[Friend]mParamCount; public int ParamCount => mMethodData.[Friend]mParamCount;
@ -788,7 +789,15 @@ namespace System.Reflection
{ {
mIdx++; mIdx++;
if (mIdx == mTypeInstance.[Friend]mMethodDataCount) if (mIdx == mTypeInstance.[Friend]mMethodDataCount)
{
if (mBindingFlags.HasFlag(.DeclaredOnly))
return false; return false;
if (mTypeInstance.[Friend]mBaseType == 0)
return false;
mTypeInstance = Type.[Friend]GetType(mTypeInstance.[Friend]mBaseType) as TypeInstance;
mIdx = -1;
continue;
}
var methodData = &mTypeInstance.[Friend]mMethodDataPtr[mIdx]; var methodData = &mTypeInstance.[Friend]mMethodDataPtr[mIdx];
bool matches = (mBindingFlags.HasFlag(BindingFlags.Static) && (methodData.mFlags.HasFlag(.Static))); bool matches = (mBindingFlags.HasFlag(BindingFlags.Static) && (methodData.mFlags.HasFlag(.Static)));
matches |= (mBindingFlags.HasFlag(BindingFlags.Instance) && (!methodData.mFlags.HasFlag(.Static))); matches |= (mBindingFlags.HasFlag(BindingFlags.Instance) && (!methodData.mFlags.HasFlag(.Static)));