Могут ли геттеры и сеттеры свойств Luabind дать результат?

Можно ли создать свойство Luabind с геттерами и сеттерами, которые уступают, пока они ждут выполнения запроса в другом потоке? Следующий синтаксис компилируется, но не работает:

luabind::class_<Foo>("Foo")
  .property("bar", &Foo::getBar, &Foo::setBar, luabind::yield)

Обертывание объекта на стороне Lua и добавление оберток свойств вокруг обычных функций — не лучший вариант, так как мне нужно определить эти свойства в базовых классах, а это потребовало бы значительного дублирования кода оболочки для каждого производного класса.


person Xtapolapocetl    schedule 14.11.2011    source источник


Ответы (1)


Следующий синтаксис компилируется, но не работает:

Конечно, это не работает; luabind::yield решает другую проблему. yield сообщает системе, что нужно выполнить после завершения функции, а не до и, конечно же, не в ее середине.

Вы не можете уступить в середине функций C/C++. В Lua 5.2 добавлена ​​возможность установить функцию «возобновления», но даже в этом случае существует серьезная опасность при использовании yield в коде C++, поскольку Lua обычно не очищает стек.

Что вам нужно сделать, так это выполнить перед вызовом функции. Это было бы эквивалентно этому коду Lua:

function myGet(...)
  local tester = StartAsyncAction(...);
  while(~tester:IsFinished()) do
    coroutine.yield();
  end
  return tester:Get(...);
end

Вы не можете имитировать это в C/C++; не с Lua 5.2. И Luabind не полностью поддерживает новые функции 5.2.

person Nicol Bolas    schedule 14.11.2011
comment
Я понимаю, как работает yield — у меня уже есть работающий планировщик сопрограмм. Эти функции немедленно возвращают объект (ScriptRequest), который обрабатывает передачу правильного возвращаемого значения обратно в luabind::resume_function, когда придет время. Все это отлично работает с обычными функциями, вместо этого я просто пытаюсь связать это со свойством. - person Xtapolapocetl; 14.11.2011
comment
@Xtapolapocetl: О. Ну, я думаю, тогда это просто ошибка Luabind. Хотя это и неудивительно, так как нет интерфейса для использования разных политик с методами геттера и сеттера. - person Nicol Bolas; 14.11.2011
comment
Ошибка в Luabind или просто отсутствие функциональности? Это похоже на то, что нужно поддерживать. - person Xtapolapocetl; 14.11.2011
comment
@Xtapolapocetl: это ошибка, поскольку .property без жалоб принимает политику yield. Если он не должен быть в состоянии уступить, он должен ошибиться, если вы попытаетесь это сделать. Если предполагается, что он может уступить, то он должен это сделать. - person Nicol Bolas; 14.11.2011