-- Hack.mesa -- Last Modified On December 16, 1983 11:22 am By Paul Rovner DIRECTORY AMTypes USING[TypeClass, Class, Error], IO USING[STREAM, int, char, PutRope, Put], PrintTV USING[PrintType], RTTypesBasicPrivate USING[GetLastTypeIndex, MapTiTd], SafeStorage USING[GetCanonicalType, Type], ViewerIO USING[CreateViewerStreams], Set USING[Handle, New, In, Put, Nth, Cardinality]; Hack: PROGRAM IMPORTS AMTypes, IO, PrintTV, RTTypesBasicPrivate, SafeStorage, Set, ViewerIO = { DoIt: PROC[showTypeNames: BOOL _ FALSE] = { UCA: TYPE = ARRAY [1..10000] OF REF CARDINAL; cTypeList: LIST OF Set.Handle _ NIL; uniqueCardinals: REF UCA _ NEW[UCA]; out: IO.STREAM = ViewerIO.CreateViewerStreams["Hack Output"].out; FOR i: CARDINAL IN [1..10000] DO uniqueCardinals[i] _ NEW[CARDINAL _ i] ENDLOOP; FOR i: CARDINAL IN [7..RTTypesBasicPrivate.GetLastTypeIndex[]] -- for each type DO ct: REF CARDINAL = uniqueCardinals[SafeStorage.GetCanonicalType[LOOPHOLE[i]]]; set: Set.Handle; found: BOOLEAN _ FALSE; FOR l: LIST OF Set.Handle _ cTypeList, l.rest UNTIL l = NIL DO IF Set.In[l.first, ct] THEN {[] _ Set.Put[l.first, uniqueCardinals[i]]; found _ TRUE; EXIT}; ENDLOOP; IF NOT found THEN-- here if canonical type has not been seen yet {set _ Set.New[]; [] _ Set.Put[set, ct]; [] _ Set.Put[set, uniqueCardinals[i]]; cTypeList _ CONS[set, cTypeList]}; ENDLOOP; out.PutRope["The set of Type equivalence classes: \n"]; FOR l: LIST OF Set.Handle _ cTypeList, l.rest UNTIL l = NIL DO typeNotPrinted: BOOL _ TRUE; finalized: BOOL _ FALSE; cardinality: LONG CARDINAL _ l.first.Cardinality[]; inconsistentFinalization: BOOL _ FALSE; nPackageRefs: NAT _ 0; out.PutRope["{ "]; FOR i: LONG CARDINAL IN [1..cardinality] DO type: SafeStorage.Type = [NARROW[Set.Nth[l.first, i], REF CARDINAL]^]; class: AMTypes.Class _ nil; IF showTypeNames THEN class _ AMTypes.TypeClass[type ! ANY => CONTINUE]; IF RTTypesBasicPrivate.MapTiTd[type].numberPackageRefs > 0 THEN {IF finalized AND RTTypesBasicPrivate.MapTiTd[type].numberPackageRefs # nPackageRefs THEN inconsistentFinalization _ TRUE ELSE {finalized _ TRUE; nPackageRefs _ RTTypesBasicPrivate.MapTiTd[type].numberPackageRefs}}; out.Put[IO.int[type], IO.char[' ]]; IF showTypeNames AND class = definition AND typeNotPrinted THEN {typeNotPrinted _ FALSE; out.Put[IO.char['[]]; PrintTV.PrintType[ [NARROW[Set.Nth[l.first, 1], REF CARDINAL]^], out ! AMTypes.Error => CONTINUE]; out.Put[IO.char[']]]; out.Put[IO.char[' ]]; }; ENDLOOP; IF inconsistentFinalization THEN out.PutRope[" INCONSISTENTFINALIZATION"]; IF finalized THEN {out.PutRope[" FINALIZED ("]; out.Put[IO.int[nPackageRefs], IO.char[')]]}; out.PutRope["}\n"]; ENDLOOP; }; }. ʘJšòÏcKÏk œ žœžœžœžœ&žœ#žœ+žœ%žœžœ3žœžœ žœ?Ïnœžœžœžœžœžœžœ žœžœžœžœžœžœžœžœžœžœ žœžœ7žœžœžœ žœžœžœžœžœžœžœ.œžœžœžœ0žœ1žœžœžœžœžœ žœžœ žœžœ&žœOžœžœžœ žœžœž0œ‹žœžœ>žœžœžœ žœžœžœžœžœžœžœž œ<žœžœžœ)žœž œžœžœžœžœžœ=žœžœ"žœžœžœHžœžœ%žœ]žœžœžœžœžœ žœžœžœžœžœžœ"žœ8žœžœžœ8žœ#žœ,žœ/žœ žœžœ3žœžœ9žœžœ,žœ ˜«—…— .<