OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 08:01

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




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Метод RECORD.From.
СообщениеДобавлено: Суббота, 05 Сентябрь, 2020 00:00 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Чем дальше в лес, тем крупнее пасхальные яички.

При попытке определить у RECORD-а метод From столкнулся с тем, что нельзя: атрибут NEW не позволяется, а без NEW заявляет, что базовая процедура не EXTENSIBLE. То есть у любой записи есть метод From. Как выяснилось экспериментально, его сигнатура - From (VAR par: ANYREC).

Вот это компилируется:

Код:
MODULE Test;

   TYPE
      Rec = RECORD END;

   PROCEDURE Do*;
      VAR r: Rec; r2: RECORD END;
   BEGIN
      r.From(r2)
   END Do;

END Test.



При вызове - NIL procedure call.

Поиск по ключевому слову From в надежде найти место, где что-нибудь в дерево при компиляции добавляется, ничего не дал.
Загадка ждёт археологов :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Метод RECORD.From.
СообщениеДобавлено: Суббота, 05 Сентябрь, 2020 06:41 

Зарегистрирован: Суббота, 04 Май, 2019 10:21
Сообщения: 29
Nothing strange happened. I test this demo
Код:
MODULE TestRecordFrom;
   
   IMPORT Log:=StdLog;

   TYPE
   Rec = RECORD END;
   
   PROCEDURE (VAR r: Rec)From(VAR par: ANYREC), NEW;
   BEGIN
      Log.String("hello");Log.Ln;
   END From;

   PROCEDURE Do* ;
      VAR
      r: Rec;
      r2: RECORD END;
   BEGIN
      r.From(r2);
   END Do;
   
 
END  TestRecordFrom.Do
Maybe your changes to the compiler made this happen


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Метод RECORD.From.
СообщениеДобавлено: Суббота, 05 Сентябрь, 2020 07:35 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Проверил, тоже компилируется и исполняется. Может в версии 1.6 так было.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Метод RECORD.From.
СообщениеДобавлено: Суббота, 05 Сентябрь, 2020 11:23 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Илья Евгеньевич,

у меня такой текст
Код:
   TYPE R = RECORD END;
   PROCEDURE (VAR r: R) From, NEW; END From;

компилируется успешно, а такой
Код:
   TYPE RR = RECORD END;
   PROCEDURE Do*; VAR rr: RR; BEGIN rr.From(*X*)(rr) END Do;


завершается ошибкой undefined record field.
Строки "From" в модулях анализатора не найдено.
Похоже, у вас там какая-то магия...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Метод RECORD.From.
СообщениеДобавлено: Суббота, 05 Сентябрь, 2020 18:31 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Очень странная история. Компилятор - обычный, от 1.6, без изменений.

Вчера пришлось из-за этого эффекта отказаться от имени метода From, заменив его на GetFrom.

Эффект наличия у записи базового метода From проявлялся при компиляции нескольких модулей, т.е. переживал инициализацию компилятора. Т.е. я столкнулся в некоем крупном модуле, с которым много работал, что метод From (IN rec: ANYREC), NEW стал непроходить по ошибке "invalid NEW attribute". Тогда я создал вот этот тестовый модуль, чтобы убедиться, что у базового RECORD есть метод From. Убедился. Запустил. Получил рантайм-ошибку.

От компиляции вышеприведённого примера (с другим имененем модуля) остался кодовый файл. Который при запуске даёт этот самый NIL procedure call.

Но компиляция сегодня уже не происходит - идёт undefined record field на From, как и положено.

Исходник, откомпилировавшийся вчера:

Код:

MODULE L1_devMeta;

   TYPE
      Rec = RECORD END;

   PROCEDURE Do*;
      VAR r: Rec; r2: RECORD END;
   BEGIN
      r.From(r)
   END Do;

END L1_devMeta.



Декомпиляция вчерашнего кодового файла:

Код:

MODULE L1_devMeta;
 compiled: 2020-09-04 23:58:04
 opts: {0, 2..6, 8}
