У меня есть некоторые объекты lua, которые являются оболочками для объектов C++, они содержат локальную ссылку на объект C++ и называют ее.Как создать оболочку lua C++ из C++
Теперь я хочу, чтобы некоторые функции в C++ возвращали эти оболочки, поэтому мне нужно вызвать эту функцию lua, а затем установить на ней объект C++.
У меня возникли сбои, и я подозреваю, что я не справляюсь со стволом lua. Например, если я запрашиваю lua_top перед тем, как выйти из функции, которая создает объект wrapper + C++, я получаю 5 в качестве результата, не должен ли он быть 1, если я верну 1 объект?
Так вот, что я делаю, может быть, я делаю это неправильно, возможно, есть лучший способ сделать это.
C++, .h:
#define gLuaGet(L, var, type) \
if (lua_istable(L, 1)) {\
lua_getfield(L, 1, "CObj");\
lua_replace(L, 1);\
}\
type& var = *(type*)lua_touserdata(L, 1);
#define gLuaCreate(L, type) new (lua_newuserdata(L, sizeof(type))) type();
class MyObject {
public:
MyObject();
int somefunc();
};
int MyObjectCreate(lua_State *L);
int MyObjectCallSomefunc(lua_State *L);
C++ .cpp:
int MyObject::somefunc() {
std::cerr << "in c++ function" << std::endl;
return 123;
}
int MyObjectCreate(lua_State *L) {
gLuaCreate(L, MyObject);
return 1;
}
int MyObjectCallSomefunc(lua_State *L) {
gLuaGet(L, obj, MyObject);
int r = obj.somefunc();
lua_checkstack(L, 1);
lua_pushnumber(L, r);
return 1;
}
Lua обертка:
function MyObject(donotinit)
self = {}
self.CObj = nil
if (donotinit == nil) then
self.CObj = MyObjectCreate()
end
self.setCObject = function(obj)
self.CObj = obj
end
self.somefunc = function()
return MyObjectCallSomeFunc(self)
end
return self
end
Теперь я хочу какой-нибудь другой обертку, чтобы вернуть MyObject, который созданный в C++, так что вот код C++, который вызывается из новой обертки (для лучшей читаемости я удалил проверку на чувствительность на lu a_pcall):
int returnLuaMyObject(lua_State *L) {
gLuaGet(L, obj, MyOtherObject);
MyObject *myObject = obj.getMyObject(); // get c++ part
lua_getglobal(L, "MyObject"); // create lua part
lua_pushnumber(L, 1); // and tell it not to initialize the self.CObj
lua_pcall(L, 1, 1, 0);
lua_getfield(L, -1, "setCObject"); // call the setCObject function
lua_pushlightuserdata(L, myObject); // give c++ object as param
lua_pcall(L, 1, 0, 0);
// at this point lua_gettop(L); returns 5, can this be correct?
return 1;
}
Ну, если я вызвать эту функцию с помощью Lua обертке теперь пару раз, кажется, все хорошо, но если я называю это позволяет сказать, что в 50 раз в цикле в то время, его сбой на случайные моменты времени (но всегда на той же линии C++)
Я делаю что-то не то здесь? Хорошо ли для вершины lua stack быть 5 в этой точке, где она возвращает только один объект?