diff --git a/Upsilon/BaseTypes/Number/ScriptNumberDouble.cs b/Upsilon/BaseTypes/Number/ScriptNumberDouble.cs index 693230b..80b088a 100644 --- a/Upsilon/BaseTypes/Number/ScriptNumberDouble.cs +++ b/Upsilon/BaseTypes/Number/ScriptNumberDouble.cs @@ -2,7 +2,7 @@ using System.Globalization; namespace Upsilon.BaseTypes.Number { - internal class ScriptNumberDouble : ScriptNumber + public class ScriptNumberDouble : ScriptNumber { public double Value { get; } protected internal override bool IsFloat { get; } = true; diff --git a/Upsilon/BaseTypes/TypeContainer.cs b/Upsilon/BaseTypes/TypeContainer.cs index 3eca1aa..b458992 100644 --- a/Upsilon/BaseTypes/TypeContainer.cs +++ b/Upsilon/BaseTypes/TypeContainer.cs @@ -6,7 +6,7 @@ namespace Upsilon.BaseTypes { public class TypeContainer { - public Type Type { get; } + public Type Type { get; protected set; } public virtual string UserData { get; } protected TypeContainer(Type t) @@ -77,6 +77,18 @@ namespace Upsilon.BaseTypes } } + internal class IgnoredUserDataTypeContainer : TypeContainer + { + public IgnoredUserDataTypeContainer() : base(BaseTypes.Type.Unknown) + { + Type = Type.UserData; + } + + public IgnoredUserDataTypeContainer(string userData) : base(userData) + { + } + } + public class UndefinedUserDataTypeContainer : TypeContainer { private System.Type RealType { get; set; } diff --git a/Upsilon/BaseTypes/UserData/GenericUserData.cs b/Upsilon/BaseTypes/UserData/GenericUserData.cs index 70e79de..d39bfbc 100644 --- a/Upsilon/BaseTypes/UserData/GenericUserData.cs +++ b/Upsilon/BaseTypes/UserData/GenericUserData.cs @@ -10,16 +10,7 @@ namespace Upsilon.BaseTypes.UserData Value = obj; _typeInfo = UserDataTypeHandler.GetTypeInfo(obj.GetType()); } - public override TypeContainer Type - { - get - { - var typeData = _typeInfo.BoundTypeName; - if (typeData != null) - return new TypeContainer(typeData); - return BaseTypes.Type.Unknown; - } - } + public override TypeContainer Type { get; } = new IgnoredUserDataTypeContainer(); private object Value { get; } private readonly UserDataType _typeInfo; diff --git a/Upsilon/BaseTypes/UserData/UserDataTypeOperators.cs b/Upsilon/BaseTypes/UserData/UserDataTypeOperators.cs index 71945a6..9f7b5d3 100644 --- a/Upsilon/BaseTypes/UserData/UserDataTypeOperators.cs +++ b/Upsilon/BaseTypes/UserData/UserDataTypeOperators.cs @@ -14,6 +14,7 @@ namespace Upsilon.BaseTypes.UserData Subtraction, Multiplication, Division, + Modulo } public class UserDataTypeOperators @@ -64,6 +65,9 @@ namespace Upsilon.BaseTypes.UserData case "op_Division": LoadMethod(OperatorType.Division, methodInfo); break; + case "op_Modulus": + LoadMethod(OperatorType.Modulo, methodInfo); + break; } } } diff --git a/Upsilon/BoundTypes/BoundTypeHandler.cs b/Upsilon/BoundTypes/BoundTypeHandler.cs index f8b4759..3a21134 100644 --- a/Upsilon/BoundTypes/BoundTypeHandler.cs +++ b/Upsilon/BoundTypes/BoundTypeHandler.cs @@ -43,7 +43,8 @@ namespace Upsilon.BoundTypes public static string GetTypeName(System.Type type) { - return TypeDefinitions.FirstOrDefault(x => x.Value.ValidInternalTypes.Contains(type)).Key; + return TypeDefinitions.FirstOrDefault(x => + x.Value.ValidInternalTypes.Any(validType => validType.IsAssignableFrom(type))).Key; } public static void LoadUserDataTypeDefinition(UserDataBoundTypeDefinition def) diff --git a/Upsilon/Evaluator/Evaluator.cs b/Upsilon/Evaluator/Evaluator.cs index 1fbb9fd..d8de77b 100644 --- a/Upsilon/Evaluator/Evaluator.cs +++ b/Upsilon/Evaluator/Evaluator.cs @@ -352,6 +352,13 @@ namespace Upsilon.Evaluator { return ((ScriptNumber)left) % ((ScriptNumber)right); } + else if (left.Type == Type.UserData) + { + var ud = (GenericUserData) left; + var (type, failed) = ud.BinaryOperator(left, OperatorType.Modulo, right); + if (failed) goto default; + return type; + } goto default; case BoundBinaryOperator.OperatorKind.Equality: return new ScriptBoolean(left.Equals(right));