示例#1
0
 public override void Generate(ILGenerator gen)
 {
     if (field.IsStatic)
     {
         gen.Emit(OpCodes.Ldsfld, field);
     }
     else
     {
         target.Generate(gen);
         gen.Emit(OpCodes.Ldfld, field);
     }
 }
 public override void GenerateSet(ILGenerator gen, CodeExpression value)
 {
     if (type.IsByRef) {
         gen.Emit (OpCodes.Ldarg, argNum);
         value.Generate (gen);
         CodeGenerationHelper.GenerateSafeConversion (gen, type.GetElementType (), value.GetResultType ());
         CodeGenerationHelper.SaveToPtr (gen, type.GetElementType ());
     }
     else {
         value.Generate (gen);
         CodeGenerationHelper.GenerateSafeConversion (gen, type, value.GetResultType ());
         gen.Emit (OpCodes.Starg, argNum);
     }
 }
示例#3
0
		public override void GenerateSet (ILGenerator gen, CodeExpression value)
		{
			if (field.IsStatic) {
				value.Generate (gen);
				CodeGenerationHelper.GenerateSafeConversion (gen, field.FieldType, value.GetResultType ());
				gen.Emit (OpCodes.Stsfld, field);
			}
			else {
				target.Generate (gen);
				value.Generate (gen);
				CodeGenerationHelper.GenerateSafeConversion (gen, field.FieldType, value.GetResultType ());
				gen.Emit (OpCodes.Stfld, field);
			}
		}
示例#4
0
 public override void GenerateSet(ILGenerator gen, CodeExpression value)
 {
     if (field.IsStatic)
     {
         value.Generate(gen);
         CodeGenerationHelper.GenerateSafeConversion(gen, field.FieldType, value.GetResultType());
         gen.Emit(OpCodes.Stsfld, field);
     }
     else
     {
         target.Generate(gen);
         value.Generate(gen);
         CodeGenerationHelper.GenerateSafeConversion(gen, field.FieldType, value.GetResultType());
         gen.Emit(OpCodes.Stfld, field);
     }
 }
示例#5
0
        public override void Generate(ILGenerator gen)
        {
            if (t1.IsPrimitive)
            {
                exp1.Generate(gen);
                exp2.Generate(gen);
                gen.Emit(OpCodes.Ceq);
            }
            else
            {
                exp1.Generate(gen);
                exp2.Generate(gen);
//				gen.Emit (OpCodes.Ceq);
                gen.EmitCall(OpCodes.Callvirt, t1.GetMethod("Equals", new Type[] { t2 }), null);
            }
        }
示例#6
0
 public override void GenerateSet(ILGenerator gen, CodeExpression value)
 {
     if (type.IsByRef)
     {
         gen.Emit(OpCodes.Ldarg, argNum);
         value.Generate(gen);
         CodeGenerationHelper.GenerateSafeConversion(gen, type.GetElementType(), value.GetResultType());
         CodeGenerationHelper.SaveToPtr(gen, type.GetElementType());
     }
     else
     {
         value.Generate(gen);
         CodeGenerationHelper.GenerateSafeConversion(gen, type, value.GetResultType());
         gen.Emit(OpCodes.Starg, argNum);
     }
 }
示例#7
0
        public override void Generate(ILGenerator gen)
        {
            if (!object.ReferenceEquals(retValue, null))
            {
                retValue.Generate(gen);
            }

            gen.Emit(OpCodes.Br, codeBuilder.ReturnLabel);
        }
示例#8
0
文件: CodeIs.cs 项目: raj581/Marvin
        public override void Generate(ILGenerator gen)
        {
            Type typeObj = exp.GetResultType();

            if (type.IsAssignableFrom(typeObj))
            {
                gen.Emit(OpCodes.Ldc_I4_1);
                return;
            }
            else if (!typeObj.IsAssignableFrom(type))
            {
                gen.Emit(OpCodes.Ldc_I4_0);
                return;
            }

            exp.Generate(gen);
            gen.Emit(OpCodes.Isinst, type);
            gen.Emit(OpCodes.Ldnull);
            gen.Emit(OpCodes.Cgt_Un);
        }
