-- file Literals.Mesa -- last modified by Satterthwaite, 23-Oct-81 14:35:03 DIRECTORY Symbols: TYPE USING [SEIndex], Table: TYPE USING [Base, Finger, Selector, Limit]; Literals: DEFINITIONS = { Base: TYPE = Table.Base; Finger: TYPE = Table.Finger; Limit: NAT = Table.Limit/2; -- data structures LitRecord: TYPE = RECORD [ SELECT litTag: * FROM word => [index: LTIndex], string => [index: STIndex] ENDCASE]; -- literal constants WordSequence: TYPE = ARRAY [0..0) OF WORD; LTRecord: TYPE = RECORD [ link: LTIndex, datum: SELECT kind: * FROM short => [value: WORD], long => [ codeIndex: [0..LAST[CARDINAL]/2], length: CARDINAL, value: WordSequence] ENDCASE]; LTIndex: TYPE = Base RELATIVE POINTER [0..Limit) TO LTRecord; LTNull: LTIndex = LAST[LTIndex]; LTId: TYPE = RECORD [baseP: Finger, index: LTIndex]; LitDescriptor: TYPE = RECORD[ offset: Base RELATIVE POINTER [0..LAST[CARDINAL]) TO WordSequence, length: CARDINAL]; -- string literals STRecord: TYPE = RECORD [ SELECT kind: * FROM master => [ link: MSTIndex, local: BOOLEAN, info: CARDINAL, codeIndex: CARDINAL, string: StringBody], -- the actual string text follows here copy => [ mark: BOOLEAN, link: MSTIndex], heap => [ link: MSTIndex, type: Symbols.SEIndex, info: CARDINAL] ENDCASE]; SizeSTPrefix: CARDINAL = SIZE[master STRecord] - SIZE[StringBody]; STIndex: TYPE = Base RELATIVE POINTER [0..Limit) TO STRecord; STNull: STIndex = LAST[STIndex]; MSTIndex: TYPE = Base RELATIVE POINTER [0..Limit) TO master STRecord; -- table allocation codes ltType: Table.Selector = 7; stType: Table.Selector = 8; }.