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); }
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()); } }
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)); }