[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Lua's symbol table
- From: David Jeske <jeske@...>
- Date: Fri, 3 Aug 2001 19:51:03 -0700
On Sat, Aug 04, 2001 at 03:55:45AM +0200, Edgar Toernig wrote:
> Right. Lua does it by using unique strings: each string exists only
> once. So, two strings are equal if their (struct TString) pointers
> are equal. The pointers you get with lua_tostring are at a fixed offset
> from struct TString so they share the same property.
>
> There's only one thing to note: if a string is no longer used by Lua
> it may be garbage collected and the memory (and thus the pointer) may
> later be reused by another different string. So if you want the pointer
> to stay the same even if it's temporarily not used by Lua you should
> make sure that you keep a reference. That can be done either by calling
> lua_ref(L, 1) or by putting the string into some Lua data structure
> (table, function upvalue) that will not be collected.
It's not safe to assume that the string pointer does not change. You
should use lua_ref() to store a reference to the string in your C
code. Then when you need the string again, you can "getref" that
reference ID.
>
> Ehem... another note: this property of string pointers is afaik not
> documented.
>
> > Essentially what I want is something like:
> >
> > int get_symbol_id( const char* name );
> > const char* get_symbol_name( int id );
> > void lua_getglobal_using_id( lua_State* L, int id );
> > etc.
>
> This can be even done without knowing about the above mentioned
> property of string pointers. Use lua_ref/getref to map strings
> to integers. If you call get_symbol_id more then once for a given
> name you have to manage a lookup table though to not create
> multiple references for the same name.
>
> Ciao, ET.
--
David Jeske (N9LCA) + http://www.chat.net/~jeske/ + jeske@chat.net