GetReturnType() публичный абстрактный Метод

public abstract GetReturnType ( ITypeMapper typeMapper ) : Type
typeMapper ITypeMapper
Результат IKVM.Reflection.Type
Пример #1
0
        protected internal void EmitCallHelper(MethodBase mth, Operand target)
        {
            MethodInfo mi = mth as MethodInfo;

            if (mi != null)
            {
                bool suppressVirtual = ((object)target != null && target.SuppressVirtual) || mi.IsStatic || (((object)target != null) &&
                                                                                                             (target.GetReturnType(TypeMapper).IsValueType || target.GetReturnType(TypeMapper).IsArray) && !mi.IsVirtual);

                if (!suppressVirtual && (object)target != null && target.GetReturnType(TypeMapper).IsValueType&& mi.IsVirtual)
                {
                    IL.Emit(OpCodes.Constrained, target.GetReturnType(TypeMapper));
                }
                //Console.WriteLine("Emitting " + mth + ", using " + (suppressVirtual ? "call" : "callvirt"));
                IL.Emit(suppressVirtual ? OpCodes.Call : OpCodes.Callvirt, mi);
                return;
            }

            ConstructorInfo ci = mth as ConstructorInfo;

            if (ci != null)
            {
                IL.Emit(OpCodes.Call, ci);
                return;
            }

            throw new ArgumentException(Properties.Messages.ErrInvalidMethodBase, nameof(mth));
        }
        internal void EmitGetHelper(Operand op, Type desiredType, bool allowExplicitConversion)
        {
            if (desiredType.IsByRef)
            {
                if (op.GetReturnType(TypeMapper) != desiredType.GetElementType())
                {
                    throw new InvalidOperationException(Messages.ErrByRefTypeMismatch);
                }

                op.EmitAddressOf(this);
                return;
            }

            if ((object)op == null)
            {
                if (desiredType.IsValueType)
                {
                    throw new ArgumentNullException(nameof(op));
                }
                IL.Emit(OpCodes.Ldnull);
                return;
            }

            op.EmitGet(this);
            Convert(op, desiredType, allowExplicitConversion);
        }
Пример #3
0
        void EmitGetHelper_Conversion(Operand op, Type desiredType, Conversion conv, Type from = null)
        {
            if (conv.RequiresAddress)
            {
                if (ReferenceEquals(op, null))
                {
                    throw new ArgumentException("Conversion from nullref to " + desiredType.Name + " is impossible; for nullables variable it's required to load address.");
                }

                op.EmitAddressOf(this);
            }
            else if (ReferenceEquals(op, null))
            {
                IL.Emit(OpCodes.Ldnull);
            }
            else
            {
                op.EmitGet(this);
            }
            if (from == null)
            {
                from = (object)op == null ? null : op.GetReturnType(TypeMapper);
            }
            conv.Emit(this, from, desiredType);
        }
Пример #4
0
        protected internal static Type GetType(Operand op, ITypeMapper typeMapper)
        {
            if ((object)op == null)
            {
                return(null);
            }

            return(op.GetReturnType(typeMapper));
        }
Пример #5
0
        void DoInvoke(Operand invocation)
        {
            BeforeStatement();

            invocation.EmitGet(this);
            if (!Helpers.AreTypesEqual(invocation.GetReturnType(TypeMapper), typeof(void), TypeMapper))
            {
                IL.Emit(OpCodes.Pop);
            }
        }
Пример #6
0
 public IfBlock(Operand condition, ITypeMapper typeMapper)
 {
     if (!Helpers.AreTypesEqual(condition.GetReturnType(typeMapper), typeof(bool), typeMapper))
     {
         _condition = condition.IsTrue();
     }
     else
     {
         _condition = condition;
     }
 }
Пример #7
0
            public LoopBlock(IStatement init, Operand test, IStatement iter, ITypeMapper typeMapper)
            {
                _init = init;
                _test = test;
                _iter = iter;

                if (!Helpers.AreTypesEqual(test.GetReturnType(typeMapper), typeof(bool), typeMapper))
                {
                    test = test.IsTrue();
                }
            }
Пример #8
0
        public void InitObj(Operand target)
        {
            if ((object)target == null)
            {
                throw new ArgumentNullException(nameof(target));
            }

            BeforeStatement();

            target.EmitAddressOf(this);
            IL.Emit(OpCodes.Initobj, target.GetReturnType(TypeMapper));
        }
