Очень странная история. Компилятор - обычный, от 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