[LUA] Stackverhalten



  • Ich hoffe mal, ich habe da richtige Forum erwischt. Leider scheint es ja kein Forum für Scriptsprachen zu geben.

    Mal eine kleine Frage zur Scriptsprache Lua.

    Ich habe folgenden C-Code:

    static int
    lua_require_module(struct lua_State *lua_state)
    {
        const char *module = luaL_checkstring(lua_state, 1);
        lua_Debug debugger;
    
        lua_pop(lua_state, 1);
        lua_pop(lua_state, 1);
        lua_getinfo(lua_state, ">S", &debugger);
    
        printf("\n\n%s\n\n\n", debugger.short_src);
    
        return 0;
    }
    
    ...
    lua_register(lua_state, "require_module",    lua_require_module);
    

    und in der Lua Datei habe ich dann

    require_module("blah")
    

    Nun möchte ich an den Dateinamen des Scripts kommen, in dem require_module() ausgeführt wurde. Dazu mache ich zweimal lua_pop(.., 1) in der C Funktion und greife über den Debugger auf debugger.short_src zu. Was ich mich aber nun frage: Wenn ich in der C Funktion etwas vom Stack schmeisse, muss ich das wieder dem Stack hinzufügen, bevor ich die C Funktion verlasse oder kann ich einfach die beiden Pop Operationen ohne Wieder-auf-den-Stack-pushen Operationen verwenden? Ich habe festgestellt, dass Lua ohne Probleme weiterarbeitet, wenn ich die Daten nicht zurückpushe, aber ich würde doch gerne wissen, ob ich solche Stack Veränderungen ohne Probleme machen darf, ohne den Stack auf den Anfangszustand vor der C Funktion zurückzusetzen (ja ok, ich kann zwar auch Results pushen, aber das betrachte ich jetzt nicht 😉 oder ob es zu Problemen kommen *könnte*.



  • Du sollst das Zeug nicht wieder pushen.

    Im Idealfall enthält der Stack am Ende deiner Funktion exakt die Anzahl Elemente die du per "return x" zurückgibst.

    Lua ist da aber flexibel. Wenn du den Stack nicht aufräumst tut es Lua für dich. Wenn du return 0 zurückgibst, wie in deinem Beispiel, schmeisst Lua alle Überflüssigen Elemente die noch auf dem Stack liegen weg.



  • Alles klar, scheinbar macht es Lua dann auch nix aus, wenn ich alles vom Stack schmeisse, was der Funktion übergeben wurde. Habe mir sowas schon gedacht, wollte aber sicher gehen. Danke


Log in to reply