|
I analyzed the use of CallInfo func field,then I figured out that the field is used as either CClosure or LClosure.
There are actually 3 kinds of functions: - Lua closures - C closures - Light C functionsThe Lua calling convention is to push the function object to the Lua stack, followed by the function arguments. The `func` field refers to this function object, which can be any of the 3 function types.
First, at the entry of the VM dispatch loop (Lua 5.4.3), the CallInfo func field is cast as LClosure as follows:
The VM dispatch loop only makes sense for Lua closures. It's only called in situations where it's known that it's a Lua closure.
That said, now that you mention it really is a bit strange that it does a straight cast with clLvalue, without any checking. I wonder if it would make sense to have the `cl` be one of the parameters to luaV_execute. The places that call luaV_execute are all places that have checked the type tag of the function object and have the `cl` at hand.
Furthermore, the function index2value (./src/lapi.c) assumes that ci->func is type of either CClosure or LClosure implicitly as follows:
I think you might mean "light C function" instead of "Lua closure". The C API stuff is only accessible to C functions.
-- Hugo