Пример #1
0
        private void EmitOptimizedPower(FleeIlGenerator ilg, bool emitOverflow, bool unsigned)
        {
            var right = (Int32LiteralElement)this.myRightChild;
            var flag  = right.Value == 0;

            if (flag)
            {
                ilg.Emit(OpCodes.Pop);
                LiteralElement.EmitLoad(1, ilg);
                ImplicitConverter.EmitImplicitNumericConvert(typeof(int), this.myLeftChild.ResultType, ilg);
            }
            else
            {
                var flag2 = right.Value == 1;
                if (!flag2)
                {
                    var num = right.Value - 1;
                    for (var i = 1; i <= num; i++)
                    {
                        ilg.Emit(OpCodes.Dup);
                    }
                    var num2 = right.Value - 1;
                    for (var j = 1; j <= num2; j++)
                    {
                        this.EmitMultiply(ilg, emitOverflow, unsigned);
                    }
                }
            }
        }
Пример #2
0
        protected override Type GetResultType(Type leftType, Type rightType)
        {
            var  flag          = !ImplicitConverter.EmitImplicitNumericConvert(rightType, typeof(int), null);
            Type getResultType = null;

            if (!flag)
            {
                var flag2 = !Utility.IsIntegralType(leftType);
                if (flag2)
                {
                    getResultType = null;
                }
                else
                {
                    switch (Type.GetTypeCode(leftType))
                    {
                    case TypeCode.SByte:
                    case TypeCode.Byte:
                    case TypeCode.Int16:
                    case TypeCode.UInt16:
                    case TypeCode.Int32:
                        getResultType = typeof(int);
                        break;

                    case TypeCode.UInt32:
                        getResultType = typeof(uint);
                        break;

                    case TypeCode.Int64:
                        getResultType = typeof(long);
                        break;

                    case TypeCode.UInt64:
                        getResultType = typeof(ulong);
                        break;

                    default:
                        Debug.Assert(false, "unknown left shift operand");
                        break;
                    }
                }
            }
            return(getResultType);
        }