Никак не соображу как локализовать ошибку. Сбивает с толку факт, что в Windows компиляция происходит успешно. Наверно, модуль Kernel был неполноценно перенесён на Линукс.
Вот такой код сбоит компиляцию в Линуксе (основан на модуле Files):
Код:
MODULE TestOop2;
IMPORT Kernel;
CONST copyleft* = "Copyleft";
TYPE
Name* = ARRAY 256 OF CHAR;
Type* = ARRAY 16 OF CHAR;
FileInfo* = POINTER TO RECORD
next*: FileInfo;
name*: Name;
length*: INTEGER;
type*: Type;
modified*: RECORD year*, month*, day*, hour*, minute*, second*: INTEGER END;
attr*: SET
END;
LocInfo* = POINTER TO RECORD
next*: LocInfo;
name*: Name;
attr*: SET;
END;
Data* = POINTER TO ABSTRACT RECORD
init: BOOLEAN;
f1: INTEGER
END;
Locator* = POINTER TO ABSTRACT RECORD
END;
File* = POINTER TO ABSTRACT RECORD
type-: Type;
(*init: BOOLEAN;*)
END;
Rec = POINTER TO RECORD END;
VAR
(*d: Data;*)
v, v2, v3, v4, v5, v6: ARRAY 1 OF INTEGER;
PROCEDURE (s: Data) Init*, NEW;
BEGIN
ASSERT(s.f1 # 0, 20);
s.init := TRUE;
s.f1 := 100;
END Init;
PROCEDURE (l: Locator) This* (IN path: ARRAY OF CHAR): Locator, NEW, ABSTRACT;
PROCEDURE (f: File) InitType* (type: Type), NEW;
BEGIN
f.type := type$
END InitType;
PROCEDURE (f: File) Length* (): INTEGER, NEW, ABSTRACT;
(*PROCEDURE (f: File) Length* (): INTEGER, NEW; BEGIN RETURN 1 END Length;*)
(*PROCEDURE (f: File) Length2* (): INTEGER, NEW, ABSTRACT;*)
END TestOop2.
Практически любое изменение в объявлении символов для экспорта или в теле процедур может привести к исчезновению сбоя. Есть ощущение, что есть зависимость от размера данных и количества экспортируемых символов от наличия сбоя.
Кроме того, мне удалось адаптировать модуль StdDebug для консольного режима и теперь я могу немнгого более подробно знать об ошибке. Но это пока не помогло в выявлении ошибки.
Код:
Trying to compile module TestOop2 ...
illegal memory read (ad = B7362DFAH)
CDevCPV486.procs [00006A81H]
.ch SHORTCHAR "�"
.end INTEGER 163345872
.i INTEGER -1220564312
.j INTEGER 0
.n CDevCPT.Node IllegalAddress0000003CH
.name CDevCPT.Name "�x56��d" ...
"�x56��d", 0X, 0X, "����", 1X, "56��ۼ", 9X, 0X, 0X, 0X, 0X, "��?�", 1CX, "���", 0CX, "���", 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, "��?�", 1CX, "���,���F�7�", 0X, 0X, 0X, 0X, 10X, 90X, "�", 9X, 0X, 0X, 0X, 0FX, "��?�", 1CX, "���H���F�7��", 8FX, "�", 9X, 90X, 8FX, "�", 9X, 0X, 0X, 0X, 0FX, "��?�", 1CX, "���d���F�7�0", 8FX, "�", 9X, 10X, 8FX, "�", 9X, 0X, 0X, 0X, 0FX, "��?�", 1CX, "���", 80X, "���F�7��", 8EX, "�", 9X, 90X, 8EX, "�", 9X, 0X, 0X, 0X, 0FX, "��?�", 1CX, "���", 9CX, "���F�7�0", 8EX, "�", 9X, 10X, 8EX, "�", 9X, 0X, 0X, 0X, 0FX, "��?�", 1CX, "����F�7��", 8DX, "�", 9X, 90X, 8DX, "�", 9X, "���", 0FX, "��?�", 1CX, "�������F�7�0", 8DX, "�", 9X, 0X, 0X, 0X, 0X, "��7���?�", 1CX, "�������F�7"
.obj CDevCPT.Object NIL
.proc CDevCPT.Object NIL
.useFpu BOOLEAN Undefined238
CDevCPV486.Module [00006F7AH]
.aAd INTEGER 163352240
.end INTEGER 0
.n CDevCPT.Node NIL
.name CDevCPT.Name "$$" ...
"$$", 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, "h�", 8BX, "6�0", 8EX, "�", 9X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, "�", 0X, 9X, 0X, 9CX, "�", 8BX, "6��", 8DX, "�", 9X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, "������", 8BX, "6�0", 8DX, "�", 9X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, "0v�", 9X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 80X, "O", 4X, "�", 8BX, "6��u�", 9X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, " ��� ���m", 8DX, "6�Pu�", 9X, 80X, "m�", 9X, 1X, 3X, 7FX, 0X
.obj CDevCPT.Object NIL
.p CDevCPT.Object NIL
.prog CDevCPT.Node [09BC9D10H]
.rAd INTEGER -1221162053
.typ CDevCPT.Struct NIL
.useFpu BOOLEAN FALSE
Что интересно, что сбой происходит если подключать модуль Kernel. Если же его не подключать, то всё скомпилируется без сбоя. Да и, вообще, сбой происходит именно в модулях с низкоуровневыми операциями. Во всех сбоях ловушка указывает на модуль CDevCPV486. Причём, именно на рекурсивных процедурах. Переполнение стека?