Copyright c Xerox Corporation 1980Inter-Office MemorandumToMesa UsersDateSeptember 26, 1980FromDick SweetLocationPalo AltoSubjectMesa 6.0m Change SummaryOrganizationSDD/SS/MesaXEROX Filed on: [Igor]Doc>Summary60m.bravoThis memo outlines changes made in Mesa since the last alpha update (Mesa 6.0u, July 11, 1980).These changes will shortly be incorporated into the Mesa 6.0 Change Summary to correctly reflectthe differences between Mesa 5.0 and Mesa 6.0. This document also includes a list of ARs fixedsince 6.0u.LanguageThe language has been extended in the following areas:Monitor Locks and Condition Variables in RecordsWhen constructing a record, any fields not mentioned (and not having defaults) are not guaranteedto have known values after the construction. In particular, they are not guaranteed to have theirprevious values. This poses a problem in types containing "hidden" fields such as the queues ofprocesses in MONITORLOCKs and CONDITIONs, and with a few other types (see the attached memofrom Ed Satterthwaite). To protect users from inadvertantly overwriting these fields, the Mesa 6compiler does not allow updating of variables of these types, or of any composite type containing afield of these types. This does not mean that MONITORED RECORDs are read-only; they can beassigned to field by field. However, it is illegal to write a constructor for an entire MONITOREDRECORD except at the point of declaration (or allocation, by the NEW operator). SequencesA sequence is an indexable collection of objects, all of which have the same type. In this respect, asequence resembles an array; however, the length of a sequence is not specified at compile time.Consider some examples of "faked" sequences from Mesa 5.. . .ARec1: TYPE = RECORD [common: . . .count: CARDINAL, -- number of elementsbody: ARRAY [0..0) OF INTEGER];. . .ARec2: TYPE = RECORD [!pX qp]g~ri cs]pX -s7Bp ]s]p -s7Bp Ys]t-s 7Bp Sup MsF/ Gp6) F$8( D}M B >t ;p6 89v0 4pR 3CH 1D / s psp4 .MN ,G *$ sp )W>s 'p;sp $av !pvp'5 k3- 8Ivwswswp('vwX(vwspwp(1vwswpwsF pwvwspswpb>d Mesa 6.0m Change Summary2common: . . .body: ARRAY [0..0) OF INTEGER];ar1: POINTER TO ARec1;ar2: POINTER TO ARec2;The record ARec1 contains a count of the number of INTEGERs in body. The number of elements inan ARec2 is not contained in the record; it is kept elsewhere, say in a global variable, or computedfrom the values of common fields. Note that these "variable length" arrays occur only at the end ofrecords (they obviously couldn't occur in the middle). Also, since you aren't telling the compilerhow many elements are present in a given ARec*, it doesn't make sense to declare one; you obtainstorage from your favorite allocator and access the elements using a pointer.In Mesa 6, these constructs are built into the language. A SEQUENCE occurs as the last field of arecord. It optionally has a count of elements associated with the indexable portion. The followingMesa 6 declarations are roughly equivalent to the Mesa 5 ones above:. . .SRec1: TYPE = RECORD [common: . . .body: SEQUENCE count: CARDINAL OF INTEGER];. . .SRec2: TYPE = RECORD [common: . . .body: SEQUENCE COMPUTED CARDINAL OF INTEGER];sr1: POINTER TO SRec1;sr2: POINTER TO SRec2;Variables of type SRec* must also be dynamically allocated at runtime, since they are of variablelength. However, the NEW operator of Mesa 6 knows how to deal with sequences. Let z be anMDSZone, n a CARDINAL. The following are legal statements:(1)sr1 _ z.NEW [SRec1[n]];-- sets sr1.count to n(2)sr2 _ z.NEW[SRec2[n]];(3)sr1 _ z.NEW[SRec1[n] _ [common: . . ., body: NULL]];In statement (1), sufficient space is allocated to contain the common part of an SRec1 plus nelements (INTEGERs) in the sequence part. Additionally, the number of elements, count, is initializedto the value n. Thereafter, the value of count is readonly. The only way to set the length field of asequence is by the NEW operator. In statement (2), space is allocated for an SRec2 with n elements,but there is no count field to initialize. Of course, in any of these statements, n could be replacedby any constant or expression of type CARDINAL. In statement (3), the common fields are also set byan initializing constructor. Note that the "array" part of the sequence is voided in the constructor.In Mesa 6, there is no provision for writing a constructor for the variable length portion of aSEQUENCE. One must write explicit code to initialize it. ftG(bvwX(_vwswpwsF p\Tvws wvpYvws wvp U vpspvp Tvp+1 Rh<( PV O)vp2 MrM J# 2sp H|N FDDZwBvwspsp(@7vX (=swvsFp<w:nvspsp(7vX (5xsFxXsFp2)vs wvp.vs wvp +vp@ )sp(vp (=vpvpsp%2$vpvswpvpvpwpvpv2!pvpvspvpvp2Qvpvspvpvpvsp Jvpv [p sp?vp  vpvp v   sv p.vpvp eRvp &sp5 H o$; sp1 R >ZMesa 6.0m Change Summary3To access an element of the sequence, one attaches an indexing expression to the pointer to therecord containing the sequence. This is analogous to the treatment of type STRING (which isessentially a sequence of the Mesa 6 variety).i _ sr1[j];sr2[j] _ i;If one compiles a module with bounds checking enabled (/b to the compiler), code will begenerated when accessing sr1[j] to assure that j IN [0..sr1.count).Alternative, on may write (analogous to saying s.text[i] for a STRING):i _ sr1.body[j];sr2.body[j] _ i;The attached memo from Ed Satterthwaite discusses the use and declaration of SEQUENCEs inconsiderable detail.FormatterThe Formatter is a program for transforming Mesa source files into a standard format. It uses theCompiler's scanner and parser to determine nesting, and hence can be used only on syntacticallycorrect programs. Attached is the Appendix from the Mesa 6 Users Handbook (in progress) thatexplains the use of the Formatter.BinderThe binder now allows the association between file names and module or configuration names to begiven on the command line, in much the same way as the compiler. For example, the commandline>Binder.bcd Tajo[TestPilot: UnpackagedTestPilot]will bind Tajo.config using the previously bound configuration TestPilot that is stored in thefile named UnpackagedTestPilot.bcd. One can best think of the the text inside the bracketsas defining (augmenting/replacing) a DIRECTORY statement at the beginning of the configuration.SystemAll of the system interfaces have been recompiled for 6.0m. This means that all modules must berecompiled/rebound to use the new Mesa.image. No source changes are necessary (except forusers of FTPDefs, as previously announced; see below).To track development in other systems, minor revisions have been made in the DevelopmentSoftware interfaces Format, Inline, Runtime, System, and Time.RunMesaRunMesa has been upgraded to included Alto microcode for Pup checksums, IEEE floating point,and HBlt (Griffin). This microcode is loaded with the XMesa overflow microcode on Altos withthe 2K ROM or 3K RAM option. Users who have been loading microcode for these functions needno longer do so. This change affects Alto IIs only. ftG bp_ `vLsp ^.[vpvpvpYvpvpvp V7yp Tvpvpvswpvp Q/vpvpspNFvpvpvpLvpvpvp IP=zp G Ct @[pR >I = +2 ;e" 7ft 4p-3 2p/+ 0-zy0 *+p y pwp ( yp$ &%sp $ "t pP y p. @wp& &2 Jwpwpwpwpwp Kt pU UI {p{pH 4 =]L2Mesa 6.0m Change Summary4DebuggerIn addition to many bug fixes, the following changes and additions have been made:Source MenusAttachThe Attach menu command has been added to the Source Ops source menu; it causes theDebugger to ignore the creation date of the current source file when setting breakpoints orpositioning to a source line. Because this defeats type checking, this command should be used withcaution. If, after invoking this command, the Debugger sets breakpoints in strange places, chancesare that the source file does not match the object in the system you are debugging.CommandsReSet context [confirm]This command now requires two keystrokes, to avoid conflict with the ReMote debuggeecommand (not yet implemented on the Alto).Program-not-started IndicationWhen the debugger refers to a program module, it usually gives the address of its global frame, e.g(G: nnnnnB). If the module has not been started, the debugger now prints a tilde (~) after the B.If a module has not been started, the user should not believe and should not modify the globalvariables of that module.Command CentralThe options window has changed format and allows inclusion of default switch settings.Performance MonitorThe Performance Monitor has been upgraded to Mesa 6.0. It is the same as in Mesa 5.0 except thatdebugger breakpoint numbers are used for NodeIDs. Upgraded documentation will beforthcoming.Xfer CounterThe Xfer Counter has been upgraded to Mesa 6.0. A new mode of operation has been added togather information on the flow of control between groups of modules. Documentation for the XferCounter is attached.PupPupDefsUseAltoChecksumMicrocode has been added to speed up processing if you are running on anAlto II with the 2K ROM or 3K RAM option. The overflow microcode loaded into the RAM byRunMesa.run includes the necessary additions. (Beware if you load your own microcode.) ftG b ^pR [v X2y Tpyp$v p S<[ Qv+ Op P NFS Jv Gy DZp@y Bp* ?dv <pX :nypTyp 82vp 7 3 t /pV +t (pR &:N; %5 !6t pJ @8(  t Kv wp? U{p{p0{p y p@ d g>[Mesa 6.0m Change Summary5Subtle implementation changesGetPupAddress will no longer return an address for a dying net. EnumeratePupAddresseswill now pass the client-supplied procedure addresses on dead or dying nets, but only afterprocessing all the addresses on nets that are reachable. (It used to skip addresses on unreachablenets.)The byte stream internals have been reworked to eliminate several unpleasant delays while openingand closing connections. It is now possible to open a connection, send a thousand words, and closethe connection in less than a second. (Since Close UnNews three module instances, it will takelonger if you have a lot of active global frames.) A byproduct of this cleanup is that SendNowwill send an empty aData packet to request an acknowledgment even if the previous SendBlockhappened to end on a convenient packet boundary.Bug fixesThe following change requests are closed by this release:5005 Delays when creating byte stream5093 NameLookup vs dying nets5098 Change priority of interrupt routine in EthernetDriver(s)FtpFTPDefsThe arguments to the (client supplied) procedure passed to FTPInventoryDumpFile have beenextended to allow proper processing of create dates. It is now compatable with the procedurepassed to FTPEnumerateFiles.Bug fixesThe following change requests are closed by this release:3987 StringBoundsFault from TimeExtras.PacketTimeFromString4444 FTPInventorryDumpFile needs create date4763 Troubles if forget to call IdentifyNextRejectedRecipient5152 TimeExtras.PacketTimeFromString zone screwup5198 Config with server and user thingsDistribution:Mesa UsersMesa GroupSDSupport ftG bv ^w p,w ](pF [ U Y VL TI S<wp, QFw Opwp0 w NFp0 Jv Gp9E-%Cw p A-w p =t :v 7Bp0 wp 5&7 3 wp 0v -Vp9*wpw)4pwp'w%pwp $>'  X R d d=OInter-Office MemorandumToMesa UsersDateSeptember 25, 1980FromEd SatterthwaiteLocationPalo AltoSubjectMesa 6.0m Compiler ChangesOrganizationPARC/CSLXEROX Filed on: [Igor]Compiler60m.bravo (and .press)DRAFTThis memo documents additions and changes to the Mesa 6 language since the last alpha release(Mesa 6.0u, July 11, 1980). For a complete description of the differences between the Mesa 5 andMesa 6 languages, including the material below, see [Igor]Compiler60.bravo (or .press).SequencesA sequence in Mesa is an indexable collection of objects, all of which have the same type. In thisrespect, a sequence resembles an array; however, you need not specify the length of the sequencewhen its type is declared, only when an instance of that type is created. Mesa 6 provides sequence-containing types for applications in which the size of a dynamically created array cannot becomputed statically. Note, however, that only a subset of a more general design for sequences hasbeen implemented. The contexts in which sequence types may appear are somewhat restricted, asare the available operations on them. We believe that the subset provides enough functionality toaccomodate most uses of sequences, but you will encounter a number of annoying and sometimesinconvenient restrictions that you must take note of in your Mesa 6 programming.One can view a sequence type as a union of some number of array types, just as the variant part ofa variant record type can be viewed as a union of some (enumerated) collection of record types.Mesa adopts this view, particularly with respect to the declaration of sequence-containing types, withthe following consequences:A sequence type can be used only to declare a field of a record. At most one such field mayappear within a record, and it must occur last.A sequence-containing object has a tag field that specifies the length of that particular objectand thus the set of valid indices for its elements.To access the elements of a sequence, you use ordinary indexing operations; no discrimination isrequired. In this sense, all sequences are overlaid, but simple bounds checking is sufficient to validate each access.Uses of sequence-containing variables must follow a more restrictive discipline than is currentlyenforced for variant records. The (maximum) length of a sequence is fixed when the objectcontaining that sequence is created, and it cannot subsequently be changed. In addition, Mesa 6imposes the following restrictions on the uses of sequences:You cannot embed a sequence-containing record within another data structure. You mustallocate such records dynamically and reference them through pointers. (The NEW operationhas been extended to make allocation convenient.)]gpi c8q]rX -q7Br ]q]r-q7Br Yq]s-q 7BrStr MqF9?v FHr!< DJ Bb >s ;rwr#6 9P 89J 6.. 4.4 3CH 16, /R .MP *Z )WV 'f & L#+1L!/LkNL3 uE uP r*7 < 1^ <LAL g!,qr L 1  y>^Mesa 6.0m Compiler Changes2You cannot derive a new type from a sequence-containing type by fixing the (maximum)length; i.e., there is no analog of a discriminated variant record type. There are no constructors for sequence-valued components of records, nor are suchcomponents initialized automatically.The following sections describe sequences in more detail.Defining Sequence TypesYou may use sequence types only to declare fields of records. A record may have at most one suchfield, and that field must be declared as the final component of the record:SyntaxVariantPart ::=. . . |PackingOption SEQUENCE SeqTag OF TypeSpecificationSeqTag ::=identifier : Access BoundsType |COMPUTED BoundsTypeBoundsType ::=IndexTypeTypeSpecification ::=. . . |TypeIdentifier [ Expression ]The TypeSpecification in VariantPart establishes the type of the sequence elements. TheBoundsType appearing in the SeqTag determines the type of the indices used to select from thoseelements. It is also the type of a tag value that is associated with each particular sequence object toencode the length of that object. For any such object, all valid indices are smaller than the value ofthe tag. If T is the BoundsType, the sequence type is effectively a union of array types with theindex typesT[FIRST[T] .. FIRST[T]), T[FIRST[T] .. SUCC[FIRST[T]]), ... T[FIRST[T] .. LAST[T])and a sequence with tag value v has index type T[FIRST[T]..v). Note that the smallest interval in thisunion is empty.If you use the first form of SeqTag, the value of the tag is stored with the sequence and isavailable for subscript checking. In the form using COMPUTED, no such value is stored, and nobounds checking is possible.Examples:StackRep: TYPE = RECORD [ top: INTEGER _ 1, item: SEQUENCE size: [0..LAST[INTEGER]] OF T]Number: TYPE = RECORD [ sign: {plus, minus}, magnitude: SELECT kind: * FROM short => [val: [0..1000)], long => [val: LONG CARDINAL], extended => [val: SEQUENCE length: CARDINAL OF CARDINAL] ENDCASE] fsGLbr=L`vIL]"L#L\T% YX9 Uw RhrB PL MrwLJx rX xIPrx qxqxLFr x rxrx E-rx qrx LB r xL>r xcardinality(Ti), and you have requested bounds checking.If FIRST[Ti] = 0, SUCCn[FIRST[Ti]] is just n, i.e., the interpretation of the tag is most intuitive if Ti isa zero-origin subrange. Usually you will specify a BoundsType (e.g., CARDINAL) with a range thatcomfortably exceeds the maximum expected sequence length. If, however, some maximum lengthN is important to you, you should consider using [0..N] as the BoundsType; then the value of thetag field in a sequence of length n (n < N) is just n and the valid indices are in the interval [0..n).Operations on SequencesYou can use a sequence-containing type S only as the argument of the type constructor POINTER TO(or REF). Note that the type of z.NEW[S[n]] is POINTER TO S (not POINTER TO S[n]). If the type ofan object is S, the operations defined upon that object areordinary access to fields in the common partreadonly access to the tag field (if not COMPUTED)indexing of the sequence fieldconstructing a descriptor for the components of the sequence field (if not COMPUTED).There are no other operations upon either type S or the sequence type embedded within S. Inparticular, you cannot assign or compare sequences or sequence-containing records (except byexplicitly programming operations on the components).Indexing: You may use indexing to select elements of the sequence-containing field of a record byusing ordinary subscript notation, e.g., s.seq[i]. The type of the indexing expression i must conformto the BoundsType appearing in the declaration of the sequence field and must be less than thevalue of the tag, as described above. The result designates a variable with the type of thesequence's elements. A bounds fault occurs if the index is out of range, the sequence is notCOMPUTED, and you have requested bounds checking.By convention, the indexing operation upon sequences extends to records containing sequence-valued fields. Thus you need not supply the field name in the indexing operation. Note too thatboth indexing and field selection provide automatic dereferencing.Examples:ps^.item[ps.top] ps.item[ps.top] ps[ps.top] -- all equivalentDescriptors: You may apply the DESCRIPTOR operator to the sequence field of a record; the result isa descriptor for the elements of that field. The resulting value has a descriptor type with index andcomponent types and PACKED attribute equal to the corresponding attributes of the sequence type.By extension, DESCRIPTOR may be applied to a sequence-containing record to obtain a descriptor forthe sequence part. The DESCRIPTOR operator does not automatically dereference its argument. fsG brL_wrXqFrXwrwrqrwr.wrwrL](wrqF rXwrqrwrwrwrwrwrqrLZwrqF rXwrwrqrwrwr W^ wrR Uqrx rwU*uUrxr SqTuSrqrwRuSr@wRuSr wry Qw rwQ+uQrwr$ NqrwMuNrqOuNrqrwMuNr wr;wMuNr Lx rqr KT Iswr4wrx r G wrwryrwr wr/wr D}w A.r'wr.q ?rqrwrqrwrwrq rwrq rwrwr = wr-L;eX,L8)qrL6oL3Kqr 0/wr&wr .2* -V5 *wr L (`)wrwrwr&wr &x rM %K #j8% !qrwr$ t4( ># &B \wrwrwrwrXwrwrwrwrwrwrwr  w r q r: ff qr0  q rC pq r1 B )>\Mesa 6.0m Compiler Changes5You cannot use the single-argument form of the DESCRIPTOR operator if the sequence is COMPUTED.The multiple-argument form remains available for constructing such descriptor values explicitly (andwithout type checking).In any new programming, you should consider the following style recommendation: use sequence-containing types forallocation of arrays with dynamically computed size; use array descriptor types only for parameter passing. This style willbecome mandatory in the safe subset of Cedar Mesa.Examples:DESCRIPTOR[pn^] DESCRIPTOR[pn.sons] -- equivalentString Bodies and TEXTThe type StringBody provided by previous versions of Mesa illustrates the intended properties anduses of sequences. For compatibility reasons, it has not been redefined as a sequence; thedeclarations of the types STRING and StringBody remain as follows:STRING: TYPE = POINTER TO StringBody;StringBody: TYPE = MACHINE DEPENDENT RECORD [ length (0): CARDINAL _ 0, maxlength (1): --READONLY-- CARDINAL, text (2): PACKED ARRAY [0..0) OF CHARACTER]The operations upon sequence-containing types have, however, been extended to StringBody so thatits operational behavior is similar. In these extensions, the common part of the record consists ofthe field length, maxlength serves as the tag, and text is the collection of indexable components(packed characters). Thus z.NEW[StringBody[n]] creates a StringBody with maxlength = n andreturns a STRING; if s is a STRING, s[i] is an indexing operation upon the text of s, DESCRIPTOR[s^]creates a DESCRIPTOR FOR PACKED ARRAY OF CHARACTER, etc.There are two anomalies arising from the actual declaration of StringBody: s.text[i] never uses bounds checking,and DESCRIPTOR[s.text] produces a descriptor for an array of length 0. Use s[i] and DESCRIPTOR[s^] instead.Type TEXTThe following types, which describe a structure similar to a StringBody as a true sequence, arepredeclared in Mesa 6. The type TEXT is primarily intended for users of Cedar, where the type REFTEXT (or REF READONLY TEXT) will replace most current uses of type STRING.TEXT: TYPE = MACHINE DEPENDENT RECORD [ length (0): [0..LAST[INTEGER]] _ 0, text (1): PACKED SEQUENCE maxLength (1): [0..LAST[INTEGER]] OF CHARACTER]Restrictions on AssignmentThe assignment operations defined upon certain types have been restricted so that variables of thosetypes can be initialized (either explicitly or by default) when they are created but cannotsubsequently be updated. A variable is considered to be created at its point of declaration or, fordynamically allocated objects, by the corresponding NEW operation. This restriction is made so that"invisible" fields such as queues of waiting processes cannot be smashed in a variable that is alreadyin use.In Mesa 6, the following types have restricted assignment operations: fsG br/q rqr `v=' ^ [uq ZCl X2 UrSXwrqFrXqrqr ;A<w r 9:* 7wrwrwr* 6Kwrqrw rwr w rwrwr 4 qrwrqrwrwrwrq rwr 2 q(rL0u?z uzuzuzuzuL/Dq uzuzu.zuzuq uzu ,wq (r7w r '#!qrq %|rqr)qrL#qrXqrqFrXL!Ywr qrqrLwrqFrXwr qrqrqrqr s Ar[ C d Kqr- M  E $ g>[Mesa 6.0m Compiler Changes6MONITORLOCKCONDITIONany type constructed using PORTany type constructed using SEQUENCEany type constructed using ARRAY in which the component type has a restricted assignmentoperation.any type constructed using RECORD in which one of the field types has a restricted assignmentoperation.Note that the restrictions upon assignment for a type do not impose restrictions upon assignment tocomponent types. Thus selective updating of fields of a variable may be possible even when theentire variable cannot be updated; e.g., the timeout field of a CONDITION variable can be updated byordinary assignment. In Mesa 5, when a variable was allocated at runtime, it was necessary to call system procedures toinitialize any fields of types MONITORLOCK or CONDITION. If one uses the Mesa 6 NEW operator, thisinitialization takes place automatically as a result of the defaulting mechanism.Distribution:Mesa UsersMesa Group fsGLbq L_L](rXqLZrqLX2rqr +LV LTqr1 LRh OZ NF? L-wr qr J H|b Fq rqrqr E-Q > <X ;A  :=-Formatter1Appendix B: FormatterThe Formatter transforms Mesa source files into a standard format. It establishes the horizontaland vertical spacing of the program in a way which reflects its logical structure.This appendix describes the formatting rules and the operation of the formatter, including the run-time options and messages.Preparing Source FilesSee this section in Appendix A: Compiler. Since the formatter uses the scanner and parser of thecompiler in order to determine structure, only syntactically correct programs may be formatted.ExamplesThe formatter takes commands only from the command line: follow "Formatter" with a list offilenames, separated by spaces. Let us consider first a few simple examples:The command>Formatter ProgNamewill read the file ProgName.mesa, copy its old contents to Formatter.scratch$, andassuming that it has no syntax errors, will produce a new, plain text, consistently formatted versionof ProgName.mesa.The command>Formatter ProgName/-tkwill read the file ProgName.mesa, and produce a two column landscape listing of the module inthe file ProgName.press. The program will be formatted using multiple fonts and faces.There are numerous other options described below.Command Line DescriptionThe simplest form of command is just the name of a source file to be formatted. If you supply thecommand sourcefile with no period and no extension, the formatter assumes you meansourcefile.mesa.During formatting, the display is turned off and the compiler's pass-one die is displayed in thecursor.The formatter reports the result of each command in Formatter.log with a message having oneof the following forms (each * is replaced by an appropriate number; bracketed items appear onlywhen relevant):'.fpG"\qi YrF WR TE R N#p JrZ I-.1 DZp A r/sr ?dM < 8s 5xr s r sr 3e 2)s r . +s (=rs r= &s r/ #G1 tp &r-5 ~s r- sr 4,  4s r T D =\Formatter2file.mesa -- source tokens: *, time: *Formatting was successful. The source file has been rewritten. The original can be foundin Formatter.scratch$. If several files are formatted in the same run, the original ofonly the last file will be in Formatter.scratch$.file.mesa -- aborted, * errors [and * warnings] on file.errlogFormatting was unsuccessful. The output of the formatter is undefined if syntax errors existin the input file. The original file is undisturbed.File errorThe formatter could not find the specified file.If any error or warning messages were issued, it brings this to your attention by putting "Type Key"into the cursor. The formatter will not return to the executive or run another subsystem until youacknowledge the message. (You can change this behavior by using switches, described below.)Formatting rulesGeneral RuleAs a general rule, the Formatter changes only the white space in the program. It does not insert ordelete any printing characters. On the other hand, it may insert white space where there previouslywas none. SpacingIndentation is done by a combination of tabs and spaces in plain-text mode (assuming that a tabequals eight spaces), and by spaces alone in Bravo formatted mode.The decision of where to break lines is made independently of the output mode: press file, plaintext, or Bravo looks.A logical unit will be placed on a single line if it fits.A simple carriage return in the input file is treated as a space. The occurrence of two consecutivecarriage returns (a blank line) is preserved in the output file. Three or more consecutive returns(two or more blank lines) result in two blank lines in the output file. Since all Bravo looks arediscarded by the scanner, paragraph leading done with looks is not preserved.For output files that contain fonts and faces (Press or Bravo) these additional rules apply:Comments are set in italics.The names of procedures are bold where they are defined.Reserved words and predeclared identifiers are in Font 1.'.fpG btsrsr^;](sr/[sr X2tsrs rs tsTrP S<sr! Os Lr0 IP^ G/4 F7% A.p <\t 9 rQ 7fM 5 0t -r:% +B 'A &, " : -8 O lH M 4((829 =Z Formatter3Font 1 should be smaller than font 0. The fonts Helvetica 10 and Helvetica 8 work well inBravo mode. For press files, the formatter choses Helvetica 10 and 8 for portrait listingsand Helvetica 8 and 6 for landscape listings.In general there are no spaces before or after atoms containing only special characters. Exceptionsto this rule are as follows:A space or carriage return follows (but does not precede) a comma, semicolon, or colon.A space precedes a left square bracket when the bracket follows any of the keywordsRECORD, MACHINE CODE, PROCEDURE, RETURNS, SIGNAL, PORT, and PROGRAM.Spaces surround the left-arrow operator.The exclamation point (enabling) and equal-greater (chooses) operators are alwayssurrounded by spaces. This is also true for equal signs used in initialization and forasterisks used in place of variant record tags.Some arithmetic operators, depending on their precedence, are surrounded by spaces.The equivalent of two spaces are used for each level of indenting.StructureThe formatter determines the indenting structure of the program by the brackets that surround thebodies of compounds. The brackets include {}, (), [], BEGIN-END, DO-ENDLOOP, and FROM-ENDCASE.An attempt is made to maximize the amount of information on a page. For example, consider:Record: TYPE = RECORD [Record: TYPE = RECORDfield: Type,[field: Type];field: Type,field: Type,];In both cases, the structure is clear; it is indicated by the indenting, not the placement of thebrackets. The formatter generates the form on the left.The body of each compound, assuming it does not fit on a single line, is indented one nesting level.The placement of the brackets depends on the bracket and on its prefix and its suffix. Forexample, a loop statement has the following possible prefixes, brackets, and suffixes:PrefixesBracketsSuffixesFOR, WHILEDOOPENUNTIL, (empty)ENDLOOPENABLEThe following paragraphs contain a number of examples. They observe the following rules for theplacement of opening and closing brackets:The opening brackets {, [, FROM, and DO appear on the same line as their prefixes; BEGINstarts on a new line.If the remainder of the statement fits on a single line (with its closing bracket), it is placedthere, indented one level. Otherwise, all closing brackets except ] and } appear on lines bythemselves. If } is preceded by a semicolon, then it is also placed on a line by itself.'.fpGbr M`v+0^- Z(< YVDT5Rhuru rurururururO(Mr4J5KWJ#/G9 CB >t ;erI 9+vrvrvwrurururururur 88"4vuvuv0;uvu3 v 2)1y 2) 2)/ 2).* *r&; (`8 %?% #jK !Vt"st0;turu"su0;u&ur"su0;u r\ 0*vrvrurur u r` 4vrvr Dvr$$ p >\ZFormatter4The statement following a THEN or ELSE is indented one level, unless it fits on the same line. THENis on the same line as its matching IF, and ELSE is indented the same amount as IF.IF bool THENIF bool THEN statementBEGINELSE {body}bodyENDELSEIF bool THEN {BEGIN statement;body statement}ENDThe labels of a SELECT (and its terminating ENDCASE) are indented one level, and the statements asecond level, unless they fit on the same line with the label.SELECT tag FROMcase => statement;case => long statement;ENDCASEEach compound BEGIN-END, DO-ENDLOOP, or bracket pair is indented one level. When the rules forIF and SELECT call for indenting a statement, a BEGIN is not indented an extra level.These rules are not exhaustive, but are intended to give the flavor of the formatter output.Formatter SwitchesSwitches allow you to modify command input. A command has the general formfile[/s] {file2[/s] . . .}where [] indicates an optional part and s is a sequence of switch specifications. A switchspecification is a letter, identifying the switch, optionally preceded by a '-' or '~' to reverse its sense.The valid switches areccompile input file after formattinggdon't close press file at end of input filehgenerate a press file (does not force ~t)kgenerate a two-column landscape press file (does not force ~t)ppause after formatting if there are errorsrterminate formatting and run the program contained in filetoverwrite input file with plain text formatted version (default)voverwrite input file with bravo looks using fonts 6 and 7zoverwrite input file with bravo looks using fonts 0 and 1Each switch has a default setting, The command sourcefile is equivalent tosourcefile/~c~g~h~k~p~rt~u~x~z if you use the standard defaults, i.e., the formatter onlygenerates a plain text file to replace the original source. Note that the "r" switch changes theinterpretation of file, which should name a subsystem.If the assignment of switch names does not seem too mnemonic, realize that with the /c switch, alladditional switches are passed to the compiler. For example,'.fpG brurur)u `vr$ururur](urvru"urvrurv[u"urvYvX2uVu"urvrurvTu"rv S<" Qu NFrurur, L>IPurvruGvrv FvrDZvBu ?dr urururur. =urur#ur :nM 5p 2LrK/s -Vr(wr $ +Ksrsr *&sr#%sr+#jsrtrsr!sr1trsr sr*tsr:sr@&sr9~sr9 0 %s r sr6 1sr :sr !3sr D< >\^Formatter5>Formatter Foo/cj-awould reformat Foo.mesa and then call>Compiler Foo/j-a.You can also change the default setting of any switch by using a global switch. Switches given withno sourcefile establish the default setting. Unless overridden or reset, that default applies to allsubsequent commands. See, for example, the multiple program Press output example below.Here is some information about the options:gIf a press file is being generated, it is not closed at the end of the current input file. It isexpected that another file in the command list will also be generating press file outputand a single press file will contain multiple input files. The name of the press file willbe that of the first to which press output is being generated. If the type of press file(landscape versus portrait) changes, the first will be forced closed and another press filewill be started. Be careful not to generate a press file larger than will be accepted byyour printer.v, z These switches cause the formatted version of the source file to contain bravo looks.The "z" switch is intended to be used on a standard Mesa Programming disk that hasHelvetica 10 and Helvetica 8 as fonts 0 and 1. The "v" switch uses fonts 6 and 7 andproduces output that is more convenient for including in documentation. Indenting ishandled slightly differently for bravo format output files. In plain text mode, indentationis done by a combination of tabs and spaces: the font is assumed to be fixed pitch andthe tab is assumed to be 8 times the width of a space. The z switch causes allindentation to be done with spaces only. For v, each level of indentation is indicated bya single tab.Examples:fooFormat foo using all the default switch settings (standard or established by a globalswitch).foo/-tkFormats foo into a two-column, landscape press file, leaving the original source unchanged./-tkg ProgA ProgB ProgC ProgD/-g Produces a two-column, landscape press file ProgA.press that contains listing of all fourprograms, each starting on a new page.The r (run) and p (pause) switches have identical semantics as in the compiler.Formatter FailuresThe message reporting a formatter failure has the following form:'.fpGbs ^rsr [sr X2] V41 T(1 Q+ NFs`r)8`L)/`J?`IP#6`G3(`F9`DZ t A sx`r3`?d%-`=%0`<F`:nE`8 M`7-"`5xD`3 0 -3s*rsr&%) %s#GrsrI s!}r s r"& sr srDoc>XferCounter.bravo .pressDRAFTThis tool for studying the behavior of Mesa programs counts the number of control transfers(XFERs) to a module and records the time spent executing in a module; it can also be used to gatherinformation on the flow of control between groups of modules. An XFER is the general controltransfer mechanism in Mesa. The following are all XFERs: procedure calls, returns from procedures,traps, and process switches.The system is implemented as a set of commands that can be executed from the Mesa Debugger, aroutine that intercepts all XFERs and collects statistics about them, plus a routine that interceptsconditional breakpoints for turning the XFER monitoring on and off. Existing Debugger commandsare used to specify where XFER monitoring is enabled, and additional commands are provided forcontrolling the counting of XFERs and outputting the results.This tool is intended to provide a global view of the behavior of a system. With this tool, a usercan identify modules that warrant closer study with other tools such as the Performance Monitor.ComponentsCountTool is the component of the tool that lives with user programs built on top of Alto/Mesa.This configuration contains one module: Counter. It contains the XFER trap handler and abreakpoint handler. CountTool must be loaded and started in the system it will monitor. Thismay be done by including CountTool in the client configuration whose control module importsand starts XferCountDefs.Counter or by executing the following command to the AltoExecutive:>Mesa CountTool ClientCountPackage is the component that lives as a tool in the Mesa Debugger. It implements thebasic commands required to enable XFER monitoring and to output measurement results.CountPackage must be loaded into the Debugger before its commands can be executed. It iseasiest to load it when installing the Debugger by executing the following command to the AltoExecutive:]gpi c8q]rX -q7Br ]q]r -q7Br Yq]r-q 7Br Ssr MqF2>u FHrQ Dvr@ BBvr ARvr, ? <\C :vr 6 9 vr2 7fvr< 5vr 2pZ 0G +w (xrD &(xr vr %5xr$ #xr9 ! xr  ? y x rH %& vr. Sx rM 2,  J=VEXfer Counting Tool2>XDebug CountPackage/lThe CountPackage creates a window through which all interactions with the tool take place.OperationThere are two modes of operation, plain and matrix. Plain mode (the default) simply records thetime spend in a module and the number of XFER to that module. Matrix mode is used to gatherinformation on the flow of control between groups of modules. Each module is a member of oneof 16 groups. A 16 by 16 matrix of counts and times is maintained by the Counter. The rows ofthe matrix are the groups of the source of the Xfer, the from group. The columns of the matrixare the groups of the destination of the Xfer, the to group.In plain mode, when XFER monitoring is enabled and a XFER occurs, the trap handler calculates thetime since the last XFER and adds that to the cumulative time for the current module. It thencalculates which module is the destination of the XFER and makes that the current module,incrementing its count. In matrix mode, the trap handler updates the appropriate element of thematrix. The XFER handler then completes the XFER, and the user program continues.The state of XFER monitoring can be controlled by two methods. The first is by setting aconditional break to be handled by the tool's breakpoint handler. The second is by calling theprocedures XferCountDefs.StartCounting and XferCountDefs.StopCounting.When the break handler intercepts a breakpoint, it checks to see if the breakpoint is conditional. Ifnot, the break handler proceeds to the Debugger. Otherwise, the state of XFER monitoring ischanged and program execution is resumed. A condition of zero turns XFER monitoring on; acondition of one toggles the state of XFER monitoring; a condition of two turns XFER monitoringoff. Any other condition has no effect.The procedures XferCountDefs.StartCounting and XferCountDefs.StopCounting providean alternative method of enabling XFER monitoring. These procedures may be called fromstatements in the user's program, or they may be called using the Debugger's interpreter.Since multiple processes may interact with each other, there is the concept of the tracked process. Ifthis process is not NIL, only those XFERs that are encountered during execution of the trackedprocess are counted; all others are simply resumed. If the tracked process process is NIL, then allprocesses contribute to the accumulated data.The CountPackage determines group membership by reading a file that associates groupnumbers with global frames. The easiest way to produce this file is to use the Debugger'sDisplay GlobalFrameTable command and then edit the file Debug.log. Append the desiredgroup number to the line for that module. If no group number is specified for a line, it goes in thegroup specified by the previous line. Modules not assigned group numbers are in group zero. Forexample:StringsB, G:173134B, gfi:33B 1group 1StringsA, G:173140B, gfi:32Bgroup 1StreamsC, G:173144B, gfi:31B 2group 2StreamsB, G:173150B, gfi:30Bgroup 2StreamsA, G:173154B, gfi:27Bgroup 2SegmentsB, G:173160B, gfi:26B 3group 3SegmentsA, G:173164B, gfi:25Bgroup 3OurProcess, G:173170B, gfi:24B 4group 4 fwGbyz y ^rx r9 Yw VrM T%vr/ S<= Q? O9yr" NF3yr Jvrvr( IPvr& Gvr# F9' DZ vrvr! A vr2 ?dN = xrxr :n^ 8< vr 7Evr 5x&vrvr 3( 0xrxr .!vr1 -3Y )/${r (=qr vr6 &Vqr $- !x rD ?D yryryr  7P 2/ /0y4rXy4rX(y4rXy4rX y4rXy4rX y4rX y4rX X L=\Xfer Counting Tool3NonResident, G:173210B, gfi:23Bgroup 4Modules, G:173214B, gfi:22Bgroup 4Miscellaneous, G:173220B, gfi:21Bgroup 4MesaInit, G:173224B, gfi:20B 0group 0MesaDebug, G:173234B, gfi:17Bgroup 0Window and CommandsInteraction with the CountPackage is through its window. There are three subwindows: themessage subwindow, the form subwindow, and the log subwindow. Error messages and warningsare displayed in the message subwindow. Commands are invoked in the form subwindow. Alloutput is displayed in the log subwindow and written on Count.log. An illustration of thewindow during a sample session is shown in Figure 1.The elements of the form subwindow are explained below:Monitor: {off, on}Turns off/on the tools breakpoint handler. All conditional breakpoints will affect the stateof XFER monitoring when the monitor is on, and will behave like normal conditionalbreakpoints when it is off.Zero Tables!Zeros out all counts and times.Condition Breaks!Makes all non-conditional breakpoints into conditional breakpoints by adding the condition"1" to them.Print Tables!Displays all the statistics for each module in order of increasing global frame table index(gfi) for plain mode. In matrix mode, it displays the statistics for each nonzero element ofthe matrix. The output format of times is sec.msec:usec. May be aborted by typing^DEL.Print Sorted!Displays all the statistics for each module in order of decreasing time or decreasing numberof XFERs depending on the value of Sort by. May be aborted by typing ^DEL. Notallowed in matrix mode.Sort by: {count, time}When set to count, the Print Sorted command displays in order of decreasing numberof XFERs, otherwise it displays in order of decreasing time.Print Module!Displays the statistics for the module specified by Module. Not allowed in matrix mode. fwGby4rX`y4rX_y!4rX]y4rX\y4rX Ww Srx r" R"2( Pz(1 N8yr M,4 I7 FyC@r/.Avr,? SEt Root configuration: MesaExec>SEt Module context: MesaExec>Break Entry procedure: LoadNew Breakpoint #1. -- Count XFER involved withloading>Break Xit procedure: LoadNew Breakpoint #2.-- the Condition Breaks command will make these conditional breaks-- now interact with the CountPackage. Condition breaks and set the process>Proceed [Confirm]You called?-- now look at the results>--Test.map-- file containing group information-- now set mode to matrix and load group information using Load Matrix command>Proceed [Confirm]You called?-- now look at the matrix>Kill session [Confirm]Xfer Counter 6.0 of 19-Sep-80 9:5325-Sep-80 10:48Track process: 3647B-- ignore keyboard and interrupt keyConditionalized breaks-- Output of Print Tables command with mode = plainTotal Xfers 4,088Total Time 1.329:842 Gfi Frame Module #Xfers %Xfers Time %Time---- ------- ------------------ ----------- ------- ----------- ------ 1B 174164B Resident 12 .29 6:286 .47 3B 174030B DiskIO 869 21.25 583:996 43.91 4B 174000B Swapper 530 12.96 96:050 7.22 5B 173344B MDSRegion 538 13.16 200:367 15.06 7B 173314B BFS 1 .02 76 .00 10B 173304B Directory 80 1.95 38:900 2.92 11B 173270B DiskKD 2 .04 533 .04 13B 173260B Files 140 3.42 15:392 1.15 15B 173254B FSP 100 2.44 15:468 1.16 16B 173240B LoadState 97 2.37 105:384 7.92 22B 173214B Modules 96 2.34 35:471 2.66 23B 173210B NonResident 3 .07 457 .03 25B 173164B SegmentsA 74 1.81 17:945 1.34 26B 173160B SegmentsB 89 2.17 13:487 1.01 27B 173154B StreamsA 55 1.34 10:629 .79 30B 173150B StreamsB 44 1.07 8:115 .61 31B 173144B StreamsC 55 1.34 10:629 .79 32B 173140B StringsA 89 2.17 9:525 .71 33B 173134B StringsB 19 .46 3:924 .29 35B 173124B AlFont 176 4.30 21:107 1.58 fwG bX _r#yryr& ]Hyr Zy* Y U Ty! R Qq/ryryvrX O Niy, LrXyrX+ Kay r' Iy HY FrX EQy r$ CyrXy r BIy @ ?ArX =y 90# 7 4rX$ 3 y .rX y rXy - + *F (F 'F %|F #F "sF F kF F cF F [F F SF F KF F CF F ;F F 3F N ;I^Xfer Counting Tool7 36B 173104B AltoLoader 237 5.79 29:070 2.18 40B 173100B BcdOperations 153 3.74 16:421 1.23 45B 172720B LoaderCore 516 12.62 74:256 5.58 47B 172660B StreamIO 23 .56 2:057 .15 50B 172650B SystemDisplay 82 2.00 13:830 1.03 54B 170274B MesaExec 8 .19 457 .03Ignored Xfers 98Ignored Time 309:943-- Output of Print Sorted command with Sorted by = countTotal Xfers 4,088Total Time 1.329:842 Gfi Frame Module #Xfers %Xfers Time %Time---- ------- ------------------ ----------- ------- ----------- ------ 3B 174030B DiskIO 869 21.25 583:996 43.91 5B 173344B MDSRegion 538 13.16 200:367 15.06 4B 174000B Swapper 530 12.96 96:050 7.22 45B 172720B LoaderCore 516 12.62 74:256 5.58 36B 173104B AltoLoader 237 5.79 29:070 2.18 35B 173124B AlFont 176 4.30 21:107 1.58 40B 173100B BcdOperations 153 3.74 16:421 1.23 13B 173260B Files 140 3.42 15:392 1.15 15B 173254B FSP 100 2.44 15:468 1.16 16B 173240B LoadState 97 2.37 105:384 7.92 22B 173214B Modules 96 2.34 35:471 2.66 26B 173160B SegmentsB 89 2.17 13:487 1.01 32B 173140B StringsA 89 2.17 9:525 .71 50B 172650B SystemDisplay 82 2.00 13:830 1.03 10B 173304B Directory 80 1.95 38:900 2.92 25B 173164B SegmentsA 74 1.81 17:945 1.34 27B 173154B StreamsA 55 1.34 10:629 .79 31B 173144B StreamsC 55 1.34 10:629 .79 30B 173150B StreamsB 44 1.07 8:115 .61 47B 172660B StreamIO 23 .56 2:057 .15 33B 173134B StringsB 19 .46 3:924 .29 1B 174164B Resident 12 .29 6:286 .47 54B 170274B MesaExec 8 .19 457 .03 23B 173210B NonResident 3 .07 457 .03 11B 173270B DiskKD 2 .04 533 .04 7B 173314B BFS 1 .02 76 .00Ignored Xfers 98Ignored Time 309:943-- Output of Print Sorted command with Sorted by = timeTotal Xfers 4,088Total Time 1.329:842 Gfi Frame Module #Xfers %Xfers Time %Time---- ------- ------------------ ----------- ------- ----------- ------ 3B 174030B DiskIO 869 21.25 583:996 43.91 5B 173344B MDSRegion 538 13.16 200:367 15.06 16B 173240B LoadState 97 2.37 105:384 7.92 4B 174000B Swapper 530 12.96 96:050 7.22 45B 172720B LoaderCore 516 12.62 74:256 5.58 10B 173304B Directory 80 1.95 38:900 2.92 22B 173214B Modules 96 2.34 35:471 2.66 fwG byF `F _F ]F \F ZF Y W QqrX y rXy O Ni LF KaF IF HYF FF EQF CF BIF @F ?AF =F <8F :F 90F 7F 6(F 4F 3 F 1F 0F .F -F +F *F (F 'F %|F #F "s  rX y rXy [  SF F KF F CF F ;F F 3F  :^Xfer Counting Tool8 36B 173104B AltoLoader 237 5.79 29:070 2.18 35B 173124B AlFont 176 4.30 21:107 1.58 25B 173164B SegmentsA 74 1.81 17:945 1.34 40B 173100B BcdOperations 153 3.74 16:421 1.23 15B 173254B FSP 100 2.44 15:468 1.16 13B 173260B Files 140 3.42 15:392 1.15 50B 172650B SystemDisplay 82 2.00 13:830 1.03 26B 173160B SegmentsB 89 2.17 13:487 1.01 31B 173144B StreamsC 55 1.34 10:629 .79 27B 173154B StreamsA 55 1.34 10:629 .79 32B 173140B StringsA 89 2.17 9:525 .71 30B 173150B StreamsB 44 1.07 8:115 .61 1B 174164B Resident 12 .29 6:286 .47 33B 173134B StringsB 19 .46 3:924 .29 47B 172660B StreamIO 23 .56 2:057 .15 11B 173270B DiskKD 2 .04 533 .04 23B 173210B NonResident 3 .07 457 .03 54B 170274B MesaExec 8 .19 457 .03 7B 173314B BFS 1 .02 76 .00Ignored Xfers 98Ignored Time 309:943Matrix loaded-- Output of Print Tables command with mode = matrixTotal Xfers 3,834Total Time 871:004From -> To #Xfers %Xfers Time %Time---- --- ----------- ------- ----------- ------ 1 -> 1 2 .05 114 .01 1 -> 2 1 .02 114 .01 1 -> 3 4 .10 266 .03 2 -> 1 1 .02 419 .04 2 -> 2 542 14.13 110:756 12.71 2 -> 4 126 3.28 17:487 2.00 2 -> 5 87 2.26 11:201 1.28 2 -> 6 7 .18 342 .03 2 -> 10 53 1.38 17:221 1.97 3 -> 1 4 .10 228 .02 3 -> 3 179 4.66 37:719 4.33 3 -> 4 64 1.66 5:829 .66 3 -> 6 13 .33 2:247 .25 3 -> 10 1 .02 38 .00 4 -> 2 124 3.23 19:240 2.20 4 -> 3 61 1.59 6:705 .76 4 -> 4 1,105 28.82 264:795 30.40 4 -> 6 87 2.26 16:725 1.92 4 -> 7 9 .23 1:790 .20 4 -> 9 8 .20 5:486 .62 5 -> 2 82 2.13 13:563 1.55 6 -> 2 7 .18 495 .05 6 -> 3 14 .36 2:057 .23 6 -> 4 87 2.26 27:089 3.11 6 -> 6 207 5.39 54:330 6.23 6 -> 7 36 .93 7:658 .87 6 -> 10 12 .31 1:066 .12 7 -> 4 9 .23 2:552 .29 7 -> 6 37 .96 5:067 .58 fwG byF `F _F ]F \F ZF YF WF UF TyF RF QqF OF NiF LF KaF IF HYF FF EQ C ?A <8rX y rXy : 90 7: 6(: 4: 3 : 1: 0: .: -: +: *: (: ': %|: #: "s: : k: : c: : [: : S: : K: : C: : ;: : 3: :^Xfer Counting Tool9 7 -> 7 759 19.79 221:932 25.48 9 -> 4 11 .28 647 .07 10 -> 2 59 1.53 9:944 1.14 10 -> 3 1 .02 152 .01 10 -> 6 12 .31 3:543 .40 10 -> 10 23 .59 2:171 .24Ignored Xfers 396Ignored Time 673:569 fwG by: `: _: ]: \: Z: W U T205`(Le`(""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""#??"""""#ݷwww]}"""4~7S4wOY }MOt?g7w?""#}]7v?At7Uww"""""#}]wv_wM"""ݽu]wvw]7]uݾ79]7xO?""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#""" `@8I@D""#9c9` iX1a8@@9X8Ď"""""#EE eID@ASdE%"""EE E90@AQDQ| EEa AI@AQDPA%""#EE AIDESDPE$"""""#990 n@=a8@8M`D8N"""@ ""# `"""""#"""""#"""""# """ p88?@@DDO@""#XCV9g@8@d@Lq@8@"""""#d&HDDY 9HE19HDKmD@"""D$HC H}HK|@@$HD A@0""#@$ID@ @E E0E KD@"""""#@$FC 888aLqL`8@"""O@ O@""#?"""""#"""?""# """""# """ $@ | @$@@ F ""#XDC&5qp 8F """""#d&HSDDD&M"@( QEQ `"""D$HQDG&E@"` QA J @$HTQDD%QE@  A_ ""#@$ITSLD@%QM1H ( EQB!"""""#@$FS4C%N40 qp 8 """   ""# """""# """?""#"""""# """? @ 9O@E""#8ӀJ{@SXD@ XDAcEa"""""#E4DIـd"Ad"9UQE"""EKۀSD!AD!UtQEEۀT@!AT@!JE""#E4@IۀT@"AT@"EJ4M"""""#8ӄJ{یS@$D|S@$D95a"""KK""#;"""""#"""""#"""""#"""""#"""""#"""""#F8"""""#I$@D"""9`99`0 EEHEPxY@1""#}EH}P  xy@"""""#AEHA @"""HEE4IE Y@DH98F9 8""#"""""#"""""#@"""""#P@0 0"""PQ@PY@A""#xy@A"""""#@@"""Y@@}|""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""#"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""wLeReport on file: Fixed60m.rpt1 25-Sep-80 15:54:56Numb Originator Subsystem Subject er 490 Murray Binder Compiler doesn't check Defs for unEXPORTED exports 650 Johnsson Binder Packed bit on MT Records not set 801 Murray Binder Unbound procedure vs. Binder /r 1169 Wick Binder Configurations Specifying List of Control Modules 2039 Murray Binder Abort For ^C After Error 3128 Olmstead Binder Error messages re: different versions 4038 Evans Binder Lock released once too often when zap target bcd 4250 Knutsen Binder Issue Warning if two /c items 4416 Murray Binder Which module can't be packed 4478 LNelson Binder Binder under Tajo 4502 BLyon Binder 'IMPORT' instead of 'IMPORTS' in a CONFIG blew the binder up 4514 Knutsen Binder Copying code to bcd w/ "code" gives "Ref'd in diff versions" 4593 Luniewski Binder Output files incorrectly chosen 4656 mbrown Binder switch syntax: "bind /c foo" vs. "bind foo/c" 4658 Johnsson Binder Command line '; eats next char 4676 LNelson Binder Binder patches for Star 4765 Newman Binder "Foo.run/r" puts "Foo.run/" in Com.cm 4766 Newman Binder "Foo.image/r" doesn't work 4924 Newman Binder Fails to pause after syntax error 5392 Luniewski Binder Unimplemented command line args not detected 5393 Luniewski Binder Command line overriding of Directory statements 5727 LNelson Binder Fatal Binder Error: 1015B 5842 LNelson Binder LongBinder hung on config that standard binder handled OK 5885 Johnsson Binder Passing LINKS: CODE to pre-bound Config. 5887 Marzullo Binder binding packaged code with code copy 5950 Smokey Binder Fatal Binder ERROR 792 McJones Compiler Break Entry with DO as first statement 911 McJones Compiler Frames lost from UNWIND 1034 Murray Compiler Help on interupt routines 1969 Redell Compiler Bad Fine-grain Table 2068 Murray Compiler Poor Code For a+b*c 2622 Howard Compiler Fatal compiler error, Pass 5, 267601B 2858 Morrison Compiler Bad code generated for an INLINE (RXLPL) causes AddressFault 3335 Newman Compiler Doc: Pitfalls in allocating bound variants from a heap 3653 MBrown Compiler Error message for expressions in extractors 3660 Sweet Compiler bounds checking strings 3797 Howard Compiler RETURN WITH ERROR in ENTRY INLINE does wrong thing 4351 Guyton Compiler Short Pointer code generated from LONG DESCRIPTORS 4464 Tanaka.ES Compiler Subrange type in Defs gives bogus results 4537 McJones Compiler Zero-size field in M.D. record with explicit field positions 4547 Levin Compiler Bad FGT entry 4608 Hamilton Compiler ALL[ALL bombs pass 5 4657 Schwartz Compiler Compiler hangs in pass 5 when null EXITS clauses 4681 maxwell Compiler Crash in pass 5 4742 mitchell Compiler fatal, pass 5, variant record element compare w/nil checking 4774 ayers Compiler Error Messages' Construction 4899 Sweet Compiler Constant Table: zero length constants entered in the table 4941 Newman Compiler Doc: ABORTED totally undocumented 4956 McJones Compiler Extra FREE for large result record in FOR loop expression 4997 Swinehart Compiler Machine Dependent Records Bug 5112 AWells Compiler Bad code generation for array initialization 5114 AWells Compiler Internal stack overflow in recursive type declaration 5148 Luniewski Compiler Fatal compiler error pass 5 5151 Murray Compiler FOR Clause Problem - long variable and constant bounds 5172 Nelson Compiler Variant record defaults 5182 Knutsen Compiler Comparing expr to field of result of inline blows up 5215 Newman Compiler Type mismatches involving zone.NEW give poor error messages 5221 AWells Compiler Lack of defaults for declared return variables 5231 Wyatt Compiler Fatal from call on an INLINE procedure 5264 LStewart Compiler a, b: DESCRIPTOR _ [NIL,0] => "Multiple init w/ptr" 5276 Levin Compiler CV and ML addresses 5281 Newman Compiler Confused about compile-time constants & subrange types 5294 schmidt Compiler NEW of extremely large arrays 5298 Artibee Compiler OptCatchPhrase on WaitStmt sometimes mandatory 5324 Newman Compiler Can't zone.NEW for objects with non-constant size 5337 AWells Compiler Compiler dropping into the debugger in pass 5 5343 Levin Compiler @constructor gives fatal error 5385 Ludolph Compiler LOOP in loopexitsclause of inner loop repeats inner loop 5405 AJM@MIT-ML Compiler Multi-module MONITOR 5415 Daniels Compiler Fatal compiler error after ill-formed DIRECTORY clause 5417 Marzullo Compiler The same temporary location is assigned twice in a loop. 5424 Fay Compiler StackModelling Error in long, zero-based IN tests 5488 Knutsen Compiler MachDepRec complains of gaps _0]j[jYOjXjVjUjT[jSjQjPjOgjN*jLjKjJsjI6jGjFjEjDBjCjAj@j?Nj>jqG`<5492 McJones Compiler Catch phrase should not be allowed on RETURN WITH ERROR 5546 LStewart Compiler Floating point compare to zero code generator 5614 Newman Compiler Mainline code local variables allocated in global frame 5622 Newman Compiler Type mismatch for PROC RETURNS [UNCOUNTED ZONE](or MDSZone) 5687 Newman Compiler Bad code for record constructor containing proc calls 5689 Forrest Compiler Long pointer to Packed ARRAY of >4K bits generates bad code 5710 Newman Compiler StackModelingError, pass 5 from LONG CARDINAL loop iteration 5720 Alfvin Compiler NIL as an acceptable ZONE value 5754 Daniels Compiler Fatal System Error (Punt) in Pass 5 5783 Swinehart Compiler Compiler loops in pass 5 with nil-checking on 5805 Swinehart Compiler Code generation bug -- long pointers 5846 Sweet Compiler [] _ ERROR SigReturnsValues; 1161 Morrison Debugger Command to Redisplay Uncaught Signal Messages 2155 Karlton Debugger Indirect Type-in For DebugWindow 2191 Johnsson Debugger p%FileName$Type fails 2432 Schwartz Debugger Doc: Cursor actions on tiny windows need documenting 2455 Schwartz Debugger Doc: >> prompt not documented 2460 Schwartz Debugger Doc: Some finepoints 2531 malasky Debugger Doc: Find Variable vs Search Context 2598 Selly Debugger Doc: Set Octal Context examples;Frame$var 2618 CharliLevy Debugger Display Stack source listing in error 2767 Purvy Debugger Doc: Reporting debugger problems 2910 charnley Debugger can't break at entry 3047 beard Debugger Debugger's unawareness of new source file 3182 olmstead Debugger Doc: conditional breakpoints 3410 Sandman Debugger PerfMonitor and XferCounter trap handlers and NOOPs 3456 Murray Debugger -1,-1 from Trace All Xits 3610 Birrell Debugger Doc: Going into Swat and overwriting Swatee 3662 Birrell Debugger Attach Image to use current load state 3663 Birrell Debugger Doc: Ascii read increments start address wrong 4020 Newman Debugger Doc: Some variables print out followed by "^R" 4160 LNelson Debugger Condition breaks vs subranges 4437 Murray Debugger process not bound 4445 Levin Debugger Debugger frame trouble 4525 Freier Debugger Display of variable of type PROCESS 4564 Kayashima Debugger Xdebug Hangs when Move or Grow sized window 4598 Hamilton Debugger Doc: Attach Symbols 4614 Kayashima Debugger Stripping Bravo Trailers 4633 mbrown Debugger Confusion about contexts 4655 mbrown Debugger Attach Mesa Source command 4672 Gobbel Debugger Debugger bitmap goes away sometimes if Edit is used. 4680 morris Debugger Debugger crash 4732 birrell Debugger Incorrect handling of multiple instances of modules 4741 Wyatt Debugger COremap bug 4743 Levin Debugger Lockup while repainting windows 4745 Murray Debugger Can't install Internal Debugger 4757 Newman Debugger Displaying arguments of Signaller.ErrorList goes to // mode 4759 Newman Debugger Fails to find symbols in files retrieved with FileTool 4761 Newman Debugger Misleading error message from Display Frame 4764 Newman Debugger Spurious "...is not a valid field selector" 4776 Murray Debugger 1001 while trying to Kill 4777 Murray Debugger context mixup 4783 ayers Debugger Debuggers erxtra-memory bitmap space 4789 ayers Debugger temp>xdebug.image Intall problems 4791 Murray Debugger Bound OVERLAID variants 4804 Levin Debugger Debugger bootloading: NIL PuntInfo gives PointerFault 4808 Levin Debugger Imported LONG DESCRIPTOR 4824 Newman Debugger Interpreter doesn't know size of UNSPECIFIED 4825 Newman Debugger Interpeting "array[Type[value]] gives uncaught signal 4827 Newman Debugger Enumerated values not found 4839 birrell Debugger Clear All Traces missing 4843 Newman Debugger List Breaks says nothing if no breaks set 4844 Newman Debugger ATtach Conditon command rejected 4851 Cattell Debugger Doc: No [non-wizard] way to get debugger to redisplay SIGNAL 4858 McGregor Debugger Debugger Inline eval bug 4864 Cattell Debugger NotRelocated SIGNAL from debugger on call to user routine 4869 Johnsson Debugger CL? doesn't list all options 4873 Johnsson Debugger ? for unknown PROCEDURE 4874 Karlton Debugger Will not display Ascii.NULs 4875 Sweet Debugger Clear Break # 4877 Sweet Debugger Display Break # 4880 Malasky Debugger ^Nvalidate cache command 4887 Newman Debugger Missing command "CLear Module" ?? 4889 Newman Debugger ATtach Expression to nonexistent break => no error msg 4890 Newman Debugger LIst Breaks doesn't display attached expressions... 4894 MBrown Debugger breakpoint set on "BEGIN" of proc body smashes entry break? 4916 Newman Debugger "Break ?" shows invalid options 4918 Newman Debugger "CLear ?" leaves some options out _j^Cj]j[jZjYOjXjVjUjT[jSjQjPjOgjN*jLjKjJsjI6jGjFjEjDBjCjAj@j?Nj>j "100000B is invalid Process" 5286 Newman Debugger Display Queue of octal number fails 5299 Newman.ES Debugger Interpreter: subrange assignment error 5301 Murray Debugger PC mixup after clearing break 5302 Murray Debugger 47201 from Set Module Context (ambigious) 5315 Murray Debugger SourceWindow: context mixup 5328 Murray Debugger Display GlobalFrameTable 5364 JEllis Debugger No response to $ 5365 JEllis Debugger Interpreted relational expression produces Uncaught Signal 5384 Daniels Debugger Falling into // mode from Interpreter 5389 morris Debugger Breakpoint not found. 5484 Daniels Debugger Incorrect printing of variant records 5695 McJones Debugger Spurious question mark for value of large cardinal subrange 5742 Cattell Debugger allows attaching condition to non-existent breakpoint 5863 Israel Debugger Relative string 5883 Stewart Debugger PACKED ARRAY printing 5910 israel Debugger Relative array descriptors. 1823 Hamilton Ether FTPtool: no filstats 2092 Malasky Ether ChatTool: Should Attach Or Log In 2438 Schwartz Ether FileTool: behaves strangely when opened a second time. 2558 LNelson Ether FileTool: close connection logic is defective. 2766 Hamilton Ether FTPtool: "IFS full" funnies 2880 Clemons Ether FileTool: Closes connection unnecessarily 2906 israel Ether Pup: FTP: Slow on Dorado 3626 Murray Ether FTP: sending mail 3863 Murray.PA Ether Fetch: Make it more like FTPtool 3900 Murray Ether FTP: UNWIND from FTPEnumerate/retrieve 3987 Sapsford Ether FTP: TimeExtras.PackedTimeFromString vs StringBoundsFault 4131 Levin Ether FTP: FTPServers.config 4174 Hamilton Ether FileTool: deletion fails 4352 Karlton Ether FTP: FTPAltoFile.PreProcessFile does a blind ReleaseFile 4444 Schmidt.PA Ether FTP: FTPInventoryDumpFile needs create date parameter 4456 Birrell Ether Pup: FTP: Recompile packages to fix long return record bug 4499 Murray Ether FTP: FTPTransferFile doesn't pass through the creation date 4544 birrell Ether FTP: FTPRetrieve hangs until timeout on a "no" mark 4550 Levin Ether FileTool: "delete" bugs 4552 Birrell Ether Pup: ByteStream timeout 4590 birrell Ether FileTool: returns slowly if the client stops an enumeration 4612 Hamilton Ether FileTool: shift col.2 left; move "verify" 4763 Newman Ether FTP: Forgetting to call IdNxtRejRecip => disaster 4809 Levin Ether FileTool: Local Delete: error message is misleading 4904 Levin Ether FileTool: fails to restore command buttons 5005 birrell Ether Pup: 2 sec delay creating Byte Streams 5062 kolling Ether Pup: DriverDefs.debugPointer 5093 Murray Ether Pup: NameLookup vs dying nets 5098 Murray Ether Pup: EthernetDriver priority 5132 MBrown Ether FileTool: does not set creation date properly 5152 Murray Ether FTP: TimeExtras: zone screwup 5195 birrell Ether FileTool: window size 5198 birrell Ether FTP: make single config available with everything 5236 Newman Ether FileTool: obsolete free page count 5527 Newman Ether FIleTool: treat empty "source" field as "*" 1230 Judd Other DOC: Examples 2063 Ayers Other Perf. Monitor: Improved Handling Of Node String Printout 2135 Malasky Other Two CursorProcesses In Put After NewSession 2186 McJones Other Lister: Code Listings To Show Global Frame Size 2242 Johnsson Other IncludeChecker vs. Compiler switches 2253 Otto Other IncludeChecker chokes on STAR _j^Cj]j[jZjYOjXjVjUjT[jSjQjPjOgjN*jLjKjJsjI6jGjFjEjDBjCjAj@j?Nj>jn,ENDCASE=>ERROR; 4863 Luniewski Other Packager: Can't process compiler bcd's 4865 Gobbel Other Formatter spaces too wide 4939 Levin Other CommandCentral selection glitch 5058 forrest Other Formatter adds extra blank lines 5082 BLewis Other Formatter: Improper treatment of "~=" operator 5084 BLewis Other Formatter: Improper treatment of "~(a OR b)" 5250 Gobbel Other Formatter should use small font for predeclared identifiers. 5311 Sapsford Other Formatter: Extraneous CR 5313 Mitchell Other Formatter: Use of tabs and spaces 5325 Nelson Other Formatter handles string contants wrong 5327 Morris Other Formatter problem 5344 Levin Other Formatter: comments on END procedure lines 5434 Daniels Other Statistics: InsufficientVM raised upon initialization 5480 Johnsson Other Formatter: Overlaid variant records 2007 Murray System Image Files Poisoned With Bad FP 2161 Murray System Swapper/Disk IO Difficulties 2224 Ayers System ERROR in MakeCheckPoint 3061 israel System Nil and bounds checking 3129 Olmstead System Request for info 3661 Birrell System Aborting process in ReadChar leaves keyboard monitor locked 3668 Birrell System XMesa Nucleus: determining memory size 4397 Murray System Loading garbage: Uncaught BadFile 4405 Schmidt.PA System Reading leader pages: don't change read-date 4574 Newman System RESUMEing a PointerFault=>uncaught SIGNAL InvalidGlobalFrame 4604 Newman System FrameDefs.[New/Run]Config should return a GlobalFrameHandle 4847 AWells System Bug in turning off echos in ReadLine (IODefs) 4932 Levin System Bug in AltoLoader.Load 4933 Sandman System BcdOps.ProcessSpaces lacks *SIZE[SpaceID] 4938 Levin System CommandCentral: Expand @file1 @file2 fails 4958 Levin System Bug in Wart: InitLoadState was changed 4970 Evans System Debugger looses bitmap when client makes checkpoint 4985 Newman System Loader doesn't link up imported POINTER TO FRAME 5003 Evans System MakeImage: Disk Descriptor not swapped in when needed 5057 kolling System Doc: Where is the stuff that used to be in bootdefs? 5065 McGregor System Preserving /k when coming back from a MakeCheckpoint 5094 Murray System MakeImage dies 5108 Karlton System Time: add Time.Packed to ease compatibility problems 5147 Levin System Nasty FSP bug...again! 5154 Murray System TimeConvert.PackDT off by an hour 5184 Levin System HyperRegion bug: rover not in bounds 5185 Levin System AllocVM: specific allocation too restrictive 5190 McJones System CommandCentral should parse the options window fields 5191 McJones System Uncaught signal when CommandCentral can't find compiler 5296 Hayes System Memory Competition Tajo vs. Debugger 5342 schmidt System GetID vs. GetId in CharIO.mesa 5416 Levin System Debugger smashes HyperRegion 5449 Levin System Missing Start Traps 5479 kolling System where is debugnub.bcd/mesa? 5626 Levin System LoadConfig returns ControlModule, not GlobalFrame 5627 Levin System Killing off the Interrupt process _j^Cj]j[jZjYOjXjVjUjT[jSjQjPjOgjN*jLjKjJsjI6jGjFjEjDBjCjAj@j?Nj>j