Page 1 of 1

SYSTEM.TYP - Why is it even there?

Posted: Wed Aug 04, 2021 1:32 pm
by adimetrius
Colleagues,

In keeping my work on Herschel, the amd64 compiler for CP, I have encountered the following.

Platform-Specific issues defines the module SYSTEM, including procedures TYP and ADR. Their definition in PSI is limited compared to what they actually do.

SYSTEM.TYP expects, according to PSI, a variable v of record type and returns the type tag of v (presumably the actual, or dynamic, type of v).
First, What the PSI does not define, is that SYSTEM.TYP can also accept T: a record type, and will return the type tag of T, or T: a pointer to record type, and will return the type tag of the record type (NOT the pointer type!). This notation, despite being undocumented, is widely used in module Kernel.

SYSTEM.ADR has three documented notations, the last expecting T: a record type and returning the address of Descriptor of T.
Second, What the PSI does not define, is that SYSTEM.ADR can also accept A: an array type, P: a procedural type, PTR: a pointer type, and in all these cases will return the address of Descriptor of the type. In other words, SYSTEM.ADR(T) expects a structural, pointer or procedural type (all these are descriptored in BB) and returns the address of the descriptor of T.

Third, there is a duplicity of terms: TYP definition talks about the type tag, while ADR definition talks about the address of Decriptor - which in essense is the same thing, isn't it?

Fourth, and last, There is a duplicity of function: for T: a record type, SYSTEM.TYP(T) = SYSTEM.ADR(T).

I think that dropping SYSTEM.TYP(T) from the compiler would make it and the PSI slightly simpler and cleaner; while documenting all notations of SYSTEM.ADR would make PSI more truthful and exact - like so for example:
ADR(T) T: a record, array, pointer or procedural type INTEGER address of descriptor of T (type tag)

What do you think?

Re: SYSTEM.TYP - Why is it even there?

Posted: Thu Sep 09, 2021 7:18 pm
by Josef Templ
according to PSI it seems to me that TYP(v) gives you the dynamic type of record variable v (or some p^) while ADR(T) gives you the type of the statically known type T.

- Josef