+/* Returning from a subroutine, tos must be CALL */
+class cl_stack_ret: public cl_stack_call
+{
+public:
+ cl_stack_ret(t_addr iPC, t_addr iaddr, t_addr iSP_before, t_addr iSP_after);
+ virtual class cl_stack_op *mk_copy(void);
+protected:
+ virtual char *get_op_name(void);
+public:
+ virtual char *get_matching_name(void);
+ virtual enum stack_op get_matching_op(void);
+ virtual bool match(class cl_stack_op *op);
+};
+
+/* Returning from an ISR, yos must be INTR */
+class cl_stack_iret: public cl_stack_ret
+{
+public:
+ cl_stack_iret(t_addr iPC, t_addr iaddr, t_addr iSP_before, t_addr iSP_after);
+ virtual class cl_stack_op *mk_copy(void);
+protected:
+ virtual char *get_op_name(void);
+public:
+ virtual char *get_matching_name(void);
+ virtual enum stack_op get_matching_op(void);
+ virtual bool match(class cl_stack_op *op);
+};
+
+/* Pop out data from stack, tos must be PUSH */
+class cl_stack_pop: public cl_stack_push
+{
+public:
+ cl_stack_pop(t_addr iPC, t_mem idata, t_addr iSP_before, t_addr iSP_after);
+ virtual class cl_stack_op *mk_copy(void);
+protected:
+ virtual char *get_op_name(void);
+public:
+ virtual char *get_matching_name(void);
+ virtual enum stack_op get_matching_op(void);
+ virtual bool match(class cl_stack_op *op);
+};
+
+
+/*
+ * All kind of stack errors
+ */
+class cl_error_stack: public cl_error
+{
+private:
+ static class cl_error_class *error_stack_class;
+public:
+ cl_error_stack(void);
+};
+
+/*
+ * All kind of stack tracker errors
+ */
+class cl_error_stack_tracker: public cl_error_stack
+{
+public:
+ cl_error_stack_tracker(void);
+};
+
+class cl_error_stack_tracker_wrong_handle: public cl_error_stack_tracker
+{
+public:
+ bool write_operation;
+public:
+ cl_error_stack_tracker_wrong_handle(bool write_op);
+
+ virtual void print(class cl_commander_base *c);
+};
+
+class cl_error_stack_tracker_empty: public cl_error_stack_tracker
+{
+protected:
+ class cl_stack_op *operation;
+public:
+ cl_error_stack_tracker_empty(class cl_stack_op *op);
+ virtual ~cl_error_stack_tracker_empty(void);
+
+ virtual void print(class cl_commander_base *c);
+};
+
+class cl_error_stack_tracker_unmatch: public cl_error_stack_tracker
+{
+protected:
+ class cl_stack_op *top, *operation;
+public:
+ cl_error_stack_tracker_unmatch(class cl_stack_op *Top,
+ class cl_stack_op *op);
+ virtual ~cl_error_stack_tracker_unmatch(void);
+
+ virtual void print(class cl_commander_base *c);
+};
+
+class cl_error_stack_tracker_inconsistent: public cl_error_stack_tracker
+{
+protected:
+ class cl_stack_op *operation;
+ int unread_data_size;
+public:
+ cl_error_stack_tracker_inconsistent(class cl_stack_op *op,
+ int the_unread_data_size);
+ virtual ~cl_error_stack_tracker_inconsistent(void);
+
+ virtual void print(class cl_commander_base *c);
+};
+
+class cl_stack_error_registry: public cl_error_registry
+{
+public:
+ cl_stack_error_registry(void);
+};