Search code examples
pointersffiluajit

How can I create a pointer to existing data using the LuaJIT FFI?


I know there are examples of creating pointers using the LuaJIT FFI, but most of these aren't pointed to existing data. One such example of this is here: How to pass a pointer to LuaJIT ffi to be used as out argument?

One thing that I haven't been able to successfully do is create a pointer to an existing value. In order to have a pointer type as far as I know, I have to know that I want to have a pointer point to it at some point in the future, as in:

local vao = ffi.new("GLuint[1]")
gl.GenVertexArrays(1, vao)
gl.BindVertexArray(vao[0])

Here, I know that glGenVertexArrays needs a pointer to vao, so I specify it as a GLuint[1]. In C, I would be doing something like the following:

GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

Here, I have no idea that I'll be needing a pointer to vao, so I can just specify it normally.

In other words, is there a way to get the address of, or create a pointer to, an existing value? Do I have to foresee what I'll be doing with the value before I create it?

Thanks!


Solution

  • There's no way to get a pointer to a cdata object in the FFI.

    I remember reading in the LuaJIT mailing list that this was done intentionally for some optimizations to work, though I can't find the exact message in the archive.

    So far, I haven't had a need for getting the pointer of a cdata object; LuaJIT refers to cdata by reference (similar to tables) and the type[1] trick works for out parameters.