Skip to content

Commit 139d571

Browse files
committed
Fix LuaFunction.Call with LuaFunctionCallParameters
1 parent 02167c1 commit 139d571

2 files changed

Lines changed: 87 additions & 1 deletion

File tree

src/Laylua/Library/Entities/Reference/Function/LuaFunction.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,17 @@ private static void PrepareForCall(LuaThread caller, LuaReference reference, int
4545
caller.Stack.Push(reference);
4646
}
4747

48+
private static void PrepareForCallWithStackArguments(LuaThread caller, LuaReference reference, int nargs)
49+
{
50+
caller.Stack.EnsureFreeCapacity(1);
51+
52+
caller.Stack.Push(reference);
53+
if (nargs > 0)
54+
{
55+
lua_rotate(caller.State.L, -(nargs + 1), 1);
56+
}
57+
}
58+
4859
internal static void PrepareForCall(LuaThread caller, LuaReference reference, int nargs, out int top)
4960
{
5061
PrepareForCall(caller, reference, nargs);
@@ -95,7 +106,7 @@ public void Call(in LuaFunctionCallParameters parameters)
95106
var nargs = parameters.ArgumentCount;
96107
var nresults = parameters.ResultCount ?? LUA_MULTRET;
97108

98-
PrepareForCall(caller, this, nargs);
109+
PrepareForCallWithStackArguments(caller, this, nargs);
99110
PCallCore(caller, nargs, nresults);
100111
}
101112

tests/Laylua.Tests/Tests/Library/Entities/Function/LuaFunctionTests.cs

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,4 +287,79 @@ public void Call_CallParametersWithLimitedResults_RestrictsFunctionResults([Valu
287287

288288
Lua.Stack.Pop(resultCount);
289289
}
290+
291+
[Test]
292+
public void Call_CallParametersWithStackArgument_ReturnsExpectedResult()
293+
{
294+
// Arrange
295+
using var function = Lua.Load("local x = ... return x + 1");
296+
Lua.Stack.EnsureFreeCapacity(1);
297+
Lua.Stack.Push(41);
298+
299+
var parameters = new LuaFunctionCallParameters
300+
{
301+
ArgumentCount = 1,
302+
ResultCount = 1
303+
};
304+
305+
// Act
306+
function.Call(in parameters);
307+
308+
// Assert
309+
Assert.That(Lua.Stack.Count, Is.EqualTo(1));
310+
Assert.That(Lua.Stack[-1].GetValue<int>(), Is.EqualTo(42));
311+
312+
Lua.Stack.Pop();
313+
}
314+
315+
[Test]
316+
public void Call_CallParametersWithChildThreadStackArgument_ReturnsExpectedResult()
317+
{
318+
// Arrange
319+
using var thread = Lua.CreateThread();
320+
using var function = Lua.Load("local x = ... return x + 1");
321+
thread.Stack.EnsureFreeCapacity(1);
322+
thread.Stack.Push(41);
323+
324+
var parameters = new LuaFunctionCallParameters
325+
{
326+
Caller = thread,
327+
ArgumentCount = 1,
328+
ResultCount = 1
329+
};
330+
331+
// Act
332+
function.Call(in parameters);
333+
334+
// Assert
335+
Assert.That(thread.Stack.Count, Is.EqualTo(1));
336+
Assert.That(thread.Stack[-1].GetValue<int>(), Is.EqualTo(42));
337+
338+
thread.Stack.Pop();
339+
}
340+
341+
[Test]
342+
public void Call_CallParametersWithCallableArgument_CallsTargetFunction()
343+
{
344+
// Arrange
345+
using var callableArgument = Lua.Load("return 'argument'");
346+
using var function = Lua.Load("return 'target'");
347+
Lua.Stack.EnsureFreeCapacity(1);
348+
Lua.Stack.Push(callableArgument);
349+
350+
var parameters = new LuaFunctionCallParameters
351+
{
352+
ArgumentCount = 1,
353+
ResultCount = 1
354+
};
355+
356+
// Act
357+
function.Call(in parameters);
358+
359+
// Assert
360+
Assert.That(Lua.Stack.Count, Is.EqualTo(1));
361+
Assert.That(Lua.Stack[-1].GetValue<string>(), Is.EqualTo("target"));
362+
363+
Lua.Stack.Pop();
364+
}
290365
}

0 commit comments

Comments
 (0)