Нарвался на трэп ASSERT(p IS Store, 21) в Stores.NewStore в модуле с типами
Element* = POINTER TO LIMITED RECORD (Stores.Store)
ElementDesc* = RECORD
Вроде как в Kernel неявные базовые типы метятся крышкой.
на
T = POINTER TO RECORD ... END;
получаем
T = POINTER TO T^
T^ = RECORD ... END
Однако в Stores это дело проскакивает как TDesc. Старое наследие, недопеределанное?
Воспроизведение (переименовать TDesc, трэп пропадает):
Код:
MODULE PrivStoresDescTest;
IMPORT Log, Files, Stores;
TYPE
T = POINTER TO RECORD (Stores.Store)
n: INTEGER
END;
TDesc = RECORD
n: INTEGER
END;
PROCEDURE (t: T) Externalize (VAR wr: Stores.Writer);
BEGIN
wr.WriteInt(t.n)
END Externalize;
PROCEDURE (t: T) Internalize (VAR rd: Stores.Reader);
BEGIN
rd.ReadInt(t.n)
END Internalize;
PROCEDURE WriteAndReadT* (n: INTEGER);
VAR
t: T; s: Stores.Store;
f: Files.File; r: Stores.Reader; w: Stores.Writer;
BEGIN
NEW(t); t.n := n;
f := Files.dir.Temp();
w.ConnectTo(f); w.SetPos(0);
w.WriteStore(t);
r.ConnectTo(f); r.SetPos(0);
r.ReadStore(s);
Log.Int(s(T).n); Log.Ln
END WriteAndReadT;
END PrivStoresDescTest.
^Q "PrivStoresDescTest.WriteAndReadT(1)"