-- file Pass1.Mesa For debugger -- last modified by Bruce, October 17, 1980 11:32 AM -- last modified by Satterthwaite, September 16, 1980 9:42 AM -- last modified by Sweet, October 17, 1980 10:03 AM DIRECTORY BcdDefs: TYPE USING [Link, EPIndex, GFTNull], ComData: TYPE USING [ idANY, idATOM, idBOOL, idCARDINAL, idCHAR, idINT, idLOCK, idREAL, idSTRING, idUNWIND, outerCtx, seAnon, tC0, tC1, typeATOM, typeBOOL, typeCARDINAL, typeCHAR, typeCONDITION, typeINT, typeLOCK, typeREAL, typeSTRING, typeStringBody, typeTEXT], CompilerUtil USING [], LiteralOps: TYPE USING [Find], P1: TYPE USING [], Strings: TYPE USING [SubStringDescriptor], Symbols: TYPE USING [ BitAddress, ByteLength, WordLength, SERecord, HTIndex, SEIndex, ISEIndex, CSEIndex, RecordSEIndex, CTXIndex, codeANY, codeINT, codeCHAR, typeANY, typeTYPE, HTNull, ISENull, RecordSENull, CTXNull, lZ, ctxType, seType], SymbolOps: TYPE USING [ EnterExtension, EnterString, FillCtxSe, NewCtx, MakeNonCtxSe, MakeSeChain, NextSe], Table: TYPE USING [Base, Notifier, AddNotify, DropNotify], Tree: TYPE USING [Link, Null]; Pass1: PROGRAM IMPORTS LiteralOps, SymbolOps, Table, dataPtr: ComData EXPORTS CompilerUtil, P1 = BEGIN OPEN SymbolOps, Symbols; -- symbol table bases seb: Table.Base; -- semantic entry base ctxb: Table.Base; -- context table base P1Notify: Table.Notifier = {seb ← base[seType]; ctxb ← base[ctxType]}; -- construction of predeclared symbols SubStringDescriptor: TYPE = Strings.SubStringDescriptor; MakeBasicType: PROC [code: [0..16), ordered: BOOLEAN, nBits: CARDINAL] RETURNS [sei: CSEIndex] = { sei ← MakeNonCtxSe[SIZE[basic cons SERecord]]; seb[sei] ← [mark3: TRUE, mark4: TRUE, body: cons[basic[ordered:ordered, code:code, length:nBits]]]; RETURN}; MakeRecordType: PROC [nBits: CARDINAL, default: BOOLEAN] RETURNS [rSei: RecordSEIndex] = { rSei ← LOOPHOLE[MakeNonCtxSe[SIZE[notLinked record cons SERecord]]]; seb[rSei] ← [mark3: TRUE, mark4: TRUE, body: cons[record[ machineDep: TRUE, argument: FALSE, monitored: FALSE, painted: TRUE, hints: [ comparable: FALSE, assignable: FALSE, variant: FALSE, unifield: FALSE, privateFields: FALSE, refField: FALSE, default: default, voidable: ~default], fieldCtx: NewCtx[lZ], length: nBits, linkPart: notLinked[]]]]; RETURN}; MakeRefType: PROC [refType: SEIndex] RETURNS [sei: CSEIndex] = { sei ← MakeNonCtxSe[SIZE[ref cons SERecord]]; seb[sei] ← [mark3: TRUE, mark4: TRUE, body: cons[ref[ counted: FALSE, ordered: FALSE, list: FALSE, basing: FALSE, readOnly: FALSE, refType: refType]]]; RETURN}; MakeSubrangeType: PROC [origin: INTEGER, range: CARDINAL, empty: BOOLEAN] RETURNS [sei: CSEIndex] = { sei ← MakeNonCtxSe[SIZE[subrange cons SERecord]]; seb[sei] ← [mark3: TRUE, mark4: TRUE, body: cons[subrange[ filled: TRUE, empty: empty, rangeType: dataPtr.idINT, origin: origin, range: range]]]; RETURN}; SetIdAttr: PROC [sei: ISEIndex, const: BOOLEAN] = { seb[sei].immutable ← seb[sei].constant ← const; seb[sei].extended ← seb[sei].public ← seb[sei].linkSpace ← FALSE; seb[sei].mark3 ← seb[sei].mark4 ← TRUE}; FillVariable: PROC [ sei: ISEIndex, name: STRING, type: SEIndex, offset: BitAddress, nBits: CARDINAL] = { desc: SubStringDescriptor; hti: HTIndex; IF name # NIL THEN {desc ← [base:name, offset:0, length:name.length]; hti ← EnterString[@desc]} ELSE hti ← HTNull; FillCtxSe[sei, hti, FALSE]; seb[sei].idType ← type; seb[sei].idValue ← offset; seb[sei].idInfo ← nBits; SetIdAttr[sei, FALSE]}; FillConstant: PROC [sei: ISEIndex, name: STRING, type: SEIndex, value: WORD] = { desc: SubStringDescriptor ← [base:name, offset:0, length:name.length]; FillCtxSe[sei, EnterString[@desc], FALSE]; seb[sei].idType ← type; seb[sei].idInfo ← 0; seb[sei].idValue ← value; SetIdAttr[sei, TRUE]}; FillNamedType: PROC [sei: ISEIndex, s: STRING, type: SEIndex] = { desc: SubStringDescriptor ← [base:s, offset:0, length:s.length]; FillCtxSe[sei, EnterString[@desc], FALSE]; SetIdAttr[sei, TRUE]; seb[sei].idType ← typeTYPE; seb[sei].idInfo ← type; seb[sei].idValue ← Tree.Null; SetIdAttr[sei, TRUE]}; MakeTreeLiteral: PROC [val: WORD] RETURNS [Tree.Link] = { RETURN [[literal[info:[word[LiteralOps.Find[val]]]]]]}; NOuterSymbols: CARDINAL = 20; -- number of predeclared ids (outer level only) PrefillSymbols: PUBLIC PROC = { OPEN dataPtr; tSei: CSEIndex; rSei: RecordSEIndex; tCtx: CTXIndex; sei, seChain: ISEIndex; outerChain: ISEIndex; NextOuterSe: PROC RETURNS [next: ISEIndex] = { IF outerChain = ISENull THEN ERROR; next ← outerChain; outerChain ← NextSe[outerChain]; RETURN}; idNAT: ISEIndex; Table.AddNotify[P1Notify]; tSei ← MakeBasicType[codeANY, TRUE, WordLength]; -- guaranteed position outerCtx ← NewCtx[lZ]; outerChain ← ctxb[outerCtx].seList ← MakeSeChain[outerCtx, NOuterSymbols, FALSE]; -- make some constants {tC0 ← MakeTreeLiteral[0]; tC1 ← MakeTreeLiteral[1]}; idANY ← NextOuterSe[]; FillNamedType[idANY, "UNSPECIFIED"L, tSei]; IF tSei # typeANY THEN ERROR; idINT ← NextOuterSe[]; typeINT ← MakeBasicType[codeINT, TRUE, WordLength]; FillNamedType[idINT, "INTEGER"L, typeINT]; idCHAR ← NextOuterSe[]; typeCHAR ← MakeBasicType[codeCHAR, TRUE, ByteLength]; FillNamedType[idCHAR, "CHARACTER"L, typeCHAR]; idBOOL ← NextOuterSe[]; typeBOOL ← MakeNonCtxSe[SIZE[enumerated cons SERecord]]; tCtx ← NewCtx[lZ]; seb[typeBOOL] ← [mark3: TRUE, mark4: TRUE, body: cons[enumerated[ ordered: TRUE, machineDep: TRUE, sparse: FALSE, valueCtx: tCtx, nValues: 2]]]; ctxb[tCtx].seList ← seChain ← MakeSeChain[tCtx, 2, FALSE]; FillConstant[seChain, "FALSE"L, idBOOL, 0]; seChain ← NextSe[seChain]; FillConstant[seChain, "TRUE"L, idBOOL, 1]; FillNamedType[idBOOL, "BOOLEAN"L, typeBOOL]; idCARDINAL ← NextOuterSe[]; typeCARDINAL ← MakeSubrangeType[0, 177777B, FALSE]; FillNamedType[idCARDINAL, "CARDINAL"L, typeCARDINAL]; FillNamedType[NextOuterSe[], "WORD"L, typeCARDINAL]; idREAL ← NextOuterSe[]; typeREAL ← MakeNonCtxSe[SIZE[real cons SERecord]]; seb[typeREAL] ← [mark3:TRUE, mark4:TRUE, body:cons[real[rangeType:idINT]]]; FillNamedType[idREAL, "REAL"L, typeREAL]; idNAT ← sei ← NextOuterSe[]; -- NAT FillNamedType[sei, "***"L, MakeSubrangeType[0, 77777B, FALSE]]; sei ← NextOuterSe[]; -- TEXT typeTEXT ← rSei ← MakeRecordType[nBits:2*WordLength, default:TRUE]; seb[rSei].hints.variant ← TRUE; tCtx ← seb[rSei].fieldCtx; ctxb[tCtx].seList ← seChain ← MakeSeChain[tCtx, 2, FALSE]; FillVariable[seChain, "length"L, idNAT, [wd:0, bd:0], WordLength]; EnterExtension[seChain, default, tC0]; seChain ← NextSe[seChain]; BEGIN tag: ISEIndex = MakeSeChain[CTXNull, 1, FALSE]; seqSei: CSEIndex = MakeNonCtxSe[SIZE[sequence cons SERecord]]; FillVariable[tag, "maxLength"L, idNAT, [wd:1, bd:0], WordLength]; seb[tag].immutable ← TRUE; seb[seqSei] ← [mark3: TRUE, mark4: TRUE, body: cons[sequence[ packed: TRUE, machineDep: TRUE, controlled: TRUE, tagSei: tag, componentType: idCHAR]]]; FillVariable[seChain, "text"L, seqSei, [wd:1, bd:0], WordLength]; END; FillNamedType[sei, "TEXT"L, rSei]; idSTRING ← NextOuterSe[]; sei ← NextOuterSe[]; -- StringBody typeStringBody ← rSei ← MakeRecordType[nBits:2*WordLength, default:TRUE]; seb[rSei].hints.assignable ← TRUE; -- compatibility tCtx ← seb[rSei].fieldCtx; ctxb[tCtx].seList ← seChain ← MakeSeChain[tCtx, 3, FALSE]; FillVariable[seChain, "length"L, idCARDINAL, [wd:0, bd:0], WordLength]; EnterExtension[seChain, default, tC0]; seChain ← NextSe[seChain]; FillVariable[seChain, "maxlength"L, idCARDINAL, [wd:1, bd:0], WordLength]; seb[seChain].immutable ← TRUE; seChain ← NextSe[seChain]; tSei ← MakeNonCtxSe[SIZE[array cons SERecord]]; seb[tSei] ← [mark3: TRUE, mark4: TRUE, body: cons[array[ packed: TRUE, indexType: MakeSubrangeType[0, 0, TRUE], componentType: idCHAR]]]; FillVariable[seChain, "text"L, tSei, [wd:2, bd:0], 0]; FillNamedType[sei, "StringBody"L, rSei]; typeSTRING ← MakeRefType[sei]; FillNamedType[idSTRING, "STRING"L, typeSTRING]; idLOCK ← NextOuterSe[]; rSei ← MakeRecordType[nBits:WordLength, default:TRUE]; tCtx ← seb[rSei].fieldCtx; ctxb[tCtx].seList ← seChain ← MakeSeChain[tCtx, 1, FALSE]; FillVariable[seChain, NIL, idANY, [wd:0, bd:0], WordLength]; EnterExtension[seChain, default, MakeTreeLiteral[100000B]]; FillNamedType[idLOCK, "MONITORLOCK"L, rSei]; typeLOCK ← rSei; sei ← NextOuterSe[]; -- CONDITION rSei ← MakeRecordType[nBits:2*WordLength, default:TRUE]; typeCONDITION ← rSei; tCtx ← seb[rSei].fieldCtx; ctxb[tCtx].seList ← seChain ← MakeSeChain[tCtx, 2, FALSE]; FillVariable[seChain, "timeout"L, idCARDINAL, [wd:1, bd:0], WordLength]; EnterExtension[seChain, default, MakeTreeLiteral[100]]; seChain ← NextSe[seChain]; FillVariable[seChain, NIL, idANY, [wd:0, bd:0], WordLength]; EnterExtension[seChain, default, tC0]; FillNamedType[sei, "CONDITION"L, rSei]; typeCONDITION ← rSei; sei ← NextOuterSe[]; -- MDSZone tSei ← MakeNonCtxSe[SIZE[zone cons SERecord]]; seb[tSei] ← [mark3:TRUE, mark4:TRUE, body:cons[zone[counted:FALSE, mds:TRUE]]]; FillNamedType[sei, "MDSZone"L, tSei]; idATOM ← sei ← NextOuterSe[]; tSei ← MakeNonCtxSe[SIZE[opaque cons SERecord]]; seb[tSei] ← [mark3: TRUE, mark4: TRUE, body: cons[opaque[ id: NextSe[sei], -- seAnon length: 0, lengthKnown: FALSE]]]; tSei ← MakeRefType[tSei]; typeATOM ← MakeNonCtxSe[SIZE[long cons SERecord]]; seb[typeATOM] ← [mark3: TRUE, mark4: TRUE, body: cons[long[rangeType: tSei]]]; FillNamedType[idATOM, "****"L, typeATOM]; -- so you can't say ATOM seAnon ← NextOuterSe[]; FillVariable[seAnon, "?"L, typeANY, [wd:0, bd:0], WordLength]; FillConstant[NextOuterSe[], "TRUE"L, idBOOL, 1]; -- TRUE FillConstant[NextOuterSe[], "FALSE"L, idBOOL, 0]; -- FALSE idUNWIND ← NextOuterSe[]; tSei ← MakeNonCtxSe[SIZE[transfer cons SERecord]]; seb[tSei] ← [mark3: TRUE, mark4: TRUE, body: cons[transfer[mode:error, inRecord:RecordSENull, outRecord:RecordSENull]]]; FillConstant[idUNWIND, "UNWIND"L, tSei, LOOPHOLE[BcdDefs.Link[procedure[gfi:BcdDefs.GFTNull, ep:1, tag:TRUE]]]]; FillConstant[NextOuterSe[], "ABORTED"L, tSei, LOOPHOLE[BcdDefs.Link[procedure[gfi:BcdDefs.GFTNull, ep:2, tag:TRUE]]]]; IF outerChain # ISENull THEN ERROR; Table.DropNotify[P1Notify]}; LockId: PUBLIC PROC RETURNS [HTIndex] = { desc: SubStringDescriptor ← [base:"LOCK"L, offset:0, length:("LOCK"L).length]; RETURN [EnterString[@desc]]}; EnterHashMark: PROC = INLINE { -- marks end of symbols from source file in hash table desc: SubStringDescriptor ← [base:" "L, offset:1, length:0]; [] ← EnterString[@desc]}; END.