From 85d08a0a34df72d40b994ad9795bc900f4521537 Mon Sep 17 00:00:00 2001 From: IonutParau Date: Sun, 15 Feb 2026 21:16:03 +0100 Subject: [PATCH] fixed the memory corruption Stinky Lua --- data/OpenOS/lib/tty.lua | 1 - rewrite/luaarch.c | 39 ++++++++------------------------------- rewrite/machine.lua | 2 ++ rewrite/main.c | 5 ++--- 4 files changed, 12 insertions(+), 35 deletions(-) diff --git a/data/OpenOS/lib/tty.lua b/data/OpenOS/lib/tty.lua index ce0353d..455307b 100644 --- a/data/OpenOS/lib/tty.lua +++ b/data/OpenOS/lib/tty.lua @@ -30,7 +30,6 @@ function tty.getViewport() if window.fullscreen and screen and not screen_cache[screen] then screen_cache[screen] = true window.width, window.height = window.gpu.getViewport() - debug.print("viewport is", window.width, window.height) end return window.width, window.height, window.dx, window.dy, window.x, window.y diff --git a/rewrite/luaarch.c b/rewrite/luaarch.c index 7d1ae1b..c8c5bb2 100644 --- a/rewrite/luaarch.c +++ b/rewrite/luaarch.c @@ -53,8 +53,7 @@ static luaArch *luaArch_from(lua_State *L) { } // pushes an NN value from a Lua stack index -static nn_Exit luaArch_luaToNN(luaArch *arch, int luaIdx) { - lua_State *L = arch->L; +static nn_Exit luaArch_luaToNN(luaArch *arch, lua_State *L, int luaIdx) { nn_Computer *C = arch->computer; if(lua_isnoneornil(L, luaIdx)) { @@ -76,8 +75,7 @@ static nn_Exit luaArch_luaToNN(luaArch *arch, int luaIdx) { } // pushes a Lua value from an NN stack index -static void luaArch_nnToLua(luaArch *arch, size_t nnIdx) { - lua_State *L = arch->L; +static void luaArch_nnToLua(luaArch *arch, lua_State *L, size_t nnIdx) { nn_Computer *C = arch->computer; if(nn_isnull(C, nnIdx)) { @@ -104,8 +102,8 @@ static void luaArch_nnToLua(luaArch *arch, size_t nnIdx) { nn_dumptable(C, nnIdx, &len); lua_createtable(L, 0, len); for(size_t i = 0; i < len; i++) { - luaArch_nnToLua(arch, start + i * 2); - luaArch_nnToLua(arch, start + i * 2 + 1); + luaArch_nnToLua(arch, L, start + i * 2); + luaArch_nnToLua(arch, L, start + i * 2 + 1); lua_settable(L, -3); } nn_popn(C, len * 2); @@ -236,7 +234,7 @@ static int luaArch_computer_pushSignal(lua_State *L) { size_t signalCount = lua_gettop(L); nn_Exit err; for(int i = 1; i <= signalCount; i++) { - err = luaArch_luaToNN(arch, i); + err = luaArch_luaToNN(arch, L, i); if(err) { nn_setErrorFromExit(c, err); luaL_error(L, "%s", nn_getError(c)); @@ -260,7 +258,7 @@ static int luaArch_computer_popSignal(lua_State *L) { nn_Exit err = nn_popSignal(c, &signalCount); if(err) goto fail; for(size_t i = 0; i < signalCount; i++) { - luaArch_nnToLua(arch, i); + luaArch_nnToLua(arch, L, i); } nn_clearstack(c); return signalCount; @@ -301,7 +299,7 @@ static int luaArch_component_invoke(lua_State *L) { nn_clearstack(arch->computer); for(size_t i = 3; i <= argc; i++) { - luaArch_luaToNN(arch, i); + luaArch_luaToNN(arch, L, i); } nn_Exit err = nn_call(arch->computer, address, method); if(err != NN_OK) { @@ -310,29 +308,8 @@ static int luaArch_component_invoke(lua_State *L) { return 2; } size_t retc = nn_getstacksize(arch->computer); - if(strcmp(method, "getViewport") == 0) { - printf("component.invoke(%s, %s) = %zu\n", address, method, retc); - for(size_t i = 0; i < retc; i++) { - printf("%zu. %s\n", i+1, nn_typenameof(arch->computer, i)); - } - printf("prev lua stack size: %d\n", lua_gettop(L)); - } for(size_t i = 0; i < retc; i++) { - if(strcmp(method, "getViewport") == 0) { - printf("lua stack size: %d\n", lua_gettop(L)); - } - luaArch_nnToLua(arch, i); - } - if(strcmp(method, "getViewport") == 0) { - printf("RECHECK STACK\n"); - for(size_t i = 0; i < retc; i++) { - printf("%zu. %s\n", i+1, nn_typenameof(arch->computer, i)); - } - printf("new lua stack size: %d\n", lua_gettop(L)); - printf("Lua rets:\n"); - for(int i = 0; i < retc; i++) { - printf("%d. %s\n", i+1, luaL_typename(L, i - retc)); - } + luaArch_nnToLua(arch, L, i); } nn_clearstack(arch->computer); return retc; diff --git a/rewrite/machine.lua b/rewrite/machine.lua index 9d6e03f..4978130 100644 --- a/rewrite/machine.lua +++ b/rewrite/machine.lua @@ -227,6 +227,8 @@ if os.getenv("NN_REPL") == "1" then print("exiting repl") end +collectgarbage("stop") + local eeprom = component.list("eeprom", true)() assert(eeprom, "missing firmware") diff --git a/rewrite/main.c b/rewrite/main.c index 3be9390..a7bbf4a 100644 --- a/rewrite/main.c +++ b/rewrite/main.c @@ -107,7 +107,6 @@ void ne_fsState_truepath(ne_FsState *state, char truepath[NN_MAX_PATH], const ch } } - nn_Exit ne_fsState_handler(nn_FilesystemRequest *req) { nn_Computer *C = req->computer; ne_FsState *state = req->instance; @@ -988,7 +987,7 @@ int main() { const char *player = getenv("USER"); if(player == NULL) player = "me"; - bool sandboxMem = true; + bool sandboxMem = getenv("NN_MEMSAND") != NULL; nn_Context ctx; nn_initContext(&ctx); @@ -1097,7 +1096,7 @@ int main() { } } - DrawText(TextFormat("mem used: %.2f%%", (double)sand.used / sand.cap * 100), 10, 10, 20, WHITE); + if(sand.buf != NULL) DrawText(TextFormat("mem used: %.2f%%", (double)sand.used / sand.cap * 100), 10, 10, 20, WHITE); EndDrawing();