[M3devel] M3CG_Ops.Public vs. M3CG.T
Antony Hosking
hosking at cs.purdue.edu
Wed Sep 26 17:58:01 CEST 2012
Yes, M3CG.T is the most abstract type.
Please don’t make this change.
On Sep 26, 2012, at 11:36 AM, Jay K <jay.krell at cornell.edu> wrote:
> It is not pervasive.
> It is like one line in about six files. M3CG.T => M3CG_Ops.Publics.
>
>
> I guess you are saying that M3CG.T is merely the extremely abstract ROOT, where M3CG_Ops.Public has a bunch of methods? Then I might argue that M3CG.T is overly abstract -- it is like void* instead of pointer just with a bunch of methods.
>
>
> This isn't quite right, doesn't compilte, but rougly:
>
> Index: M3CG_BinRd.i3
> ===================================================================
> RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_BinRd.i3,v
> retrieving revision 1.2
> diff -u -r1.2 M3CG_BinRd.i3
> --- M3CG_BinRd.i3 12 Feb 2001 15:25:47 -0000 1.2
> +++ M3CG_BinRd.i3 26 Sep 2012 15:34:32 -0000
> @@ -3,9 +3,9 @@
>
> INTERFACE M3CG_BinRd;
>
> -IMPORT M3CG, Rd;
> +IMPORT M3CG_Ops, Rd;
>
> -PROCEDURE Inhale (rd: Rd.T; cg: M3CG.T);
> +PROCEDURE Inhale (rd: Rd.T; cg: M3CG_Ops.Public);
> (* Parse the binary intermediate code M3CG calls from 'rd'
> and call 'cg' to implement them. *)
>
> Index: M3CG_BinRd.m3
> ===================================================================
> RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_BinRd.m3,v
> retrieving revision 1.19
> diff -u -r1.19 M3CG_BinRd.m3
> --- M3CG_BinRd.m3 4 Sep 2012 14:29:54 -0000 1.19
> +++ M3CG_BinRd.m3 26 Sep 2012 15:34:32 -0000
> @@ -20,7 +20,7 @@
> TYPE
> State = RECORD
> rd : Rd.T;
> - cg : M3CG.T;
> + cg : M3CG_Ops.Public;
> buf : InputBuffer;
> buf_len: CARDINAL;
> buf_ptr: CARDINAL;
> @@ -200,7 +200,7 @@
> Cmd {Bop.fetch_and_xor, fetch_and_xor}
> };
>
> -PROCEDURE Inhale (rd: Rd.T; cg: M3CG.T) =
> +PROCEDURE Inhale (rd: Rd.T; cg: M3CG_Ops.Public) =
> VAR s: State; op: M3CG.Name; cmd: INTEGER;
> BEGIN
> s.rd := rd;
> Index: M3CG_BinWr.i3
> ===================================================================
> RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_BinWr.i3,v
> retrieving revision 1.2
> diff -u -r1.2 M3CG_BinWr.i3
> --- M3CG_BinWr.i3 12 Feb 2001 15:25:47 -0000 1.2
> +++ M3CG_BinWr.i3 26 Sep 2012 15:34:32 -0000
> @@ -3,9 +3,9 @@
>
> INTERFACE M3CG_BinWr;
>
> -IMPORT M3CG, Wr;
> +IMPORT M3CG_Ops, Wr;
>
> -PROCEDURE New (wr: Wr.T): M3CG.T;
> +PROCEDURE New (wr: Wr.T): M3CG_Ops.Public;
> (* returns a fresh, initialized code generator that writes its
> calls as binary intermediate code on 'wr'. See M3CG_Binary
> for the binary format. *)
> Index: M3CG_BinWr.m3
> ===================================================================
> RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_BinWr.m3,v
> retrieving revision 1.23
> diff -u -r1.23 M3CG_BinWr.m3
> --- M3CG_BinWr.m3 4 Sep 2012 15:20:09 -0000 1.23
> +++ M3CG_BinWr.m3 26 Sep 2012 15:34:32 -0000
> @@ -27,7 +27,7 @@
> END;
>
> TYPE
> - U = M3CG.T OBJECT
> + U = M3CG_Ops.Public OBJECT
> wr : Wr.T := NIL;
> buf : M3Buf.T := NIL;
> buf_len : INTEGER := 0;
> @@ -375,7 +375,7 @@
>
> (*---------------------------------------------------------------------------*)
>
> -PROCEDURE New (output: Wr.T): M3CG.T =
> +PROCEDURE New (output: Wr.T): M3CG_Ops.Public =
> VAR mbuf := M3Buf.New ();
> BEGIN
> M3Buf.AttachDrain (mbuf, output);
> Index: M3CG_Check.i3
> ===================================================================
> RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_Check.i3,v
> retrieving revision 1.1.1.1
> diff -u -r1.1.1.1 M3CG_Check.i3
> --- M3CG_Check.i3 14 Jan 2001 13:40:37 -0000 1.1.1.1
> +++ M3CG_Check.i3 26 Sep 2012 15:34:32 -0000
> @@ -7,11 +7,11 @@
>
> INTERFACE M3CG_Check;
>
> -IMPORT M3CG;
> +IMPORT M3CG_Ops;
>
> -PROCEDURE New (child: M3CG.T;
> +PROCEDURE New (child: M3CG_Ops.Public;
> clean_jumps, clean_stores: BOOLEAN;
> - nested_calls, nested_procs: BOOLEAN): M3CG.T;
> + nested_calls, nested_procs: BOOLEAN): M3CG_Ops.Public;
> (* returns a fresh, initialized code generator that passes its calls
> to 'child' and checks that the stream obeys the M3CG restrictions.
> If 'clean_jumps', it also checks that the stack is empty at every
> Index: M3CG_Check.m3
> ===================================================================
> RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_Check.m3,v
> retrieving revision 1.17
> diff -u -r1.17 M3CG_Check.m3
> --- M3CG_Check.m3 4 Sep 2012 14:47:43 -0000 1.17
> +++ M3CG_Check.m3 26 Sep 2012 15:34:33 -0000
> @@ -32,7 +32,7 @@
> };
>
> TYPE
> - U = M3CG.T OBJECT
> + U = M3CG_Ops.Public OBJECT
> clean_stores := FALSE;
> clean_jumps := FALSE;
> nested_calls := TRUE;
> ===================================================================
> RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_Ops.i3,v
> retrieving revision 1.12
> diff -u -r1.12 M3CG_Ops.i3
> --- M3CG_Ops.i3 16 Aug 2012 13:12:35 -0000 1.12
> +++ M3CG_Ops.i3 26 Sep 2012 15:34:33 -0000
> @@ -30,7 +30,7 @@
> Public = OBJECT
> (*------------------------------------------------ READONLY configuration ---*)
>
> -child: M3CG.T := NIL;
> +child: Public := NIL;
> (* The default methods simply call the corresponding method in 'child',
> hence a vanilla 'M3CG.T' can be used as a filter where you override
> only the methods of interest. *)
> Index: M3CG_Rd.i3
> ===================================================================
> RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_Rd.i3,v
> retrieving revision 1.1.1.1
> diff -u -r1.1.1.1 M3CG_Rd.i3
> --- M3CG_Rd.i3 14 Jan 2001 13:40:37 -0000 1.1.1.1
> +++ M3CG_Rd.i3 26 Sep 2012 15:34:33 -0000
> @@ -7,9 +7,9 @@
>
> INTERFACE M3CG_Rd;
>
> -IMPORT M3CG, Rd;
> +IMPORT M3CG_Ops, Rd;
>
> -PROCEDURE Inhale (rd: Rd.T; cg: M3CG.T);
> +PROCEDURE Inhale (rd: Rd.T; cg: M3CG_Ops.Public);
> (* Parse the M3CG calls from 'rd' and call 'cg' to implement them. *)
>
> END M3CG_Rd.
> Index: M3CG_Rd.m3
> ===================================================================
> RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_Rd.m3,v
> retrieving revision 1.15
> diff -u -r1.15 M3CG_Rd.m3
> --- M3CG_Rd.m3 4 Sep 2012 14:52:46 -0000 1.15
> +++ M3CG_Rd.m3 26 Sep 2012 15:34:33 -0000
> @@ -22,7 +22,7 @@
> TYPE
> State = RECORD
> rd : Rd.T;
> - cg : M3CG.T;
> + cg : M3CG_Ops.Public;
> ch : CHAR; (* current scan character *)
> buf : InputBuffer;
> buf_len: CARDINAL;
> @@ -206,7 +206,7 @@
> cmds: IntIntTbl.T := NIL;
> types: IntIntTbl.T := NIL;
>
> -PROCEDURE Inhale (rd: Rd.T; cg: M3CG.T) =
> +PROCEDURE Inhale (rd: Rd.T; cg: M3CG_Ops.Public) =
> VAR s: State; op: M3CG.Name; cmd: INTEGER;
> BEGIN
> s.rd := rd;
> Index: M3CG_Wr.i3
> ===================================================================
> RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_Wr.i3,v
> retrieving revision 1.1.1.1
> diff -u -r1.1.1.1 M3CG_Wr.i3
> --- M3CG_Wr.i3 14 Jan 2001 13:40:37 -0000 1.1.1.1
> +++ M3CG_Wr.i3 26 Sep 2012 15:34:33 -0000
> @@ -7,9 +7,9 @@
>
> INTERFACE M3CG_Wr;
>
> -IMPORT M3CG, Wr;
> +IMPORT M3CG_Ops, Wr;
>
> -PROCEDURE New (wr: Wr.T): M3CG.T;
> +PROCEDURE New (wr: Wr.T): M3CG_Ops.Public;
> (* returns a fresh, initialized code generator that writes its
> calls as readable ASCII on 'wr'. *)
>
> Index: M3CG_Wr.m3
> ===================================================================
> RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_Wr.m3,v
> retrieving revision 1.18
> diff -u -r1.18 M3CG_Wr.m3
> --- M3CG_Wr.m3 22 Aug 2012 14:15:40 -0000 1.18
> +++ M3CG_Wr.m3 26 Sep 2012 15:34:33 -0000
> @@ -27,7 +27,7 @@
> END;
>
> TYPE
> - U = M3CG.T OBJECT
> + U = M3CG_Ops.Public OBJECT
> wr : Wr.T := NIL;
> buf : M3Buf.T := NIL;
> buf_len : INTEGER := 0;
> @@ -375,7 +375,7 @@
>
> (*---------------------------------------------------------------------------*)
>
> -PROCEDURE New (output: Wr.T): M3CG.T =
> +PROCEDURE New (output: Wr.T): M3CG_Ops.Public =
> VAR mbuf := M3Buf.New ();
> BEGIN
> M3Buf.AttachDrain (mbuf, output);
> Index: Target.i3
> ===================================================================
>
>
> - Jay
>
> From: hosking at cs.purdue.edu
> Date: Wed, 26 Sep 2012 10:42:26 -0400
> To: jay.krell at cornell.edu
> CC: m3devel at elegosoft.com
> Subject: Re: [M3devel] M3CG_Ops.Public vs. M3CG.T
>
> I disagree. M3CG.T is more abstract than M3CG_Ops. The revelation of M3CG.T <: M3CG_Ops.Public is in M3CG_Ops. If you want the ops you simply import that interface to get the revelation. Please don’t make pervasive changes in interfaces that some of us are developing against.
>
> On Sep 26, 2012, at 4:11 AM, Jay K <jay.krell at cornell.edu> wrote:
>
> M3CG_Ops.i3:
>
>
> child: M3CG.T := NIL;
> (* The default methods simply call the corresponding method in 'child',
> hence a vanilla 'M3CG.T' can be used as a filter where you override
> only the methods of interest. *)
>
> 1)
>
> I am not keen on fixing this, but I feel this was clearly a mistake.
>
> M3CG_Ops.Public should have been "purely abstract" with no default
> implementation.
> M3CG_Filter.T or somesuch could have been as described.
>
>
> 2) I am fixing:
> M3CG.T is overused.
> Most uses should be M3CG_Ops.Public.
> It is ok to derive from -- though that was a mistake.
> But functions that take or return M3CG.T should really be
> taking and returning M3CG_Ops.Public.
>
>
> - Jay
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20120926/16ef8a2a/attachment-0002.html>
More information about the M3devel
mailing list