C++-Objekt bei lua im Stack speichern
-
Hallo!
Ich versuche eben, per Metatable und Userdata ein C++-Objekt im Stack von Lua zwischen zu speichern, bekomme es aber nicht hin. Ich habe schon gesehen, dass das welche gemacht haben, aber ich komme mit dem Stack einfach nicht klar. Hat jemand ein Beispiel, wie man einen beliebigen C++-Datentyp im Stack von Lua speichert und wieder herausholt?MfG
Florian
-
das würde mich auch mal interessieren, wusste garnicht das das überhaupt klappen soll.
bis jetzt mach ich das nur so dass ich einzelne daten aus einer klasse(keine klassen und so) nach LUA schiebe und dann verarbeite.
wenn man die ganze klasse benutzen könte wär das natürlich einfacher.
-
Ich habe inzwischen eine Lösung gefunden, aber nicht die optimale die ich wollte. Ich hätte lieber eine Matatabelle in Lua gehabt, wo ich die Objekte speichern kann, aber das bekomme ich irgendwie nicht hin. Stattdessen benutze ich jetzt die Lua-Registry zum abspeichern.
Und so wirds gemacht
// nClientSocket in der Registry unter "SSLSocket" speichern (nClientSocket ist genau genommen ein Pointer auf das eigendliche Objekt) lua_pushstring(luaState, "SSLSocket"); lua_pushlightuserdata(luaState, nClientSocket); lua_settable(luaState, LUA_REGISTRYINDEX); // Und wieder raus damit lua_pushstring(luaState, "SSLSocket"); lua_gettable(luaState, LUA_REGISTRYINDEX); SSLSocket *clientSocket = (SSLSocket*) lua_touserdata(luaState, -1); lua_pop(luaState, -1);
Der obige Code läuft übrigends meines wissens mach nur unter Lua 5, keine früheren Versionen (weil denen lua_pushlightuserdata fehlt).
Aber noch eine Warnung zur Sicherheit: Es wird keiner daran gehindert im Lua-Script den Pointer zu lesen oder zu verändern, da die Registry ja auch vom Script aus frei zugänglich ist. Das lässt sich wohl nur durch eine Änderung im Lua-Quellcode verhindern.
-
Ich weiss ja nicht, wie's bei Lua 5 ist. Bei Lua 4 benutze ich einfach Tag-Methoden um sicherzustellen, dass ein Script mir die Pointer nicht überschreiben kann. rawset() wird durch nil ersetzt, da es damit möglich wäre an der Tag-Methode vorbei einen Wert zu ändern.
Allerdings entspricht bei mir jedes C++ Objekt einer Lua-Table. Ich weiss nicht, ob man für die globale Table auch Tag-Methoden setzen kann. Oder ob's die bei Lua 5 überhaupt noch gibt...
-
Bei Lua 5 gibt es dafür die metatables (wusste in meinem ersten post nicht genau, für was die gut sind
). Damit kann man den = operator überladen. Muss ich mir mal genauer ansehen
-
Ich benutze jetzt toLua++ dafür aber das hört sich so an als ob das da so gemeacht wird wie frenki das macht(mit den tabellen).