OberonCore
https://forum.oberoncore.ru/

Копирование расширяемых записей
https://forum.oberoncore.ru/viewtopic.php?f=131&t=6535
Страница 1 из 1

Автор:  Oleg N. Cher [ Воскресенье, 05 Январь, 2020 20:03 ]
Заголовок сообщения:  Копирование расширяемых записей

Коллеги, быть может, этот вопрос где-то уже и обсуждался, но я не нашёл.

В процессе работы над Ofront'ом+ я столкнулся с такой особенностью поведения BlackBox при копировании расширяемых записей: копирование невозможно для записи, помеченной любым атрибутом, и не только для потомка записи, но и для нерасширенной записи того же типа. В то же время, компилятор вполне может отследить статически, а рантайм в процессе исполнения программы, является ли запись потомком или же она не расширена, а объявлена с тем же типом. Я нахожу эту невозможность копирования очень странной. И намерен смягчить эту стратегию в Ofront'е+ для записей, чей тип является гарантированно не расширенным, хотя запись и помечена как расширяемая.

Вопросы к разработчикам на КП: как обходите эту невозможность копирования? Не считаете ли это глюком? Напоминаю, что в Обероне-2 все записи по умолчанию могут быть расширены, но такое копирование записей одного типа там разрешено.

Вложения:
TestCopyRecs.png
TestCopyRecs.png [ 158.68 КБ | Просмотров: 9066 ]

Автор:  Oleg N. Cher [ Воскресенье, 05 Январь, 2020 20:08 ]
Заголовок сообщения:  Re: Копирование расширяемых записей

Вот код, который отвечает за такую проверку (OPB.CheckAssign):

BlackBox:
Код:
         IF x.comp = Record THEN
            IF ~DevCPT.EqualType(x, y) OR (x.attribute # 0) THEN err(113) END

Ofront+:
Код:
            IF x^.comp = Record THEN
               IF x = y THEN (* ok *)
               ELSIF ~OPT.EqualType(x, y) OR (x^.attribute # 0) THEN err(113)
               END

Если я убираю вот это самое IF x = y THEN, то перестаёт компилироваться, например, ZlibDeflate из ETH Oberon, т.к. переменые типа запись StaticTree становятся несовместимы сами с собой.

Автор:  Trurl [ Воскресенье, 05 Январь, 2020 23:13 ]
Заголовок сообщения:  Re: Копирование расширяемых записей

Непонятно. Вы хотите разрешить копирование расширенных записей или только того же типа? Если второе, появится ещё один источник ошибок времени исполнения.

Автор:  Oleg N. Cher [ Понедельник, 06 Январь, 2020 13:40 ]
Заголовок сообщения:  Re: Копирование расширяемых записей

Я хочу разрешить копирование записей одного типа, объявленных как EXTENSIBLE. Копирование между предком и потомком записи этим кодом пресекается.

Автор:  Trurl [ Понедельник, 06 Январь, 2020 22:28 ]
Заголовок сообщения:  Re: Копирование расширяемых записей

А как быть с указателями?

Автор:  Валерий Лаптев [ Вторник, 07 Январь, 2020 09:08 ]
Заголовок сообщения:  Re: Копирование расширяемых записей

Вообще-то запрет странный.
Принцип LSP жеж нарушается: вместо объекта базового класса может быть подставлен объект - наследник.
Виртуальность методов жеж отсюда произрастает, не?

Автор:  Oleg N. Cher [ Вторник, 07 Январь, 2020 12:59 ]
Заголовок сообщения:  Re: Копирование расширяемых записей

Я, так или иначе, должен был столкнуться с этой проблемой, т.к. я стыкую Оберон-2 и КП. И появилась сущность "запись, которую нельзя расширить" наряду с "записью, которую можно". И получается, что все записи Оберона-2 становятся расширяемыми, других там просто нет. И код на Обероне-2, который копирует записи в общем-то одного типа, перестаёт компилироваться просто из-за привнесённой КП-шной интерпретации расширяемой записи с невозможностью её потом копировать. Типа: если вам нужно копировать запись, просто не делайте её расширяемой. Но сейчас в Ofront'е+ перед копированием типы проверяются на полное соответствие, никакого смешивания наследников и предков не допускается. А указатели-поля записи при копировании просто дублируются. Были NIL - остались NIL. Были не NIL, таковыми и будут.

Если вопрос был про копирование записи, на которую указывает указатель, то у каждой записи есть тег типа, который однозначно её идентифицирует. То есть, проверить тип в рантайме можно.

Автор:  Дмитрий Дагаев [ Вторник, 07 Январь, 2020 13:18 ]
Заголовок сообщения:  Re: Копирование расширяемых записей

Oleg N. Cher писал(а):
Я хочу разрешить копирование записей одного типа, объявленных как EXTENSIBLE. Копирование между предком и потомком записи этим кодом пресекается.

А Вы отследите ситуацию, если потомок StaticTreeChild передается как параметр процедуры, например VAR c: StaticTree? А нужно присвоить c := stree

Автор:  Oleg N. Cher [ Вторник, 07 Январь, 2020 15:46 ]
Заголовок сообщения:  Re: Копирование расширяемых записей

Да, такая ситуация отслеживается в Обероне-2. Ну и, думаю, так же нужно сделать и в КП, а не лечить головную боль путём отрубания головы (запрещения копирования расширяемых записей вообще, как это сделано сейчас).

Код:
MODULE TestCopyRecs2;
TYPE
  StaticTree = EXTENSIBLE RECORD i: INTEGER END;
  StaticTreeChild = RECORD (StaticTree) a: REAL END;

VAR
  tree: StaticTree; child: StaticTreeChild;

PROCEDURE Copy (VAR tree, child: StaticTree);
BEGIN
  tree := child; child := tree;
END Copy;

BEGIN
  Copy(tree, child); Copy(child, tree);
END TestCopyRecs2.

Код:
static void TestCopyRecs2_Copy (TestCopyRecs2_StaticTree *tree, SYSTEM_ADRINT *tree__typ, TestCopyRecs2_StaticTree *child, SYSTEM_ADRINT *child__typ)
{
   __GUARDEQR(tree, tree__typ, TestCopyRecs2_StaticTree) = *child;
   __GUARDEQR(child, child__typ, TestCopyRecs2_StaticTree) = *tree;
}

Согласен с тем, что хорошо бы снабдить такую рантайм-проверку информацией о месте в коде, где сработала охрана типа. Это собираюсь сделать.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/