Пример #9
0
            public SwitchBlock(Operand expression, ITypeMapper typeMapper)
            {
                _typeMapper = typeMapper;
                _strCmp     = typeMapper.MapType(typeof(string)).GetMethod(
                    "Equals",
                    BindingFlags.Public | BindingFlags.Static,
                    null,
                    new Type[] { typeMapper.MapType(typeof(string)), typeMapper.MapType(typeof(string)) },
                    null);

                _expression = expression;

                Type exprType = expression.GetReturnType(typeMapper);

                foreach (var t in _validTypes)
                {
                    Type mapped = typeMapper.MapType(t);
                    if (mapped == exprType)
                    {
                        _govType = mapped;
                        break;
                    }
                }
                if (_govType == null)
                {
                    if (exprType.IsEnum)
                    {
                        _govType = Helpers.GetEnumEnderlyingType(exprType);
                    }
                    else
                    {
                        // if a single implicit coversion from expression to one of the valid types exists, it's ok
                        foreach (System.Type t in _validTypes)
                        {
                            Conversion tmp = Conversion.GetImplicit(expression, typeMapper.MapType(t), false, typeMapper);
                            if (tmp.IsValid)
                            {
                                if (_conv == null)
                                {
                                    _conv    = tmp;
                                    _govType = typeMapper.MapType(t);
                                    //if (_govType==expression.)
                                }
                                else
                                {
                                    throw new AmbiguousMatchException(Messages.ErrAmbiguousSwitchExpression);
                                }
                            }
                        }
                    }
                }
            }
Пример #10
0
        void EmitGetHelper_Ref(Operand op, Type desiredType)
        {
            if (ReferenceEquals(op, null))
            {
                throw new ArgumentException("Ref argument can't be null, expected " + desiredType.Name);
            }
            if (op.GetReturnType(TypeMapper) != desiredType.GetElementType())
            {
                throw new InvalidOperationException(Properties.Messages.ErrByRefTypeMismatch);
            }

            op.EmitAddressOf(this);
        }
Пример #11
0
            protected internal override void EmitSet(CodeGen g, Operand value, bool allowExplicitConversion)
            {
                OperandExtensions.SetLeakedState(this, false);
                CheckScope(g);

                if (_t == null)
                {
                    _t = value.GetReturnType(g.TypeMapper);
                }

                if (_var == null)
                {
                    _var = g.IL.DeclareLocal(_t);
                }

                Type nullableUnderlyingType = Helpers.GetNullableUnderlyingType(_t);

                if (ReferenceEquals(value, null))
                {
                    if (nullableUnderlyingType != null)
                    {
                        g.InitObj(this);
                        return;
                    }
                }
                else if (nullableUnderlyingType == value.GetReturnType(g.TypeMapper))
                {
                    EmitAddressOf(g);
                    g.EmitGetHelper(value, nullableUnderlyingType, false);
                    ConstructorInfo ctor = _t.GetConstructor(new [] { nullableUnderlyingType });
                    g.IL.Emit(OpCodes.Call, ctor);
                    return;
                }
                g.EmitGetHelper(value, _t, allowExplicitConversion);

                EmitSetFromStack(g);
            }
Пример #12
0
            protected override void BeginImpl()
            {
                _lbDecision = G.IL.DefineLabel();
                _lbDefault  = _lbEnd = G.IL.DefineLabel();

                _expression.EmitGet(G);
                if (_conv != null)
                {
                    _conv.Emit(G, _expression.GetReturnType(G.TypeMapper), _govType);
                }
                _exp = G.IL.DeclareLocal(_govType);
                G.IL.Emit(OpCodes.Stloc, _exp);
                G.IL.Emit(OpCodes.Br, _lbDecision);
                G._reachable = false;
            }
Пример #13
0
            public void InitializeCondition(Operand test)
            {
                if (ReferenceEquals(test, null))
                {
                    throw new ArgumentNullException(nameof(test));
                }
                if (!ReferenceEquals(_test, null))
                {
                    throw new InvalidOperationException("Loop condition has been already initialized");
                }

                if (!Helpers.AreTypesEqual(test.GetReturnType(_typeMapper), typeof(bool), _typeMapper))
                {
                    test = test.IsTrue();
                }
                _test = test;
            }
Пример #14
0
            internal override void EmitSet(CodeGen g, Operand value, bool allowExplicitConversion)
            {
                CheckScope(g);

                if (_t == null)
                {
                    _t = value.GetReturnType(g.TypeMapper);
                }

                if (_var == null)
                {
                    _var = g.IL.DeclareLocal(_t);
                }

                g.EmitGetHelper(value, _t, allowExplicitConversion);
                g.IL.Emit(OpCodes.Stloc, _var);
            }
Пример #15
0
            protected override void BeginImpl()
            {
                G.BeforeStatement();

                _enumerator = G.Local();
                _lbLoop     = G.IL.DefineLabel();
                _lbTest     = G.IL.DefineLabel();

                if (Helpers.IsAssignableFrom(typeof(IEnumerable), _collection.GetReturnType(G.TypeMapper), _typeMapper))
                {
                    _collection = _collection.Cast(_typeMapper.MapType(typeof(IEnumerable)));
                }

                G.Assign(_enumerator, _collection.Invoke("GetEnumerator", _typeMapper));
                G.IL.Emit(OpCodes.Br, _lbTest);
                G.IL.MarkLabel(_lbLoop);
                Element = G.Local(_elementType);
                G.Assign(Element, _enumerator.Property("Current", _typeMapper), true);
            }
Пример #16
0
        public void InitObj(Operand target)
        {
            if ((object)target == null)
            {
                throw new ArgumentNullException(nameof(target));
            }

            BeforeStatement();

            Type type = target.GetReturnType(TypeMapper);

            if (type.IsValueType)
            {
                target.EmitAddressOf(this);
                IL.Emit(OpCodes.Initobj, type);
            }
            else
            {
                Assign(target, null);
            }
        }
Пример #17
0
        public void UnsubscribeEvent(Operand target, string eventName, Operand handler)
        {
            if ((object)target == null)
            {
                throw new ArgumentNullException(nameof(target));
            }
            if ((object)handler == null)
            {
                throw new ArgumentNullException(nameof(handler));
            }

            IMemberInfo evt = TypeMapper.TypeInfo.FindEvent(target.GetReturnType(TypeMapper), eventName, target.IsStaticTarget);
            MethodInfo  mi  = ((EventInfo)evt.Member).GetRemoveMethod();

            if (!target.IsStaticTarget)
            {
                target.EmitGet(this);
            }
            handler.EmitGet(this);
            EmitCallHelper(mi, target);
        }
Пример #18
0
        /// <summary>
        /// Allows evaluation of <see cref="StaticFactory.Invoke"/>, <see cref="ExpressionFactory.New"/> and others. The result of the evaluation is discarded.
        /// </summary>
        /// <remarks>E.g. if you already have `exp.New(typeof(MyClass))` part you may wrap it with Eval: g.Eval(myExp).</remarks>
        public void Eval(Operand operand)
        {
            BeforeStatement();

            operand.EmitGet(this);
            if (!Helpers.AreTypesEqual(operand.GetReturnType(TypeMapper), typeof(void), TypeMapper))
            {
                if (!_leaveNextReturnOnStack)
                {
                    IL.Emit(OpCodes.Pop);
                }
                else
                {
                    _leaveNextReturnOnStack = false;
                }
            }
            else if (_leaveNextReturnOnStack)
            {
                throw new InvalidOperationException(nameof(LeaveNextReturnOnStack) + " called but operand " + operand.ToString() + " doesn't return a value");
            }
        }
Пример #19
0
        internal void EmitGetHelper(Operand op, Type desiredType, Conversion conv, Type from = null)
        {
            if (desiredType.IsPrimitive && op.ConstantValue != null)
            {
                var opType = op.GetReturnType(TypeMapper);
                if (opType.IsPrimitive && opType != desiredType)
                {
                    // hot swap literals
                    var c = op.ConstantValue;

                    object converted = null;
                    try
                    {
                        converted = Convert.ChangeType(c, System.Type.GetType(desiredType.FullName));
                    }
                    catch
                    {
                    }

                    if (converted != null)
                    {
                        Operand.FromObject(converted).EmitGet(this);
                        return;
                    }
                }
            }


            if (conv == null)
            {
                EmitGetHelper(op, desiredType, false);
                return;
            }

            EmitGetHelper_Conversion(op, desiredType.IsByRef ? desiredType.GetElementType() : desiredType, conv, from);
            if (desiredType.IsByRef)
            {
                EmitGetHelper_Ref(op, desiredType);
            }
        }
