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; } } }
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)); } }