private void EmitDecimal()
        {
            var primitiveOperand = PrimitiveInstruction.Operand;
            var methodReference  = primitiveOperand as MethodReference;
            var ctor             = methodReference.GetActualMethod <ConstructorInfo>();
            var types            = ctor.GetParameters();
            var instructions     = InstructionsIndexer.GetPrevoiusRangeOfInstructions(PrimitiveInstruction, types.Length);

            instructions.ForEach((instruction, i) => {
                var mapped  = OpCodesMapper.Map(instruction.OpCode);
                var operand = instruction.Operand;

                if (operand == null)
                {
                    ILGenerator.Emit(mapped);
                }
                else
                {
                    var typeCode = Type.GetTypeCode(operand.GetType());
                    ILGenerator.EmitPrimitiveByTypeCode(operand, typeCode);
                }
            });

            ILGenerator.Emit(OpCodes.Newobj, ctor);
        }
 internal PrimitiveEmitter(PrimitiveExpression primitiveExpression, ILGenerator ilGenerator, IOpCodeIndexer instructionsIndexer)
     : base(ilGenerator, instructionsIndexer)
 {
     PrimitiveExpression = primitiveExpression;
     Type = PrimitiveExpression.Value.GetType();
     PrimitiveInstruction = InstructionsIndexer.GetInstruction(PrimitiveExpression);
 }
        public override AstNode Emit()
        {
            if (IgnoreLeftOperand())
            {
                Node.Right.AcceptVisitor(Visitor, ILGenerator);
            }
            else
            {
                var memberReference = Node.Left as MemberReferenceExpression;

                if (memberReference != null)
                {
                    return(new MultipuleAssignmentEmitter(memberReference, Node.Right, ILGenerator, InstructionsIndexer, Visitor, Locals).Emit());
                }

                var instruction = InstructionsIndexer.GetLastInstructionInRange(Node);

                Node.Right.AcceptVisitor(Visitor, ILGenerator);
                Node.Left.AcceptVisitor(Visitor, ILGenerator);

                if (instruction.Operand != null)
                {
                    var methodReference = instruction.Operand as MethodReference;

                    if (methodReference != null)
                    {
                        var methodInfo = methodReference.GetActualMethod <MethodInfo>();
                        ILGenerator.Emit(OpCodes.Call, methodInfo);
                    }
                }
            }

            return(new AstNodeDecorator(Node, null));
        }
        private bool TryEmitNewObject()
        {
            Cil.Instruction instruction;

            if (InstructionsIndexer.TryGetNewObjectInstruction(Node, out instruction))
            {
                var methodReference = instruction.Operand as MethodReference;
                var constructorInfo = methodReference.GetActualMethod <ConstructorInfo>();

                ILGenerator.Emit(OpCodes.Newobj, constructorInfo);
                return(true);
            }

            return(false);
        }
Example #5
0
        private void EmitLoadFieldReference()
        {
            var instruction = InstructionsIndexer.GetInstruction(MemberReference);

            if (instruction == null || !IsPrimitive())
            {
                if (NonPublic)
                {
                    EmitPrivateReference();
                }
                else
                {
                    var opCode = GetLoadFieldOpCode();
                    ILGenerator.Emit(opCode, Member as FieldInfo);
                }

                MemberReference.Children.ForEach(c => c.AcceptVisitor(ILGenerator, Visitor));
            }
            else
            {
                EmitPrimitive(ILGenerator, instruction);
            }
        }
        private AstNode EmitNewObjectInitializer()
        {
            Type             parameterType = null;
            bool             requiresPop   = false;
            MethodInfo       methodInfo    = null;
            AstNodeDecorator nodeDecorator = null;
            var callOpCode      = _isPrimitive ? OpCodes.Call : OpCodes.Callvirt;
            var firstChild      = Node.Elements.First();
            var methodReference = Node.Elements.First().Annotation <MethodReference>();

            if (methodReference == null)
            {
                Cil.Instruction instruction;
                InstructionsIndexer.TryGetCallInstruction(firstChild, out instruction);
                methodReference = instruction.Operand as MethodReference;
            }

            methodInfo    = methodReference.GetActualMethod <MethodInfo>();
            parameterType = methodInfo.GetParameters()[0].ParameterType;
            requiresPop   = !methodInfo.ReturnType.Equals(TypeSystem.Void);

            Node.Elements.ForEach((node, i) => {
                ILGenerator.EmitLoadLocal(_localBuilder);
                nodeDecorator = node.AcceptVisitor(ILGenerator, Visitor);
                ILGenerator.EmitCastIfNeeded(nodeDecorator.Type, parameterType);
                ILGenerator.Emit(callOpCode, methodInfo);

                if (requiresPop)
                {
                    ILGenerator.Emit(OpCodes.Pop);
                }
            });

            ILGenerator.EmitLoadLocal(_localBuilder, true);

            return(new AstNodeDecorator(Node, Type));
        }