IMPORT

 code: $F2000000
 data: $F0000000
 meta: $F1000000
 names: $F100006C
Constants:
F1000060:  14  1  0 F1  0  0  0  0  0  0  0  0  0 44 6F  0    ...￱.........Do.
F1000070:  52 65 63  0  0  0  0  0  0  0  0  0  0  0  0  0    Rec.............

EXPORT
  TYPE  = $F1000174;
  PROCEDURE Do*(); $F2000001
  TYPE Rec = Rec;

Descs:
$F1000174
   = RECORD(extlev: 0, size: 0)
  END;
  meth 0:         0
  base types:
  base 0:  $F1000174
  pointers:
  /
$F1000114
  Rec = RECORD(extlev: 0, size: 0)
  END;
  meth 0:         0
  base types:
  base 0:  Rec
  pointers:
  /


MODULE BODY;
F2000000:     RET      C3

PROCEDURE Do;

    VAR r2: $F1000174; -8
    VAR r: Rec; -8
F2000001:     PUSH    EBP      55
F2000002:     MOV     EBP,ESP      8BEC
F2000004:     PUSH    EDI      57
F2000005:     PUSH    ESI      56
F2000006:     PUSH    $F1000114      68140100F1   >>>
F200000B:     LEA     EAX,[EBP,-8]      8D45F8
F200000E:     PUSH    EAX      50
F200000F:     PUSH    $F1000114      68140100F1
F2000014:     LEA     EAX,[EBP,-8]      8D45F8
F2000017:     PUSH    EAX      50
F2000018:     CALL    [$F1000110]      FF15100100F1
F200001E:     LEA     ESP,[EBP,-8]      8D65F8   >>>
F2000021:     POP     ESI      5E
F2000022:     POP     EDI      5F
F2000023:     POP     EBP      5D
F2000024:     RET      C3
F2000025:     XCHG    EAX,EAX      90
F2000026:     XCHG    EAX,EAX      90
F2000027:     XCHG    EAX,EAX      90



Вложения:
Meta.7z [398 байт]
Скачиваний: 205
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Метод RECORD.From.
СообщениеДобавлено: Суббота, 05 Сентябрь, 2020 18:33 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Т.е. имеем ошибку перехода компилятора в неадекватное состояние. Которое не сбрасывается инициализацией при очередной компиляции.

Могу точно сказать, что трепов при компиляции не было перед этим.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Метод RECORD.From.
СообщениеДобавлено: Воскресенье, 06 Сентябрь, 2020 13:35 

Зарегистрирован: Суббота, 04 Май, 2019 10:21
Сообщения: 29
yes, it's very strange:
analysis the dasm code, the procedure "From" occupying the position of the method 0 "FINALIZE", which is a callback, No parameters proceudre; I don't know how this happened;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Метод RECORD.From.
СообщениеДобавлено: Воскресенье, 06 Сентябрь, 2020 17:23 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Илья Ермаков писал(а):
...Т.е. я столкнулся в некоем крупном модуле, с которым много работал, что метод From (IN rec: ANYREC), NEW стал непроходить по ошибке "invalid NEW attribute".


Можно предположить, что при каких-то термоядерных условиях в таблице символов остались "хвосты" от предыдущих компиляций.

Либо, размышляя над сообщением luowy, - что в ТС по ошибке поменялось имя метода с FINALIZE на From. А поскольку FINALIZE/From живет в той части ТС, которая называется @universe и создается раз при инициализации компилятора, а потом повторно используется при последующих компиляциях - он вполне мог "переходить" из модуля в модуль. Правда, если вы перезагружали ББ, вся эта логика рассыпается.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Метод RECORD.From.
СообщениеДобавлено: Воскресенье, 06 Сентябрь, 2020 18:31 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
adimetrius писал(а):
Правда, если вы перезагружали ББ, вся эта логика рассыпается.


Нет, ошибка жила только в рамках одного запуска ББ.


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

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


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

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


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

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