[Oberon] NEW with anonymous records
andreas_pirklbauer at yahoo.com
Tue Feb 20 12:13:58 CET 2018
> I believe this problem was addressed in the 23.9.2017
> update of Project Oberon with a language restriction
> implemented in ORP.Mod. If you try to compile the
> code above you will now get the error message:
> "Error: must point to named record”
Correct. This is when it happened. It came out of a discussion
about type descriptors and a suggestion I had made back then.
Prior to 23.9.2017 it possible to declare pointers to
*anonymous* records eg: TYPE T = POINTER TO RECORD .. END.
The issue with this was that the compiler did not (and still
does not) create type descriptors for *anonymous* records.
This created a problem if a dynamic variable pointing to
an *anonymous* record type is allocated via the predefined
procedure NEW (which accesses the type descriptor to obtain
the size of the record about to be allocated in the heap).
Solution #1 is to also create type descriptors for *anonymous*
records, which could be accomplished by changing ORP.Type0 to:
IF type.base.form # ORB.Record THEN ORS.Mark("must point to record”)
ELSIF type.base.typobj = NIL THEN ORG.BuildTD(type.base, dc) (*type descriptor; len used as its address*)
Solution #2 is to restrict pointers to *named* records, which is
accomplished by replacing the above IF statement in ORP.Type0 to:
IF (type.base.form # ORB.Record) OR (type.base.typobj = NIL) THEN
ORS.Mark("must point to named record”)
Solution #2 was retained. It leads to more readably code, even though
the necessity to declare a pointer type AND its record type my be
perceived as somewhat annoying. But one can certainly live with it.
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Oberon