Skip to content

Commit 4a73ecf

Browse files
spahnkeoliverbock
authored andcommitted
Cap length of supplied parameters array at maximum available parameters; add test case for ignoring redundant parameters
1 parent 12efc48 commit 4a73ecf

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

Source/Noesis.Javascript/JavascriptInterop.cpp

+10-3
Original file line numberDiff line numberDiff line change
@@ -692,10 +692,17 @@ JavascriptInterop::Invoker(const v8::FunctionCallbackInfo<Value>& iArgs)
692692

693693
if (members->Length > 0 && members[0]->MemberType == System::Reflection::MemberTypes::Method)
694694
{
695+
int maxParameters = 0;
696+
for (int i = 0; i < members->Length; i++)
697+
{
698+
System::Reflection::MethodInfo^ method = (System::Reflection::MethodInfo^) members[i];
699+
maxParameters = System::Math::Max(maxParameters, method->GetParameters()->Length);
700+
}
701+
695702
// parameters
696-
suppliedArguments = gcnew cli::array<System::Object^>(iArgs.Length());
703+
suppliedArguments = gcnew cli::array<System::Object^>(maxParameters);
697704
ConvertedObjects already_converted;
698-
for (int i = 0; i < iArgs.Length(); i++)
705+
for (int i = 0; i < maxParameters; i++)
699706
suppliedArguments[i] = ConvertFromV8(iArgs[i], already_converted);
700707

701708
// look for best matching method
@@ -710,7 +717,7 @@ JavascriptInterop::Invoker(const v8::FunctionCallbackInfo<Value>& iArgs)
710717
// not detect where nulls have been supplied (or insufficient parameters
711718
// have been supplied), but the corresponding parameter cannot accept
712719
// a null. This will trigger an exception during invocation.
713-
if (iArgs.Length() <= parametersInfo->Length)
720+
if (suppliedArguments->Length <= parametersInfo->Length)
714721
{
715722
int match = 0;
716723
int failed = 0;

Tests/Noesis.Javascript.Tests/ConvertFromJavascriptTests.cs

+10
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,16 @@ public void MethodCallWithoutParameters()
201201
result.Should().Be(1);
202202
}
203203

204+
[TestMethod]
205+
public void MethodCallWithoutParameters_RedundantArgumentsAreIgnored()
206+
{
207+
var obj = new TypedPropertiesClass();
208+
_context.SetParameter("obj", obj);
209+
var result = _context.Run("obj.methodWithoutParameters(42)");
210+
211+
result.Should().Be(1);
212+
}
213+
204214
[TestMethod]
205215
public void MethodCallWithParameter()
206216
{

0 commit comments

Comments
 (0)