[M3devel] M3CG_Ops.Public vs. M3CG.T

Jay K jay.krell at cornell.edu
Wed Sep 26 17:36:34 CEST 2012


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,vretrieving revision 1.2diff -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,vretrieving revision 1.19diff -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,vretrieving revision 1.2diff -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,vretrieving revision 1.23diff -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,vretrieving revision 1.1.1.1diff -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 everyIndex: M3CG_Check.m3===================================================================RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_Check.m3,vretrieving revision 1.17diff -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,vretrieving revision 1.12diff -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,vretrieving revision 1.1.1.1diff -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,vretrieving revision 1.15diff -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,vretrieving revision 1.1.1.1diff -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,vretrieving revision 1.18diff -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 defaultimplementation.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 betaking and returning M3CG_Ops.Public.

  - Jay

 		 	   		  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20120926/6680c40d/attachment-0002.html>


More information about the M3devel mailing list