Closed prospero78 closed 2 years ago
`
1472 lines, 0.01 sec, 6477 bytes ./bin/testing Testing begin... test.COLLECTIONS.create() test.COLLECTIONS.push() testing NIL dereference module: COLLECTIONS line: 29 ` Хм. Это правильное поведение?
Сначала надо объявить тип-расширение от COLLECTIONS.ITEM, потом создать экземпляр такого типа (NEW(...)), и только тогда можно добавить новый экземпляр в коллекцию.
ext* = POINTER TO RECORD (COLLECTIONS.ITEM)
(* добавить нужные поля *)
END;
...
NEW(...)
Элементы добавляются в конец и извлекаются из конца (по сути это стэк, коллекцией я это назвал, потому что там могут храниться элементы любого типа, производного от COLLECTIONS.ITEM). При добавлении нового элемента в коллекцию проверка на NIL не производится, потому что по логике программы всегда добавляются ненулевые элементы. Коллекции используются для временного хранения свободных динамических записей, чтобы реже обращаться к операционной системе. Если запись больше не нужна, то вместо DISPOSE(...), она помещается в коллекцию. Если требуется создать новую динамическую запись, то она будет взята из коллекции и только если коллекция пустая, тогда будет обращение к ОС за памятью. Этот прием заметно ускоряет работу компилятора.
Ихмо, нельзя полагаться на логику работы. Нельзя допускать ситуации, когда в коллекцию кладётся NIL. Вот это точно поломает всю логику. Опять же, где реально возникла ошибка -- непонятно. Из какого места прилетает подобный NIL -- совершенно не очевидно. Догадываться -- худшее, что может случиться с программистом при анализе ошибок в коде.
`
1472 lines, 0.01 sec, 6477 bytes ./bin/testing Testing begin... test.COLLECTIONS.create() test.COLLECTIONS.push() testing NIL dereference module: COLLECTIONS line: 29 ` Хм. Это правильное поведение?