Example #1
0
        internal bool FindCast(SmallType pFromType, SmallType pToType, out MethodDefinition pDefinition)
        {
            pDefinition = default;
            var name = GetMethodName(null, CAST_METHOD);

            if (_methods.ContainsKey(name))
            {
                bool found = false;
                foreach (var md in _methods[name])
                {
                    if (pFromType == md.ArgumentTypes[0] && md.ReturnType == pFromType)
                    {
                        pDefinition = md;
                        return(true);
                    }

                    if (pFromType.IsAssignableFrom(md.ArgumentTypes[0]) && md.ReturnType == pToType)
                    {
                        pDefinition = md;
                        found       = true;
                    }
                }

                return(found);
            }

            return(false);
        }
Example #2
0
        internal static SmallType GetResultType(SmallType pLeft, BinaryExpressionOperator pOp, SmallType pRight)
        {
            switch (pOp)
            {
            case BinaryExpressionOperator.Addition:
            case BinaryExpressionOperator.Subtraction:
            case BinaryExpressionOperator.Multiplication:
            case BinaryExpressionOperator.Division:
            case BinaryExpressionOperator.Mod:
                if (pLeft.IsAssignableFrom(pRight))
                {
                    return(pLeft);
                }
                if (TypeHelper.IsFloat(pLeft) && TypeHelper.IsNumber(pRight))
                {
                    return(pLeft);
                }
                if (TypeHelper.IsFloat(pRight) && TypeHelper.IsNumber(pLeft))
                {
                    return(pRight);
                }
                return(SmallTypeCache.Undefined);

            case BinaryExpressionOperator.Equals:
            case BinaryExpressionOperator.GreaterThan:
            case BinaryExpressionOperator.GreaterThanOrEqual:
            case BinaryExpressionOperator.LessThan:
            case BinaryExpressionOperator.LessThanOrEqual:
            case BinaryExpressionOperator.NotEquals:
                if (pLeft.IsAssignableFrom(pRight))
                {
                    return(pLeft);
                }
                return(SmallTypeCache.Undefined);

            default:
                throw new NotSupportedException("Unknown binary expression operator " + pOp.ToString());
            }
        }
Example #3
0
 private bool CanCast(SmallType pFrom, SmallType pTo)
 {
     //Undefined types are caused by non-existent types
     //These errors will be caught when the type is first encountered
     return(pTo.IsAssignableFrom(pFrom));
 }