[M3devel] null type?

Jay K jay.krell at cornell.edu
Mon Apr 22 19:38:28 CEST 2013


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/dbc9b338/attachment-0002.html>


More information about the M3devel mailing list