Files
wyatt 648386cd73 Lua向C#逻辑迁移 一期 #13
将整个插件代码上传
2025-10-26 21:48:39 +08:00

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);
}
}
}
}