OberonCore https://forum.oberoncore.ru/ |
|
Метод RECORD.From. https://forum.oberoncore.ru/viewtopic.php?f=23&t=6651 |
Страница 1 из 1 |
Автор: | Илья Ермаков [ Суббота, 05 Сентябрь, 2020 00:00 ] |
Заголовок сообщения: | Метод RECORD.From. |
Чем дальше в лес, тем крупнее пасхальные яички. При попытке определить у 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 в надежде найти место, где что-нибудь в дерево при компиляции добавляется, ничего не дал. Загадка ждёт археологов ![]() |
Автор: | luowy [ Суббота, 05 Сентябрь, 2020 06:41 ] |
Заголовок сообщения: | Re: Метод RECORD.From. |
Nothing strange happened. I test this demo Код: MODULE TestRecordFrom; Maybe your changes to the compiler made this happen
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 |
Автор: | Иван Денисов [ Суббота, 05 Сентябрь, 2020 07:35 ] |
Заголовок сообщения: | Re: Метод RECORD.From. |
Проверил, тоже компилируется и исполняется. Может в версии 1.6 так было. |
Автор: | adimetrius [ Суббота, 05 Сентябрь, 2020 11:23 ] |
Заголовок сообщения: | Re: Метод RECORD.From. |
Илья Евгеньевич, у меня такой текст Код: 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" в модулях анализатора не найдено. Похоже, у вас там какая-то магия... |
Автор: | Илья Ермаков [ Суббота, 05 Сентябрь, 2020 18:31 ] | ||
Заголовок сообщения: | Re: Метод RECORD.From. | ||
Очень странная история. Компилятор - обычный, от 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
|
Автор: | Илья Ермаков [ Суббота, 05 Сентябрь, 2020 18:33 ] |
Заголовок сообщения: | Re: Метод RECORD.From. |
Т.е. имеем ошибку перехода компилятора в неадекватное состояние. Которое не сбрасывается инициализацией при очередной компиляции. Могу точно сказать, что трепов при компиляции не было перед этим. |
Автор: | luowy [ Воскресенье, 06 Сентябрь, 2020 13:35 ] |
Заголовок сообщения: | Re: Метод RECORD.From. |
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; |
Автор: | adimetrius [ Воскресенье, 06 Сентябрь, 2020 17:23 ] |
Заголовок сообщения: | Re: Метод RECORD.From. |
Илья Ермаков писал(а): ...Т.е. я столкнулся в некоем крупном модуле, с которым много работал, что метод From (IN rec: ANYREC), NEW стал непроходить по ошибке "invalid NEW attribute". Можно предположить, что при каких-то термоядерных условиях в таблице символов остались "хвосты" от предыдущих компиляций. Либо, размышляя над сообщением luowy, - что в ТС по ошибке поменялось имя метода с FINALIZE на From. А поскольку FINALIZE/From живет в той части ТС, которая называется @universe и создается раз при инициализации компилятора, а потом повторно используется при последующих компиляциях - он вполне мог "переходить" из модуля в модуль. Правда, если вы перезагружали ББ, вся эта логика рассыпается. |
Автор: | Илья Ермаков [ Воскресенье, 06 Сентябрь, 2020 18:31 ] |
Заголовок сообщения: | Re: Метод RECORD.From. |
adimetrius писал(а): Правда, если вы перезагружали ББ, вся эта логика рассыпается. Нет, ошибка жила только в рамках одного запуска ББ. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |