From eddf0b5a23767991c9cb81ff43007e112d2447e5 Mon Sep 17 00:00:00 2001 From: min Date: Tue, 9 Jun 2026 10:12:36 +0300 Subject: [PATCH] =?UTF-8?q?fix(lua):=20=D0=BE=D0=B1=D1=85=D0=BE=D0=B4?= =?UTF-8?q?=D0=B8=D0=BC=20wasmoon=20null.then=20bug=20=E2=80=94=20=5F=5Frb?= =?UTF-8?q?xl=5Fdrain=5Fhandler=20=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0?= =?UTF-8?q?=D1=89=D0=B0=D0=B5=D1=82=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Корень: wasmoon Promise-detection (строка 1026 в index.js): if (Promise.resolve(target) === target || typeof target.then === 'function') typeof null === 'object' → проходит проверку → target.then на null → crash. Когда __rbxl_drain_handler возвращался nil → wasmoon видел null → крашился. Фикс: возвращаем число 1 явно из coroutine.create body и из самой drain_handler. Это не-объект — проверка Promise-detection не сработает. --- src/editor/engine/lua/RobloxShim.js | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/editor/engine/lua/RobloxShim.js b/src/editor/engine/lua/RobloxShim.js index 61bb1d1..3e04ba6 100644 --- a/src/editor/engine/lua/RobloxShim.js +++ b/src/editor/engine/lua/RobloxShim.js @@ -1748,22 +1748,19 @@ export function registerRobloxShim(lua, opts) { debug.sethook(function() coroutine.yield(0.016) end, "", 20000) - local ok, err = pcall(fn, a1, a2, a3, a4) - if not ok then - __log("error", "[handler-fn-error] " .. tostring(err)) - end + -- ВНУТРЕННИЙ pcall: игнорирует runtime errors handler'а + -- ВНЕШНИЙ pcall: ловит yield-across-C-boundary + -- Все возвращаемые значения отбрасываем (не возвращаем из coroutine + -- что-либо, чтобы wasmoon Promise-detection не сработал на null). + pcall(function() pcall(fn, a1, a2, a3, a4) end) + return 1 -- возвращаем НЕ-nil чтобы wasmoon не падал на null.then end) __rbxl_register_coroutine(handlerId, co) - local ok, ret = coroutine.resume(co) - if not ok then - __log("error", "[handler-resume-error] " .. tostring(ret)) - __rbxl_send_error(handlerId, tostring(ret)) - __rbxl_unregister_coroutine(handlerId) - elseif type(ret) == 'number' then - __rbxl_schedule_resume(handlerId, ret) - elseif coroutine.status(co) == 'dead' then + pcall(coroutine.resume, co) + if coroutine.status(co) == 'dead' then __rbxl_unregister_coroutine(handlerId) end + return 1 -- возвращаем НЕ-nil end `); // Кешируем ссылку на Lua-функцию запуска handler'а