Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there any way to programmatically determine in C/C++ how many parameters a Lua function expects?

Tags:

c++

lua

Is there a way to determine how many parameters a Lua function takes just before calling it from C/C++ code?

I looked at lua_Debug and lua_getinfo but they don't appear to provide what I need.

It may seem a bit like I am going against the spirit of Lua but I really want to bullet proof the interface that I have between Lua and C++. When a C++ function is called from Lua code the interface verifies that Lua has supplied the correct number of arguments and the type of each argument is correct. If a problem is found with the arguments a lua_error is issued.

I'd like to have similar error checking the other way around. When C++ calls a Lua function it should at least check that the Lua function doesn't declare more parameters than are necessary.

like image 264
Ashley Davis Avatar asked Dec 10 '22 21:12

Ashley Davis


2 Answers

What you're asking for isn't possible in Lua.

You can define a Lua function with a set of arguments like this:

function f(a, b, c)
   body
end

However, Lua imposes no restrictions on the number of arguments you pass to this function.

This is valid:

f(1,2,3,4,5)

The extra parameters are ignored.

This is also valid:

f(1)

The remaining arguments are assigned 'nil'.

Finally, you can defined a function that takes a variable number of arguments:

function f(a, ...)

At which point you can pass any number of arguments to the function.

See section 2.5.9 of the Lua reference manual.

The best you can do here is to add checks to your Lua functions to verify you receive the arguments you expect.

like image 159
Aaron Saarela Avatar answered May 11 '23 15:05

Aaron Saarela


You can determine the number of parameters, upvalues and whether the function accepts variable number of arguments in Lua 5.2, by using the 'u' type to fill nups, nparams, isvararg fields by get_info(). This feature is not available in Lua 5.1.

like image 23
Michal Kottman Avatar answered May 11 '23 16:05

Michal Kottman