Пример #1
0
        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();
            }
        }
Пример #3
0
        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();
            }
        }
Пример #4
0
        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);
        }
Пример #5
0
 public void EmitDecode(IEmittingContext emittingContext)
 {
     codec.EmitDecode(emittingContext, false);
 }