public void Emit(ILGenerator gen)
        {
            ArgumentsUtil.EmitLoadOwnerAndReference(owner, gen);

            foreach (var exp in args)
            {
                exp.Emit(gen);
            }

            if (VirtualCall)
            {
                gen.Emit(OpCodes.Callvirt, method);
            }
            else
            {
                gen.Emit(OpCodes.Call, method);
            }
        }
Пример #2
0
        public override void Emit(IMemberEmitter member, ILGenerator gen)
        {
            ArgumentsUtil.EmitLoadOwnerAndReference(owner, gen);

            foreach (Expression exp in args)
            {
                exp.Emit(member, gen);
            }

            if (virtualCall)
            {
                gen.Emit(OpCodes.Callvirt, method);
            }
            else
            {
                gen.Emit(OpCodes.Call, method);
            }
        }
Пример #3
0
        public override void Emit(IEasyMember member, ILGenerator gen)
        {
            ArgumentsUtil.EmitLoadOwnerAndReference(_syncLockSource, gen);

            gen.Emit(OpCodes.Call, typeof(Monitor).GetMethod("Enter"));

            Label tryBlock = gen.BeginExceptionBlock();

            foreach (Statement stmt in _stmts)
            {
                stmt.Emit(member, gen);
            }


            gen.BeginFinallyBlock();
            ArgumentsUtil.EmitLoadOwnerAndReference(_syncLockSource, gen);
            gen.Emit(OpCodes.Call, typeof(Monitor).GetMethod("Exit"));
            gen.EndExceptionBlock();
        }
Пример #4
0
 public override void Emit(IEasyMember member, System.Reflection.Emit.ILGenerator gen)
 {
     if (_reference != null)
     {
         ArgumentsUtil.EmitLoadOwnerAndReference(_reference, gen);
     }
     else if (_expression != null)
     {
         _expression.Emit(member, gen);
     }
     else
     {
         if (member.ReturnType != typeof(void))
         {
             OpCodeUtil.EmitLoadOpCodeForDefaultValueOfType(gen, member.ReturnType);
         }
     }
     gen.Emit(OpCodes.Ret);
 }
Пример #5
0
        public void Emit(IMemberEmitter member, ILGenerator gen)
        {
            if (reference != null)
            {
                ArgumentsUtil.EmitLoadOwnerAndReference(reference, gen);
            }
            else if (expression != null)
            {
                expression.Emit(member, gen);
            }
            else
            {
                if (member.ReturnType != typeof(void))
                {
                    OpCodeUtil.EmitLoadOpCodeForDefaultValueOfType(gen, member.ReturnType);
                }
            }

            gen.Emit(OpCodes.Ret);
        }
Пример #6
0
        public void Emit(ILGenerator gen)
        {
            if (reference != null)
            {
                ArgumentsUtil.EmitLoadOwnerAndReference(reference, gen);
            }
            else if (expression != null)
            {
                expression.Emit(gen);
            }

            var notNull = gen.DefineLabel();

            gen.Emit(OpCodes.Brtrue_S, notNull);
            ifNull.Emit(gen);
            gen.MarkLabel(notNull);
            if (ifNotNull != null)             // yeah, I know that reads funny :)
            {
                ifNotNull.Emit(gen);
            }
        }
Пример #7
0
        public override void Emit(IMemberEmitter member, ILGenerator gen)
        {
            var local = gen.DeclareLocal(typeof(object[]));

            gen.Emit(OpCodes.Ldc_I4, args.Length);
            gen.Emit(OpCodes.Newarr, typeof(object));
            gen.Emit(OpCodes.Stloc, local);

            for (var i = 0; i < args.Length; i++)
            {
                gen.Emit(OpCodes.Ldloc, local);
                gen.Emit(OpCodes.Ldc_I4, i);

                var reference = args[i];

                ArgumentsUtil.EmitLoadOwnerAndReference(reference, gen);

                if (reference.Type.GetTypeInfo().IsByRef)
                {
                    throw new NotSupportedException();
                }
                if (reference.Type.GetTypeInfo().IsPointer)
                {
                    gen.Emit(OpCodes.Call, ArgumentsUtil.IntPtrFromPointer());
                    gen.Emit(OpCodes.Box, typeof(IntPtr));
                }
                if (reference.Type.GetTypeInfo().IsValueType)
                {
                    gen.Emit(OpCodes.Box, reference.Type);
                }
                else if (reference.Type.GetTypeInfo().IsGenericParameter)
                {
                    gen.Emit(OpCodes.Box, reference.Type);
                }

                gen.Emit(OpCodes.Stelem_Ref);
            }

            gen.Emit(OpCodes.Ldloc, local);
        }
        public override void Emit(IMemberEmitter member, ILGenerator gen)
        {
            LocalBuilder local = gen.DeclareLocal(typeof(object[]));

            gen.Emit(OpCodes.Ldc_I4, args.Length);
            gen.Emit(OpCodes.Newarr, typeof(object));
            gen.Emit(OpCodes.Stloc, local);

            for (int i = 0; i < args.Length; i++)
            {
                gen.Emit(OpCodes.Ldloc, local);
                gen.Emit(OpCodes.Ldc_I4, i);

                TypeReference reference = args[i];

                ArgumentsUtil.EmitLoadOwnerAndReference(reference, gen);

                if (reference.Type.IsByRef)
                {
                    throw new NotSupportedException();
                }

                if (reference.Type.IsValueType)
                {
                    gen.Emit(OpCodes.Box, reference.Type.UnderlyingSystemType);
                }
                if (reference.Type.IsGenericParameter)
                {
                    gen.Emit(OpCodes.Box, reference.Type);
                }

                gen.Emit(OpCodes.Stelem_Ref);
            }

            gen.Emit(OpCodes.Ldloc, local);
        }
