rtexcept.h
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C头文件 代码 · 共 732 行 · 第 1/2 页
H
732 行
, EXCSTATE_ABORT = 4 // - "abort" routine has been called
, EXCSTATE_CTOR = 5 // - copying exception to active area
, EXCSTATE_DTOR = 6 // - DTORing exception in active area
, EXCSTATE_BAD_EXC = 7 // - "bad_exception" thrown for fn-exc
};
struct DISPATCH_EXC; // DISPATCH_EXC -- dispatch control
struct ACTIVE_EXC // ACTIVE_EXC -- exception being handled
{ ACTIVE_EXC *prev; // - stacked exception in thread
THROW_RO *throw_ro; // - R/O block for throw
RT_TYPE_SIG sig; // - type signature for exception
EXCSTATE state; // - state of exception EXCSTATE_...
EXCSTATE fnexc_state; // - state of exception before fn-exc dispatch
uint_8 zero_thrown :1; // - const zero was thrown
unsigned :0; // - alignment
void *extra_object; // - extra pointer object
void *exc_area; // - allocation area for exception
DTOR_CMD* cat_try; // - fnexc or try command for first catch
DISPATCH_EXC* dispatch; // - fnexc: dispatch information
RW_DTREG* rw; // - read/write block for cat_try
char data[1]; // - exception saved
};
struct DISPATCH_EXC // DISPATCH_EXC -- dispatch control
{ RW_DTREG* rw; // - read/write block for dispatch
THROW_RO* ro; // - read/only try block
_RTCTL* rtc; // - R/T control info
ACTIVE_EXC *exc; // - exception to dispatch
ACTIVE_EXC *exc_srch; // - exception for search
THROW_CNV *cnv_try; // - try conversion
DTOR_CMD* try_cmd; // - try command
unsigned catch_no; // - catch number
RT_STATE_VAR state_var; // - state variable after dispatch
DISPATCHABLE type; // - type of dispatch
uint_8 zero :1;// - TRUE ==> zero thrown
uint_8 rethrow :1;// - TRUE ==> is re-throw
uint_8 popped :1;// - TRUE ==> original catch handler popped
uint_8 non_watcom :1;// - TRUE ==> non-watcom exc. & catch(...)
unsigned :0; // - alignment
long system_exc; // - system exc code
RW_DTREG* fnexc_skip; // - fn-exc skipping R/W block
RW_DTREG* fs_last; // - last WATCOM R/W block
_EXC_PR* srch_ctl; // - exception search control
#ifdef PD_REGISTRATION
PData* pdata; // - proc. descr. for dispatching rtn.
#endif
};
//************************************************************************
// PROTOTYPES
//************************************************************************
extern "C" {
ACTIVE_EXC *CPPLIB( alloc_exc )(// ALLOCATE AN EXCEPTION
void *object, // - address of object
THROW_RO *throw_ro, // - throw R/O block
_RTCTL* rwc ) // - R/T control
;
#ifdef RW_REGISTRATION
_WPRTLINK
void CPPLIB( base_deregister )( // DE-REGISTRATION OF BASE
void )
;
#endif
THREAD_CTL* CPPLIB( base_deregister_2 )( // DE-REGISTRATION OF 2 BASES
void )
;
THREAD_CTL* CPPLIB( base_register )( // REGISTRATION OF BASE
RW_DTREG* rw, // - R/W element
RO_DTREG* ro, // - R/O element
RT_STATE_VAR state_var ) // - initial state variable
;
void CPPLIB( bit_off )( // TURN BIT OFF
uint_8* bits, // - bits
offset_t bit_no ) // - bit_no
;
uint_8 CPPLIB( bit_test )( // TEST IF BIT IS ON
uint_8* bits, // - bits
offset_t bit_no ) // - bit_no
;
#if 0
DISPATCHABLE CPPLIB( catch_any )// TEST IF R/W BLOCK IS DISPATCHABLE FOR ...
( FsExcRec* rec_exc // - exception record
, RW_DTREG* rw ) // - R/W block: search block
;
#endif
_WPRTLINK
void CPPLIB( catch_done )( // COMPLETION OF CATCH
#ifdef RW_REGISTRATION
void
#else
RW_DTREG *rw // - current R/W block
#endif
)
;
void CPPLIB( corrupted_stack )(// TERMINATE, WITH CORRUPTED STACK MSG
void )
;
#ifndef NDEBUG
int CPPLIB( cmd_active )( // INFO CAN BE DISPLAYED ABOUT IT
RW_DTREG* rw, // - active r/w entry
DTOR_CMD* cmd ) // - command in question
;
#endif
_WPRTLINK
void* CPPLIB( ctor_array_storage_1m )( // CTOR ARRAY MEMORY, SUPPLIED DELETE[]
void* array, // - array memory
unsigned count, // - number of elements
RT_TYPE_SIG sig, // - type signature for array type
void (*op_del)() ) // - operator delete[] to be used
;
_WPRTLINK
void* CPPLIB( ctor_array_storage_1s )( // CTOR ARRAY_STORAGE, SUPPLIED DELETE[]
ARRAY_STORAGE *base, // - array storage
unsigned count, // - number of elements
RT_TYPE_SIG sig, // - type signature for array type
void (*op_del)() ) // - operator delete[] to be used
;
_WPRTLINK
void* CPPLIB( ctor_array_storage_2s )( // CTOR ARRAY_STORAGE, SUPPLIED DELETE[]
ARRAY_STORAGE *base, // - array storage
unsigned count, // - number of elements
RT_TYPE_SIG sig, // - type signature for array type
void (*op_del)() ) // - operator delete[] to be used
;
_WPRTLINK
void* CPPLIB( ctor_array_storage_gm )( // CTOR ARRAY MEMORY, ::delete[]
void* array, // - array memory
unsigned count, // - number of elements
RT_TYPE_SIG sig ) // - type signature for array type
;
_WPRTLINK
void* CPPLIB( ctor_array_storage_gs )( // CTOR ARRAY_STORAGE, ::delete[]
ARRAY_STORAGE *base, // - array storage
unsigned count, // - number of elements
RT_TYPE_SIG sig ) // - type signature for array type
;
_WPRTLINK
void CPPLIB( destruct )( // R/T CALL -- destruct up to state variable
#ifdef __USE_PD
RW_DTREG* rw, // - active r/w entry
#endif
RT_STATE_VAR state_var ) // - value of state variable
;
_WPRTLINK
void CPPLIB( destruct_all )( // R/T CALL -- destruct remainder of block
#ifdef __USE_PD
RW_DTREG* rw // - active r/w entry
#else
void
#endif
)
;
void CPPLIB( ctor_done )( // R/T CALL -- ctor completed
void )
;
void CPPLIB( destruct_internal )// DESTRUCTION FOR BLK UNTIL STATE REACHED
( RT_STATE_VAR state_var // - state variable
, RW_DTREG *rw ) // - R/W for block
;
void CPPLIB( dispatch_dummy ) // CREATE DUMMY DISPATCH BLOCK
( DISPATCH_EXC* dispatch // - dispatch block
, _RTCTL* rtc ) // - R/T control
;
DISPATCHABLE CPPLIB( dispatchable )(// TEST IF R/W BLOCK IS DISPATCHABLE
DISPATCH_EXC *dispatch, // - dispatch control
RW_DTREG* rw ) // - R/W block: search block
;
void CPPLIB( dtor_free_exc ) // DESTRUCT AND FREE EXCEPTION
( ACTIVE_EXC* active // - exception
, _RTCTL* rtc ) // - R/T control
;
void CPPLIB( exc_setup ) // SETUP DISPATCH, EXCEPTION RECORDS
( DISPATCH_EXC* disp // - dispatch record
, THROW_RO* thr_ro // - throw r/o block
, rboolean is_zero // - TRUE ==> thrown object is zero constant
, _RTCTL* rt_ctl // - R/T control
, void* object // - thrown object
, FsExcRec* rec ) // - exception record
;
ACTIVE_EXC* CPPLIB( find_active )( // FIND EXCEPTION FOR A POSITION
_RTCTL* rtc, // - R/T control
RW_DTREG* rw, // - current r/w block
DTOR_CMD* cmd ) // - command within it
;
void CPPLIB( free_exc )( // FREE AN EXCEPTION
_RTCTL* rtc, // - R/T control
ACTIVE_EXC *active ) // - exception to be freed
;
#ifdef RW_REGISTRATION
_WPRTLINK
void CPPLIB( fun_register )( // REGISTRATION FOR FUNCTION
RW_DTREG* rw, // - R/W block
RO_DTREG* ro ) // - R/O block
;
#endif
void CPPLIB( lcl_register )( // REGISTRATION OF LOCAL INITIALIZATION
RW_DTREG RT_FAR *rw ) // - read/write block
;
void CPPLIB( mod_register )( // REGISTRATION FOR MODULE INITIALIZED OBJECTS
RW_DTREG* rw ) // - R/W block
;
#ifdef __USE_PD
struct _PDITER;
int CPPLIB( PditerInit ) // START THE ITERATION
( _PDITER* pdit // - iteration block
, void* SP_reg // - SP register contents
, void (*RA_reg)( void ) ) // - RA (return register) register
;
int CPPLIB( PditerUnwind ) // UNWIND ONE PROCEDURE CALL
( _PDITER* pdit ) // - iteration block
;
void CPPLIB( PdUnwind ) // UNWIND USING PROCEDURE DESCRIPTORS
( FsExcRec* exc_rec ) // - exception record
;
#endif
_WPRTLINK
void CPPLIB( rethrow )( // RE-THROW AN EXCEPTION
void )
;
RO_STATE* CPPLIB( stab_entry ) // GET ENTRY FOR STATE VARIABLE
( RO_DTREG* ro // - R/O entry
, RT_STATE_VAR state_var ) // - state variable
;
void CPPLIB( stab_trav_comp ) // POINT STATE-TABLE ENTRY BEYOND COMPONENT
( STAB_TRAVERSE* ctl ) // - control for travsersal
;
void CPPLIB( stab_trav_init ) // INITIALIZE STATE-TABLE TRAVERSAL
( STAB_TRAVERSE* ctl // - control for travsersal
, _RTCTL* rtc ) // - R/T control
;
RO_STATE* CPPLIB( stab_trav_move)( // MOVE TO NEXT ACTUAL POSITION
STAB_TRAVERSE *traverse ) // - traversal control information
;
RO_STATE* CPPLIB( stab_trav_next )// POINT AT NEXT STATE-TABLE ENTRY
( STAB_TRAVERSE* ctl ) // - control for travsersal
;
_WPRTLINK
void CPPLIB( throw )( // THROW AN EXCEPTION OBJECT
void *object, // - address of object
THROW_RO *throw_ro ) // - throw R/O block
;
_WPRTLINK
void CPPLIB( throw_zero )( // THROW AN EXCEPTION OBJECT (CONST ZERO)
void *object, // - address of object
THROW_RO *throw_ro ) // - throw R/O block
;
#ifdef RW_REGISTRATION
FSREGAPI unsigned CPPLIB( fs_handler_rtn ) // HANDLER FOR FS REGISTRATIONS
( FsExcRec* rec_exc // - exception record
, RW_DTREG* rw // - current R/W block
, FsCtxRec* rec_ctx // - context record
, unsigned context // - dispatch context
);
THREAD_CTL* CPPLIB( fs_lookup ) // LOOK THRU FS ENTRIES FOR LAST, THREAD_CTL
( RW_DTREG** a_last ) // - addr[ ptr to last WATCOM entry ]
;
#endif
#ifdef PD_REGISTRATION
#ifndef NDEBUG
void CPPLIB( pd_dump_rws ) // DEBUGGING -- DUMP R/W, R/O data structure
( register void (*dump_rw)( RW_DTREG*// - watcom block
, RO_DTREG* )
, register void (*dump_pd)( PData* ) )// - non-watcom block
;
#endif
_WPRTLINK
unsigned CPPLIB( pd_handler_rtn ) // HANDLER FOR FS REGISTRATIONS
( FsExcRec* rec_exc // - exception record
, void* // - SP at function entry
, _CONTEXT* ctx // - context record
, PD_DISP_CTX* dctx // - dispatch context
)
;
THREAD_CTL* CPPLIB( pd_lookup ) // LOOK THRU FS ENTRIES FOR LAST, THREAD_CTL
( RW_DTREG** a_last ) // - addr[ ptr to last WATCOM entry ]
;
RW_DTREG* CPPLIB( pd_top ) // LOOK THRU PD ENTRIES FOR FIRST R/W ENTRY
( void )
;
#endif
#ifdef SYSIND_REGISTRATION
void CPPLIB( raise_exception ) // RAISE AN EXCEPTION
( FsExcRec* excrec ) // - exception record
;
void CPPLIB( unwind_global ) // GLOBAL UNWIND ROUTINE
( RW_DTREG* rw // - bounding R/W block
, uint_32 // - return address (not used)
, FsExcRec* excrec ) // - exception record
;
#endif
// FS REGISTRATION ONLY
#ifdef FS_REGISTRATION
#define RwTop( thr ) \
FsTop()
#define RwDeregister( thr ) \
( FsPop() \
, (thr) )
#define RwRegister( thr, rw ) \
( FsPush( (rw) ) \
, (thr) )
#define PgmThread() CPPLIB(pgm_thread)()
THREAD_CTL* CPPLIB( pgm_thread ) // LOCATE THREAD_CTL FOR PROGRAM (.EXE)
( void )
;
#else
// NOT FS REGISTRATION
#define RwTop( thr ) \
(thr)->registered
#define RwDeregister( thr ) \
( (thr)->registered = RwTop(thr)->base.prev \
, (thr) )
#define RwRegister( thr, rw ) \
( (rw)->base.prev = (thr)->registered \
, (thr)->registered = (rw) \
, (thr) )
#define PgmThread() (&_RWD_ThreadData)
#endif
#ifndef NDEBUG
// DEBUG ONLY:
void CPPLIB( DbgRtDumpAutoDtor )( // DUMP REGISTRATION BLOCKS
void )
;
void CPPLIB( DbgRtDumpModuleDtor )( // DUMP MODULE DTOR BLOCKS
void )
;
#endif
} // extern "C"
#include "rtctl.h"
#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?