<<>> <> <> <> <> <> <> <> DIRECTORY CirioTypes USING[CompilerContext, Mem, Node, Type], Rope USING[ROPE]; VariantRecords: CEDAR DEFINITIONS = BEGIN Type: TYPE = CirioTypes.Type; Mem: TYPE = CirioTypes.Mem; Node: TYPE = CirioTypes.Node; CC: TYPE = CirioTypes.CompilerContext; <<>> <> <> <> <> <<>> CreateVariantRecordType: PROC[preamble: Type, tailName: Rope.ROPE, tagName: Rope.ROPE, tagType: Type, nTailTypes: INT, controlled: BOOL, details: VariantRecordTypeDetails, cc: CC, procData: REF ANY] RETURNS[Type]; <> VariantRecordTypeDetails: TYPE ~ REF VariantRecordTypeDetailsRec; VariantRecordTypeDetailsRec: TYPE ~ RECORD [ createIndirectNode: PROC [cc: CC, procData: REF ANY, indirectType, targetType: Type, mem: Mem] RETURNS [Node], getBitSize: PROC[indirectType: Type, cc: CC, procData: REF ANY] RETURNS[CARD], getTailType: PROC[index: INT, procData: REF ANY] RETURNS[Type] ]; <> GetVRVariant: PROC[vrType: Type, index: INT, cc: CC] RETURNS[Type]; <<>> IndirectVRNodeProcs: TYPE = RECORD[ selectPreamble: PROC[procsData: REF ANY, cc: CC] RETURNS[Node], readVariantIndex: PROC[procsData: REF ANY, cc: CC] RETURNS[INT], selectTag: PROC[procsData: REF ANY, cc: CC] RETURNS[Node], selectTailBody: PROC[procsData: REF ANY, cc: CC] RETURNS[Node], getPointer: PROC[procsData: REF ANY, cc: CC] RETURNS[Node]]; VariantRecordNodeProcs: TYPE = RECORD[ extractPreamble: PROC[procsData: REF ANY, cc: CC] RETURNS[Node], variantIndex: PROC[procsData: REF ANY, cc: CC] RETURNS[INT], extractTag: PROC[procsData: REF ANY, cc: CC] RETURNS[Node], extractTailBody: PROC[procsData: REF ANY, cc: CC] RETURNS[Node]]; CreateIndirectVariantRecordNode: PROC[vrType: Type, procs: REF IndirectVRNodeProcs, procsData: REF ANY, cc: CC] RETURNS[Node]; CreateVariantRecordNode: PROC[type: Type, procs: REF VariantRecordNodeProcs, procsData: REF ANY, cc: CC, alreadyLoaded: BOOLEAN _ FALSE] RETURNS[Node]; END..