Переглянути джерело

Fix params array type handling under interop (#1216)

Marko Lahma 3 роки тому
батько
коміт
7da34e9ee5

+ 26 - 0
Jint.Tests/Runtime/InteropTests.cs

@@ -3012,5 +3012,31 @@ namespace Jint.Tests.Runtime
         {
             public int Sum(int a, int? b) => a + b.GetValueOrDefault(1);
         }
+
+        private delegate void ParamsTestDelegate(params Action[] callbacks);
+
+        [Fact]
+        public void CanUseParamsActions()
+        {
+            var engine = new Engine();
+            engine.SetValue("print", new Action<string>(_ => { }));
+            engine.SetValue("callAll", new DelegateWrapper(engine, new ParamsTestDelegate(ParamsTest)));
+
+            engine.Execute(@"
+                callAll(
+                    function() { print('a'); },
+                    function() { print('b'); },
+                    function() { print('c'); }
+                );
+            ");
+        }
+
+        private static void ParamsTest(params Action[] callbacks)
+        {
+            foreach (var callback in callbacks)
+            {
+                callback.Invoke();
+            }
+        }
     }
 }

+ 3 - 3
Jint/Runtime/Interop/DelegateWrapper.cs

@@ -102,8 +102,8 @@ namespace Jint.Runtime.Interop
                 int paramsArgumentIndex = delegateArgumentsCount - 1;
                 int paramsCount = Math.Max(0, jsArgumentsCount - delegateNonParamsArgumentsCount);
 
-                object[] paramsParameter = new object[paramsCount];
                 var paramsParameterType = parameterInfos[paramsArgumentIndex].ParameterType.GetElementType();
+                var paramsParameter = Array.CreateInstance(paramsParameterType!, paramsCount);
 
                 for (var i = paramsArgumentIndex; i < jsArgumentsCount; i++)
                 {
@@ -123,7 +123,7 @@ namespace Jint.Runtime.Interop
                             CultureInfo.InvariantCulture);
                     }
 
-                    paramsParameter[paramsIndex] = converted;
+                    paramsParameter.SetValue(converted, paramsIndex);
                 }
 
                 parameters[paramsArgumentIndex] = paramsParameter;
@@ -140,4 +140,4 @@ namespace Jint.Runtime.Interop
             }
         }
     }
-}
+}