OGSR / OGSR-Engine

OGSR Project - Evolution of X-Ray Engine for S.T.A.L.K.E.R.: Shadow of Chernobyl
https://discord.gg/Q6QDxbNcfR
Other
468 stars 87 forks source link

Update LuaJIT to latest version #281

Closed xrSimpodin closed 3 years ago

xrSimpodin commented 3 years ago

https://github.com/OGSR/OGSR-Engine/commit/53370305e9550666aa42a89b54bf09a70f602a70 Есть небольшая проблема с совместимостью. Там поменяли сортировку таблиц, видимо для увеличения производительности. Ранее, итерация элементов в цикле по таблице всегда была с одинаковой последовательностью, ну типа как у std::map, хотя по стандарту луа, как std::map себя должны вести только массивы вида { "a", "b", "c", "d", ... } или { [1] = "a", [2] = "b", [3] = "c", ...} что по сути одно и то же. Для таблиц вида {["avd"] = 1, ["dlfk"] = 5, ...} последовательность не гарантируется, это уже std::unordered_map по сути своей. Но всё равно в старых версиях LuaJIT последовательность была одинаковой всегда. Так вот, в новой версии таблицы работают как настоящий std::unordered_map. Это наверно даже хорошо, но всякий говнокод типа такого, теперь работать не будет:

function on_game_load()
    -- готовим таймеры к работе с id вместо названий
    local i = 1
    for k,v in pairs(func_by_string) do
        table_insert(timers_id_name, k)
        timers_name_id[k] = i
        i = i + 1
    end

-- Раньше все эти циферки в таблицах timers_id_name, timers_name_id были всегда актуальные, их можно было в сейв записать,
-- потом после перезагрузки использовать для доступа в таблицу func_by_string, а щас после перезагрузки они будут всегда разные.

    log3("func_by_string is %s", func_by_string)
    log3("timers_id_name is %s", timers_id_name)
    log3("timers_name_id is %s", timers_name_id)

Конечно в проектах, где скрипты в порядке, проблем не будет. Но проектов где скрипты не в порядке подавляющее большинство. Вот и возникает вопрос, что с этим делать, и имеет ли вообще смысл что-то делать, сколько такого говнокода в модах и так далее.

Xottab-DUTY commented 3 years ago

Спасибо за обнаружение! :)

xrSimpodin commented 3 years ago

Ну, на ЗП ты бы такого и не заметил, может. Это в ТЧ старые моды очень бестолковые в плане скриптов. Всякие типа амк. Это кусок из амк таймеров в примере выше.

Xottab-DUTY commented 3 years ago

Ну, на ЗП ты бы такого и не заметил, может. Это в ТЧ старые моды очень бестолковые в плане скриптов. Всякие типа амк. Это кусок из амк таймеров в примере выше.

У нас с новым луаджитом вылетает ЧН оригинальный, без модов, и есть подозрение, что это именно из-за порядка сортировки таблиц..

Открыл вопрос в репозитории LuaJIT: https://github.com/LuaJIT/LuaJIT/issues/719

xrSimpodin commented 3 years ago

Ну причин то может быть много и без сортировки. Я таких чудес насмотрелся за всё время как занимаюсь движком, что уже ничему не удивляюсь.

Xottab-DUTY commented 3 years ago

Нашли коммит, который меняет поведение: https://github.com/LuaJIT/LuaJIT/commit/ff34b48ddd6f2b3bdd26d6088662a214ba6b0288. После реверта скрипты починились. Может, позже найдём какой-то фикс без реверта и не хуже реверта, но пока так.

xrSimpodin commented 3 years ago

Ну да, я тоже проверил, эта проблема фиксится после реверта. На днях наверно обновлю здесь луаджит. Теперь главное, чтоб в нём ещё каких-то новых проблем не нашлось)