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 + -
显示快捷键?