Пример #20
0
 public override Type GetReturnType(ITypeMapper typeMapper)
 {
     OperandExtensions.SetLeakedState(this, false);
     return(_operand.GetReturnType(typeMapper));
 }
Пример #21
0
        protected internal static Type GetType(Operand op, ITypeMapper typeMapper)
		{
			if ((object)op == null)
				return null;

			return op.GetReturnType(typeMapper);
		}
Пример #22
0
        void EmitGetHelper_Ref(Operand op, Type desiredType)
        {
            if (ReferenceEquals(op, null))
                throw new ArgumentException("Ref argument can't be null, expected " + desiredType.Name);
            if (op.GetReturnType(TypeMapper) != desiredType.GetElementType())
                throw new InvalidOperationException(Properties.Messages.ErrByRefTypeMismatch);

            op.EmitAddressOf(this);
        }
Пример #23
0
        void EmitGetHelper_Conversion(Operand op, Type desiredType, Conversion conv, Type from = null)
        {
            if (conv.RequiresAddress)
            {
                if (ReferenceEquals(op, null))
                    throw new ArgumentException("Conversion from nullref to " + desiredType.Name + " is impossible; for nullables variable it's required to load address.");

                op.EmitAddressOf(this);
            }
            else if (ReferenceEquals(op, null))
                IL.Emit(OpCodes.Ldnull);
            else
                op.EmitGet(this);
            if (from == null)
                from = (object)op == null ? null : op.GetReturnType(TypeMapper);
            conv.Emit(this, from, desiredType);
        }
Пример #24
0
        protected internal void EmitCallHelper(MethodBase mth, Operand target)
        {
            MethodInfo mi = mth as MethodInfo;
            if (mi != null)
            {
                bool suppressVirtual = ((object)target != null && target.SuppressVirtual) || mi.IsStatic || (((object)target != null) 
                    && (target.GetReturnType(TypeMapper).IsValueType|| target.GetReturnType(TypeMapper).IsArray) && !mi.IsVirtual);
                
                if (!suppressVirtual && (object)target != null && target.GetReturnType(TypeMapper).IsValueType && mi.IsVirtual)
                {
                    IL.Emit(OpCodes.Constrained, target.GetReturnType(TypeMapper));
                }
                //Console.WriteLine("Emitting " + mth + ", using " + (suppressVirtual ? "call" : "callvirt"));
                IL.Emit(suppressVirtual ? OpCodes.Call : OpCodes.Callvirt, mi);
                return;
            }

            ConstructorInfo ci = mth as ConstructorInfo;
            if (ci != null)
            {
                IL.Emit(OpCodes.Call, ci);
                return;
            }

            throw new ArgumentException(Properties.Messages.ErrInvalidMethodBase, nameof(mth));
        }
        internal void Convert(Operand op, Type to, bool allowExplicit)
        {
            Conversion conv = allowExplicit ? Conversion.GetExplicit(op, to, false, TypeMapper) : Conversion.GetImplicit(op, to, false, TypeMapper);

            conv.Emit(this, (object)op == null ? null : op.GetReturnType(TypeMapper), to);
        }
Пример #26
0
 public override Type GetReturnType(ITypeMapper typeMapper) => _op.GetReturnType(typeMapper).MakeByRefType();
Пример #27
0
			protected internal override void EmitSet(CodeGen g, Operand value, bool allowExplicitConversion)
			{
		        OperandExtensions.SetLeakedState(this, false); 
				CheckScope(g);

				if (_t == null)
					_t = value.GetReturnType(g.TypeMapper);

				if (_var == null)
					_var = g.IL.DeclareLocal(_t);

			    Type nullableUnderlyingType = Helpers.GetNullableUnderlyingType(_t);
			    if (ReferenceEquals(value, null))
			    {
			        if (nullableUnderlyingType != null)
			        {
			            g.InitObj(this);
			            return;
			        }
			    }
                else if (nullableUnderlyingType == value.GetReturnType(g.TypeMapper))
                {
                    EmitAddressOf(g);
                    g.EmitGetHelper(value, nullableUnderlyingType, false);
                    ConstructorInfo ctor = _t.GetConstructor(new [] { nullableUnderlyingType});
                    g.IL.Emit(OpCodes.Call, ctor);
                    return;
                }
                    g.EmitGetHelper(value, _t, allowExplicitConversion);

			    EmitSetFromStack(g);
			}