Mickey Shine
Mickey Shine

Reputation: 12549

Is there a built in routine to convert lightuserdata to int?

Lightuserdata is different from userdata so what can I do with it? I mean the operations of lightuserdata in lua. Looks like I cannot convert it to any other data type.

One of my case:

My C library returns a C pointer named 'c_pointer', AKA lightuserdata to Lua, and then I want:

my_pointer = c_pointer +4

and then pass 'my_pointer' back to C library. Since I cannot do anything with 'c_pointer', so the expression 'c_pointer + 4' is invalid.

I am wondering are there some practical solutions to this?

Upvotes: 1

Views: 403

Answers (2)

finnw
finnw

Reputation: 48629

Plain Lua has no pointer arithmetic, so as Doug Currie stated you would need to do the pointer arithmetic on the C side.

LuaJIT on the other hand can do pointer arithmetic (via the FFI library), so consider using that instead.

Upvotes: 0

Doug Currie
Doug Currie

Reputation: 41180

Lightuserdata are created by C libraries. They are simply C pointers.

For example, you can use them to refer to data you allocate with malloc, or statically allocate in your module. Your C library can transfer these pointers to the Lua side as a lightuserdata using lua_pushlightuserdata, and later Lua can give it back to your library (or other C code) on the stack. Lua code can use the lightuserdata as any other value, storing it in a table, for example, even as a table key.

ADDENDUM

To answer your revised question, if you want to add an offset to the pointer, do it on the C side. Pass the lightuserdata and the integer offset to C, and let C do the offset using ptr[n]

void * ptr = lua_touserdata(L, idx1);
lua_Integer n = lua_tointeger(L. idx2);
// do something with
((char *)ptr)[n];

Upvotes: 2

Related Questions