Александр
> These classes, on construction, assignment and other operations, forcibly obtain the lua_State* associated with the main thread, if possible. Using these classes will allow your code to be immune when a wrapped coroutine or a lua thread is set to nil and then garbage-collected.
Anton
Окей, хорошо, с L может что-то пойти не так, если указатель на неё теряется каким-то образом. Например, L был запушан на стек другой корутины в рамках исполнения какой-то функции: корутина, соответствующая L, открутилась, функция завершилась, корутина будет удалена GC.
Anton
И если какой-то объект достижим только через стек этой L (например), то и он будет удалён. Да, такой сценарий можно назвать протуханием стейта.
Александр
Так, можно ещё раз, но помедленнее. L - основной стейт, L1 - стейт какой-то корутины. Правильно ли я понял, что L1 может быть как-то сохранен, что его соберёт сборщик мусора, хотя реально он должен ещё жить? Разве L1 не имеет счетчик ссылок "себя", чтобы знать, пора ему умирать или нет? И описанная ситуация возможна в луа или это косяк разраба, который юзает C-API?
Александр
Вообще, когда я добуду минимальный воспроизводимый пример, я его обязательно покажу
Dadaskis
Отойду чуть-чуть от текущей темы... Какие либы есть кроме LuaBridge, которые со стороны C++ кода позволяют добавлять кучу всего в Lua?
Dadaskis
Тут есть и список либ, и бенчмарки
Обогнали чистый C, это, конечно, сильно
Max
Обогнали чистый C, это, конечно, сильно
Plain c видимо нужно читать как plain lua c api
Александр
Корутина L1 — это просто значение, которое живет по тем же принципам, что и все остальные строки/таблицы/корутины. Да, если вы хотите, чтобы объект корутины жил, он должен быть достижим для GC.
"Объект корутины жил" - пусть помирает себе. Корутина сама никуда себя не записывает в луа коде, она просто выполняется. Во время работы создаёт какие-то объекты, которые, имея владельца L1, вполне могут записаться в табличку из L. И после записи у них кто владелец? L или L1? Или я несу чушь и никаких владельцев нет?
Александр
Лучше подходит термин «точка достижимости». Если L1 передала ссылку на объект в L, то этот объект не будет сколлекчен (если L достижима для GC).
Хорошо. У переменных есть lua_State* владелец/создатель или как-то так? Или после создания переменная - это просто нечто в куче, как-то связанное со всеми другими GCObject* и будет собрана, когда все ссылки очистятся?
Anton
Хорошо. У переменных есть lua_State* владелец/создатель или как-то так? Или после создания переменная - это просто нечто в куче, как-то связанное со всеми другими GCObject* и будет собрана, когда все ссылки очистятся?
Нет. Переменная – это слот на стеке. Как-только этот слот оказывается выше, чем указатель на вершину стека, GC не видит этот слот. Если на всех стеках всех корутин нет такого слота slot < L->top, то значение, лежащее в слоте, будет сколлекчено (немного грубая формулировка, там ещё есть registry и gc roots, но идея такая).
Дмитрий
А бывают луа реверсеры?
Александр
Если у нас таблица, на которую есть несколько ссылок из разных корутин, то в каждом слоте на стеке лежит указатель на неё + счетчик ссылок? @igelhaus
Anton
Если у нас таблица, на которую есть несколько ссылок из разных корутин, то в каждом слоте на стеке лежит указатель на неё + счетчик ссылок? @igelhaus
Счетчика ссылок в Lua нет вообще. Да, если есть таблица и в нескольких корутинах есть local t = ... То на стеке каждой корутины будет указатель на эту таблицу.
Александр
Счетчика ссылок в Lua нет вообще. Да, если есть таблица и в нескольких корутинах есть local t = ... То на стеке каждой корутины будет указатель на эту таблицу.
У меня есть такое предположение: Абстракция в виде sol хранит объекты в плюсовом коде как lua_State* + некий хендл объекта. При перекидывании объектов между стейтами, sol требует или какой-то спец. обработки, или просто тупит (баг). Возможно, это сделано для удобства, чтобы всегда был под рукой lua_State.
Александр
Я в свою очередь попробую решить проблему так: если у меня в плюсовом коде хранятся таблицы, которые могут пережить какие-то из корутин, то их следует хранить stateless, вручную ref/unrefая их
Anton
Ясно. К сожалению, не могу поддержать разговор про sol. Но да, идея верная: если данные, которые порождает корутина, должны жить дольше корутины, то они всегда должны быть как-то достижимы.
Александр
Спасибо большое, Вы многое прояснили. До этого в моей голове сидела мысль, что каждый объект ассоциирован с каким-то lua_State. Но как выяснилось, он появляется лишь в sol'овской абстракции и в данном случае всё ломает. Буду чинить, ещё раз спасибо
vvzvlad
Держитесь там!
Mark ☢️
local pretty = require "pl.pretty" local function qwe() return nil, 'pepyaka' end pretty.dump(qwe()) так вот, блять, этот код создаст файл pepyaka и запишет в него трибуквы (nil)
Highly Likely
А что не так?
Mark ☢️
да всё так. просто апи уебанское. может внезапно создать файл когда этого не ждёшь
Mark ☢️
ничего нового
Snusmumriken
А я злой
Snusmumriken
В целом, единственное что тут неприятно — это именно что какая-то посторонняя работа с файлами вместо работы со строками. Имхо всё вот это вот не должно никуда выводить, только вовращать строку. Типа если пользователь захочет файл — он откроет его, и запишет туда строчку которую вернули дампы. Ну, по хорошему.
Александр
@Snusmumriken @igelhaus Проблема, с которой я пришёл вчера, решилась. sol2 действительно хранил lua_State*, которому принадлежит та или иная ссылка. И в нём был механизм, который позволял создавать такие плюсовые объекты, в которых lua_State* всегда гарантированно будет взят основным, а не от какого-либо треда. Но в этом механизме была небольшая опечатка, из-за которой он просто работал некорректно. Благодаря вам эта опечатка была обнаружена, моя программа перестала падать, а библиотека станет чуть лучше после одобрения PR. Большое спасибо.
Lucky
Воот, допилил таки перевод букваря по Gideros.
Lucky
Интересный движок.
Tverd
Годо как-то получше смотрится. Да и корона тоже
Tverd
Но букварь это хорошо 👍🏻
Nibeon
Воот, допилил таки перевод букваря по Gideros.
Его где найти можно? Во ВКонтакте?
Nibeon
Или он будет где-то выложен? Или её купить надо будет (книжку с переводом)?
Lucky
да
Lucky
не, выкладывать не буду
Nibeon
да
А в каком оно там формате? Статьи?
Lucky
это очень дорого
Lucky
в epub
Nibeon
А) счас посмотрим)
Pavel
Да что вы знаете о тротлинге.....
Pavel
По оси Y секунды...
Konstantin
Всем привет. Вопрос: как дебажить луа на мак (наверное - в vscode) Детали: есть игра 15-и летней давности, которая собирается под мак и линукс и в которой надо добавить достаточно много луа кода. Из разрабов только плюсеры (Ваш покорный слуга), и от написанного луа кода очень сильно течет мозг. Проект писался двумя джунами, за то очень активно. Сейчас нужно поднять дебаггер, прям жизни без него нет, в чем угодно и как угодно. Проект на cmake, работаем в xcode 9.4.1 (в более поздних версиях не работает из за deprecated api) либо чез cmake && make && run. Архитектура Lua файлов достаточно сложная - все идет через с++ код, подгружается динамически исходя из параметров, получаемых по сети.
Konstantin
это я уже погуглил, поставил и не смог раскурить за недостатком информации
Konstantin
хотя надо видимо взять яйца в руки и просто попробовать
Leon174
Вот сколько раз не пробовал VS Code, столько раз и снес. Не нравится, хоть ты тресни. Несерьезный он какой-то. Мой вариант – IntelliJ IDEA Community Edition + EmmyLua, отладчики в комплекте, хотя под Mac только удаленный.
Leon174
https://www.jetbrains.com/idea/download/#section=mac
Leon174
https://emmylua.github.io/
Leon174
Есть еще плагин Lua для Idea, но он какой-то странной жизнью живет. То вроде кажется, что окончательно сдох, то вдруг откоматозится. EmmyLua больше нравится, хотя там вместо документации палочки-веточки и гифки.
Leon174
https://plugins.jetbrains.com/plugin/5055-lua/
Konstantin
@leon174 под мак только удаленный? потрясающе, это как вообще
Konstantin
mind blowing
Leon174
Ну, сами так пишут. У меня мака нет, ничего сказать не могу.
Leon174
Konstantin
спасибо 🙂 Попоробую запустить проект в IntelliJ
Mark ☢️
Mark ☢️
Konstantin
день потрачен. Подтянул расширения, перебрал все вручную. Из забавного - на старте запустился отладчик для луа, я так и не понял как - мануала нет, китаец на гитхаб написал, что мануала и не будет. Но как он выбрал луа файл и так далее - большая загадка. Проект стартанул не правильно. Починил запуск проекта, все таки это первый раз запуск отладки в vscode - отвалился луа дебаггер, при чем отвалился с концами. Перебор и т.д. не помогло
Konstantin
сложностей добавляет то, что скрипт создается в недрах игрового движка, луа версии 5.2.1, и хз как добавить туда луашные сокеты. Попробовал lrdb, как ниболее подходящий, потдянул плюсовый дебаг сервер, вызвал attach - брейкпоинты не работают, даже самый первый. Нашел issue на github, что на маке и не заработает. расстроился
Konstantin
надеюсь было интересно это читать
🐅🤦‍♂️
надеюсь было интересно это читать
интересно читать, только связывай свои сообщения через "Reply" с первым в цепочку, что-бы можно было прочитать всю историю, когда она растянется на не один день
Konstantin
принято
Дмитрий
привет господа луашники
Дмитрий
На сталкер скрипты есть?
usernameak
На сталкер скрипты есть?
нет, но они пишутся на луа
Дмитрий
А какой сталкер
usernameak
А какой сталкер
ну не 2 же :D
Дмитрий
Где можно проверить свои знания луа
Дмитрий
?
Дмитрий
алло люди
Дмитрий
хочу максимально изучить луа
Дмитрий
https://exercism.io/tracks/lua
спссс за сайт
Дмитрий
плохо английский знаю