Cleaned up DynamicIL
This commit is contained in:
@@ -13,25 +13,27 @@ namespace Discord
|
|||||||
var generator = method.GetILGenerator();
|
var generator = method.GetILGenerator();
|
||||||
var typeInfo = typeof(T).GetTypeInfo();
|
var typeInfo = typeof(T).GetTypeInfo();
|
||||||
|
|
||||||
CopyFields(generator, typeInfo);
|
typeInfo.ForEachField(f =>
|
||||||
|
{
|
||||||
|
generator.Emit(OpCodes.Ldarg_1); //Stack: TargetRef
|
||||||
|
generator.Emit(OpCodes.Ldarg_0); //Stack: TargetRef, SourceRef
|
||||||
|
generator.Emit(OpCodes.Ldfld, f); //Stack: TargetRef, Value
|
||||||
|
generator.Emit(OpCodes.Stfld, f); //Stack:
|
||||||
|
});
|
||||||
|
|
||||||
generator.Emit(OpCodes.Ret);
|
generator.Emit(OpCodes.Ret);
|
||||||
|
|
||||||
return method.CreateDelegate(typeof(Action<T, T>)) as Action<T, T>;
|
return method.CreateDelegate(typeof(Action<T, T>)) as Action<T, T>;
|
||||||
}
|
}
|
||||||
private static void CopyFields(ILGenerator generator, TypeInfo typeInfo)
|
|
||||||
{
|
|
||||||
foreach (var field in typeInfo.DeclaredFields.Where(x => !x.IsStatic))
|
|
||||||
{
|
|
||||||
generator.Emit(OpCodes.Ldarg_1); //Stack: TargetRef
|
|
||||||
generator.Emit(OpCodes.Ldarg_0); //Stack: TargetRef, SourceRef
|
|
||||||
generator.Emit(OpCodes.Ldfld, field); //Stack: TargetRef, Value
|
|
||||||
generator.Emit(OpCodes.Stfld, field); //Stack:
|
|
||||||
}
|
|
||||||
|
|
||||||
|
public static void ForEachField(this TypeInfo typeInfo, Action<FieldInfo> fieldProcessor)
|
||||||
|
{
|
||||||
var baseType = typeInfo.BaseType;
|
var baseType = typeInfo.BaseType;
|
||||||
if (baseType != null && baseType.AssemblyQualifiedName == typeInfo.AssemblyQualifiedName)
|
if (baseType != null)
|
||||||
CopyFields(generator, baseType.GetTypeInfo());
|
ForEachField(baseType.GetTypeInfo(), fieldProcessor);
|
||||||
|
|
||||||
|
foreach (var field in typeInfo.DeclaredFields.Where(x => !x.IsStatic))
|
||||||
|
fieldProcessor(field);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user