private ITest BuildCalli()
        {
            var action        = Build();
            var typeBuilder   = Module.DefineType(Guid.NewGuid().ToString(), TypeAttributes.Class | TypeAttributes.Public);
            var pointerField  = typeBuilder.DefineField("pointer", typeof(IntPtr), FieldAttributes.Private | FieldAttributes.InitOnly);
            var delegateField = typeBuilder.DefineField("delegate", typeof(Delegate), FieldAttributes.Private | FieldAttributes.InitOnly);
            var constructor   = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.HasThis, new[] { typeof(IntPtr), typeof(Delegate) });
            var il            = new GroboIL(constructor);

            il.Ldarg(0);
            il.Ldarg(1);
            il.Stfld(pointerField);
            il.Ldarg(0);
            il.Ldarg(2);
            il.Stfld(delegateField);
            il.Ret();
            var method = typeBuilder.DefineMethod("DoNothing", MethodAttributes.Public | MethodAttributes.Virtual, typeof(void), Type.EmptyTypes);

            il = new GroboIL(method);
            il.Ldarg(0);
            il.Ldfld(pointerField);
            il.Calli(CallingConventions.Standard, typeof(void), Type.EmptyTypes);
            il.Ret();
            typeBuilder.DefineMethodOverride(method, typeof(ITest).GetMethod("DoNothing"));
            typeBuilder.AddInterfaceImplementation(typeof(ITest));
            var type = typeBuilder.CreateType();

            return((ITest)Activator.CreateInstance(type, new object[] { DynamicMethodInvokerBuilder.DynamicMethodPointerExtractor((DynamicMethod)action.Item2), action.Item1 }));
        }
Esempio n. 2
0
        public unsafe void TestWriteAssemblerCode4()
        {
            var method = new DynamicMethod(Guid.NewGuid().ToString(), typeof(int), new[] { typeof(int), typeof(int), typeof(int), typeof(int) }, typeof(string), true);
            var il     = method.GetILGenerator();

            il.Emit(OpCodes.Ldarg_0);
            il.Emit(OpCodes.Ldarg_1);
            il.Emit(OpCodes.Ldarg_2);
            il.Emit(OpCodes.Ldarg_3);
            il.Emit(OpCodes.Ldarg_0);
            il.Emit(OpCodes.Ldarg_1);
            il.Emit(OpCodes.Ldarg_2);
            il.Emit(OpCodes.Ldarg_3);
            il.Emit(OpCodes.Ldarg_0);
            il.Emit(OpCodes.Ldarg_1);
            byte[] marker;
            if (IntPtr.Size == 8)
            {
                const long addr = 0x123456789ABCDEF1;
                marker = BitConverter.GetBytes(addr);
                il.Emit(OpCodes.Ldc_I8, addr);
            }
            else
            {
                const int addr = 0x12345678;
                marker = BitConverter.GetBytes(addr);
                il.Emit(OpCodes.Ldc_I4, addr);
            }
            il.EmitCalli(OpCodes.Calli, CallingConventions.Standard, typeof(int), new[] { typeof(int), typeof(int), typeof(int), typeof(int), typeof(int), typeof(int), typeof(int), typeof(int), typeof(int), typeof(int), }, null);
            il.Emit(OpCodes.Ret);
            var func    = (Func <int, int, int, int, int>)method.CreateDelegate(typeof(Func <int, int, int, int, int>));
            var pointer = DynamicMethodInvokerBuilder.DynamicMethodPointerExtractor(method);

            Console.WriteLine("{0:X}", pointer.ToInt64());

            //Replace((byte*)pointer, marker);

            var b = (byte *)pointer;

            for (int i = 0; i < 20; ++i)
            {
                for (int j = 0; j < 10; ++j)
                {
                    Console.Write(string.Format("{0:X2} ", *b++));
                }
                Console.WriteLine();
            }

            var stopwatch = Stopwatch.StartNew();

            for (int i = 0; i < 1000000001; ++i)
            {
                func(i, i, i, i);
            }
            var elapsed = stopwatch.Elapsed;

            Console.WriteLine(elapsed);
        }
Esempio n. 3
0
 public void LoadCompiledLambdaPointer(CompiledLambda compiledLambda)
 {
     if (TypeBuilder != null)
     {
         Il.Ldftn(compiledLambda.Method);
     }
     else
     {
         var stopwatch = Stopwatch.StartNew();
         var pointer   = DynamicMethodInvokerBuilder.DynamicMethodPointerExtractor((DynamicMethod)compiledLambda.Method);
         LambdaCompiler.TotalJITCompilationTime += stopwatch.Elapsed.TotalSeconds;
         Il.Ldc_IntPtr(pointer);
     }
 }
        private static Tuple <Delegate, IntPtr> EmitFieldExtractor <T, TValue>(FieldInfo field)
        {
            var method = new DynamicMethod(Guid.NewGuid().ToString(), typeof(TValue), new[] { typeof(T) }, typeof(string), true);

            using (var il = new GroboIL(method))
            {
                il.Ldarg(0); // stack: [list]
                il.Ldfld(field);
                il.Ret();
            }
            return(new Tuple <Delegate, IntPtr>((Func <T, TValue>)method.CreateDelegate(typeof(Func <T, TValue>)), DynamicMethodInvokerBuilder.DynamicMethodPointerExtractor(method)));
        }
        private static Tuple <Delegate, IntPtr> EmitListResizer <T>()
        {
            var method = new DynamicMethod(Guid.NewGuid().ToString(), typeof(void), new[] { typeof(List <T>), typeof(int) }, typeof(string), true);

            using (var il = new GroboIL(method))
            {
                il.Ldarg(0);                                                                                           // stack: [list]
                il.Ldarg(1);                                                                                           // stack: [list, arrayIndex]
                il.Ldc_I4(1);                                                                                          // stack: [list, arrayIndex, 1]
                il.Add();                                                                                              // stack: [list, arrayIndex + 1]
                il.Call(typeof(List <T>).GetMethod("EnsureCapacity", BindingFlags.Instance | BindingFlags.NonPublic)); // list.EnsureCapacity(arrayIndex + 1); stack: []
                il.Ldarg(0);                                                                                           // stack: [list]
                il.Ldarg(1);                                                                                           // stack: [list, arrayIndex]
                il.Ldc_I4(1);                                                                                          // stack: [list, arrayIndex, 1]
                il.Add();                                                                                              // stack: [list, arrayIndex + 1]
                il.Stfld(typeof(List <T>).GetField("_size", BindingFlags.Instance | BindingFlags.NonPublic));          // list.Count = arrayIndex + 1; stack: []
                il.Ret();
            }
            return(new Tuple <Delegate, IntPtr>((Action <List <T>, int>)method.CreateDelegate(typeof(Action <List <T>, int>)), DynamicMethodInvokerBuilder.DynamicMethodPointerExtractor(method)));
        }