2
votes

Is it possible for a piece of Lua userdata to hold reference to a Lua object? (Like a table, or another piece of userdata?). Basically, what I want to know is:

Can I create a piece of userdata in such a way taht when the gc runs, the user data can say: "Hey! I'm holding references to these other objects, mark them as well."

EDIT: responding to lhf:

Suppose I have:

struct Vertex {
  double x, y, z;
}

struct Quaternion {
  double w, x, y, z;
}

Now, I can do:

struct Foo {
  Vertex v;
  Quaternion q;
}

but suppose instead I want:

struct Bar {
  Vertex *v;
  Quaternion *q;
}

[i.e. suppose Vertex & Quaternion are really big pieces of userdata].

Now, suppose I have a Lua user function that takes a userdata Vertex, and a userdata Quaternion, and creates a userdata Bar (I don't want a userdata Foo since I want to save the space) -- then I need somehow for the userdata Vertex*/Quaternion* to not be gc-ed.

2
It seems convoluted. Why do you want to do this?lhf
@lhf: does the above edit make sense?anon
That's a different question now. The short answer is not to mix two styles of memory management: explicit in C vs automatic in Lua. See Norman's answer.lhf
How is that a different question? The point is that "Bar" now needs to say -- hey, this Vertex*/Quaternion* I'm pointing to, in the lua heap, also needs to be marked.anon

2 Answers

4
votes

Is it possible for a piece of lua user data to hold reference to a lua object?

No. A userdata can't hold a pointer to another Lua object. If you want to use a userdata to keep another Lua object alive, you have to do it using weak tables. Roberto's book as a section on how to do it.

0
votes

Been a while since I did anything with lua. I think that if the data referenced was created by the lua machine, then it will clean it up itself. Otherwise you must wait for the gc callback in your C code and free the memory yourself.