OberonCore https://forum.oberoncore.ru/ |
|
Копирование расширяемых записей https://forum.oberoncore.ru/viewtopic.php?f=131&t=6535 |
Страница 1 из 1 |
Автор: | 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/ |