156 lines
6.2 KiB
C#
156 lines
6.2 KiB
C#
using Mono.Cecil;
|
|
using Mono.Cecil.Cil;
|
|
using Mono.Cecil.Rocks;
|
|
|
|
namespace UnrealSharpWeaver.Utilities;
|
|
|
|
public static class ParameterUtilities
|
|
{
|
|
public static Instruction CreateLoadInstructionOutParam(this ParameterDefinition param, PropertyType paramTypeCode)
|
|
{
|
|
while (true)
|
|
{
|
|
switch (paramTypeCode)
|
|
{
|
|
case PropertyType.Enum:
|
|
var param1 = param;
|
|
param = null!;
|
|
paramTypeCode = param1.ParameterType.Resolve().GetEnumUnderlyingType().GetPrimitiveTypeCode();
|
|
continue;
|
|
|
|
case PropertyType.Bool:
|
|
case PropertyType.Int8:
|
|
case PropertyType.Byte:
|
|
return Instruction.Create(OpCodes.Ldind_I1);
|
|
|
|
case PropertyType.Int16:
|
|
case PropertyType.UInt16:
|
|
return Instruction.Create(OpCodes.Ldind_I2);
|
|
|
|
case PropertyType.Int:
|
|
case PropertyType.UInt32:
|
|
return Instruction.Create(OpCodes.Ldind_I4);
|
|
|
|
case PropertyType.Int64:
|
|
case PropertyType.UInt64:
|
|
return Instruction.Create(OpCodes.Ldind_I8);
|
|
|
|
case PropertyType.Float:
|
|
return Instruction.Create(OpCodes.Ldind_R4);
|
|
|
|
case PropertyType.Double:
|
|
return Instruction.Create(OpCodes.Ldind_R8);
|
|
|
|
case PropertyType.Struct:
|
|
return Instruction.Create(OpCodes.Ldobj, param.ParameterType.GetElementType());
|
|
|
|
case PropertyType.LazyObject:
|
|
case PropertyType.WeakObject:
|
|
case PropertyType.SoftClass:
|
|
case PropertyType.SoftObject:
|
|
case PropertyType.Class:
|
|
return Instruction.Create(OpCodes.Ldobj, param.ParameterType.GetElementType());
|
|
|
|
case PropertyType.Delegate:
|
|
case PropertyType.MulticastInlineDelegate:
|
|
case PropertyType.MulticastSparseDelegate:
|
|
// Delegate/multicast delegates in C# are implemented as classes, use Ldind_Ref
|
|
return Instruction.Create(OpCodes.Ldind_Ref);
|
|
|
|
case PropertyType.InternalManagedFixedSizeArray:
|
|
case PropertyType.InternalNativeFixedSizeArray:
|
|
throw new NotImplementedException(); // Fixed size arrays not supported as args
|
|
|
|
case PropertyType.Array:
|
|
case PropertyType.Set:
|
|
case PropertyType.Map:
|
|
// Assumes this will be always be an object (IList, List, ISet, HashSet, IDictionary, Dictionary)
|
|
return Instruction.Create(OpCodes.Ldind_Ref);
|
|
|
|
case PropertyType.Unknown:
|
|
case PropertyType.Interface:
|
|
case PropertyType.Object:
|
|
case PropertyType.ObjectPtr:
|
|
case PropertyType.String:
|
|
case PropertyType.Name:
|
|
case PropertyType.Text:
|
|
case PropertyType.DefaultComponent:
|
|
default:
|
|
return Instruction.Create(OpCodes.Ldind_Ref);
|
|
}
|
|
}
|
|
}
|
|
|
|
public static Instruction CreateSetInstructionOutParam(this ParameterDefinition param, PropertyType paramTypeCode)
|
|
{
|
|
while (true)
|
|
{
|
|
switch (paramTypeCode)
|
|
{
|
|
case PropertyType.Enum:
|
|
paramTypeCode = param.ParameterType.Resolve().GetEnumUnderlyingType().GetPrimitiveTypeCode();
|
|
continue;
|
|
|
|
case PropertyType.Bool:
|
|
case PropertyType.Int8:
|
|
case PropertyType.Byte:
|
|
return Instruction.Create(OpCodes.Stind_I1);
|
|
|
|
case PropertyType.Int16:
|
|
case PropertyType.UInt16:
|
|
return Instruction.Create(OpCodes.Stind_I2);
|
|
|
|
case PropertyType.Int:
|
|
case PropertyType.UInt32:
|
|
return Instruction.Create(OpCodes.Stind_I4);
|
|
|
|
case PropertyType.Int64:
|
|
case PropertyType.UInt64:
|
|
return Instruction.Create(OpCodes.Stind_I8);
|
|
|
|
case PropertyType.Float:
|
|
return Instruction.Create(OpCodes.Stind_R4);
|
|
|
|
case PropertyType.Double:
|
|
return Instruction.Create(OpCodes.Stind_R8);
|
|
|
|
case PropertyType.Struct:
|
|
return Instruction.Create(OpCodes.Stobj, param.ParameterType.GetElementType());
|
|
|
|
case PropertyType.LazyObject:
|
|
case PropertyType.WeakObject:
|
|
case PropertyType.SoftClass:
|
|
case PropertyType.SoftObject:
|
|
case PropertyType.Class:
|
|
case PropertyType.Name:
|
|
case PropertyType.Text:
|
|
return Instruction.Create(OpCodes.Stobj, param.ParameterType.GetElementType());
|
|
|
|
case PropertyType.Delegate:
|
|
case PropertyType.MulticastSparseDelegate:
|
|
case PropertyType.MulticastInlineDelegate:
|
|
// Delegate/multicast delegates in C# are implemented as classes, use Stind_Ref
|
|
return Instruction.Create(OpCodes.Stind_Ref);
|
|
|
|
case PropertyType.InternalManagedFixedSizeArray:
|
|
case PropertyType.InternalNativeFixedSizeArray:
|
|
throw new NotImplementedException(); // Fixed size arrays not supported as args
|
|
|
|
case PropertyType.Array:
|
|
case PropertyType.Set:
|
|
case PropertyType.Map:
|
|
// Assumes this will be always be an object (IList, List, ISet, HashSet, IDictionary, Dictionary)
|
|
return Instruction.Create(OpCodes.Stind_Ref);
|
|
|
|
case PropertyType.Unknown:
|
|
case PropertyType.Interface:
|
|
case PropertyType.Object:
|
|
case PropertyType.ObjectPtr:
|
|
case PropertyType.String:
|
|
case PropertyType.DefaultComponent:
|
|
default:
|
|
return Instruction.Create(OpCodes.Stind_Ref);
|
|
}
|
|
}
|
|
}
|
|
} |