Я в ситуации, когда получает от Lua таблицу строк. Мне нужно скопировать строки в массив, чтобы вызвать внутреннюю функцию C. Обработка строк является локальной для объема функции (т. Е. После того, как функция возвращает данные, строки не сохраняются).Нужно дублировать строки таблицы для локальной обработки области?
На данный момент, я что-то вроде этого:
int process_tokens(lua_State *lua)
{
char *tokens[TOKENS_MAX];
int ntokens = 0;
/* assume table at top */
while (ntokens < sizeof(tokens)/sizeof(*tokens)) {
lua_rawgeti(lua, -1, ntokens + 1);
if (lua_isnil(lua, -1))
break;
tokens[ntokens++] = luaL_checkstring(lua, -1);
lua_pop(lua, 1);
}
lua_pushnumber(lua, handle_tokens(tokens, ntokens));
return 1;
}
Теперь мой вопрос: является ли он безопасным для не дублировать строки здесь? Я бы склонен думать, что да, так как таблица, содержащая их, не может быть gc'ed до тех пор, пока функция process_tokens()
не вернется (если она не выскользнула из стека), поэтому строки, которые она содержит, тоже не могут быть. С другой стороны, я не нашел каких-либо указаний относительно того, где указатель, полученный при вызове luaL_checkstring()
, фактически указывает на (внутри объекта? Какой-то временный стек где-нибудь?).
['lua_tolstring возвращает полностью выровненный указатель к строке внутри состояния Lua. '] (http://www.lua.org/manual/5.1/manual.html#lua_tolstring) –
Если вы знаете, что эта таблица не может быть вызвана функцией и что' handle_tokens' не измените строки, которые он задает каким-либо образом (в том числе не желая получать один и тот же указатель для нескольких записей), тогда я считаю, что это безопасно. –
В общем, указатели, полученные от Lua в Lua CFunction, гарантированно остаются в силе во время работы CFunction. – lhf