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/