Ada_Ru форум

Обсуждение языка Ада

overriden in private

Оставить новое сообщение

Сообщения

Maxim Reznik
overriden in private
2008-11-01 16:44:38

Разбираясь с утечкой памяти в AWS наткнулся на непонятный глюк.

Полный текст примера тут:

http://pastebin.mozilla-russia.org/92280

 

Суть такая: есть три пакета A1, A1.A2 и A1.A3.

Базовый тип A1.Base. От него порожден A2.Child, от которого

в свою очередь порожден A3.Child.

 

У типа A1.Base две примитивные подпрограммы P1 и P2. P1 в видимой части, P2 в приватной. Оба типа Child должны переопределять обе

подпрограммы, но фактически A3.P2 никогда не диспечеризируется.

 

Как я понимаю ARM, в пакетах A2 и A3 после слова private становится видна A1.P2, которая неявно наследуется для обоих типов Child.

Поэтому, когда далее обьявляется procedure P2 (X : Child);

она переопределяет (override) унаследванную неявно P2 и должна

в дальнейшем диспечеризироваться.

 

На практике, однако, так ведет себя только A2.P2, а A3.P2 не вызывается

Я подумал, что это глюк GNAT-а, но попробовал на ObjectAda и PowerAda и получил тот же результат.

 

Кто прав, кто виноват?

 

--

Maxim Reznik

Привет Максим,

 

On Wed, 1 Oct 2008 19:44:38 +0300, you wrote:

 

Разбираясь с утечкой памяти в AWS наткнулся на непонятный глюк.

Полный текст примера тут:

http://pastebin.mozilla-russia.org/92280

 

Суть такая: есть три пакета A1, A1.A2 и A1.A3.

Базовый тип A1.Base. От него порожден A2.Child, от которого

в свою очередь порожден A3.Child.

 

У типа A1.Base две примитивные подпрограммы P1 и P2. P1 в видимой части, P2 в приватной. Оба типа Child должны переопределять обе

подпрограммы, но фактически A3.P2 никогда не диспечеризируется.

 

Как я понимаю ARM, в пакетах A2 и A3 после слова private становится видна A1.P2, которая неявно наследуется для обоих типов Child.

Поэтому, когда далее обьявляется procedure P2 (X : Child);

она переопределяет (override) унаследванную неявно P2 и должна

в дальнейшем диспечеризироваться.

 

P2 рассматривается как новая примитивная операция.

 

На практике, однако, так ведет себя только A2.P2, а A3.P2 не вызывается

Я подумал, что это глюк GNAT-а, но попробовал на ObjectAda и PowerAda и получил тот же результат.

 

Кто прав, кто виноват?

 

По-моему, все правильно согласно 7.3.1(6.1). Дело в том, что A1.A2.Child наследует P2, следовательно этот тип имеет P2 как приватную примитивную операцию. В A1.A3 эта операция не видима и, следовательно, по правилу, не подлежит переписыванию. Тот факт, что P2 из A1 видима, ничего не меняет, переписывается-то не она! В итоге, P2 из A1.A3 перегружена с P2 из A1.

Результат - совершенно безобразный. Думаю, что надо писать в Ada-comments. Такие перегрузки должны быть запрещены. Понятно, что overriding добавленный к P2 эту ошибку отловит, но сути дела это не меняет. Я предполагаю, что возможно это правило косвенно используется в настраиваемых пакетах. Возможно не все так просто. Но оставлять все в этом виде тоже нельзя. Короче, пишите письма...

 

--

Regards,

Dmitry A. Kazakov

http://www.dmitry-kazakov.de

В догонку.

 

Я тут вспомнил свою давнюю дискуссию с Дьюаром, когда он еще посещал comp.lang.ada, по поводу того, является ли переписывание частным случаем перегрузки. Тогда казалась, мне по крайней мере, что вопрос этот - чисто схоластический. Но теперь кажется, что - нет. Пример демонстрирует разницу

- из-за того, что A1.P2 и A1.A2.P2 как бы "перегружаются" (по Дьюару) при переписывании, то разница в их видимости в A1.A3 и выдает сей гадостный эффект.

 

Интересно, "что станет говорить княгиня Марья Алексевна", то бишь Тафт... (:-)) Обязательно в Ada-comments!

 

--

Regards,

Dmitry A. Kazakov

http://www.dmitry-kazakov.de

On Wed, Oct 01, 2008 at 08:49:55PM +0200, Dmitry A. Kazakov wrote:

 

Привет Максим,

 

По-моему, все правильно согласно 7.3.1(6.1). Дело в том, что A1.A2.Child наследует P2, следовательно этот тип имеет P2 как приватную примитивную операцию. В A1.A3 эта операция не видима и, следовательно, по правилу, не подлежит переписыванию. Тот факт, что P2 из A1 видима, ничего не меняет, переписывается-то не она! В итоге, P2 из A1.A3 перегружена с P2 из A1.

 

Спасибо, теперь я понял. Для меня было отнють не очевидно, что

A2.P2 прячет A1.P2 внутри A3.

 

Результат - совершенно безобразный. Думаю, что надо писать в Ada-comments. Такие перегрузки должны быть запрещены. Понятно, что overriding добавленный к P2 эту ошибку отловит, но сути дела это не меняет. Я предполагаю, что возможно это правило косвенно используется в настраиваемых пакетах. Возможно не все так просто. Но оставлять все в этом виде тоже нельзя. Короче, пишите письма...

 

 

Писать в Ada-comments я не возьмусь, потому, что плаваю сильно в этом вопросе, как оказалось. Мне совсем не ясно, как эту ситуацию можно поправить в языке, что имено надо запретить :(

Могу написать в CLA :)

 

--

Maxim Reznik

On Thu, 2 Oct 2008 14:12:25 +0300, you wrote:

 

Писать в Ada-comments я не возьмусь, потому, что плаваю сильно в этом вопросе, как оказалось. Мне совсем не ясно, как эту ситуацию можно поправить в языке, что имено надо запретить :(

 

Например, прописать, что приватная операция может быть переписана, если она наследует не приватной примитивной операции. Что будет соответствовать здравому смыслу. Сначала - вопрос поставить. Что требуется технически, для исправления ситуации, пусть члены ARG решают. У них головы - в дверной проем не лезут... Серьезно, сложно предусмотреть все последствия.

Могу написать в CLA :)

 

И туда тоже, хотя Брукардт ругался, что серьезные вопросы и предложения надо только в Ada-comments. Проблема-то действительно гадостная. Я совсем не уверен, что в моем 95-ом коде такого нет...

 

--

Regards,

Dmitry A. Kazakov

http://www.dmitry-kazakov.de

Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти