private DynamicMethod EmitDecode(bool doNoCheckBounds) { const int codecContainerArgIndex = 0; const int dataArgIndex = 1; const int remainingBytesArgIndex = 2; var dynamicMethod = new DynamicMethod("_decode_manual_" + type.FullName + (doNoCheckBounds ? "_dncb_" : ""), type, new[] { typeof(ICodecContainer), typeof(byte *).MakeByRefType(), typeof(int).MakeByRefType() }, Assembly.GetExecutingAssembly().ManifestModule, true); var il = new MyILGenerator(dynamicMethod.GetILGenerator()); var context = new ManualCodecEmittingContext(il, codecContainerArgIndex); il.Ldarg(dataArgIndex); il.Ldind_I(); il.Stloc(context.DataPointerVar); il.Ldarg(remainingBytesArgIndex); il.Ldind_I4(); il.Stloc(context.RemainingBytesVar); emittingCodec.EmitDecode(context, doNoCheckBounds); il.Ldarg(dataArgIndex); il.Ldloc(context.DataPointerVar); il.Stind_I(); il.Ldarg(remainingBytesArgIndex); il.Ldloc(context.RemainingBytesVar); il.Stind_I4(); il.Ret(); return(dynamicMethod); }
public void EmitDecodeAndStore(IEmittingContext emittingContext) { var il = emittingContext.IL; il.Ldarg(argIndex); codec.EmitDecode(emittingContext, false); if (type.IsValueType) { il.Stobj(type); } else { il.Stind_Ref(); } }
public void EmitDecodeAndPrepare() { var il = emittingContext.IL; switch (way) { case MethodParameterWay.Val: codec.EmitDecode(emittingContext, false); break; case MethodParameterWay.Ref: codec.EmitDecode(emittingContext, false); il.Stloc(local); il.Ldloca(local); break; case MethodParameterWay.Out: il.Ldloca(local); break; default: throw new ArgumentOutOfRangeException(); } }
private DynamicMethod EmitDecode(bool doNoCheckBounds) { var dynamicMethod = new DynamicMethod("_decode_manual_" + type.FullName + (doNoCheckBounds ? "_dncb_" : ""), type, new[] { typeof(byte *).MakeByRefType(), typeof(int).MakeByRefType() }, Assembly.GetExecutingAssembly().ManifestModule, true); var il = dynamicMethod.GetILGenerator(); var locals = new LocalVariableCollection(il, true); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldind_I); il.Emit(OpCodes.Stloc, locals.DataPointer); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldind_I4); il.Emit(OpCodes.Stloc, locals.RemainingBytes); emittingCodec.EmitDecode(il, locals, doNoCheckBounds); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldloc, locals.DataPointer); il.Emit(OpCodes.Stind_I); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldloc, locals.RemainingBytes); il.Emit(OpCodes.Stind_I4); il.Emit(OpCodes.Ret); return(dynamicMethod); }
public void EmitDecode(IEmittingContext emittingContext) { codec.EmitDecode(emittingContext, false); }