<<>> <> <> <> <> <> DIRECTORY CirioTypes USING[CompilerContext, Mem, Node, Type], CirioSyntacticOperations USING [ParseTree], Rope USING[ROPE]; Records: CEDAR DEFINITIONS = BEGIN CC: TYPE = CirioTypes.CompilerContext; <> <> <<>> RecordTypeProcs: TYPE = RECORD[ createIndirectNode: PROC [cc: CC, data: REF ANY, indirectType, targetType: CirioTypes.Type, mem: CirioTypes.Mem] RETURNS [CirioTypes.Node], getBitSize: PROC[indirectType: CirioTypes.Type, cc: CC, data: REF ANY] RETURNS[CARD], getPaint: PROC[data: REF ANY] RETURNS[REF ANY], comparePaint: PROC[data: REF ANY, otherPaint: REF ANY] RETURNS[BOOLEAN], nFields: PROC[data: REF ANY] RETURNS[INT], fieldIndexToName: PROC[index: INT, data: REF ANY] RETURNS[Rope.ROPE], nameToFieldIndex: PROC[name: Rope.ROPE, data: REF ANY] RETURNS[INT], fieldIndexToType: PROC[index: INT, cc: CC, data: REF ANY] RETURNS[CirioTypes.Type], fieldIndexToDefault: PROC[index: INT, cc: CC, data: REF ANY] RETURNS[CirioSyntacticOperations.ParseTree, CirioTypes.Node], fieldIndexToFieldCase: PROC[index: INT, cc: CC, data: REF ANY] RETURNS[FieldCase], fieldIndexToCompileTimeConstantValue: PROC[index: INT, cc: CC, data: REF ANY] RETURNS[CirioTypes.Node]]; <> <> <> FieldCase: TYPE = { nodeTimeReadWrite, -- the field exists in memory and is modifiable nodeTimeReadOnly, -- the field exists in memory, but it is not modifiable nodeTimeConstant, -- the field does not exist in memory, but its value can not be computed until we know the actual location of some other appropriate data structure, e.g., a global or local frame. typeTimeConstant -- the field does not exist in memory and the value can be computed without reference to the contents of memory }; <<>> CreateRecordType: PROC[procs: REF RecordTypeProcs, cc: CC, data: REF ANY] RETURNS[CirioTypes.Type]; <> <> CreateFieldListType: PROC[procs: REF RecordTypeProcs, cc: CC, data: REF ANY] RETURNS[CirioTypes.Type]; <> <> <> <> RecordNodeProcs: TYPE = RECORD[ extractField: PROC[index: INT, fieldType: CirioTypes.Type, data: REF ANY, cc: CC] RETURNS[CirioTypes.Node]]; <<>> IndirectRecordNodeProcs: TYPE = RECORD[ selectField: PROC[index: INT, indirectFieldType: CirioTypes.Type, data: REF ANY, cc: CC] RETURNS[CirioTypes.Node], fieldIndexToNodeTimeConstantValue: PROC[index: INT, fieldType: CirioTypes.Type, data: REF ANY, cc: CC] RETURNS[CirioTypes.Node], <> getPointer: PROC[data: REF ANY, cc: CC] RETURNS[CirioTypes.Node]]; CreateIndirectRecordNode: PROC[targetRecordType: CirioTypes.Type, procs: REF IndirectRecordNodeProcs, data: REF ANY, cc: CC] RETURNS[CirioTypes.Node]; ConstructRecordNode: PROC[recordType: CirioTypes.Type, fields: LIST OF CirioTypes.Node, cc: CC] RETURNS[CirioTypes.Node]; <> END..