Странная проблема с luabind :: object

В настоящее время я использую luabind, в частности https://github.com/rpavlik/luabind с момента официального выпуска устарел и больше не компилируется с последней версией boost.

У меня возникла очень странная проблема, которую я нигде не могу найти в сети. Мне удалось свести дело к очень простому сценарию.

В одном модуле у меня будет:

luabind::object value;

void functionA() {
    lua_pushstring(L,"yo");
    luabind::object temp(luabind::from_stack(L,-1));
    value = temp;
}

В другом модуле у меня будет:

void functionB() {
    printf("My Value: %s\n",luabind::object_cast<const char*>(value));
    printf("My Original value type: %d\n",luabind::type(value));
    value.push(L);
    luabind::object a1(luabind::from_stack(L,-1));
    printf("My Copy value type: %d\n",luabind::type(a1));
}

Когда я делаю functionA и functionB доступными из lua и вызываю их последовательно, вывод будет:

My Value: yo
My Original value type: 4
My Copy value type: 0

Как видите, объект по-прежнему ссылается на то, что luabind может распечатать. Но когда я пытаюсь поместить его в стек и создать новый объект из объекта стека, это приведет к нулевому значению.

Это происходит только в этом конкретном случае. Когда я помещаю все в одну функцию, все работает нормально. Когда я помещаю код в функции одного и того же модуля, он будет работать нормально. Я еще не сделал отдельный тестовый проект, но я не могу думать, что что-то в моем коде мешает, функции вызываются напрямую из lua.

Я делаю что-то неправильно? Или это ошибка? А если это ошибка, почему я никогда не слышал о подобном?


person cib    schedule 29.08.2011    source источник
comment
Мне было бы любопытно, если бы вы могли еще больше упростить тестовый пример, удалив Luabind и просто используя Lua C API (очевидно, вы можете - путем копирования / вставки - но вопрос в том, находится ли интересная ошибка в Lua или Luabind) .   -  person John Zwinck    schedule 30.08.2011
comment
@John Zwinck: Скорее всего, нет, поскольку использование класса, обернутого luabind, является предварительным условием для запуска ошибки. Я даже не знаю, хочу ли я попытаться понять, как размещение функции в классе, обернутом luabind (сама функция не требует обертывания), может вызвать изменение поведения.   -  person cib    schedule 01.09.2011


Ответы (1)


Кажется, мой тестовый пример был неполным. functionB также должна быть в классе, обернутом luabind. Я мог бы «решить» проблему, сделав функцию в классе прокси-функцией и вызвав оттуда глобальную функцию, содержащую мой код.

person cib    schedule 31.08.2011
comment
Тогда это похоже на ошибку. Я не уверен, почему вы не слышали об этом - возможно, этот конкретный сценарий реализовывался нечасто. Если вы можете получить это в виде небольшой тестовой программы, например: github.com / rpavlik / luabind / blob / master / test / Я могу добавить его в набор тестов в своей ветке. Вы можете попробовать спросить список рассылки luabind, особенно если у вас есть автоматизированный тест - кто-то там может знать. - person Ryan Pavlik; 11.11.2011