示例#9
0
        static void GenerateMethodCall(ILGenerator gen, CodeExpression target, MethodBase method, Type[] parameterTypes, params CodeExpression[] parameters)
        {
            OpCode callOp;

            if (parameterTypes.Length != parameters.Length)
            {
                throw GetMethodException(method, "Invalid number of parameters, expected " + parameterTypes.Length + ", found " + parameters.Length + ".");
            }

            if (!object.ReferenceEquals(target, null))
            {
                target.Generate(gen);

                Type targetType = target.GetResultType();
                if (targetType.IsValueType)
                {
                    LocalBuilder lb = gen.DeclareLocal(targetType);
                    gen.Emit(OpCodes.Stloc, lb);
                    gen.Emit(OpCodes.Ldloca, lb);
                    callOp = OpCodes.Call;
                }
                else
                {
                    callOp = OpCodes.Callvirt;
                }
            }
            else
            {
                callOp = OpCodes.Call;
            }

            for (int n = 0; n < parameterTypes.Length; n++)
            {
                try
                {
                    CodeExpression par = parameters[n];
                    par.Generate(gen);
                    GenerateSafeConversion(gen, parameterTypes[n], par.GetResultType());
                }
                catch (InvalidOperationException ex)
                {
                    throw GetMethodException(method, "Parameter " + n + ". " + ex.Message);
                }
            }

            if (method is MethodInfo)
            {
                gen.Emit(callOp, (MethodInfo)method);
            }
            else if (method is ConstructorInfo)
            {
                gen.Emit(callOp, (ConstructorInfo)method);
            }
        }
示例#10
0
        public override void Generate(ILGenerator gen)
        {
            Label falseLabel = gen.DefineLabel();
            Label endLabel   = gen.DefineLabel();

            if (exp1 is CodeConditionExpression)
            {
                ((CodeConditionExpression)exp1).GenerateForBranch(gen, falseLabel, false);
            }
            else
            {
                exp1.Generate(gen);
                gen.Emit(OpCodes.Brfalse, falseLabel);
            }

            exp2.Generate(gen);
            gen.Emit(OpCodes.Br, endLabel);
            gen.MarkLabel(falseLabel);
            gen.Emit(OpCodes.Ldc_I4_0);
            gen.MarkLabel(endLabel);
        }
示例#11
0
 void GenerateCondition(ILGenerator gen, Label falseLabel)
 {
     if (condition is CodeConditionExpression)
     {
         ((CodeConditionExpression)condition).GenerateForBranch(gen, falseLabel, false);
     }
     else
     {
         condition.Generate(gen);
         gen.Emit(OpCodes.Brfalse, falseLabel);
     }
 }
示例#12
0
        public override void Generate(ILGenerator gen)
        {
            Label falseLabel = gen.DefineLabel();
            Label endLabel   = gen.DefineLabel();

            GenerateCondition(gen, falseLabel);
            trueBlock.Generate(gen);
            gen.Emit(OpCodes.Br, endLabel);
            gen.MarkLabel(falseLabel);
            falseBlock.Generate(gen);

            gen.MarkLabel(endLabel);
        }
示例#13
0
        public override void Generate(ILGenerator gen)
        {
            Label startLabel = gen.DefineLabel();
            Label checkLabel = gen.DefineLabel();

            gen.Emit(OpCodes.Br, checkLabel);
            gen.MarkLabel(startLabel);
            whileBlock.Generate(gen);
            gen.MarkLabel(checkLabel);

            if (condition is CodeConditionExpression)
            {
                ((CodeConditionExpression)condition).GenerateForBranch(gen, startLabel, true);
            }
            else
            {
                condition.Generate(gen);
                gen.Emit(OpCodes.Brtrue, startLabel);
            }
        }
示例#14
0
		static void GenerateMethodCall (ILGenerator gen, CodeExpression target, MethodBase method, Type[] parameterTypes, params CodeExpression[] parameters)
		{
			OpCode callOp;
			
			if (parameterTypes.Length != parameters.Length)
				throw GetMethodException (method, "Invalid number of parameters, expected " + parameterTypes.Length + ", found " + parameters.Length + ".");  
			
			if (!object.ReferenceEquals (target, null)) 
			{
				target.Generate (gen);
				
				Type targetType = target.GetResultType();
				if (targetType.IsValueType) {
					LocalBuilder lb = gen.DeclareLocal (targetType);
					gen.Emit (OpCodes.Stloc, lb);
					gen.Emit (OpCodes.Ldloca, lb);
					callOp = OpCodes.Call;
				}
				else
					callOp = OpCodes.Callvirt;
			}
			else
				callOp = OpCodes.Call;

			for (int n=0; n<parameterTypes.Length; n++) {
				try {
					CodeExpression par = parameters[n];
					par.Generate (gen);
					GenerateSafeConversion (gen, parameterTypes[n], par.GetResultType());
				}
				catch (InvalidOperationException ex) {
					throw GetMethodException (method, "Parameter " + n + ". " + ex.Message);  
				}
			}
			
			if (method is MethodInfo)
				gen.Emit (callOp, (MethodInfo)method);
			else if (method is ConstructorInfo)
				gen.Emit (callOp, (ConstructorInfo)method);
		}
 public override void Generate(ILGenerator gen)
 {
     array.Generate(gen);
     gen.Emit(OpCodes.Ldlen);
 }
示例#16
0
        public override void Generate(ILGenerator gen)
        {
            array.Generate(gen);
            index.Generate(gen);

            Type t = array.GetResultType().GetElementType();

            if (t.IsEnum && t != typeof(Enum))
            {
                t = t.UnderlyingSystemType;
            }

            switch (Type.GetTypeCode(t))
            {
            case TypeCode.Byte:
                gen.Emit(OpCodes.Ldelem_U1);
                break;

            case TypeCode.Double:
                gen.Emit(OpCodes.Ldelem_R8);
                break;

            case TypeCode.Int16:
                gen.Emit(OpCodes.Ldelem_I2);
                break;

            case TypeCode.UInt32:
                gen.Emit(OpCodes.Ldelem_U4);
                break;

            case TypeCode.Int32:
                gen.Emit(OpCodes.Ldelem_I4);
                break;

            case TypeCode.UInt64:
            case TypeCode.Int64:
                gen.Emit(OpCodes.Ldelem_I8);
                break;

            case TypeCode.SByte:
                gen.Emit(OpCodes.Ldelem_I1);
                break;

            case TypeCode.Single:
                gen.Emit(OpCodes.Ldelem_R4);
                break;

            case TypeCode.UInt16:
                gen.Emit(OpCodes.Ldelem_U2);
                break;

            default:
                if (t.IsValueType)
                {
                    gen.Emit(OpCodes.Ldelema, t);
                    CodeGenerationHelper.LoadFromPtr(gen, t);
                }
                else
                {
                    gen.Emit(OpCodes.Ldelem_Ref);
                }
                break;
            }
        }
示例#17
0
        public override void GenerateSet(ILGenerator gen, CodeExpression value)
        {
            if (value == null)
            {
                throw new ArgumentNullException("value");
            }
            Type t = array.GetResultType().GetElementType();

            if (t.IsEnum && t != typeof(Enum))
            {
                t = t.UnderlyingSystemType;
            }

            array.Generate(gen);
            index.Generate(gen);

            switch (Type.GetTypeCode(t))
            {
            case TypeCode.Byte:
            case TypeCode.SByte:
                value.Generate(gen);
                gen.Emit(OpCodes.Stelem_I1);
                break;

            case TypeCode.Double:
                value.Generate(gen);
                gen.Emit(OpCodes.Stelem_R8);
                break;

            case TypeCode.UInt16:
            case TypeCode.Int16:
                value.Generate(gen);
                gen.Emit(OpCodes.Stelem_I2);
                break;

            case TypeCode.UInt32:
            case TypeCode.Int32:
                value.Generate(gen);
                gen.Emit(OpCodes.Stelem_I4);
                break;

            case TypeCode.UInt64:
            case TypeCode.Int64:
                value.Generate(gen);
                gen.Emit(OpCodes.Stelem_I8);
                break;

            case TypeCode.Single:
                value.Generate(gen);
                gen.Emit(OpCodes.Stelem_R4);
                break;

            default:
                if (t.IsValueType)
                {
                    gen.Emit(OpCodes.Ldelema, t);
                    value.Generate(gen);
                    gen.Emit(OpCodes.Stobj, t);
                }
                else
                {
                    value.Generate(gen);
                    gen.Emit(OpCodes.Stelem_Ref);
                }
                break;
            }
        }
 public override void Generate(ILGenerator gen)
 {
     exp.Generate(gen);
     gen.Emit(OpCodes.Neg);
 }
 public override void GenerateSet(ILGenerator gen, CodeExpression value)
 {
     value.Generate(gen);
     CodeGenerationHelper.GenerateSafeConversion(gen, type, value.GetResultType());
     gen.Emit(OpCodes.Stloc, localBuilder);
 }
		public override void GenerateSet (ILGenerator gen, CodeExpression value)
		{
			if (value == null)
				throw new ArgumentNullException ("value");
			Type t = array.GetResultType().GetElementType();
			if (t.IsEnum && t != typeof(Enum)) t = t.UnderlyingSystemType;
			
			array.Generate (gen);
			index.Generate (gen);
			
			switch (Type.GetTypeCode (t))
			{
				case TypeCode.Byte:
				case TypeCode.SByte:
					value.Generate (gen);
					gen.Emit (OpCodes.Stelem_I1);
					break;

				case TypeCode.Double:
					value.Generate (gen);
					gen.Emit (OpCodes.Stelem_R8);
					break;
					
				case TypeCode.UInt16:
				case TypeCode.Int16:
					value.Generate (gen);
					gen.Emit (OpCodes.Stelem_I2);
					break;
					
				case TypeCode.UInt32:
				case TypeCode.Int32:
					value.Generate (gen);
					gen.Emit (OpCodes.Stelem_I4);
					break;
					
				case TypeCode.UInt64:
				case TypeCode.Int64:
					value.Generate (gen);
					gen.Emit (OpCodes.Stelem_I8);
					break;
					
				case TypeCode.Single:
					value.Generate (gen);
					gen.Emit (OpCodes.Stelem_R4);
					break;
					
				default:
					if (t.IsValueType) {
						gen.Emit (OpCodes.Ldelema, t);
						value.Generate (gen);
						gen.Emit (OpCodes.Stobj, t);
					}
					else {
						value.Generate (gen);
						gen.Emit (OpCodes.Stelem_Ref);
					}
					break;
			}				
		}
示例#21
0
 public override void Generate(ILGenerator gen)
 {
     var.GenerateSet(gen, exp);
     exp.Generate(gen);
 }
 public override void GenerateSet(ILGenerator gen, CodeExpression value)
 {
     value.Generate (gen);
     CodeGenerationHelper.GenerateSafeConversion (gen, type, value.GetResultType ());
     gen.Emit (OpCodes.Stloc, localBuilder);
 }
示例#23
0
 public override void Generate(ILGenerator gen)
 {
     size.Generate(gen);
     gen.Emit(OpCodes.Newarr, elemType);
 }
 public override void Generate(ILGenerator gen)
 {
     exp.Generate(gen);
     gen.Emit(OpCodes.Ldc_I4_0);
     gen.Emit(OpCodes.Ceq);
 }
