<<>> <> <> <> <> <> <> DIRECTORY CirioTypes USING[CompilerContext, Node, Type], Rope USING[ROPE]; Frames: CEDAR DEFINITIONS = BEGIN CC: TYPE = CirioTypes.CompilerContext; Type: TYPE = CirioTypes.Type; Node: TYPE = CirioTypes.Node; <<>> <> IndirectFrameTypeData: TYPE = RECORD[ enclosingContext: Type, -- an IndirectFrameType or IndirectGlobalFrameType args: Type, -- an Indirect Record or FieldList Type results: Type, -- an Indirect Record or FieldList Type blocks: SEQUENCE nBlocks: CARDINAL OF Type]; -- each is an Indirect FieldListType <> <<>> <> <<(1) can not be solved easily, because the symbol tables do not include information about opens. (Of course, one could parse the source file and reconstruct such information if one wanted to. Or, one could change the compiler to include such information in the symbol tables.>> <<(2) We shall tackle in due time. >> CreateIndirectFrameType: PROC[data: REF IndirectFrameTypeData, cc: CC] RETURNS[Type]; <> IndirectGlobalFrameTypeData: TYPE = RECORD[ globalVars: Type]; -- globalVars is a record type CreateIndirectGlobalFrameType: PROC[data: REF IndirectGlobalFrameTypeData, cc: CC] RETURNS[Type]; <> <> <> <<>> IndirectFrameData: TYPE = RECORD[ procedure: Node, -- eventually I have to decide what to do about catch phrases enclosingContext: Node, -- an IndirectFrame or IndirectGlobalFrame descriptor: Node, -- a Rope args: Node, -- an Indirect FieldList results: Node, -- an Indirect FieldList getSourcePosition: PROC[procData: REF ANY, cc: CC] RETURNS[Node], getCallingNode: PROC[procData: REF ANY, cc: CC] RETURNS[Node], procData: REF ANY, blocks: SEQUENCE nBlocks: CARDINAL OF Node]; -- each is an Indirect FieldList CreateIndirectFrameNode: PROC[data: REF IndirectFrameData, type: Type, cc: CC] RETURNS[Node]; <> <<&sourcePosition returns a SourcePositionNode>> <<&procedure returns the ProcedureNode for the procedure that the frame is an instance of.>> <<&descriptor returns the descriptor RopeNode>> <<&caller returns an indirect frame node for caller>> <<&enclosingContext returns an indirect frame node or globalframe node for enclosing context>> <<>> <> <<>> IndirectGlobalFrameData: TYPE = RECORD[ descriptor: Node, -- RopeNode globalVars: Node]; -- globalVars is a record type CreateIndirectGlobalFrameNode: PROC[data: REF IndirectGlobalFrameData, type: Type, cc: CC] RETURNS[Node]; <> <<&descriptor returns the descriptor RopeNode>> <<>> CreateSourcePositionNode: PROC[name: Rope.ROPE, index: INT, cc: CC] RETURNS[Node]; <> <<>> FrameAdvanceNameScope: PROC [node: Node, cc: CC] RETURNS [Node]; SourcePositionRep: TYPE = RECORD[name: Rope.ROPE, index: INT]; <> <> <> <> <> StackOfFrames: TYPE = REF StackOfFramesBody; StackOfFramesBody: TYPE = RECORD[ data: REF ANY, procs: REF StackOfFramesProcs]; StackOfFramesProcs: TYPE = RECORD[ walkStack: PROC[StackOfFrames, INT] RETURNS[Node]]; <> <<>> <> <<>> <> TargetWorld: TYPE = REF TargetWorldBody; TargetWorldBody: TYPE = RECORD[ twData: REF ANY, procs: REF TargetWorldProcs]; TargetWorldProcs: TYPE = RECORD[ <> getCodePositionFromSource: PROC[sourcePosition: Node, twData: REF ANY, cc: CC, atExit: BOOLEAN _ FALSE] RETURNS[Node], getSourcePositionFromCode: PROC[codePosition: Node, twData: REF ANY, cc: CC] RETURNS[Node], <> <<>> <> <<>> <> setBreak: PROC[codePosition: Node, twData: REF ANY, cc: CC] RETURNS[brkIndex: CARD], listBreaks: PROC[for: PROC[brkIndex: CARD, codePosition: Node], twData: REF ANY, cc: CC], getBrkIndexFromCodePos: PROC[codePosition: Node, twData: REF ANY, cc: CC] RETURNS[brkIndex: CARD], <> getCodePositionFromBrkIndex: PROC[brkIndex: CARD, twData: REF ANY, cc: CC] RETURNS[Node], clearOneBreak: PROC[brkIndex: CARD, twData: REF ANY, cc: CC], clearAllBreaks: PROC[twData: REF ANY, cc: CC], getBrkIndexFromBreakInfo: PROC[breakInfo: Node, twData: REF ANY, cc: CC] RETURNS[brkIndex: CARD], <> clearBrkFromBreakInfo: PROC[breakInfo: Node, twData: REF ANY, cc: CC] <<>> <> <<>> ]; <<>> <<>> <<>> CreateTargetWorldNode: PROC[tw: TargetWorld, cc: CC] RETURNS[Node]; <> <<>> <> <<>> CreateCodePosition: PROC[info: REF ANY, cc: CC] RETURNS[Node]; <> <> CreateBreakInfo: PROC[info: REF ANY, cc: CC] RETURNS[Node]; <> <<>> END..