https://news.ycombinator.com/item?id=46228597
https://news.ycombinator.com/item?id=46259334
Also talking about the Knuth boy/man test: https://news.ycombinator.com/item?id=46020151
Not a bad thing, but that really question if there is some active micro-
Lua has its own allocator, which will also collect for you. lua_newuserdata. At the expense of having to set executable yourself, but without all the inbuilt inefficiencies the article points out.
That said, I'm not sure that solution beats out this one. I'm using a linked list on top of an arena allocator in practice, which means allocations happen once every 0x10000 bytes. (A single C closure of mine takes up exactly 16 bytes, which includes the pointer to the next linked list node. I'm very happy with how it's designed.)
void lua_setallocf (lua_State *L, lua_Alloc f, void *ud);First, it would mean that all Lua objects would be allocated in memory that's potentially executable. That might not necessarily be more of a security issue than the app inherently allows, but at least it's wasteful.
Second, I'm not entirely sure it's a good idea to have C callbacks be collectable, which is why currently they aren't, and you have to free them manually via my winapi.freecallback function. This is part of the inherent issue in the fact that the Windows API has its own concept of lifetimes that are different than Lua's collection visibility. I would like to try to tie them together if possible one day, I'm just not entirely sure how yet.
widdershins•1mo ago
Or, if you're worried about performance/memory, you could allocate a struct for `CALLBACK` to return as userdata, containing the function pointer and `findex`. If you made a little allocator for these it would be extremely fast.
I'm sure I'm missing things, but the solution you chose feels like the nuclear option.
comex•1mo ago
This was probably posted in response to this other link from two days ago, which is about about JIT-compiling wndproc callbacks in particular; the comments discuss the “proper” way to do it, which is to use GWLP_USERDATA:
https://news.ycombinator.com/item?id=46259334
At least, that’s the proper way to do it if you control the entire application. But for what’s apparently a thin wrapper that exposes Win32 APIs directly to Lua, I can understand picking an approach that makes life easier for the Lua code author, even if it’s hackier under the hood. It also avoids the need to write custom behavior for each API.
publicdebates•1mo ago
CodesInChaos•1mo ago
GWLP_USERDATA should be the best option, though the API for setting it and setting the WNDPROC being separate looks error prone.
publicdebates•1mo ago