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