Exemple #1
0
        public BenchMethod(Ref::MethodInfo minfo, BenchMethodAttribute attr)
        {
            this.minfo = minfo;
            this.attr  = attr;

            Emit::DynamicMethod m = new Emit::DynamicMethod(
                "bench",
                typeof(TimeSpan),
                new System.Type[] { typeof(int) },
                minfo.DeclaringType
                );
            //
            //	宣言
            //
            Emit::ILGenerator ilgen = m.GetILGenerator();

            System.Type        type_dt          = typeof(System.DateTime);
            Emit::LocalBuilder loc_start        = ilgen.DeclareLocal(type_dt);
            Emit::LocalBuilder loc_end          = ilgen.DeclareLocal(type_dt);
            Emit::LocalBuilder loc_i            = ilgen.DeclareLocal(typeof(int));
            Ref::MethodInfo    m_get_Now        = type_dt.GetMethod("get_Now");
            Ref::MethodInfo    m_op_Subtraction = type_dt.GetMethod("op_Subtraction", new System.Type[] { type_dt, type_dt });
            Emit::Label        label_loopC      = ilgen.DefineLabel();
            Emit::Label        label_loopJ      = ilgen.DefineLabel();

            //
            //	ロジック
            //
            //-- pro
            ilgen.Emit(Emit::OpCodes.Call, m_get_Now);
            ilgen.Emit(Emit::OpCodes.Stloc, loc_start);
            //-- loop
            ilgen.Emit(Emit::OpCodes.Ldc_I4_0);
            ilgen.Emit(Emit::OpCodes.Dup);            //
            ilgen.Emit(Emit::OpCodes.Stloc, loc_i);
            ilgen.Emit(Emit::OpCodes.Br_S, label_loopJ);

            ilgen.MarkLabel(label_loopC);
            ilgen.Emit(Emit::OpCodes.Call, minfo);
            if (minfo.ReturnType != typeof(void))
            {
                ilgen.Emit(Emit::OpCodes.Pop);
            }

            ilgen.Emit(Emit::OpCodes.Ldloc, loc_i);
            ilgen.Emit(Emit::OpCodes.Ldc_I4_1);
            ilgen.Emit(Emit::OpCodes.Add);
            ilgen.Emit(Emit::OpCodes.Dup);            //
            ilgen.Emit(Emit::OpCodes.Stloc, loc_i);
            ilgen.MarkLabel(label_loopJ);
            //ilgen.Emit(Emit::OpCodes.Ldloc,loc_i);
            ilgen.Emit(Emit::OpCodes.Ldarg_0);
            ilgen.Emit(Emit::OpCodes.Blt_S, label_loopC);

            //-- epi
            ilgen.Emit(Emit::OpCodes.Call, m_get_Now);
            ilgen.Emit(Emit::OpCodes.Stloc, loc_end);
            ilgen.Emit(Emit::OpCodes.Ldloc, loc_end);
            ilgen.Emit(Emit::OpCodes.Ldloc, loc_start);
            ilgen.Emit(Emit::OpCodes.Call, m_op_Subtraction);
            ilgen.Emit(Emit::OpCodes.Ret);

            this.meth = (MeasureTime)m.CreateDelegate(typeof(MeasureTime));
        }
Exemple #2
0
 /// <summary>
 /// 指定した ILGenerator を使用して ILGeneratorHelper を初期化します。
 /// </summary>
 /// <param name="gen">出力対象の ILGenerator を指定します。</param>
 public ILGeneratorHelper(Emit::ILGenerator gen)
 {
     this.gen = gen;
 }