private void SetupOperands(BinaryExpression n)
        {
            //push L
            n.Left.Visit(this);
            if(_lastWalkedType != n.InternalType.CilType)
            {
                switch(n.InternalType.CilType.ToString())
                {
                    case"System.Double":
                        _gen.Emit(OpCodes.Conv_R8);
                        break;
                    case "System.Int32":
                        _gen.Emit(OpCodes.Conv_I4);
                        break;
                }
            }

            //push R
            n.Right.Visit(this);
            if(_lastWalkedType != n.InternalType.CilType)
            {
                switch (n.InternalType.CilType.ToString())
                {
                    case "System.Double":
                        _gen.Emit(OpCodes.Conv_R8);
                        break;
                    case "System.Int32":
                        _gen.Emit(OpCodes.Conv_I4);
                        break;
                }
            }
        }
Пример #2
0
        private void VisitBinaryArithmetic(BinaryExpression n)
        {
            var lhs = CheckSubTree(n.Left);
            var rhs = CheckSubTree(n.Right);

            if (lhs.IsNumeric && rhs.IsNumeric)
            {
                _lastSeenType = n.InternalType = Supertype(lhs, rhs);
            }
            else if(lhs.CilType == typeof(DateTime) && rhs.CilType == typeof(DateTime))
            {
                _lastSeenType = n.InternalType = new TypeSpan();
            }
            else
            {
                ReportError(n.Location, "Invalid operands for operation {0}. Got types '{1}' and '{2}'.", n.GetType().ToString(), TypeToFriendlyName(lhs), TypeToFriendlyName(rhs));
            }
        }