<> <> <> DIRECTORY Rope USING [ROPE], SaffronBaseDef USING [ValueNode]; SaffronProgramGraphPrivateTypes: CEDAR DEFINITIONS = BEGIN OPEN BD: SaffronBaseDef; <> ParameterizedFieldDescriptorNode: TYPE = REF ParameterizedFieldDescriptorNodeBody; ParameterizedFieldDescriptorNodeBody: TYPE = RECORD [ firstCell: ParameterizedFieldDescriptorCell, lastCell: ParameterizedFieldDescriptorCell ]; ParameterizedFieldDescriptorCell: TYPE = REF ParameterizedFieldDescriptorCellBody; ParameterizedFieldDescriptorCellBody: TYPE = RECORD [ next: ParameterizedFieldDescriptorCell, k: SELECT kind: * FROM index => [], -- find it on the stack! < [index: BD.ValueNode],>> nested => [], staticLink => [], vars => [name: Rope.ROPE], fieldName => [name: Rope.ROPE] ENDCASE ]; <> ProgramGraphNode: TYPE = REF ProgramGraphNodeBody; ProgramGraphNodeBody: TYPE = RECORD [ main: ProcedureGraphNode, firstSubroutine: ProcedureGraphCell, lastSubroutine: ProcedureGraphCell ]; ProcedureGraphCell: TYPE = REF ProcedureGraphCellBody; ProcedureGraphCellBody: TYPE = RECORD [ next: ProcedureGraphCell, procedureGraph: ProcedureGraphNode ]; ProcedureGraphNode: TYPE = REF ProcedureGraphNodeBody; ProcedureGraphNodeBody: TYPE = RECORD [ code: ProgramFragmentNode ]; <> ProgramFragmentNode: TYPE = REF ProgramFragmentNodeBody; ProgramFragmentNodeBody: TYPE = RECORD [ firstOperation: OperationNode, exitingOperations: LIST OF OperationNode ]; <> << operation.outgoingActionEdges = [label: next, to: NIL, next: NIL] >> <> OperationNode: TYPE = REF OperationNodeBody; OperationNodeBody: TYPE = RECORD [ signalCatchNode: SignalCatchNode, outgoingActionEdges: OutgoingActionsCell, effects: REF ANY ]; <> < [op: OpNoOp],>> < [op: OpPushConstant],>> < [op: OpTest],>> < [op: OpUnaryFunction],>> < [op: OpBinaryFunction],>> < [op: OpLoadLocal],>> < [op: OpLoadIndirect],>> < [op: OpStoreLocal],>> < [op: OpStoreIndirect],>> < [op: OpNew],>> < [op: OpCall],>> < [op: OpReturn],>> < [op: OpCreateProcedureDescriptor],>> < [op: OpSetLock],>> < [op: OpSleep],>> < [op: OpWake],>> < [op: OpLoadOwnProcess],>> < [op: OpFork],>> < [op: OpJoin],>> < [op: OpDetach],>> < [op: OpWaitForCondition],>> < [op: OpNotifyCondition],>> < [op: OpBroadcastToCondition],>> < [op: OpEnterMonitor],>> < [op: OpExitMonitor],>> < [op: OpEnQueueSelf],>> < [op: OpDeQueueSelf],>> < [op: OpWakeOneOnQueue],>> < [op: OpWakeAllOnQueue],>> < [op: OpLockQueue],>> < [op: OpReleaseQueue],>> < [op: OpSaveSignalParamters],>> < [op: OpGetCatchNode],>> < [op: OpGetCatchCodeProcedureDescriptor],>> < [op: OpGetNextCatchNode],>> < [op: OpAcquireSignalParameters],>> < [op: OpDeleteCallerPFrame],>> <> <<];>> OutgoingActionsCell: TYPE = REF OutgoingActionsCellBody; OutgoingActionsCellBody: TYPE = RECORD [ label: OutgoingActionKind, to: OperationNode, next: OutgoingActionsCell ]; OutgoingActionKind: TYPE = {next, ifTrue, ifFalse}; SignalCatchNode: TYPE = REF SignalCatchNodeBody; SignalCatchNodeBody: TYPE = RECORD []; <> OpPushConstant: TYPE = REF OpPushConstantBody; OpPushConstantBody: TYPE = RECORD [ constant: BD.ValueNode ]; OpTest: TYPE = REF OpTestBody; OpTestBody: TYPE = RECORD []; OpUnaryFunction: TYPE = REF OpUnaryFunctionBody; OpUnaryFunctionBody: TYPE = RECORD [ <> f: SELECT function: * FROM negate => [], -- these fields should contain next actions for unsatisfactory arguments. not => [], ENDCASE ]; OpBinaryFunction: TYPE = REF OpBinaryFunctionBody; OpBinaryFunctionBody: TYPE = RECORD [ <> f: SELECT function: * FROM add => [], subtract => [], multiply => [], divide => [], mod => [], and => [], or => [], equal => [], notEqual => [], ENDCASE ]; <> OpLoadLocal: TYPE = REF OpLoadLocalBody; OpLoadLocalBody: TYPE = RECORD [ pfd: ParameterizedFieldDescriptorNode, <> nextActionIfUnsatisfactoryIndices: OperationNode ]; OpLoadIndirect: TYPE = REF OpLoadIndirectBody; OpLoadIndirectBody: TYPE = RECORD [ pfd: ParameterizedFieldDescriptorNode, <> nextActionIfUnsatisfactoryIndices: OperationNode, nextActionIfNilPointer: OperationNode ]; OpStoreLocal: TYPE = REF OpStoreLocalBody; OpStoreLocalBody: TYPE = RECORD [ pfd: ParameterizedFieldDescriptorNode, <> nextActionIfUnsatisfactoryIndices: OperationNode ]; OpStoreIndirect: TYPE = REF OpStoreIndirectBody; OpStoreIndirectBody: TYPE = RECORD [ pfd: ParameterizedFieldDescriptorNode, <> nextActionIfUnsatisfactoryIndices: OperationNode, nextActionIfNilPointer: OperationNode ]; OpReturn: TYPE = REF OpReturnBody; OpReturnBody: TYPE = RECORD [ ]; END.