|
@@ -27,11 +27,13 @@ namespace Jint.Runtime.Interop
|
|
int delegateArgumentsCount = parameterInfos.Length;
|
|
int delegateArgumentsCount = parameterInfos.Length;
|
|
int delegateNonParamsArgumentsCount = delegateContainsParamsArgument ? delegateArgumentsCount - 1 : delegateArgumentsCount;
|
|
int delegateNonParamsArgumentsCount = delegateContainsParamsArgument ? delegateArgumentsCount - 1 : delegateArgumentsCount;
|
|
|
|
|
|
- var parameters = new object[delegateArgumentsCount];
|
|
|
|
|
|
+ int jsArgumentsCount = jsArguments.Length;
|
|
|
|
+ int jsArgumentsWithoutParamsCount = Math.Min(jsArgumentsCount, delegateNonParamsArgumentsCount);
|
|
|
|
|
|
|
|
+ var parameters = new object[delegateArgumentsCount];
|
|
|
|
|
|
// convert non params parameter to expected types
|
|
// convert non params parameter to expected types
|
|
- for (var i = 0; i < delegateNonParamsArgumentsCount; i++)
|
|
|
|
|
|
+ for (var i = 0; i < jsArgumentsWithoutParamsCount; i++)
|
|
{
|
|
{
|
|
var parameterType = parameterInfos[i].ParameterType;
|
|
var parameterType = parameterInfos[i].ParameterType;
|
|
|
|
|
|
@@ -49,7 +51,7 @@ namespace Jint.Runtime.Interop
|
|
}
|
|
}
|
|
|
|
|
|
// assign null to parameters not provided
|
|
// assign null to parameters not provided
|
|
- for (var i = jsArguments.Length; i < delegateNonParamsArgumentsCount; i++)
|
|
|
|
|
|
+ for (var i = jsArgumentsWithoutParamsCount; i < delegateNonParamsArgumentsCount; i++)
|
|
{
|
|
{
|
|
if (parameterInfos[i].ParameterType.IsValueType)
|
|
if (parameterInfos[i].ParameterType.IsValueType)
|
|
{
|
|
{
|
|
@@ -64,24 +66,29 @@ namespace Jint.Runtime.Interop
|
|
// assign params to array and converts each objet to expected type
|
|
// assign params to array and converts each objet to expected type
|
|
if(delegateContainsParamsArgument)
|
|
if(delegateContainsParamsArgument)
|
|
{
|
|
{
|
|
- object[] paramsParameter = new object[jsArguments.Length - delegateNonParamsArgumentsCount];
|
|
|
|
- var paramsParameterType = parameterInfos[delegateArgumentsCount -1].ParameterType.GetElementType();
|
|
|
|
|
|
+ int paramsArgumentIndex = delegateArgumentsCount - 1;
|
|
|
|
+ int paramsCount = Math.Max(0, jsArgumentsCount - delegateNonParamsArgumentsCount);
|
|
|
|
|
|
- for (var i = delegateNonParamsArgumentsCount; i < jsArguments.Length; i++)
|
|
|
|
|
|
+ object[] paramsParameter = new object[paramsCount];
|
|
|
|
+ var paramsParameterType = parameterInfos[paramsArgumentIndex].ParameterType.GetElementType();
|
|
|
|
+
|
|
|
|
+ for (var i = paramsArgumentIndex; i < jsArgumentsCount; i++)
|
|
{
|
|
{
|
|
|
|
+ var paramsIndex = i - paramsArgumentIndex;
|
|
|
|
+
|
|
if (paramsParameterType == typeof(JsValue))
|
|
if (paramsParameterType == typeof(JsValue))
|
|
{
|
|
{
|
|
- paramsParameter[i - delegateNonParamsArgumentsCount] = jsArguments[i];
|
|
|
|
|
|
+ paramsParameter[paramsIndex] = jsArguments[i];
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
- paramsParameter[i - delegateNonParamsArgumentsCount] = Engine.ClrTypeConverter.Convert(
|
|
|
|
|
|
+ paramsParameter[paramsIndex] = Engine.ClrTypeConverter.Convert(
|
|
jsArguments[i].ToObject(),
|
|
jsArguments[i].ToObject(),
|
|
paramsParameterType,
|
|
paramsParameterType,
|
|
CultureInfo.InvariantCulture);
|
|
CultureInfo.InvariantCulture);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- parameters[delegateNonParamsArgumentsCount] = paramsParameter;
|
|
|
|
|
|
+ parameters[paramsArgumentIndex] = paramsParameter;
|
|
}
|
|
}
|
|
|
|
|
|
return JsValue.FromObject(Engine, _d.DynamicInvoke(parameters));
|
|
return JsValue.FromObject(Engine, _d.DynamicInvoke(parameters));
|