Пример #9
0
        public void Emit(ILGenerator gen)
        {
            var local = gen.DeclareLocal(typeof(object[]));

            gen.Emit(OpCodes.Ldc_I4, args.Length);
            gen.Emit(OpCodes.Newarr, typeof(object));
            gen.Emit(OpCodes.Stloc, local);

            for (var i = 0; i < args.Length; i++)
            {
                gen.Emit(OpCodes.Ldloc, local);
                gen.Emit(OpCodes.Ldc_I4, i);

                var reference = args[i];

                ArgumentsUtil.EmitLoadOwnerAndReference(reference, gen);

                if (reference.Type.IsByRef)
                {
                    throw new NotSupportedException();
                }

                if (reference.Type.IsValueType)
                {
                    gen.Emit(OpCodes.Box, reference.Type);
                }
                else if (reference.Type.IsGenericParameter)
                {
                    gen.Emit(OpCodes.Box, reference.Type);
                }

                gen.Emit(OpCodes.Stelem_Ref);
            }

            gen.Emit(OpCodes.Ldloc, local);
        }
Пример #10
0
 public override void Emit(IMemberEmitter member, ILGenerator gen)
 {
     ArgumentsUtil.EmitLoadOwnerAndReference(target.OwnerReference, gen);
     expression.Emit(member, gen);
     target.StoreReference(gen);
 }
Пример #11
0
 public override void Emit(IMemberEmitter member, ILGenerator gen)
 {
     ArgumentsUtil.EmitLoadOwnerAndReference(arrayReference, gen);
     ArgumentsUtil.EmitLoadOwnerAndReference(index, gen);
     gen.Emit(OpCodes.Ldelem, returnType);
 }
Пример #12
0
 public void Emit(ILGenerator gen)
 {
     ArgumentsUtil.EmitLoadOwnerAndReference(target.OwnerReference, gen);
     expression.Emit(gen);
     target.StoreReference(gen);
 }
Пример #13
0
        public override void Emit(IMemberEmitter member, ILGenerator gen)
        {
            ArgumentsUtil.EmitLoadOwnerAndReference(reference.OwnerReference, gen);

            reference.LoadAddressOfReference(gen);
        }
Пример #14
0
 public override void Emit(IEasyMember member, ILGenerator gen)
 {
     ArgumentsUtil.EmitLoadOwnerAndReference(_arrayReference, gen);
     ArgumentsUtil.EmitLoadOwnerAndReference(_index, gen);
     gen.Emit(OpCodes.Ldelem_Ref);
 }
Пример #15
0
 public void Emit(IMemberEmitter member, ILGenerator gen)
 {
     ArgumentsUtil.EmitLoadOwnerAndReference(argument, gen);
     expression.Emit(member, gen);
 }
Пример #16
0
 public void Emit(ILGenerator gen)
 {
     ArgumentsUtil.EmitLoadOwnerAndReference(arrayReference, gen);
     index.Emit(gen);
     gen.Emit(OpCodes.Ldelem_Ref);
 }
Пример #17
0
 public void Emit(ILGenerator gen)
 {
     ArgumentsUtil.EmitLoadOwnerAndReference(this, gen);
 }
 public override void Emit(IEasyMember member, ILGenerator gen)
 {
     ArgumentsUtil.EmitLoadOwnerAndReference(this._reference, gen);
 }
 public void Emit(ILGenerator gen)
 {
     ArgumentsUtil.EmitLoadOwnerAndReference(argument, gen);
     expression.Emit(gen);
 }
Пример #20
0
 public void Emit(IMemberEmitter member, ILGenerator gen)
 {
     ArgumentsUtil.EmitLoadOwnerAndReference(arrayReference, gen);
     ArgumentsUtil.EmitLoadOwnerAndReference(index, gen);
     gen.Emit(OpCodes.Ldelem_Ref);
 }