Доступ к переменным Lua в userdata из C api

Я работаю над проектом, написанным на C++, который использует Lua в качестве языка сценариев. Чтобы облегчить отладку, мы реализовали сетевой отладчик, который получает код Lua, запускает его, кодирует возвращаемые значения в Json и отправляет эту строку обратно.

Мне удалось реализовать это для таблиц, но теперь я застрял с переменными, хранящимися в пользовательских данных. Например, у меня есть этот код Lua:

Elements.Avatar.testVar = 5

Elements.testVar = 15

return Elements    

// result
{
  "result0": "{Application:userdata; Avatar:userdata; Physics:userdata; testVar:15; }"
}

Application, Avatar а также Physics являются объектами, которые были созданы в C++. Два testVars однако были созданы в сценарии выше.Elements таблица, поэтому я могу перечислить все элементы, но Avatar.testVar кажется скрытым, потому что Avatar это LUA_TUSERDATA,

Кто-нибудь есть идеи, как я могу обнаружить переменные, которые были добавлены в userdata в Lua?

1 ответ

Решение

Не существует такой вещи, как "переменная, хранимая в пользовательских данных", по крайней мере, не так, как это касается Lua. С точки зрения Lua, userdata - это гигантский черный ящик. Все Avatar.testVar = 5 это называется метаметод __newindex в Avatar со строкой testVar и новое значение 15, То, как ваш метаметод C++ (поскольку только код C++ может помещать метаметоды в пользовательские данные) интерпретирует это, полностью зависит от вашего кода.

Так что это невозможно сделать с Луа. Ваш код должен будет содержать отладочные хуки. Lua 5.2 позволяет реализовать __pairs а также __ipairs метаметоды, которые pairs а также ipairs функции могут использовать для перебора ваших значений. Помимо этого, вы сами по себе запрашиваете то, что существует и не существует в пользовательских данных.

Другие вопросы по тегам