Wolfgang Pupp wrote: > Henk Boom wrote: > > I couldn't find a way to get the returned callback through the lua API > > I used lua_tointeger for this (not completely sure if it'd work with a > LuaJIT x64 build). It does, because lua_Integer is a ptrdiff_t per luaconf.h, which is an int64_t on x64. > Ran into some (surprising to me) quirks though: > print(ffi.cast('ptrdiff_t', 5)) --> cdata<int>: 0x... > print(ffi.new('ptrdiff_t[1]', 5)[0]) --> 5 > print(ffi.new('ptrdiff_t', 5)+0) --> 5LL > > I can understand why the cast would give me a boxed int instead of a > number-- I asked for it, after all, and the documentation says that > C->Lua type conversions only happen with return values from FFI-function > calls (or when dereferencing, thus case 2). The canonical way to convert a cdata pointer to a Lua number is: tonumber(ffi.cast('intptr_t', ffi.cast('void *', ptr))) This returns a signed result, which is cheaper to handle and turns into a no-op, when JIT-compiled. If you really need an unsigned address (and not just an abstract identifier), then use uintptr_t. > But I don't understand why I'm getting a different result for the third > case (a boxed int64). Can someone explain? ptrdiff_t is an int32_t on your platform and cdata number arithmetic coerces to int64_t/uint64_t. Only the 64 bit types have a tostring() metamethod that shows them as LL/ULL. [It's rarely helpful to operate on isolated, boxed 32 bit ints. They occur only as results of casts or as boxed enums. Plain Lua numbers work just as well.] --Mike