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