Я использую Lua в системе с очень ограниченными ресурсами в сочетании с C.
Библиотека, которую я использую, создает некоторые ссылки (как указатели) на объекты, которые она создает, что полезно для последующего доступа к этим объектам. Чтобы предоставить функциональность этой библиотеки Lua, при создании такого объекта эта ссылка возвращается в сценарий Lua.
Пользователь имеет возможность сохранить эту ссылку по своему вкусу, поскольку это делает последующие звонки очень удобными.
Примеры случаев:
ref = MyLib.createObject("some", arguments)
local ref = MyLib.createObject("some", arguments)
table_of_refs[45] = MyLib.createObject("some", arguments)
-- etc...
К сожалению, эти ссылки могут быть уничтожены вне области действия сценария Lua (изнутри C). Таким образом, эти ссылки могут стать недействительными.
Пока что мой код может без проблем обрабатывать эти недействительные ссылки. Все эти указатели проверяются перед фактическим использованием в библиотеке, поэтому код безопасен.
Однако это немного сбивает с толку с точки зрения пользователя Lua, поскольку невозможно определить, действительна ли эта ссылка или нет (это не очень важно, но все же я хочу улучшить ее) .
Я хочу следующее. Я хочу перебрать из C все lightuserdata, которые хранит Lua. Если lightuserdatum больше не действителен, установите его на ноль. Таким образом, при следующем использовании переменная будет либо действительной, либо нулевой, предоставляя пользователям гораздо лучший API.
Есть ли способ достичь этого? Могу ли я выполнить итерацию из C всех lightuserdata, о которых знает Lua (независимо от того, где они хранятся, локальные / глобальные / таблицы и т. Д.), И изменить их?