public static void Register(ITypeResolver typeResolver) { var codeBuilder = new IlCodeBuilder(); codeBuilder.LoadArgument(0); codeBuilder.Add(Code.Call, 1); codeBuilder.Add(Code.Dup); codeBuilder.LoadArgument(0); codeBuilder.Add(Code.Stfld, 2); codeBuilder.Add(Code.Ret); var parameters = new List <IParameter>(); parameters.Add(typeResolver.System.System_Int32.ToParameter()); var tokenResolutions = new List <object>(); tokenResolutions.Add( new SynthesizedStaticMethod( string.Empty, typeResolver.System.System_String, typeResolver.System.System_String, parameters, (llvmWriter, opCode) => llvmWriter.WriteNewMethodBody(opCode, typeResolver.System.System_String, enableStringFastAllocation: true))); tokenResolutions.Add(typeResolver.System.System_String.GetFieldByName("m_stringLength", typeResolver)); var locals = new List <IType>(); MethodBodyBank.Register(Name, codeBuilder.GetCode(), tokenResolutions, locals, parameters); }
public static void Register(ITypeResolver typeResolver) { var codeList = new List <object>(); codeList.AddRange( new object[] { Code.Ldarg_0, }); codeList.AppendInt(Code.Castclass, 1); codeList.AppendInt(Code.Ldfld, 2); codeList.Add(Code.Ret); var arrayType = typeResolver.System.System_Byte.ToArrayType(1); var tokenResolutions = new List <object>(); tokenResolutions.Add(arrayType); tokenResolutions.Add(arrayType.GetFieldByName("rank", typeResolver)); var locals = new List <IType>(); var parameters = new List <IParameter>(); MethodBodyBank.Register(Name, codeList.ToArray(), tokenResolutions, locals, parameters); }
public static void Register(ITypeResolver typeResolver) { // Registering GetHashCode var tokenResolutions = new List <object>(); tokenResolutions.Add( new SynthesizedThisMethod( SynthesizedGetSizeMethod.Name, typeResolver.System.System_Object, typeResolver.GetIntTypeByByteSize(LlvmWriter.PointerSize), true)); tokenResolutions.Add(typeResolver.System.System_Byte.ToPointerType()); var locals = new List <IType>(); locals.Add(typeResolver.System.System_Byte.ToPointerType()); locals.Add(typeResolver.System.System_Int32); locals.Add(typeResolver.System.System_Byte.ToPointerType()); locals.Add(typeResolver.System.System_Int32); locals.Add(typeResolver.System.System_Int32); var parameters = new List <IParameter>(); parameters.Add(typeResolver.System.System_Object.ToParameter()); MethodBodyBank.Register(Name, ByteCode, tokenResolutions, locals, parameters); }
public static void Register(ITypeResolver typeResolver) { var codeList = new IlCodeBuilder(); codeList.LoadArgument(0); codeList.Add(Code.Castclass, 1); codeList.Add(Code.Ldfld, 2); var label1 = codeList.Branch(Code.Brtrue, Code.Brtrue_S); codeList.LoadArgument(1); var label2 = codeList.Branch(Code.Brtrue, Code.Brtrue_S); codeList.LoadConstant(0); codeList.Add(Code.Ret); codeList.Add(label1); codeList.Add(label2); codeList.LoadArgument(0); codeList.Add(Code.Castclass, 3); codeList.Add(Code.Ldfld, 4); // Rank - index - 1 codeList.LoadArgument(0); codeList.Add(Code.Castclass, 1); codeList.Add(Code.Ldfld, 2); codeList.LoadArgument(1); codeList.Add(Code.Sub); codeList.LoadConstant(1); codeList.Add(Code.Sub); codeList.Add(Code.Ldelem_I4); codeList.Add(Code.Ret); var arrayType = typeResolver.System.System_Byte.ToArrayType(1); var arrayTypeMulti = typeResolver.System.System_Byte.ToArrayType(2); // Registering GetHashCode var tokenResolutions = new List <object>(); tokenResolutions.Add(arrayType); tokenResolutions.Add(arrayType.GetFieldByName("rank", typeResolver)); tokenResolutions.Add(arrayTypeMulti); tokenResolutions.Add(arrayTypeMulti.GetFieldByName("lowerBounds", typeResolver)); var locals = new List <IType>(); var parameters = new List <IParameter>(); parameters.Add(typeResolver.System.System_Int32.ToParameter()); MethodBodyBank.Register(Name, codeList.GetCode(), tokenResolutions, locals, parameters); }
public static void Register(ITypeResolver typeResolver) { // Registering UnsafeCastToStackPointerGen var tokenResolutions = new List <object>(); tokenResolutions.Add( IlReader.Constructors(typeResolver.System.System_IntPtr, typeResolver) .First( c => c.GetParameters().Count() == 1 && c.GetParameters().First().ParameterType.TypeEquals(typeResolver.System.System_Void.ToPointerType()))); var locals = new List <IType>(); // params will be taken from method MethodBodyBank.Register(Name, ByteCode, tokenResolutions, locals, null); }
public static void Register(ICodeWriter codeWriter) { // Registering GetHashCode var tokenResolutions = new List <object>(); tokenResolutions.Add(codeWriter.ResolveType("System.Byte").ToPointerType()); tokenResolutions.Add(new SynthesizedStaticMethod( "", codeWriter.ResolveType("System.Array"), codeWriter.ResolveType("System.Int32"), new[] { codeWriter.ResolveType("System.Array") }, (llvmWriter, opCode) => { // get element size llvmWriter.WriteArrayGetElementSize(opCode); })); tokenResolutions.Add(new SynthesizedStaticMethod( "", codeWriter.ResolveType("System.Array"), codeWriter.ResolveType("System.Void"), new[] { codeWriter.ResolveType("System.Byte").ToPointerType(), codeWriter.ResolveType("System.Byte").ToPointerType(), codeWriter.ResolveType("System.Int32") }, (llvmWriter, opCode) => { // copy data var firstByteOfSourceArray = opCode.OpCodeOperands[0].Result; var firstByteOfDestArray = opCode.OpCodeOperands[1].Result; var len = opCode.OpCodeOperands[2].Result; llvmWriter.WriteMemCopy(firstByteOfSourceArray, firstByteOfDestArray, len); })); tokenResolutions.Add(codeWriter.ResolveType("System.Byte")); tokenResolutions.Add(codeWriter.ResolveType("System.Byte").ToArrayType(1)); var locals = new List <IType>(); locals.Add(codeWriter.ResolveType("System.Int32")); var parameters = new List <IType>(); parameters.Add(codeWriter.ResolveType("System.Array")); parameters.Add(codeWriter.ResolveType("System.Int32")); parameters.Add(codeWriter.ResolveType("System.Array")); parameters.Add(codeWriter.ResolveType("System.Int32")); parameters.Add(codeWriter.ResolveType("System.Int32")); MethodBodyBank.Register(ArrayCopyGen.Name, ArrayCopyGen.ByteCode, tokenResolutions, locals, parameters); }
public static void Register(ITypeResolver typeResolver) { // Registering GetHashCode var tokenResolutions = new List <object>(); tokenResolutions.Add( new SynthesizedThisMethod( SynthesizedGetSizeMethod.Name, typeResolver.System.System_Object, typeResolver.GetIntTypeByByteSize(LlvmWriter.PointerSize), true)); tokenResolutions.Add(typeResolver.System.System_Byte.ToPointerType()); tokenResolutions.Add( new SynthesizedStaticMethod( string.Empty, typeResolver.System.System_Object, typeResolver.System.System_Byte.ToPointerType(), new[] { typeResolver.System.System_Int32.ToParameter() }, (llvmWriter, opCode) => llvmWriter.WriteAllocateMemory(opCode, opCode.OpCodeOperands[0].Result, false))); tokenResolutions.Add( new SynthesizedStaticMethod( string.Empty, typeResolver.System.System_Object, typeResolver.System.System_Void, new[] { typeResolver.System.System_Byte.ToPointerType().ToParameter(), typeResolver.System.System_Byte.ToPointerType().ToParameter(), typeResolver.System.System_Int32.ToParameter() }, (llvmWriter, opCode) => llvmWriter.WriteMemCopy( opCode.OpCodeOperands[0].Result, opCode.OpCodeOperands[1].Result, opCode.OpCodeOperands[2].Result))); tokenResolutions.Add(typeResolver.System.System_Object); var locals = new List <IType>(); locals.Add(typeResolver.System.System_Byte.ToPointerType()); locals.Add(typeResolver.System.System_Int32); var parameters = new List <IParameter>(); MethodBodyBank.Register(Name, ByteCode, tokenResolutions, locals, parameters); }
public static void Register(ITypeResolver typeResolver) { var arrayType = typeResolver.System.System_Byte.ToArrayType(1); // Registering GetHashCode var tokenResolutions = new List <object>(); tokenResolutions.Add(typeResolver.System.System_Byte.ToPointerType()); tokenResolutions.Add(arrayType.GetFieldByName("elementSize", typeResolver)); tokenResolutions.Add( new SynthesizedStaticMethod( string.Empty, typeResolver.System.System_Array, typeResolver.System.System_Void, new[] { typeResolver.System.System_Byte.ToPointerType().ToParameter(), typeResolver.System.System_Byte.ToPointerType().ToParameter(), typeResolver.System.System_Int32.ToParameter() }, (llvmWriter, opCode) => { // copy data var firstByteOfSourceArray = opCode.OpCodeOperands[0].Result; var firstByteOfDestArray = opCode.OpCodeOperands[1].Result; var len = opCode.OpCodeOperands[2].Result; llvmWriter.WriteMemCopy(firstByteOfSourceArray, firstByteOfDestArray, len); })); tokenResolutions.Add(typeResolver.System.System_Byte); tokenResolutions.Add(arrayType); var locals = new List <IType>(); locals.Add(typeResolver.System.System_Int32); var parameters = new List <IParameter>(); parameters.Add(typeResolver.System.System_Array.ToParameter()); parameters.Add(typeResolver.System.System_Int32.ToParameter()); parameters.Add(typeResolver.System.System_Array.ToParameter()); parameters.Add(typeResolver.System.System_Int32.ToParameter()); parameters.Add(typeResolver.System.System_Int32.ToParameter()); MethodBodyBank.Register(Name, ByteCode, tokenResolutions, locals, parameters); }
public static void Register(ITypeResolver typeResolver) { // Registering GetHashCode var tokenResolutions = new List <object>(); tokenResolutions.Add( new SynthesizedThisMethod( SynthesizedGetTypeMethod.Name, typeResolver.System.System_Object, typeResolver.System.System_Type, true)); var locals = new List <IType>(); var parameters = new List <IParameter>(); MethodBodyBank.Register(Name, ByteCode, tokenResolutions, locals, parameters); }
public static void Register(ICodeWriter codeWriter) { // Registering GetHashCode var tokenResolutions = new List <object>(); tokenResolutions.Add(new SynthesizedThisMethod("GetType", codeWriter.ResolveType("System.Object"), codeWriter.ResolveType("System.Type"), true)); tokenResolutions.Add(new SynthesizedThisMethod("get_Size", codeWriter.ResolveType("System.Type"), codeWriter.ResolveType("System.Int32"), true)); tokenResolutions.Add(codeWriter.ResolveType("System.Byte").ToPointerType()); var locals = new List <IType>(); locals.Add(codeWriter.ResolveType("System.Int32")); locals.Add(codeWriter.ResolveType("System.Int32")); locals.Add(codeWriter.ResolveType("System.Int32")); locals.Add(codeWriter.ResolveType("System.Byte").ToPointerType()); var parameters = new List <IType>(); MethodBodyBank.Register(GetHashCodeGen.Name, GetHashCodeGen.ByteCode, tokenResolutions, locals, parameters); }
public static void Register(ICodeWriter codeWriter) { // Registering GetHashCode var tokenResolutions = new List <object>(); tokenResolutions.Add(new SynthesizedThisMethod("GetType", codeWriter.ResolveType("System.Object"), codeWriter.ResolveType("System.Type"), true)); tokenResolutions.Add(new SynthesizedThisMethod("get_Size", codeWriter.ResolveType("System.Type"), codeWriter.ResolveType("System.Int32"), true)); tokenResolutions.Add(codeWriter.ResolveType("System.Byte").ToPointerType()); tokenResolutions.Add(new SynthesizedStaticMethod( "", codeWriter.ResolveType("System.Object"), codeWriter.ResolveType("System.Byte").ToPointerType(), new[] { codeWriter.ResolveType("System.Int32") }, (llvmWriter, opCode) => { // write method allocation llvmWriter.WriteAllocateMemory(opCode, opCode.OpCodeOperands[0].Result, false); })); tokenResolutions.Add(new SynthesizedStaticMethod( "", codeWriter.ResolveType("System.Object"), codeWriter.ResolveType("System.Void"), new[] { codeWriter.ResolveType("System.Byte").ToPointerType(), codeWriter.ResolveType("System.Byte").ToPointerType(), codeWriter.ResolveType("System.Int32") }, (llvmWriter, opCode) => { // write method copy llvmWriter.WriteMemCopy(opCode.OpCodeOperands[0].Result, opCode.OpCodeOperands[1].Result, opCode.OpCodeOperands[2].Result); })); tokenResolutions.Add(codeWriter.ResolveType("System.Object")); var locals = new List <IType>(); locals.Add(codeWriter.ResolveType("System.Byte").ToPointerType()); locals.Add(codeWriter.ResolveType("System.Int32")); var parameters = new List <IType>(); MethodBodyBank.Register(MemberwiseCloneGen.Name, MemberwiseCloneGen.ByteCode, tokenResolutions, locals, parameters); }
public static void Register(ITypeResolver typeResolver) { var codeList = new List <object>(); codeList.Add(Code.Ldnull); codeList.AppendInt(Code.Castclass, 1); codeList.AppendInt(Code.Ldflda, 2); codeList.Add(Code.Ret); // Registering UnsafeCastToStackPointerGen var tokenResolutions = new List <object>(); var stringType = typeResolver.System.System_String; tokenResolutions.Add(stringType); tokenResolutions.Add(stringType.GetFieldByName("m_firstChar", typeResolver)); var locals = new List <IType>(); var parameters = new List <IParameter>(); MethodBodyBank.Register(Name, codeList.ToArray(), tokenResolutions, locals, parameters); }
public static void Register(ITypeResolver typeResolver) { var codeList = new IlCodeBuilder(); // set Type of TypedReference codeList.LoadArgument(1); codeList.Add(Code.Ldflda, 2); // Load element typeCode codeList.LoadArgument(0); codeList.Add(Code.Castclass, 4); codeList.Add(Code.Ldfld, 5); // Save typeCode into TypedReference TypeCode codeList.Add(Code.Conv_I); codeList.Add(Code.Stfld, 3); // Calculate data index // check if it 1-dim array codeList.LoadArgument(2); codeList.LoadConstant(1); codeList.Add(Code.Sub); var labelGotoMultiDimArray = codeList.Branch(Code.Brtrue, Code.Brtrue_S); // set Value of TypedReference codeList.LoadArgument(1); codeList.Add(Code.Ldflda, 1); // Load reference to an array (do not load reference to field data) codeList.LoadArgument(0); codeList.Add(Code.Castclass, 4); // Load elementSize codeList.LoadArgument(0); codeList.Add(Code.Castclass, 4); codeList.Add(Code.Ldfld, 6); codeList.Add(Code.Dup); codeList.SaveLocal(0); // Load index codeList.LoadArgument(3); codeList.Add(Code.Ldind_I4); // multiply it codeList.Add(Code.Mul); // load address of an element codeList.Add(Code.Ldelema, 7); // align index codeList.LoadLocal(0); // elementSize - 1 codeList.LoadConstant(1); codeList.Add(Code.Sub); codeList.Add(Code.Dup); codeList.SaveLocal(0); // size + align - 1 codeList.Add(Code.Add); // size &= ~(align - 1) codeList.LoadLocal(0); codeList.LoadConstant(-1); codeList.Add(Code.Xor); codeList.Add(Code.And); // Save address into TypedReference Value codeList.Add(Code.Conv_I); codeList.Add(Code.Stfld, 3); codeList.Add(Code.Ret); // for multiarray codeList.Add(labelGotoMultiDimArray); // *indeces += count; codeList.LoadArgument(3); codeList.LoadArgument(2); codeList.Add(Code.Conv_I); codeList.LoadConstant(4); codeList.Add(Code.Mul); codeList.Add(Code.Add); codeList.SaveArgument(3); // init multiplier // Load elementSize codeList.LoadArgument(0); codeList.Add(Code.Castclass, 4); codeList.Add(Code.Ldfld, 6); codeList.SaveLocal(0); // calculate first index codeList.LoadArgument(3); codeList.LoadConstant(4); codeList.Add(Code.Sub); codeList.Add(Code.Dup); codeList.SaveArgument(3); codeList.Add(Code.Ldind_I4); codeList.LoadArgument(0); codeList.Add(Code.Castclass, 9); codeList.Add(Code.Ldfld, 10); codeList.LoadConstant(0); codeList.Add(Code.Ldelem_I4); codeList.Add(Code.Sub); codeList.LoadLocal(0); codeList.Add(Code.Mul); codeList.SaveLocal(1); // init 'i' (index) codeList.LoadConstant(1); codeList.SaveLocal(2); var labelLoopStart = codeList.Branch(Code.Br, Code.Br_S); // loop start var labelLoopBack = codeList.CreateLabel(); codeList.LoadLocal(0); codeList.LoadArgument(0); codeList.Add(Code.Castclass, 9); codeList.Add(Code.Ldfld, 11); codeList.LoadLocal(2); codeList.LoadConstant(1); codeList.Add(Code.Sub); codeList.Add(Code.Ldelem_I4); codeList.Add(Code.Mul); codeList.SaveLocal(0); codeList.LoadLocal(1); codeList.LoadArgument(3); codeList.LoadConstant(4); codeList.Add(Code.Sub); codeList.Add(Code.Dup); codeList.SaveArgument(3); codeList.Add(Code.Ldind_I4); codeList.LoadArgument(0); codeList.Add(Code.Castclass, 9); codeList.Add(Code.Ldfld, 10); codeList.LoadLocal(2); codeList.Add(Code.Ldelem_I4); codeList.Add(Code.Sub); codeList.LoadLocal(0); codeList.Add(Code.Mul); codeList.Add(Code.Add); codeList.SaveLocal(1); codeList.LoadLocal(2); codeList.LoadConstant(1); codeList.Add(Code.Add); codeList.SaveLocal(2); codeList.Add(labelLoopStart); codeList.LoadLocal(2); codeList.LoadArgument(2); codeList.Branch(Code.Blt, Code.Blt_S, labelLoopBack); // set Value of TypedReference codeList.LoadArgument(1); codeList.Add(Code.Ldflda, 1); // align index (array offset) (Local.0) and save it to TypedReferenece // Load reference to an array (do not load reference to field data) codeList.LoadArgument(0); codeList.Add(Code.Castclass, 9); codeList.LoadLocal(1); // load address of an element codeList.Add(Code.Ldelema, 7); // elementSize codeList.LoadArgument(0); codeList.Add(Code.Castclass, 4); codeList.Add(Code.Ldfld, 6); // elementSize - 1 codeList.LoadConstant(1); codeList.Add(Code.Sub); codeList.Add(Code.Dup); codeList.SaveLocal(2); // size + align - 1 codeList.Add(Code.Add); // size &= ~(align - 1) codeList.LoadLocal(2); codeList.LoadConstant(-1); codeList.Add(Code.Xor); codeList.Add(Code.And); // Save address into TypedReference Value codeList.Add(Code.Conv_I); codeList.Add(Code.Stfld, 3); codeList.Add(Code.Ret); var typedReferenceType = typeResolver.System.System_TypedReference; var intPtrType = typeResolver.System.System_IntPtr; var byteType = typeResolver.System.System_Byte; var arrayType = byteType.ToArrayType(1); var multiArrayType = byteType.ToArrayType(2); var tokenResolutions = new List <object>(); tokenResolutions.Add(typedReferenceType.GetFieldByName("Value", typeResolver)); tokenResolutions.Add(typedReferenceType.GetFieldByName("Type", typeResolver)); tokenResolutions.Add(intPtrType.GetFieldByName("m_value", typeResolver)); tokenResolutions.Add(arrayType); tokenResolutions.Add(arrayType.GetFieldByName("typeCode", typeResolver)); tokenResolutions.Add(arrayType.GetFieldByName("elementSize", typeResolver)); tokenResolutions.Add(byteType); tokenResolutions.Add(arrayType.GetFieldByName("rank", typeResolver)); tokenResolutions.Add(multiArrayType); tokenResolutions.Add(multiArrayType.GetFieldByName("lowerBounds", typeResolver)); tokenResolutions.Add(multiArrayType.GetFieldByName("lengths", typeResolver)); var locals = new List <IType>(); locals.Add(typeResolver.System.System_Int32); locals.Add(typeResolver.System.System_Int32); locals.Add(typeResolver.System.System_Int32); var parameters = new List <IParameter>(); parameters.Add(typeResolver.System.System_Void.ToPointerType().ToParameter()); parameters.Add(typeResolver.System.System_Int32.ToParameter()); parameters.Add(typeResolver.System.System_Int32.ToPointerType().ToParameter()); MethodBodyBank.Register(Name, codeList.GetCode(), tokenResolutions, locals, parameters); }
public static void Register(ITypeResolver typeResolver) { var codeList = new IlCodeBuilder(); // get TypeCode of TypedReference codeList.LoadArgument(0); codeList.Add(Code.Ldflda, 2); // IntPtr.m_value codeList.Add(Code.Ldfld, 3); codeList.Add(Code.Conv_I4); // switch var @switch = codeList.Switch(); // goto default case //var defaultCaseLabel1 = codeList.Branch(Code.Br, Code.Br_S); // TODO: do not support Structs for now var defaultCaseLabel1 = codeList.CreateLabel(); codeList.Add(Code.Newobj, 20); codeList.Add(Code.Throw); // case 0(TypeCode.Empty) -> Default @switch.Labels.Add(defaultCaseLabel1); // case 1(TypeCode.Object) -> Default @switch.Labels.Add(defaultCaseLabel1); // case 2(TypeCode.DBNull) -> Default @switch.Labels.Add(defaultCaseLabel1); // case 3(TypeCode.Boolean) @switch.Labels.Add(codeList.CreateLabel()); // get Value of TypedReference codeList.LoadArgument(0); codeList.Add(Code.Ldflda, 1); // IntPtr.m_value codeList.Add(Code.Ldfld, 3); codeList.LoadArgument(1); codeList.Add(Code.Unbox, 6); codeList.Add(Code.Stind_I1); codeList.Add(Code.Ret); // case 4(TypeCode.Char) @switch.Labels.Add(codeList.CreateLabel()); // get Value of TypedReference codeList.LoadArgument(0); codeList.Add(Code.Ldflda, 1); // IntPtr.m_value codeList.Add(Code.Ldfld, 3); codeList.LoadArgument(1); codeList.Add(Code.Unbox, 7); codeList.Add(Code.Stind_I2); codeList.Add(Code.Ret); // case 5(TypeCode.SByte) @switch.Labels.Add(codeList.CreateLabel()); // get Value of TypedReference codeList.LoadArgument(0); codeList.Add(Code.Ldflda, 1); // IntPtr.m_value codeList.Add(Code.Ldfld, 3); codeList.LoadArgument(1); codeList.Add(Code.Unbox, 8); codeList.Add(Code.Stind_I1); codeList.Add(Code.Ret); // case 6(TypeCode.Byte) @switch.Labels.Add(codeList.CreateLabel()); // get Value of TypedReference codeList.LoadArgument(0); codeList.Add(Code.Ldflda, 1); // IntPtr.m_value codeList.Add(Code.Ldfld, 3); codeList.LoadArgument(1); codeList.Add(Code.Unbox, 9); codeList.Add(Code.Stind_I1); codeList.Add(Code.Ret); // case 7(TypeCode.Int16) @switch.Labels.Add(codeList.CreateLabel()); // get Value of TypedReference codeList.LoadArgument(0); codeList.Add(Code.Ldflda, 1); // IntPtr.m_value codeList.Add(Code.Ldfld, 3); codeList.LoadArgument(1); codeList.Add(Code.Unbox, 10); codeList.Add(Code.Stind_I2); codeList.Add(Code.Ret); // case 8(TypeCode.UInt16) @switch.Labels.Add(codeList.CreateLabel()); // get Value of TypedReference codeList.LoadArgument(0); codeList.Add(Code.Ldflda, 1); // IntPtr.m_value codeList.Add(Code.Ldfld, 3); codeList.LoadArgument(1); codeList.Add(Code.Unbox, 11); codeList.Add(Code.Stind_I2); codeList.Add(Code.Ret); // case 9(TypeCode.Int32) @switch.Labels.Add(codeList.CreateLabel()); // get Value of TypedReference codeList.LoadArgument(0); codeList.Add(Code.Ldflda, 1); // IntPtr.m_value codeList.Add(Code.Ldfld, 3); codeList.LoadArgument(1); codeList.Add(Code.Unbox, 12); codeList.Add(Code.Stind_I4); codeList.Add(Code.Ret); // case 10(TypeCode.UInt32) @switch.Labels.Add(codeList.CreateLabel()); // get Value of TypedReference codeList.LoadArgument(0); codeList.Add(Code.Ldflda, 1); // IntPtr.m_value codeList.Add(Code.Ldfld, 3); codeList.LoadArgument(1); codeList.Add(Code.Unbox, 13); codeList.Add(Code.Stind_I4); codeList.Add(Code.Ret); // case 11(TypeCode.Int64) @switch.Labels.Add(codeList.CreateLabel()); // get Value of TypedReference codeList.LoadArgument(0); codeList.Add(Code.Ldflda, 1); // IntPtr.m_value codeList.Add(Code.Ldfld, 3); codeList.LoadArgument(1); codeList.Add(Code.Unbox, 14); codeList.Add(Code.Stind_I8); codeList.Add(Code.Ret); // case 12(TypeCode.UInt64) @switch.Labels.Add(codeList.CreateLabel()); // get Value of TypedReference codeList.LoadArgument(0); codeList.Add(Code.Ldflda, 1); // IntPtr.m_value codeList.Add(Code.Ldfld, 3); codeList.LoadArgument(1); codeList.Add(Code.Unbox, 15); codeList.Add(Code.Stind_I8); codeList.Add(Code.Ret); // case 13(TypeCode.Single) @switch.Labels.Add(codeList.CreateLabel()); // get Value of TypedReference codeList.LoadArgument(0); codeList.Add(Code.Ldflda, 1); // IntPtr.m_value codeList.Add(Code.Ldfld, 3); codeList.LoadArgument(1); codeList.Add(Code.Unbox, 16); codeList.Add(Code.Stind_R4); codeList.Add(Code.Ret); // case 14(TypeCode.Double) @switch.Labels.Add(codeList.CreateLabel()); // get Value of TypedReference codeList.LoadArgument(0); codeList.Add(Code.Ldflda, 1); // IntPtr.m_value codeList.Add(Code.Ldfld, 3); codeList.LoadArgument(1); codeList.Add(Code.Unbox, 17); codeList.Add(Code.Stind_R8); codeList.Add(Code.Ret); // case 15(TypeCode.Decimal) @switch.Labels.Add(codeList.CreateLabel()); // get Value of TypedReference codeList.LoadArgument(0); codeList.Add(Code.Ldflda, 1); // IntPtr.m_value codeList.Add(Code.Ldfld, 3); codeList.LoadArgument(1); codeList.Add(Code.Unbox, 18); codeList.Add(Code.Ret); // case 16(TypeCode.DateTime) @switch.Labels.Add(codeList.CreateLabel()); // get Value of TypedReference codeList.LoadArgument(0); codeList.Add(Code.Ldflda, 1); // IntPtr.m_value codeList.Add(Code.Ldfld, 3); codeList.LoadArgument(1); codeList.Add(Code.Unbox, 19); codeList.Add(Code.Ret); // case 17 -> Default @switch.Labels.Add(codeList.CreateLabel()); // throw NotSupportedException codeList.Add(Code.Newobj, 20); codeList.Add(Code.Throw); // case 18(TypeCode.String) -> Default @switch.Labels.Add(defaultCaseLabel1); // default: codeList.Add(defaultCaseLabel1); // get Value of TypedReference (default case) codeList.LoadArgument(0); codeList.Add(Code.Ldflda, 1); // IntPtr.m_value codeList.Add(Code.Ldfld, 3); codeList.Add(Code.Castclass, 4); codeList.LoadArgument(1); codeList.Add(Code.Stind_Ref); codeList.Add(Code.Ret); var typedReferenceType = typeResolver.System.System_TypedReference; var intPtrType = typeResolver.System.System_IntPtr; var tokenResolutions = new List <object>(); tokenResolutions.Add(typedReferenceType.GetFieldByName("Value", typeResolver)); tokenResolutions.Add(typedReferenceType.GetFieldByName("Type", typeResolver)); tokenResolutions.Add(intPtrType.GetFieldByName("m_value", typeResolver)); tokenResolutions.Add(typeResolver.System.System_Object.ToPointerType()); tokenResolutions.Add(typeResolver.System.System_Object); tokenResolutions.Add(typeResolver.System.System_Boolean); tokenResolutions.Add(typeResolver.System.System_Char); tokenResolutions.Add(typeResolver.System.System_SByte); tokenResolutions.Add(typeResolver.System.System_Byte); tokenResolutions.Add(typeResolver.System.System_Int16); tokenResolutions.Add(typeResolver.System.System_UInt16); tokenResolutions.Add(typeResolver.System.System_Int32); tokenResolutions.Add(typeResolver.System.System_UInt32); tokenResolutions.Add(typeResolver.System.System_Int64); tokenResolutions.Add(typeResolver.System.System_UInt64); tokenResolutions.Add(typeResolver.System.System_Single); tokenResolutions.Add(typeResolver.System.System_Double); tokenResolutions.Add(typeResolver.System.System_Decimal); tokenResolutions.Add(typeResolver.System.System_DateTime); tokenResolutions.Add( IlReader.Constructors(typeResolver.System.System_NotSupportedException, typeResolver).First(c => !c.GetParameters().Any())); var locals = new List <IType>(); var parameters = new List <IParameter>(); parameters.Add(typeResolver.System.System_Void.ToPointerType().ToParameter()); parameters.Add(typeResolver.System.System_Object.ToParameter()); MethodBodyBank.Register(Name, codeList.GetCode(), tokenResolutions, locals, parameters); }