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

📄 ecore.cs

📁 C#编译器源代码。Micorsoft开放源代码
💻 CS
📖 第 1 页 / 共 5 页
字号:
			}			return System.Enum.ToObject (type, Child.GetValue ());		}				public override string AsString ()		{			return Child.AsString ();		}		public override DoubleConstant ConvertToDouble ()		{			return Child.ConvertToDouble ();		}		public override FloatConstant ConvertToFloat ()		{			return Child.ConvertToFloat ();		}		public override ULongConstant ConvertToULong ()		{			return Child.ConvertToULong ();		}		public override LongConstant ConvertToLong ()		{			return Child.ConvertToLong ();		}		public override UIntConstant ConvertToUInt ()		{			return Child.ConvertToUInt ();		}		public override IntConstant ConvertToInt ()		{			return Child.ConvertToInt ();		}		public override Constant Increment()		{			return new EnumConstant (Child.Increment (), type);		}		public override bool IsDefaultValue {			get {				return Child.IsDefaultValue;			}		}		public override bool IsZeroInteger {			get { return Child.IsZeroInteger; }		}		public override bool IsNegative {			get {				return Child.IsNegative;			}		}		public override Constant Reduce(EmitContext ec, Type target_type)		{			if (Child.Type == target_type)				return Child;			return Child.Reduce (ec, target_type);		}		public override Constant ToType (Type type, Location loc)		{			if (Type == type) {				// This is workaround of mono bug. It can be removed when the latest corlib spreads enough				if (TypeManager.IsEnumType (type.UnderlyingSystemType))					return this;				if (type.UnderlyingSystemType != Child.Type)					Child = Child.ToType (type.UnderlyingSystemType, loc);				return this;			}			if (!Convert.ImplicitStandardConversionExists (Convert.ConstantEC, this, type)){				Error_ValueCannotBeConverted (loc, type, false);				return null;			}			return Child.ToType (type, loc);		}	}	/// <summary>	///   This kind of cast is used to encapsulate Value Types in objects.	///	///   The effect of it is to box the value type emitted by the previous	///   operation.	/// </summary>	public class BoxedCast : EmptyCast {		public BoxedCast (Expression expr, Type target_type)			: base (expr, target_type)		{			eclass = ExprClass.Value;		}				public override Expression DoResolve (EmitContext ec)		{			// This should never be invoked, we are born in fully			// initialized state.			return this;		}		public override void Emit (EmitContext ec)		{			base.Emit (ec);						ec.ig.Emit (OpCodes.Box, child.Type);		}	}	public class UnboxCast : EmptyCast {		public UnboxCast (Expression expr, Type return_type)			: base (expr, return_type)		{		}		public override Expression DoResolve (EmitContext ec)		{			// This should never be invoked, we are born in fully			// initialized state.			return this;		}		public override void Emit (EmitContext ec)		{			Type t = type;			ILGenerator ig = ec.ig;						base.Emit (ec);			ig.Emit (OpCodes.Unbox, t);			LoadFromPtr (ig, t);		}	}		/// <summary>	///   This is used to perform explicit numeric conversions.	///	///   Explicit numeric conversions might trigger exceptions in a checked	///   context, so they should generate the conv.ovf opcodes instead of	///   conv opcodes.	/// </summary>	public class ConvCast : EmptyCast {		public enum Mode : byte {			I1_U1, I1_U2, I1_U4, I1_U8, I1_CH,			U1_I1, U1_CH,			I2_I1, I2_U1, I2_U2, I2_U4, I2_U8, I2_CH,			U2_I1, U2_U1, U2_I2, U2_CH,			I4_I1, I4_U1, I4_I2, I4_U2, I4_U4, I4_U8, I4_CH,			U4_I1, U4_U1, U4_I2, U4_U2, U4_I4, U4_CH,			I8_I1, I8_U1, I8_I2, I8_U2, I8_I4, I8_U4, I8_U8, I8_CH,			U8_I1, U8_U1, U8_I2, U8_U2, U8_I4, U8_U4, U8_I8, U8_CH,			CH_I1, CH_U1, CH_I2,			R4_I1, R4_U1, R4_I2, R4_U2, R4_I4, R4_U4, R4_I8, R4_U8, R4_CH,			R8_I1, R8_U1, R8_I2, R8_U2, R8_I4, R8_U4, R8_I8, R8_U8, R8_CH, R8_R4		}		Mode mode;				public ConvCast (Expression child, Type return_type, Mode m)			: base (child, return_type)		{			mode = m;		}		public override Expression DoResolve (EmitContext ec)		{			// This should never be invoked, we are born in fully			// initialized state.			return this;		}		public override string ToString ()		{			return String.Format ("ConvCast ({0}, {1})", mode, child);		}				public override void Emit (EmitContext ec)		{			ILGenerator ig = ec.ig;						base.Emit (ec);			if (ec.CheckState){				switch (mode){				case Mode.I1_U1: ig.Emit (OpCodes.Conv_Ovf_U1); break;				case Mode.I1_U2: ig.Emit (OpCodes.Conv_Ovf_U2); break;				case Mode.I1_U4: ig.Emit (OpCodes.Conv_Ovf_U4); break;				case Mode.I1_U8: ig.Emit (OpCodes.Conv_Ovf_U8); break;				case Mode.I1_CH: ig.Emit (OpCodes.Conv_Ovf_U2); break;				case Mode.U1_I1: ig.Emit (OpCodes.Conv_Ovf_I1_Un); break;				case Mode.U1_CH: /* nothing */ break;				case Mode.I2_I1: ig.Emit (OpCodes.Conv_Ovf_I1); break;				case Mode.I2_U1: ig.Emit (OpCodes.Conv_Ovf_U1); break;				case Mode.I2_U2: ig.Emit (OpCodes.Conv_Ovf_U2); break;				case Mode.I2_U4: ig.Emit (OpCodes.Conv_Ovf_U4); break;				case Mode.I2_U8: ig.Emit (OpCodes.Conv_Ovf_U8); break;				case Mode.I2_CH: ig.Emit (OpCodes.Conv_Ovf_U2); break;				case Mode.U2_I1: ig.Emit (OpCodes.Conv_Ovf_I1_Un); break;				case Mode.U2_U1: ig.Emit (OpCodes.Conv_Ovf_U1_Un); break;				case Mode.U2_I2: ig.Emit (OpCodes.Conv_Ovf_I2_Un); break;				case Mode.U2_CH: /* nothing */ break;				case Mode.I4_I1: ig.Emit (OpCodes.Conv_Ovf_I1); break;				case Mode.I4_U1: ig.Emit (OpCodes.Conv_Ovf_U1); break;				case Mode.I4_I2: ig.Emit (OpCodes.Conv_Ovf_I2); break;				case Mode.I4_U4: ig.Emit (OpCodes.Conv_Ovf_U4); break;				case Mode.I4_U2: ig.Emit (OpCodes.Conv_Ovf_U2); break;				case Mode.I4_U8: ig.Emit (OpCodes.Conv_Ovf_U8); break;				case Mode.I4_CH: ig.Emit (OpCodes.Conv_Ovf_U2); break;				case Mode.U4_I1: ig.Emit (OpCodes.Conv_Ovf_I1_Un); break;				case Mode.U4_U1: ig.Emit (OpCodes.Conv_Ovf_U1_Un); break;				case Mode.U4_I2: ig.Emit (OpCodes.Conv_Ovf_I2_Un); break;				case Mode.U4_U2: ig.Emit (OpCodes.Conv_Ovf_U2_Un); break;				case Mode.U4_I4: ig.Emit (OpCodes.Conv_Ovf_I4_Un); break;				case Mode.U4_CH: ig.Emit (OpCodes.Conv_Ovf_U2_Un); break;				case Mode.I8_I1: ig.Emit (OpCodes.Conv_Ovf_I1); break;				case Mode.I8_U1: ig.Emit (OpCodes.Conv_Ovf_U1); break;				case Mode.I8_I2: ig.Emit (OpCodes.Conv_Ovf_I2); break;				case Mode.I8_U2: ig.Emit (OpCodes.Conv_Ovf_U2); break;				case Mode.I8_I4: ig.Emit (OpCodes.Conv_Ovf_I4); break;				case Mode.I8_U4: ig.Emit (OpCodes.Conv_Ovf_U4); break;				case Mode.I8_U8: ig.Emit (OpCodes.Conv_Ovf_U8); break;				case Mode.I8_CH: ig.Emit (OpCodes.Conv_Ovf_U2); break;				case Mode.U8_I1: ig.Emit (OpCodes.Conv_Ovf_I1_Un); break;				case Mode.U8_U1: ig.Emit (OpCodes.Conv_Ovf_U1_Un); break;				case Mode.U8_I2: ig.Emit (OpCodes.Conv_Ovf_I2_Un); break;				case Mode.U8_U2: ig.Emit (OpCodes.Conv_Ovf_U2_Un); break;				case Mode.U8_I4: ig.Emit (OpCodes.Conv_Ovf_I4_Un); break;				case Mode.U8_U4: ig.Emit (OpCodes.Conv_Ovf_U4_Un); break;				case Mode.U8_I8: ig.Emit (OpCodes.Conv_Ovf_I8_Un); break;				case Mode.U8_CH: ig.Emit (OpCodes.Conv_Ovf_U2_Un); break;				case Mode.CH_I1: ig.Emit (OpCodes.Conv_Ovf_I1_Un); break;				case Mode.CH_U1: ig.Emit (OpCodes.Conv_Ovf_U1_Un); break;				case Mode.CH_I2: ig.Emit (OpCodes.Conv_Ovf_I2_Un); break;				case Mode.R4_I1: ig.Emit (OpCodes.Conv_Ovf_I1); break;				case Mode.R4_U1: ig.Emit (OpCodes.Conv_Ovf_U1); break;				case Mode.R4_I2: ig.Emit (OpCodes.Conv_Ovf_I2); break;				case Mode.R4_U2: ig.Emit (OpCodes.Conv_Ovf_U2); break;				case Mode.R4_I4: ig.Emit (OpCodes.Conv_Ovf_I4); break;				case Mode.R4_U4: ig.Emit (OpCodes.Conv_Ovf_U4); break;				case Mode.R4_I8: ig.Emit (OpCodes.Conv_Ovf_I8); break;				case Mode.R4_U8: ig.Emit (OpCodes.Conv_Ovf_U8); break;				case Mode.R4_CH: ig.Emit (OpCodes.Conv_Ovf_U2); break;				case Mode.R8_I1: ig.Emit (OpCodes.Conv_Ovf_I1); break;				case Mode.R8_U1: ig.Emit (OpCodes.Conv_Ovf_U1); break;				case Mode.R8_I2: ig.Emit (OpCodes.Conv_Ovf_I2); break;				case Mode.R8_U2: ig.Emit (OpCodes.Conv_Ovf_U2); break;				case Mode.R8_I4: ig.Emit (OpCodes.Conv_Ovf_I4); break;				case Mode.R8_U4: ig.Emit (OpCodes.Conv_Ovf_U4); break;				case Mode.R8_I8: ig.Emit (OpCodes.Conv_Ovf_I8); break;				case Mode.R8_U8: ig.Emit (OpCodes.Conv_Ovf_U8); break;				case Mode.R8_CH: ig.Emit (OpCodes.Conv_Ovf_U2); break;				case Mode.R8_R4: ig.Emit (OpCodes.Conv_R4); break;				}			} else {				switch (mode){				case Mode.I1_U1: ig.Emit (OpCodes.Conv_U1); break;				case Mode.I1_U2: ig.Emit (OpCodes.Conv_U2); break;				case Mode.I1_U4: ig.Emit (OpCodes.Conv_U4); break;				case Mode.I1_U8: ig.Emit (OpCodes.Conv_I8); break;				case Mode.I1_CH: ig.Emit (OpCodes.Conv_U2); break;				case Mode.U1_I1: ig.Emit (OpCodes.Conv_I1); break;				case Mode.U1_CH: ig.Emit (OpCodes.Conv_U2); break;				case Mode.I2_I1: ig.Emit (OpCodes.Conv_I1); break;				case Mode.I2_U1: ig.Emit (OpCodes.Conv_U1); break;				case Mode.I2_U2: ig.Emit (OpCodes.Conv_U2); break;				case Mode.I2_U4: ig.Emit (OpCodes.Conv_U4); break;				case Mode.I2_U8: ig.Emit (OpCodes.Conv_I8); break;				case Mode.I2_CH: ig.Emit (OpCodes.Conv_U2); break;				case Mode.U2_I1: ig.Emit (OpCodes.Conv_I1); break;				case Mode.U2_U1: ig.Emit (OpCodes.Conv_U1); break;				case Mode.U2_I2: ig.Emit (OpCodes.Conv_I2); break;				case Mode.U2_CH: /* nothing */ break;				case Mode.I4_I1: ig.Emit (OpCodes.Conv_I1); break;				case Mode.I4_U1: ig.Emit (OpCodes.Conv_U1); break;				case Mode.I4_I2: ig.Emit (OpCodes.Conv_I2); break;				case Mode.I4_U4: /* nothing */ break;				case Mode.I4_U2: ig.Emit (OpCodes.Conv_U2); break;				case Mode.I4_U8: ig.Emit (OpCodes.Conv_I8); break;				case Mode.I4_CH: ig.Emit (OpCodes.Conv_U2); break;				case Mode.U4_I1: ig.Emit (OpCodes.Conv_I1); break;				case Mode.U4_U1: ig.Emit (OpCodes.Conv_U1); break;				case Mode.U4_I2: ig.Emit (OpCodes.Conv_I2); break;				case Mode.U4_U2: ig.Emit (OpCodes.Conv_U2); break;				case Mode.U4_I4: /* nothing */ break;				case Mode.U4_CH: ig.Emit (OpCodes.Conv_U2); break;				case Mode.I8_I1: ig.Emit (OpCodes.Conv_I1); break;				case Mode.I8_U1: ig.Emit (OpCodes.Conv_U1); break;				case Mode.I8_I2: ig.Emit (OpCodes.Conv_I2); break;				case Mode.I8_U2: ig.Emit (OpCodes.Conv_U2); break;				case Mode.I8_I4: ig.Emit (OpCodes.Conv_I4); break;				case Mode.I8_U4: ig.Emit (OpCodes.Conv_U4); break;				case Mode.I8_U8: /* nothing */ break;				case Mode.I8_CH: ig.Emit (OpCodes.Conv_U2); break;				case Mode.U8_I1: ig.Emit (OpCodes.Conv_I1); break;				case Mode.U8_U1: ig.Emit (OpCodes.Conv_U1); break;				case Mode.U8_I2: ig.Emit (OpCodes.Conv_I2); break;				case Mode.U8_U2: ig.Emit (OpCodes.Conv_U2); break;				case Mode.U8_I4: ig.Emit (OpCodes.Conv_I4); break;				case Mode.U8_U4: ig.Emit (OpCodes.Conv_U4); break;				case Mode.U8_I8: /* nothing */ break;				case Mode.U8_CH: ig.Emit (OpCodes.Conv_U2); break;				case Mode.CH_I1: ig.Emit (OpCodes.Conv_I1); break;				case Mode.CH_U1: ig.Emit (OpCodes.Conv_U1); break;				case Mode.CH_I2: ig.Emit (OpCodes.Conv_I2); break;				case Mode.R4_I1: ig.Emit (OpCodes.Conv_I1); break;				case Mode.R4_U1: ig.Emit (OpCodes.Conv_U1); break;				case Mode.R4_I2: ig.Emit (OpCodes.Conv_I2); break;				case Mode.R4_U2: ig.Emit (OpCodes.Conv_U2); break;				case Mode.R4_I4: ig.Emit (OpCodes.Conv_I4); break;				case Mode.R4_U4: ig.Emit (OpCodes.Conv_U4); break;				case Mode.R4_I8: ig.Emit (OpCodes.Conv_I8); break;				case Mode.R4_U8: ig.Emit (OpCodes.Conv_U8); break;				case Mode.R4_CH: ig.Emit (OpCodes.Conv_U2); break;				case Mode.R8_I1: ig.Emit (OpCodes.Conv_I1); break;				case Mode.R8_U1: ig.Emit (OpCodes.Conv_U1); break;				case Mode.R8_I2: ig.Emit (OpCodes.Conv_I2); break;				case Mode.R8_U2: ig.Emit (OpCodes.Conv_U2); break;				case Mode.R8_I4: ig.Emit (OpCodes.Conv_I4); break;				case Mode.R8_U4: ig.Emit (OpCodes.Conv_U4); break;				case Mode.R8_I8: ig.Emit (OpCodes.Conv_I8); break;				case Mode.R8_U8: ig.Emit (OpCodes.Conv_U8); break;				case Mode.R8_CH: ig.Emit (OpCodes.Conv_U2); break;				case Mode.R8_R4: ig.Emit (OpCodes.Conv_R4); break;				}			}		}	}		public class OpcodeCast : EmptyCast {		OpCode op, op2;		bool second_valid;				public OpcodeCast (Expression child, Type return_type, OpCode op)			: base (child, return_type)					{			this.op = op;			second_valid = false;		}		public OpcodeCast (Expression child, Type return_type, OpCode op, OpCode op2)			: base (child, return_type)					{			this.op = op;			this.op2 = op2;			second_valid = true;		}		public override Expression DoResolve (EmitContext ec)		{			// This should never be invoked, we are born in fully			// initialized state.			return this;		}		public override void Emit (EmitContext ec)		{			base.Emit (ec);			ec.ig.Emit (op);			if (second_valid)				ec.ig.Emit (op2);		}				}	/// <summary>	///   This kind of cast is used to encapsulate a child and cast it	///   to the class requested	/// </summary>	public class ClassCast : EmptyCast {		public ClassCast (Expression child, Type return_type)			: base (child, return_type)					{		}		public override Expression DoResolve (EmitContext ec)		{			// This should never be invoked, we are born in fully			// initialized state.			return this;		}		public override void Emit (EmitContext ec)		{			base.Emit (ec);			ec.ig.Emit (OpCodes.Castclass, type);		}						}		/// <summary>	///   SimpleName expressions are formed of a single word and only happen at the beginning 	///   of a dotted-name.	/// </summary>	public class SimpleName : Expression {		public string Name;		bool in_transit;		public SimpleName (string name, Location l)		{			Name = name;			loc = l;		}		public static void Error_ObjectRefRequired (EmitContext ec, Location l, string name)		{			if (ec.IsFieldInitializer)				Report.Error (236, l,					"A field initializer cannot reference the nonstatic field, method, or property `{0}'",					name);			else {				if (name.LastIndexOf ('.') > 0)					name = name.Substring (name.LastIndexOf ('.') + 1);

⌨️ 快捷键说明

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