DEFINITION MODULE M3DL; (*NW 2.6.84 / 2.11.85*) FROM SYSTEM IMPORT ADDRESS; CONST WordSize = 16; nilval = 177777B; MaxCodeLength = 8; TYPE ObjPtr = POINTER TO Object; StrPtr = POINTER TO Structure; ParPtr = POINTER TO Parameter; PDPtr = POINTER TO PDesc; KeyPtr = POINTER TO Key; ObjClass = (Header, Const, Typ, Var, Field, Proc, Code, Module, Temp); StrForm = (Undef, Bool, Char, Card, Int, Double, Real, String, Enum, Range, Pointer, Set, Array, Record, ProcTyp, Opaque); ConstValue = RECORD CASE : StrForm OF Bool: B: BOOLEAN | Char: Ch: CHAR | Int: I: INTEGER | Card, Enum: C: CARDINAL; prev: ObjPtr | Set: S: BITSET | Double: D: LONGINT | Real: R: REAL | String: D0, D1, D2, D3: CARDINAL END END; Object = RECORD name: CARDINAL; (*index to name buffer*) typ: StrPtr; left, right, next: ObjPtr; exported: BOOLEAN; CASE class: ObjClass OF Header: kind: ObjClass; (*Proc, Module or Typ*) last, heap: ObjPtr; withadr: INTEGER | Const: conval: ConstValue | Typ: mod: ObjPtr | Var: param: BITSET; vmod, vlev: CARDINAL; vadr: INTEGER | Field: offset: INTEGER | Proc: pd: PDPtr; firstParam: ParPtr; firstLocal: ObjPtr; pmod: CARDINAL | Code: cd: PDPtr; firstArg: ParPtr; cnum, length: CARDINAL | Module: key: KeyPtr; firstObj, root: ObjPtr; modno: CARDINAL | Temp: baseref: CARDINAL END END; PDesc = RECORD CASE : BOOLEAN OF TRUE: num, lev: CARDINAL; adr, size: INTEGER | FALSE: cod: ARRAY [0..MaxCodeLength-1] OF CHAR END END; Structure = RECORD strobj: ObjPtr; (*object (type) naming structure*) size: INTEGER; ref: CARDINAL; CASE form: StrForm OF Undef, Bool, Char, Int, Card, Double, Real, String: | Enum: ConstLink: ObjPtr; NofConst: CARDINAL | Range: RBaseTyp: StrPtr; min, max: INTEGER | Pointer: PBaseTyp: StrPtr; BaseId: CARDINAL | (*to handle forward refs*) Set: SBaseTyp: StrPtr | Array: ElemTyp, IndexTyp: StrPtr; dyn: BOOLEAN | Record: firstFld: ObjPtr | ProcTyp: firstPar: ParPtr; resTyp: StrPtr | Opaque: END END; Parameter = RECORD name: CARDINAL; varpar: BOOLEAN; typ: StrPtr; next: ParPtr END; Key = RECORD k0, k1, k2: CARDINAL END; VAR mainmod, sysmod: ObjPtr; undftyp, booltyp, chartyp, inttyp, cardtyp, bitstyp, dbltyp, realtyp, proctyp, notyp, stringtyp, addrtyp, wordtyp: StrPtr; PROCEDURE ALLOCATE(VAR a: ADDRESS; n: CARDINAL); PROCEDURE Available(): CARDINAL; PROCEDURE ResetHeap(a: ADDRESS); END M3DL.