示例#25
0
        public override void Generate(ILGenerator gen)
        {
            if (decMet != null)
            {
                CodeGenerationHelper.GenerateMethodCall(gen, null, decMet, exp);
                return;
            }

            exp.Generate(gen);
            Type t = exp.GetResultType();

            switch (Type.GetTypeCode(t))
            {
            case TypeCode.Byte:
                gen.Emit(OpCodes.Ldc_I4_1);
                gen.Emit(OpCodes.Sub);
                gen.Emit(OpCodes.Conv_U1);
                break;

            case TypeCode.Double:
                gen.Emit(OpCodes.Ldc_R8, 1);
                gen.Emit(OpCodes.Sub);
                break;

            case TypeCode.Int16:
                gen.Emit(OpCodes.Ldc_I4_1);
                gen.Emit(OpCodes.Sub);
                gen.Emit(OpCodes.Conv_I2);
                break;

            case TypeCode.UInt32:
            case TypeCode.Int32:
                gen.Emit(OpCodes.Ldc_I4_1);
                gen.Emit(OpCodes.Sub);
                break;

            case TypeCode.UInt64:
            case TypeCode.Int64:
                gen.Emit(OpCodes.Ldc_I4_1);
                gen.Emit(OpCodes.Conv_U8);
                gen.Emit(OpCodes.Sub);
                break;

            case TypeCode.SByte:
                gen.Emit(OpCodes.Ldc_I4_1);
                gen.Emit(OpCodes.Sub);
                gen.Emit(OpCodes.Conv_I1);
                break;

            case TypeCode.Single:
                gen.Emit(OpCodes.Ldc_R4, 1);
                gen.Emit(OpCodes.Sub);
                break;

            case TypeCode.UInt16:
                gen.Emit(OpCodes.Ldc_I4_1);
                gen.Emit(OpCodes.Sub);
                gen.Emit(OpCodes.Conv_U2);
                break;
            }
        }
示例#26
0
        public override void Generate(ILGenerator gen)
        {
            exp.Generate(gen);

            Type typeObj = exp.GetResultType();

            if (type.IsAssignableFrom(typeObj))
            {
                if (typeObj.IsValueType)
                {
                    gen.Emit(OpCodes.Box, typeObj);
                }
                return;
            }
            else if (type.IsValueType && typeObj == typeof(object))
            {
                // Unbox
                gen.Emit(OpCodes.Unbox, type);
                CodeGenerationHelper.LoadFromPtr(gen, type);
                return;
            }
            else if (typeObj.IsAssignableFrom(type))
            {
                // Sub s = (Sub)base
                gen.Emit(OpCodes.Castclass, type);
                return;
            }
            else if (CodeGenerationHelper.IsNumber(type) && CodeGenerationHelper.IsNumber(typeObj))
            {
                switch (Type.GetTypeCode(type))
                {
                case TypeCode.Byte:
                    gen.Emit(OpCodes.Conv_U1);
                    return;

                case TypeCode.Double:
                    gen.Emit(OpCodes.Conv_R8);
                    return;

                case TypeCode.Int16:
                    gen.Emit(OpCodes.Conv_I2);
                    return;

                case TypeCode.Int32:
                    gen.Emit(OpCodes.Conv_I4);
                    return;

                case TypeCode.Int64:
                    gen.Emit(OpCodes.Conv_I8);
                    return;

                case TypeCode.SByte:
                    gen.Emit(OpCodes.Conv_I1);
                    return;

                case TypeCode.Single:
                    gen.Emit(OpCodes.Conv_R4);
                    return;

                case TypeCode.UInt16:
                    gen.Emit(OpCodes.Conv_U2);
                    return;

                case TypeCode.UInt32:
                    gen.Emit(OpCodes.Conv_U4);
                    return;

                case TypeCode.UInt64:
                    gen.Emit(OpCodes.Conv_U8);
                    return;
                }
            }

            MethodInfo imp = type.GetMethod("op_Implicit", new Type[] { typeObj });

            if (imp != null)
            {
                gen.Emit(OpCodes.Call, imp);
                return;
            }

            foreach (MethodInfo m in typeObj.GetMember("op_Explicit"))
            {
                if (m.ReturnType == type)
                {
                    gen.Emit(OpCodes.Call, m);
                    return;
                }
            }

            throw new InvalidOperationException("Can't cast from " + typeObj + " to " + type);
        }