⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 convert.cs

📁 C#编译器源代码。Micorsoft开放源代码
💻 CS
📖 第 1 页 / 共 5 页
字号:
					return new OpcodeCast (expr, target_type, OpCodes.Conv_U8);				if (real_target_type == TypeManager.int32_type)					return new OpcodeCast (expr, target_type, OpCodes.Conv_I4);				if (real_target_type == TypeManager.int64_type)					return new OpcodeCast (expr, target_type, OpCodes.Conv_I8);				if (real_target_type == TypeManager.double_type)					return new OpcodeCast (expr, target_type, OpCodes.Conv_R8);				if (real_target_type == TypeManager.float_type)					return new OpcodeCast (expr, target_type, OpCodes.Conv_R4);				if (real_target_type == TypeManager.decimal_type)					return new CastToDecimal (expr);			} else if (expr_type == TypeManager.int32_type){				//				// From int to long, float, double, decimal				//				if (real_target_type == TypeManager.int64_type)					return new OpcodeCast (expr, target_type, OpCodes.Conv_I8);				if (real_target_type == TypeManager.double_type)					return new OpcodeCast (expr, target_type, OpCodes.Conv_R8);				if (real_target_type == TypeManager.float_type)					return new OpcodeCast (expr, target_type, OpCodes.Conv_R4);				if (real_target_type == TypeManager.decimal_type)					return new CastToDecimal (expr);			} else if (expr_type == TypeManager.uint32_type){				//				// From uint to long, ulong, float, double, decimal				//				if (real_target_type == TypeManager.int64_type)					return new OpcodeCast (expr, target_type, OpCodes.Conv_U8);				if (real_target_type == TypeManager.uint64_type)					return new OpcodeCast (expr, target_type, OpCodes.Conv_U8);				if (real_target_type == TypeManager.double_type)					return new OpcodeCast (expr, target_type, OpCodes.Conv_R_Un,							       OpCodes.Conv_R8);				if (real_target_type == TypeManager.float_type)					return new OpcodeCast (expr, target_type, OpCodes.Conv_R_Un,							       OpCodes.Conv_R4);				if (real_target_type == TypeManager.decimal_type)					return new CastToDecimal (expr);			} else if (expr_type == TypeManager.int64_type){				//				// From long/ulong to float, double				//				if (real_target_type == TypeManager.double_type)					return new OpcodeCast (expr, target_type, OpCodes.Conv_R8);				if (real_target_type == TypeManager.float_type)					return new OpcodeCast (expr, target_type, OpCodes.Conv_R4);				if (real_target_type == TypeManager.decimal_type)					return new CastToDecimal (expr);			} else if (expr_type == TypeManager.uint64_type){				//				// From ulong to float, double				//				if (real_target_type == TypeManager.double_type)					return new OpcodeCast (expr, target_type, OpCodes.Conv_R_Un,							       OpCodes.Conv_R8);				if (real_target_type == TypeManager.float_type)					return new OpcodeCast (expr, target_type, OpCodes.Conv_R_Un,							       OpCodes.Conv_R4);				if (real_target_type == TypeManager.decimal_type)					return new CastToDecimal (expr);			} else if (expr_type == TypeManager.char_type){				//				// From char to ushort, int, uint, long, ulong, float, double, decimal				// 				if ((real_target_type == TypeManager.ushort_type) ||				    (real_target_type == TypeManager.int32_type) ||				    (real_target_type == TypeManager.uint32_type))					return new EmptyCast (expr, target_type);				if (real_target_type == TypeManager.uint64_type)					return new OpcodeCast (expr, target_type, OpCodes.Conv_U8);				if (real_target_type == TypeManager.int64_type)					return new OpcodeCast (expr, target_type, OpCodes.Conv_I8);				if (real_target_type == TypeManager.float_type)					return new OpcodeCast (expr, target_type, OpCodes.Conv_R4);				if (real_target_type == TypeManager.double_type)					return new OpcodeCast (expr, target_type, OpCodes.Conv_R8);				if (real_target_type == TypeManager.decimal_type)					return new CastToDecimal (expr);			} else if (expr_type == TypeManager.float_type){				//				// float to double				//				if (real_target_type == TypeManager.double_type)					return new OpcodeCast (expr, target_type, OpCodes.Conv_R8);			}			return null;		}		/// <summary>		///  Same as ImplicitStandardConversionExists except that it also looks at		///  implicit user defined conversions - needed for overload resolution		/// </summary>		public static bool ImplicitConversionExists (EmitContext ec, Expression expr, Type target_type)		{			if (ImplicitStandardConversionExists (ec, expr, target_type))				return true;			Expression dummy = ImplicitUserConversion (ec, expr, target_type, Location.Null);			if (dummy != null)				return true;			return false;		}		public static bool ImplicitUserConversionExists (EmitContext ec, Type source, Type target)		{			return ImplicitUserConversion (ec, new EmptyExpression (source), target, Location.Null) != null;		}		/// <summary>		///  Determines if a standard implicit conversion exists from		///  expr_type to target_type		///		///  ec should point to a real EmitContext if expr.Type is TypeManager.anonymous_method_type.		/// </summary>		public static bool ImplicitStandardConversionExists (EmitContext ec, Expression expr, Type target_type)		{			Type expr_type = expr.Type;			if (expr_type == TypeManager.void_type)				return false;			if (expr_type == target_type)				return true;			// First numeric conversions 			if (expr_type == TypeManager.sbyte_type){				//				// From sbyte to short, int, long, float, double, decimal				//				if ((target_type == TypeManager.int32_type) || 				    (target_type == TypeManager.int64_type) ||				    (target_type == TypeManager.double_type) ||				    (target_type == TypeManager.float_type)  ||				    (target_type == TypeManager.short_type) ||				    (target_type == TypeManager.decimal_type))					return true;							} else if (expr_type == TypeManager.byte_type){				//				// From byte to short, ushort, int, uint, long, ulong, float, double, decimal				// 				if ((target_type == TypeManager.short_type) ||				    (target_type == TypeManager.ushort_type) ||				    (target_type == TypeManager.int32_type) ||				    (target_type == TypeManager.uint32_type) ||				    (target_type == TypeManager.uint64_type) ||				    (target_type == TypeManager.int64_type) ||				    (target_type == TypeManager.float_type) ||				    (target_type == TypeManager.double_type) ||				    (target_type == TypeManager.decimal_type))					return true;				} else if (expr_type == TypeManager.short_type){				//				// From short to int, long, double, float, decimal				// 				if ((target_type == TypeManager.int32_type) ||				    (target_type == TypeManager.int64_type) ||				    (target_type == TypeManager.double_type) ||				    (target_type == TypeManager.float_type) ||				    (target_type == TypeManager.decimal_type))					return true;								} else if (expr_type == TypeManager.ushort_type){				//				// From ushort to int, uint, long, ulong, double, float, decimal				//				if ((target_type == TypeManager.uint32_type) ||				    (target_type == TypeManager.uint64_type) ||				    (target_type == TypeManager.int32_type) ||				    (target_type == TypeManager.int64_type) ||				    (target_type == TypeManager.double_type) ||				    (target_type == TypeManager.float_type) ||				    (target_type == TypeManager.decimal_type))					return true;				    			} else if (expr_type == TypeManager.int32_type){				//				// From int to long, double, float, decimal				//				if ((target_type == TypeManager.int64_type) ||				    (target_type == TypeManager.double_type) ||				    (target_type == TypeManager.float_type) ||				    (target_type == TypeManager.decimal_type))					return true;								} else if (expr_type == TypeManager.uint32_type){				//				// From uint to long, ulong, double, float, decimal				//				if ((target_type == TypeManager.int64_type) ||				    (target_type == TypeManager.uint64_type) ||				    (target_type == TypeManager.double_type) ||				    (target_type == TypeManager.float_type) ||				    (target_type == TypeManager.decimal_type))					return true;								} else if ((expr_type == TypeManager.uint64_type) ||				   (expr_type == TypeManager.int64_type)) {				//				// From long/ulong to double, float, decimal				//				if ((target_type == TypeManager.double_type) ||				    (target_type == TypeManager.float_type) ||				    (target_type == TypeManager.decimal_type))					return true;				    			} else if (expr_type == TypeManager.char_type){				//				// From char to ushort, int, uint, ulong, long, float, double, decimal				// 				if ((target_type == TypeManager.ushort_type) ||				    (target_type == TypeManager.int32_type) ||				    (target_type == TypeManager.uint32_type) ||				    (target_type == TypeManager.uint64_type) ||				    (target_type == TypeManager.int64_type) ||				    (target_type == TypeManager.float_type) ||				    (target_type == TypeManager.double_type) ||				    (target_type == TypeManager.decimal_type))					return true;			} else if (expr_type == TypeManager.float_type){				//				// float to double				//				if (target_type == TypeManager.double_type)					return true;			}							if (expr.eclass == ExprClass.MethodGroup){				if (TypeManager.IsDelegateType (target_type) && RootContext.Version != LanguageVersion.ISO_1){					MethodGroupExpr mg = expr as MethodGroupExpr;					if (mg != null){						//						// This should not happen frequently, so we can create an object						// to test compatibility						//						Expression c = ImplicitDelegateCreation.Create (							ec, mg, target_type, true, Location.Null);						return c != null;					}				}			}						if (ImplicitReferenceConversionExists (expr, target_type))				return true;			//			// Implicit Constant Expression Conversions			//			if (expr is IntConstant){				int value = ((IntConstant) expr).Value;				if (target_type == TypeManager.sbyte_type){					if (value >= SByte.MinValue && value <= SByte.MaxValue)						return true;				} else if (target_type == TypeManager.byte_type){					if (value >= 0 && value <= Byte.MaxValue)						return true;				} else if (target_type == TypeManager.short_type){					if (value >= Int16.MinValue && value <= Int16.MaxValue)						return true;				} else if (target_type == TypeManager.ushort_type){					if (value >= UInt16.MinValue && value <= UInt16.MaxValue)						return true;				} else if (target_type == TypeManager.uint32_type){					if (value >= 0)						return true;				} else if (target_type == TypeManager.uint64_type){					 //					 // we can optimize this case: a positive int32					 // always fits on a uint64.  But we need an opcode					 // to do it.					 //					if (value >= 0)						return true;				}								if (value == 0 && expr is IntLiteral && TypeManager.IsEnumType (target_type))					return true;			}			if (expr is LongConstant && target_type == TypeManager.uint64_type){				//				// Try the implicit constant expression conversion				// from long to ulong, instead of a nice routine,				// we just inline it				//				long v = ((LongConstant) expr).Value;				if (v >= 0)					return true;			}						if ((target_type == TypeManager.enum_type ||			     target_type.IsSubclassOf (TypeManager.enum_type)) &&			     expr is IntLiteral){				IntLiteral i = (IntLiteral) expr;				if (i.Value == 0)					return true;			}			//			// If `expr_type' implements `target_type' (which is an iface)			// see TryImplicitIntConversion			// 			if (target_type.IsInterface && target_type.IsAssignableFrom (expr_type))				return true;			if (target_type == TypeManager.void_ptr_type && expr_type.IsPointer)				return true;			if (expr_type == TypeManager.anonymous_method_type){				if (!TypeManager.IsDelegateType (target_type))					return false;				AnonymousMethod am = (AnonymousMethod) expr;				Expression conv = am.Compatible (ec, target_type, true);				if (conv != null)					return true;			}			return false;		}		/// <summary>		///  Finds "most encompassed type" according to the spec (13.4.2)		///  amongst the methods in the MethodGroupExpr		/// </summary>		static Type FindMostEncompassedType (EmitContext ec, ArrayList types)		{			Type best = null;			if (types.Count == 0)				return null;			if (types.Count == 1)				return (Type) types [0];			EmptyExpression expr = EmptyExpression.Grab ();			foreach (Type t in types) {				if (best == null) {					best = t;					continue;				}				expr.SetType (t);				if (ImplicitStandardConversionExists (ec, expr, best))					best = t;			}			expr.SetType (best);			foreach (Type t in types) {				if (best == t)					continue;				if (!ImplicitStandardConversionExists (ec, expr, t)) {					best = null;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -