|
@@ -1,5 +1,6 @@
|
|
|
using System.Globalization;
|
|
|
using System.Numerics;
|
|
|
+using System.Reflection;
|
|
|
using System.Runtime.CompilerServices;
|
|
|
using Esprima;
|
|
|
using Esprima.Ast;
|
|
@@ -1142,9 +1143,8 @@ namespace Jint.Runtime
|
|
|
for (var i = 0; i < arguments.Length; i++)
|
|
|
{
|
|
|
var jsValue = arguments[i];
|
|
|
- var paramType = method.Parameters[i].ParameterType;
|
|
|
|
|
|
- var parameterScore = CalculateMethodParameterScore(engine, jsValue, paramType);
|
|
|
+ var parameterScore = CalculateMethodParameterScore(engine, method.Parameters[i], jsValue);
|
|
|
if (parameterScore < 0)
|
|
|
{
|
|
|
return parameterScore;
|
|
@@ -1222,12 +1222,10 @@ namespace Jint.Runtime
|
|
|
/// <summary>
|
|
|
/// Determines how well parameter type matches target method's type.
|
|
|
/// </summary>
|
|
|
- private static int CalculateMethodParameterScore(
|
|
|
- Engine engine,
|
|
|
- JsValue jsValue,
|
|
|
- Type paramType)
|
|
|
+ private static int CalculateMethodParameterScore(Engine engine, ParameterInfo parameter, JsValue parameterValue)
|
|
|
{
|
|
|
- var objectValue = jsValue.ToObject();
|
|
|
+ var paramType = parameter.ParameterType;
|
|
|
+ var objectValue = parameterValue.ToObject();
|
|
|
var objectValueType = objectValue?.GetType();
|
|
|
|
|
|
if (objectValueType == paramType)
|
|
@@ -1237,7 +1235,7 @@ namespace Jint.Runtime
|
|
|
|
|
|
if (objectValue is null)
|
|
|
{
|
|
|
- if (!TypeIsNullable(paramType))
|
|
|
+ if (!parameter.IsOptional && !TypeIsNullable(paramType))
|
|
|
{
|
|
|
// this is bad
|
|
|
return -1;
|
|
@@ -1258,18 +1256,18 @@ namespace Jint.Runtime
|
|
|
return 5;
|
|
|
}
|
|
|
|
|
|
- if (paramType == typeof(int) && jsValue.IsInteger())
|
|
|
+ if (paramType == typeof(int) && parameterValue.IsInteger())
|
|
|
{
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
if (paramType == typeof(float) && objectValueType == typeof(double))
|
|
|
{
|
|
|
- return jsValue.IsInteger() ? 1 : 2;
|
|
|
+ return parameterValue.IsInteger() ? 1 : 2;
|
|
|
}
|
|
|
|
|
|
if (paramType.IsEnum &&
|
|
|
- jsValue is JsNumber jsNumber
|
|
|
+ parameterValue is JsNumber jsNumber
|
|
|
&& jsNumber.IsInteger()
|
|
|
&& paramType.GetEnumUnderlyingType() == typeof(int)
|
|
|
&& Enum.IsDefined(paramType, jsNumber.AsInteger()))
|
|
@@ -1284,7 +1282,7 @@ namespace Jint.Runtime
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
- if (jsValue.IsArray() && paramType.IsArray)
|
|
|
+ if (parameterValue.IsArray() && paramType.IsArray)
|
|
|
{
|
|
|
// we have potential, TODO if we'd know JS array's internal type we could have exact match
|
|
|
return 2;
|
|
@@ -1315,7 +1313,7 @@ namespace Jint.Runtime
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (ReflectionExtensions.TryConvertViaTypeCoercion(paramType, engine.Options.Interop.ValueCoercion, jsValue, out _))
|
|
|
+ if (ReflectionExtensions.TryConvertViaTypeCoercion(paramType, engine.Options.Interop.ValueCoercion, parameterValue, out _))
|
|
|
{
|
|
|
// gray JS zone where we start to do odd things
|
|
|
return 10;
|