Make Script conversion at end of execution use Type Binder, general Type Binder fixes
This commit is contained in:
parent
f1d8904ec9
commit
efea92d32a
|
@ -35,7 +35,6 @@ namespace Upsilon.BaseTypes.UserData
|
||||||
|
|
||||||
public bool IsValidMatch(MethodBase match, ref object[] args)
|
public bool IsValidMatch(MethodBase match, ref object[] args)
|
||||||
{
|
{
|
||||||
var validMatch = true;
|
|
||||||
var parameters = match.GetParameters();
|
var parameters = match.GetParameters();
|
||||||
for (var i = 0; i < parameters.Length; i++)
|
for (var i = 0; i < parameters.Length; i++)
|
||||||
{
|
{
|
||||||
|
@ -54,7 +53,7 @@ namespace Upsilon.BaseTypes.UserData
|
||||||
switch (typeCode)
|
switch (typeCode)
|
||||||
{
|
{
|
||||||
case TypeCode.Boolean:
|
case TypeCode.Boolean:
|
||||||
if (argument is ScriptBoolean b)
|
if (argument is ScriptBoolean)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -62,7 +61,7 @@ namespace Upsilon.BaseTypes.UserData
|
||||||
break;
|
break;
|
||||||
case TypeCode.Char:
|
case TypeCode.Char:
|
||||||
case TypeCode.String:
|
case TypeCode.String:
|
||||||
if (argument is ScriptString s)
|
if (argument is ScriptString)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -79,7 +78,7 @@ namespace Upsilon.BaseTypes.UserData
|
||||||
case TypeCode.UInt16:
|
case TypeCode.UInt16:
|
||||||
case TypeCode.UInt32:
|
case TypeCode.UInt32:
|
||||||
case TypeCode.UInt64:
|
case TypeCode.UInt64:
|
||||||
if (argument is ScriptNumber numeric)
|
if (argument is ScriptNumber)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -107,7 +106,7 @@ namespace Upsilon.BaseTypes.UserData
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return validMatch;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override object ChangeType(object value, System.Type type, CultureInfo culture)
|
public override object ChangeType(object value, System.Type type, CultureInfo culture)
|
||||||
|
@ -116,6 +115,13 @@ namespace Upsilon.BaseTypes.UserData
|
||||||
{
|
{
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
// ReSharper disable once ConditionIsAlwaysTrueOrFalse
|
||||||
|
if (value == null)
|
||||||
|
// ReSharper disable once HeuristicUnreachableCode
|
||||||
|
{
|
||||||
|
// ReSharper disable once HeuristicUnreachableCode
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
var typeCode = System.Type.GetTypeCode(type);
|
var typeCode = System.Type.GetTypeCode(type);
|
||||||
switch (typeCode)
|
switch (typeCode)
|
||||||
|
@ -181,7 +187,7 @@ namespace Upsilon.BaseTypes.UserData
|
||||||
var dictionary = (IDictionary)Activator.CreateInstance(requiredDictionaryType);
|
var dictionary = (IDictionary)Activator.CreateInstance(requiredDictionaryType);
|
||||||
foreach (var variable in table.EvaluationScope.Variables)
|
foreach (var variable in table.EvaluationScope.Variables)
|
||||||
{
|
{
|
||||||
dictionary.Add(variable.Key, variable.Value.ToCSharpObject());
|
dictionary.Add(variable.Key, ChangeType(variable.Value, requiredDictionaryType, culture));
|
||||||
}
|
}
|
||||||
return dictionary;
|
return dictionary;
|
||||||
}
|
}
|
||||||
|
@ -200,12 +206,18 @@ namespace Upsilon.BaseTypes.UserData
|
||||||
var list = (IList)Activator.CreateInstance(requiredListType);
|
var list = (IList)Activator.CreateInstance(requiredListType);
|
||||||
foreach (var variable in table.EvaluationScope.Variables)
|
foreach (var variable in table.EvaluationScope.Variables)
|
||||||
{
|
{
|
||||||
list.Add(variable.Value.ToCSharpObject());
|
list.Add(ChangeType(variable.Value, requiredListType, culture));
|
||||||
}
|
}
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
return table.EvaluationScope.Variables.Select(x => x.Value.ToCSharpObject()).ToArray();
|
{
|
||||||
|
var elementType = type.GetElementType();
|
||||||
|
var input = table.EvaluationScope.Variables.Select(x => ChangeType(x.Value, elementType, culture)).ToArray();
|
||||||
|
var array = Array.CreateInstance(elementType, input.Length);
|
||||||
|
input.CopyTo(array, 0);
|
||||||
|
return array;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Upsilon.BaseTypes;
|
using Upsilon.BaseTypes;
|
||||||
|
using Upsilon.BaseTypes.UserData;
|
||||||
using Upsilon.Binder;
|
using Upsilon.Binder;
|
||||||
using Upsilon.Parser;
|
using Upsilon.Parser;
|
||||||
using Upsilon.StandardLibraries;
|
using Upsilon.StandardLibraries;
|
||||||
|
@ -115,34 +117,14 @@ namespace Upsilon.Evaluator
|
||||||
|
|
||||||
private static T Convert<T>(ScriptType t)
|
private static T Convert<T>(ScriptType t)
|
||||||
{
|
{
|
||||||
if (t == null)
|
var result = UpsilonBinder.Default.ChangeType(t, typeof(T), CultureInfo.InvariantCulture);
|
||||||
return default(T);
|
if (result == null) return default(T);
|
||||||
var res = Convert(typeof(T), t);
|
return (T)result;
|
||||||
if (res == null)
|
|
||||||
return default(T);
|
|
||||||
if (typeof(IEnumerable).IsAssignableFrom(typeof(T)))
|
|
||||||
{
|
|
||||||
if (typeof(T).IsGenericType)
|
|
||||||
{
|
|
||||||
var elementType = typeof(T).GetGenericArguments()[0];
|
|
||||||
var input = (object[])res;
|
|
||||||
Array array = Array.CreateInstance(elementType, input.Length);
|
|
||||||
input.CopyTo(array, 0);
|
|
||||||
res = array;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (T)res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static object Convert(System.Type type, ScriptType t)
|
private static object Convert(System.Type type, ScriptType t)
|
||||||
{
|
{
|
||||||
if (t == null)
|
return UpsilonBinder.Default.ChangeType(t, type, CultureInfo.InvariantCulture);
|
||||||
return null;
|
|
||||||
if (type == typeof(double))
|
|
||||||
return System.Convert.ToDouble(t.ToCSharpObject());
|
|
||||||
if (type == typeof(long))
|
|
||||||
return System.Convert.ToInt64(t.ToCSharpObject());
|
|
||||||
return t.ToCSharpObject();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static object Convert(ScriptType t)
|
private static object Convert(ScriptType t)
|
||||||
|
|
Loading…
Reference in New Issue