[M3devel] null type?

Darko Volaric lists at darko.org
Tue Apr 23 01:29:06 CEST 2013


There's another aspect of the NULL type which should be considered here.
NULL is the complement of REFANY. Just as REFANY is the ultimate ancestor
of all reference types, NULL is the ultimate descendant of
all reference types. As a result any variable of a reference type can be
assigned NIL. Because of its unusual position, NIL is the only member of
type NULL, since no other value makes sense (which is why it's sometimes
called the "absurd" type).


On Mon, Apr 22, 2013 at 10:38 AM, Jay K <jay.krell at cornell.edu> wrote:

> Disclosure: I knew they are of type "NULL", but I didn't/don't know what
> that type is, or have a mental model for it.
> This about the only place in the entire tree that uses this type. It
> triggers an error in the C backend, but should be trivial to fix. I can
> just treat this as "ADDRESS" presumably. Checks that it is NIL, that is the
> frontend's job. The error is just that I check that I know about every
> type. Some types are "predeclared", some come from the frontend. I'll
> predeclare this. Arguably nothing should be predeclared.
>
>
>   - Jay
>
> > Date: Sun, 21 Apr 2013 21:03:02 -0500
> > From: rodney_bates at lcwb.coop
> > To: m3devel at elegosoft.com
> > Subject: Re: [M3devel] null type?
>
> >
> >
> >
> > On 04/21/2013 03:55 PM, Jay K wrote:
> > > What is the meaning of this:
> > >
> > > cm3/elego/graphicutils/src/RsrcFilter
> > >
> > > init(p1, p2, p3, p4, p5, p6 := NIL) : T;
> > > (* Initializes the resource search path. *)
> > >
> > >
> > > PROCEDURE Init(self : T; p1, p2, p3, p4, p5, p6 := NIL) : T =
> > >
> >
> > Modula-3 says:
> >
> > 2.2.7: 'The following reference types are predeclared:
> > ...
> > NULL Contains only NIL'
> >
> > And:
> >
> > 2.2.8: 'A formal parameter declaration has the form
> > Mode Name: Type := Default
> > ...
> > If Type is omitted, it is taken to be the type of Default.'
> >
> > And:
> >
> > 2.6.6: 'The literal "NIL" denotes the value NIL. Its type is NULL.'
> >
> > So all the pi's have type NULL, and only NIL can be passed to them
> > as actuals. That's what the language says. It looks like the code
> > in Init thinks it can get non-NIL reference values, but an attempt to
> pass
> > one in a call should fail a runtime assignability check, since it
> > won't be a member of NULL.
> >
> > When Init passes one of these to Convert (Yes, I peeked into
> > RsrcFilter.m3), it is assignable, with no runtime check. Convert
> > thinks it has a REFANY, and other calls to Convert could indeed
> > give it something non-NIL, but not from the calls in Init.
> >
> > Of course, unsafe code could probably LOOPHOLE (remember, any word
> > can be verbed) something non-NIL to NULL and pass it to init/Init.
> > If the compiler did the most obvious thing, this might do what was
> > apparently intended.
> >
> > But then again, a compiler would be fully compliant with the language
> > and perfectly within its rights to optimize out such a parameter,
> > not actually pass it at runtime at all, and just insert constant NIL
> > wherever the formal was referenced in the body of Init, thus undermining
> > the above intent.
> >
> > Which makes for a good example of how unsafe code (almost?) always
> > depends on assumptions about what a compiler will do.
> >
> > >
> > > What are the types of p1, p2, etc.?
> > >
> > >
> > > - Jay
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20130422/c5ff907b/attachment-0002.html>


More information about the M3devel mailing list