private static MethodBuilder CreateEncodeDeferredMethod(HandlerClassBuildingContext classContext, Type pureRetvalType) { const int taskArgIndex = 1; var methodBuilder = classContext.Builder.DefineMethod("EncodeDeferred", MethodAttributes.Private | MethodAttributes.Final | MethodAttributes.HideBySig | MethodAttributes.NewSlot, typeof(byte[]), new[] {typeof(Task<>).MakeGenericType(pureRetvalType)}); var il = new MyILGenerator(methodBuilder.GetILGenerator()); var emittingContext = new HandlerMethodEmittingContext(il, classContext.Fields); il.Ldarg(taskArgIndex); il.Call(TaskMethods.GetResult(pureRetvalType)); EmitEncodeDirect(emittingContext, new HandlerParameterCodec[0], pureRetvalType); il.Ret(); return methodBuilder; }
private static void CreateConstructor(HandlerClassBuildingContext classContext) { const int thisArgIndex = 0; const int codecContainerArgIndex = 1; var constructorBuilder = classContext.Builder.DefineConstructor( MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName, CallingConventions.Standard, new[] { typeof(ICodecContainer) }); var baseConstructor = typeof(object).GetConstructor(Type.EmptyTypes); var il = new MyILGenerator(constructorBuilder.GetILGenerator()); il.Ldarg(thisArgIndex); il.Call(baseConstructor); il.Ldarg(thisArgIndex); il.Ldarg(codecContainerArgIndex); il.Stfld(classContext.Fields.CodecContainer); foreach (var manualCodecField in classContext.Fields.GetAllManualCodecFields()) { il.Ldarg(thisArgIndex); il.Ldarg(codecContainerArgIndex); il.Call(CodecContainerMethods.GetManualCodecFor(manualCodecField.FieldType.GenericTypeArguments[0])); il.Stfld(manualCodecField); } il.Ret(); }
protected override void EmitParseFromString(MyILGenerator il) { il.Call(GetTypeMethod); }