OberonCore https://forum.oberoncore.ru/ |
|
Доку сборщика мусора: как дублировать POINTER TO ARR https://forum.oberoncore.ru/viewtopic.php?f=23&t=6546 |
Страница 1 из 1 |
Автор: | adimetrius [ Суббота, 25 Январь, 2020 14:23 ] |
Заголовок сообщения: | Доку сборщика мусора: как дублировать POINTER TO ARR |
Коллеги, есть ли где-то описание сборщика мусора в ББ? Мож какая статья, или диссертация на худой конец )). В частности, меня интересует сборка массивов. Мне нужно "припрятывать" указатели, так чтобы их видел сборщик мусора. С указателями на записи все понятно: я могу объявить переменную ANYPTR и поместить туда "припрятываемый" указатель. А как быть с указателями на массивы - неясно. Поскольку нет типа ANYARRAY, я, кмк, не смогу припрятать произвольный указатель на массив (неизвестного мне во время компиляции типа) языковыми средствами. Т.е. придется пользоваться заязыковыми - структурами ядра и сборщика. Посоветуйте, пож, у кого есть опыт в этом. |
Автор: | adimetrius [ Суббота, 25 Январь, 2020 21:37 ] |
Заголовок сообщения: | Re: Доку сборщика мусора: как дублировать POINTER TO ARR |
Похоже, мне поможет SYSTEM.PTR, нигде не документированный, и документация к ядру Ильи Ермакова. https://oberoncore.ru/library/ermakov_v ... ejs_kernel |
Автор: | SovietPony [ Воскресенье, 26 Январь, 2020 04:02 ] |
Заголовок сообщения: | Re: Доку сборщика мусора: как дублировать POINTER TO ARR |
Да, SYSTEM.PTR - это ещё более обобщённый ANYPTR, позвляющий присваивать вообще любые POINTER TO, включая массивы. Только untagged типы туда лучше не пихать, а то будет плохо. Работать с этим типом надо осторожно, потому что такая программа валидна и никаких проверок не производится: Код: MODULE Test; IMPORT SYSTEM; VAR rec: POINTER TO RECORD END; arr: POINTER TO ARRAY OF BYTE; ptr: SYSTEM.PTR; BEGIN ptr := rec; ptr := arr; rec := ptr; arr := ptr; END Test. Вроде как использование IS/WITH/typeguard должно быть быть безопасно, но это не точно, лучше перепроверить. |
Автор: | Trurl [ Воскресенье, 16 Февраль, 2020 20:09 ] |
Заголовок сообщения: | Re: Доку сборщика мусора: как дублировать POINTER TO ARR |
adimetrius писал(а): Мне нужно "припрятывать" указатели, так чтобы их видел сборщик мусора. Так и не понял, что бы это значило? |
Автор: | adimetrius [ Воскресенье, 16 Февраль, 2020 22:06 ] |
Заголовок сообщения: | Re: Доку сборщика мусора: как дублировать POINTER TO ARR |
Я решал задачу: найти все указатели в процедурных кадрах в цепочке активации и продублировать их в массиве. Решил с оговоркой. Для решения использовал ARRAY OF SYSTEM.PTR, т.к. этот тип совместим с указателями на записи и указателями на массивы, при этом он участвует в сборке мусора, как все - т.е. сборщик "видит" указатели SYSTEM.PTR. Оговорка в следующем: невозможно отличить в процедурном кадре p: SYSTEM.PTR от u: POINTER [untagged] TO... поскольку и то, и другое кодируется form = 0DX (в процедуре Kernel.GetRefVar). Поэтому из моей задачи такие указатели в процедурных кадрах пришлось исключить. (Однако, полагаю, можно решить и эту задачу: штатный сборщик, анализируя кадры, вообще не замудряется, где какие типы локальных переменных: каждые 4 байта объявляются кандидатом, и потом какая-то проверка идет - типа, "указывает" ли это четырехбайтное значение в кучу. До конца не вник, поскольку задача не требует). Надеюсь, что прояснил "припрятывание". |
Автор: | Trurl [ Понедельник, 17 Февраль, 2020 08:48 ] |
Заголовок сообщения: | Re: Доку сборщика мусора: как дублировать POINTER TO ARR |
Мне казалось, что припрятывать можно от сборщика мусора. А так, можно было просто массив целых завести. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |