-- RandomCodeTypes.mesa last edited by Sturgis: October 4, 1984 4:36:53 pm PDT DIRECTORY IO USING[STREAM], Rope USING[ROPE]; RandomCodeTypes: CEDAR DEFINITIONS = BEGIN WordType: TYPE = REF WordTypeBody; WordTypeBody: TYPE = RECORD[ type: WordTypeCase, index: CARDINAL, body: REF ANY]; TypeSet: TYPE = REF TypeSetBody; TypeSetBody: TYPE; WordTypeCase: TYPE = {uninitialized, ordinary, pointer, procedure}; ProcedureType: TYPE = REF ProcedureTypeBody; ProcedureTypeBody: TYPE; SeqType: TYPE = REF SeqTypeBody; SeqTypeBody: TYPE; -- Type creation operations CreateTypeSet: PROCEDURE[maxNTypes: CARDINAL] RETURNS[TypeSet]; GetSizeOfTypeSet: PROCEDURE[TypeSet] RETURNS[CARDINAL]; GetUninitializedWordType: PROCEDURE[TypeSet] RETURNS[WordType]; GetOrdinaryWordType: PROCEDURE[TypeSet] RETURNS[WordType]; GetWordTypeFromIndex: PROCEDURE[TypeSet, CARDINAL] RETURNS[WordType]; CreatePointerType: PROCEDURE[TypeSet, SeqType] RETURNS[WordType]; CreateProcedureType: PROCEDURE[typeSet: TypeSet, printName: Rope.ROPE, allowedArgs: SeqType, possibleResults: SeqType] RETURNS[WordType]; CreateSeqType: PROCEDURE[typeSet: TypeSet, printName: Rope.ROPE, nWords: CARDINAL] RETURNS[SeqType]; -- type inspection routines GetIndex: PROCEDURE[WordType] RETURNS[CARDINAL]; GetSeqTypeOfPointerType: PROCEDURE[WordType] RETURNS[SeqType]; GetArgsResultsOfProcedureType: PROCEDURE[WordType] RETURNS[args, results: SeqType]; GetTypeSetOfSeq: PROCEDURE[SeqType] RETURNS[TypeSet]; GetLength: PROCEDURE[SeqType] RETURNS[CARDINAL]; TopOfSeq: PROCEDURE[s: SeqType, baseSize: CARDINAL] RETURNS[SeqType]; TopTwoOfSeq: PROCEDURE[SeqType] RETURNS[s0, s1: WordType]; GetWordTypeFromOffset: PROCEDURE[s: SeqType, offset: CARDINAL] RETURNS[WordType]; FindFirstDiff: PROCEDURE[a, b: SeqType] RETURNS[CARDINAL]; -- Type manipulation operations FillSeqType: PROCEDURE[seq: SeqType, genWordTypes: PROCEDURE[CARDINAL] RETURNS[WordType]]; MergeTypes: PROCEDURE[a, b: SeqType] RETURNS[SeqType]; SubtractAddTypes: PROCEDURE[first, minus, plus: SeqType] RETURNS[SeqType]; PopSomeTypes: PROCEDURE[model: SeqType, nPop: CARDINAL] RETURNS[SeqType]; PushOneType: PROCEDURE[model: SeqType, type: WordType] RETURNS[SeqType]; CopySeqType: PROCEDURE[in: SeqType] RETURNS[SeqType]; CopyWithOneTypeChanged: PROCEDURE[in: SeqType, at: CARDINAL, new: WordType] RETURNS[SeqType]; CreateTypeExtendingPartOfType: PROCEDURE[in: SeqType, baseCount: CARDINAL, extension: SeqType] RETURNS[SeqType]; -- type checking operations WordStorableAs: PROCEDURE[WordType, WordType] RETURNS[BOOLEAN]; LoadIndirectTypeCheck: PROCEDURE[pointer: WordType, offset: CARDINAL, stackType: SeqType]; StoreIndirectTypeCheck: PROCEDURE[stackType: SeqType, pointer: WordType, offset: CARDINAL]; StackBaseCheck: PROCEDURE[source, target: SeqType, nArgs, nResults: CARDINAL]; FrameVarsCheck: PROCEDURE[source, target: SeqType, skip: CARDINAL]; ArgPairTypeCheck: PROCEDURE[stackType: SeqType, a0, a1: WordType]; ArgSeqTypeCheck: PROCEDURE[stackType, allowedArgs: SeqType, skipOne: BOOLEAN _ FALSE]; ResultWordTypeCheck: PROCEDURE[r0: WordType, stackType: SeqType]; ResultSeqTypeCheck: PROCEDURE[possibleResults, stackType: SeqType]; -- used during random construction of procedures GetLocalOffset: PROCEDURE[s: SeqType, t: WordType, random: CARDINAL] RETURNS[CARDINAL]; GetRemoteOffset: PROCEDURE[s: SeqType, t: WordType, random: CARDINAL] RETURNS[l,r: CARDINAL]; -- print routines PrintWordType: PROCEDURE[w: WordType, on: IO.STREAM]; PrintSeqType: PROCEDURE[t: SeqType, on: IO.STREAM]; END. MODULE HISTORY Initial by: Sturgis, October 4, 1984 4:36:29 pm PDT, edited from RandomCodeInternal. re-arrange: October 5, 1984 11:45:49 am PDT