OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 27 Февраль, 2020 07:52

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Копирование расширяемых записей
СообщениеДобавлено: Воскресенье, 05 Январь, 2020 20:03 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 374
Откуда: Украина, Днепропетровская обл.
Коллеги, быть может, этот вопрос где-то уже и обсуждался, но я не нашёл.

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

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


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


Последний раз редактировалось Oleg N. Cher Воскресенье, 05 Январь, 2020 20:11, всего редактировалось 1 раз.
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 05 Январь, 2020 20:08 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 374
Откуда: Украина, Днепропетровская обл.
Вот код, который отвечает за такую проверку (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 становятся несовместимы сами с собой.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 05 Январь, 2020 23:13 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 06 Январь, 2020 13:40 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 374
Откуда: Украина, Днепропетровская обл.
Я хочу разрешить копирование записей одного типа, объявленных как EXTENSIBLE. Копирование между предком и потомком записи этим кодом пресекается.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 06 Январь, 2020 22:28 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1261
А как быть с указателями?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 07 Январь, 2020 09:08 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3154
Откуда: Астрахань
Вообще-то запрет странный.
Принцип LSP жеж нарушается: вместо объекта базового класса может быть подставлен объект - наследник.
Виртуальность методов жеж отсюда произрастает, не?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 07 Январь, 2020 12:59 
Аватара пользователя

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 07 Январь, 2020 13:18 

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 422
Откуда: Москва
Oleg N. Cher писал(а):
Я хочу разрешить копирование записей одного типа, объявленных как EXTENSIBLE. Копирование между предком и потомком записи этим кодом пресекается.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 07 Январь, 2020 15:46 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 374
Откуда: Украина, Днепропетровская обл.
Да, такая ситуация отслеживается в Обероне-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;
}

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2020, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB