Здравствуйте. Есть проблема с движком. Пытаюсь собрать 1.0007rc1. Установил Visual Studio 2005, поисправлял в исходниках всякие ошибки путей в инклудах и ещё по мелочи, и всё без проблем собралось! Игра работает как надо. Но мне нужна сборка в моей 2019 студии, в первую очередь чтобы использовать возможности стандарта языка. Начал сборку со стандартом C++14. Это было сплошное мучение с ошибками на каждом шаге. Но в итоге всё преодолел, все ошибки локализировал, исправил, и движок собрался. Но игра вылетает сразу после стартовой заставки. Несколько дней уже сижу в отладчике и пытаюсь понять, что не так. Параллельно я запустил отладку в 2005 студии и сравниваю между студиями значения локальных переменных на каждом шаге отладки в одних и тех местах кода. Всё вроде одинаково, побочные эффекты те же. Но вот проект, который в 2019, доходит до чтения файла "effects_water.s", затем выполняет множество одинаковых с 2005 действий и вызывает функцию luaJIT_run, с этого момента выполнение уходит в черный ящик (не отслеживается), и в файле lfunc.c в функции luaF_findupval вылетает исключение "нарушение доступа чтения". До этого момента с 2005 студией всё было одинаково.
Я долго ковырялся в коде LuaJIT'a. До файла effects_water.s читается несколько других подобных файлов с тем же расширением, и при каждом из них запускается LuaJIT, но функция luaF_findupval вызывается только при effects_water. Я сравнивал, как 2005-я и 2019-я проходят через ту функцию, когда обрабатывается effects_water: на точке останова в luaF_findupval выполнение останавливается трижды. И 2005-я и 2019-я проходят два раза функцию от начала до конца одинаково, но на третий раз у 2019 сильно отличается первый аргумент - lua_State *L. То есть объект по адресу этого указателя имеет другие значения полей. Тут важный момент: этот объект, судя по всему, не должен изменяться - в 2005-й при всех трёх прохождениях через функцию объект неизменен (кроме одного поля-указателя), в 2019 первые два раза он тоже неизменен (кроме того же поля), но на третий shit happens.
Дальнейшая отладка плодов не принесла - отследить, кто и откуда вызывает эту функцию оказалось крайне сложно из-за вычурного кода LuaJIT'a. Кто-нибудь сталкивался с такой проблемой, есть предложения? Очень странно, что проблема кроется в LuaJIT'е, его код я точно не задевал, когда пытался всё скомпилить.