Похоже в 5.5 externalstring это прям способ сделать деструктор, что может исполняться при emergency gc, а также после всех userdata при закрытии.
Может есть что проще? А то при закрытии можно получиться так, что ссылка есть, а функция __gc уже вызвалась.
Не понял?
Я точно уже не помню, но при закрытии стейта вроде и так просто всё собирается, разве нет?
(Ну вроде да правда я не помню уже как там emergency gc со всем этим работает... Вроде бы emergency gc финалайзеры и не вызывает, т.к для этого надо объект "воскресить" и ещё на стеке место на его вызов, а в emergency мы могли войти как раз из-за нехватки стека. Собственно ассерты об этом же и говорят...)
Насколько я смутно помню, externalstring "деструктор" он только для освобождения собственно памяти строки, и со стейтом луашным из него взаимодействовать нельзя. Слегка похоже на то, как в luau финалайзеры юзердаты в целом сделаны, но не суть...
По сути это более оптимизированная версия на случай, когда надо внешние ресурсы прибить, без оверхеда. Вроде-бы новый лоадер нативных либ так её использует...
Хотя канонично это всё делали для переиспользования памяти константных строк между независимыми стейтами, а не вот это всё...
К слову большой вопрос стоило-ли оно того, т.к теперь надо по ещё одному указателю прогуляться, чтобы собственно данные строки получить... но да ладно.