Index: ossp-pkg/ex/ex.h RCS File: /v/ossp/cvs/ossp-pkg/ex/ex.h,v rcsdiff -q -kk '-r1.1' '-r1.2' -u '/v/ossp/cvs/ossp-pkg/ex/ex.h,v' 2>/dev/null --- ex.h 2002/01/25 15:25:51 1.1 +++ ex.h 2002/01/25 18:31:07 1.2 @@ -23,8 +23,8 @@ ** ex.h: exception handling (pre-processor part) */ -#ifndef __TEXAS_H__ -#define __TEXAS_H__ +#ifndef __EX_H__ +#define __EX_H__ /* the required ISO-C standard facilities */ #include /* for NULL */ @@ -34,16 +34,31 @@ #if ( defined(__STDC__) \ && defined(__STDC_VERSION__) \ && __STDC_VERSION__ >= 199901L) -#define __TEXAS_FUNC__ __func__ /* ISO C99 compliant */ +#define __EX_FUNC__ __func__ /* ISO C99 compliant */ #elif ( defined(__GNUC__) \ && defined(__GNUC_MINOR__) \ && ( __GNUC__ > 2 \ || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8))) -#define __TEXAS_FUNC__ __FUNCTION__ /* gcc >= 2.8 */ +#define __EX_FUNC__ __FUNCTION__ /* gcc >= 2.8 */ #else -#define __TEXAS_FUNC__ "#NA#" /* not available */ +#define __EX_FUNC__ "#NA#" /* not available */ #endif +/* the machine context */ +#ifndef __ex_mctx_st +#define __ex_mctx_st struct { jmp_buf jb; } +#endif +#ifndef __ex_mctx_save +#define __ex_mctx_save(mctx) setjmp((mctx)->jb) +#endif +#ifndef __ex_mctx_restore +#define __ex_mctx_restore(mctx) (void)longjmp((mctx)->jb, 1) +#endif +#ifndef __ex_mctx_restored +#define __ex_mctx_restored(mctx) /* NOOP */ +#endif +typedef __ex_mctx_st __ex_mctx_t; + /* declare the exception type (public) */ typedef struct { /* throw value */ @@ -58,7 +73,7 @@ /* declare the exception context type (private) */ typedef struct { - jmp_buf *ctx_jbprev; /* previous jump buffer */ + __ex_mctx_t *ctx_mctx_prev; /* previous jump buffer */ int ctx_caught; /* flag whether exception was caught */ volatile ex_t ctx_ex; /* the exception temporary storage */ } ex_ctx_t; @@ -72,11 +87,11 @@ /* block for trying execution */ #define ex_try \ { \ - jmp_buf *__ex_jbprev; \ - jmp_buf __ex_jbme; \ - __ex_jbprev = __ex_ctx->ctx_jbprev; \ - __ex_ctx->ctx_jbprev = &__ex_jbme; \ - if (setjmp(__ex_jbme) == 0) { \ + __ex_mctx_t *__ex_mctx_prev; \ + __ex_mctx_t __ex_mctx_me; \ + __ex_mctx_prev = __ex_ctx->ctx_mctx_prev; \ + __ex_ctx->ctx_mctx_prev = &__ex_mctx_me; \ + if (__ex_mctx_save(&__ex_mctx_me) == 0) { \ if (1) /* block for catching an exception */ @@ -86,9 +101,10 @@ __ex_ctx->ctx_caught = 0; \ } \ else { \ + __ex_mctx_restored(&__ex_mctx_me); \ __ex_ctx->ctx_caught = 1; \ } \ - __ex_ctx->ctx_jbprev = __ex_jbprev; \ + __ex_ctx->ctx_mctx_prev = __ex_mctx_prev; \ } \ if (!__ex_ctx->ctx_caught || ((e) = __ex_ctx->ctx_ex, 0)) { \ } \ @@ -96,39 +112,39 @@ /* throw a new exception */ #define ex_throw(c,o,v) \ - (__ex_ctx->ctx_jbprev == NULL ? \ + (__ex_ctx->ctx_mctx_prev == NULL ? \ (abort(), 0) : \ ( __ex_ctx->ctx_ex.ex_class = (void *)(c), \ __ex_ctx->ctx_ex.ex_object = (void *)(o), \ __ex_ctx->ctx_ex.ex_value = (void *)(v), \ __ex_ctx->ctx_ex.ex_file = __FILE__, \ __ex_ctx->ctx_ex.ex_line = __LINE__, \ - __ex_ctx->ctx_ex.ex_func = __TEXAS_FUNC__, \ - longjmp(*(__ex_ctx->ctx_jbprev), 1), \ + __ex_ctx->ctx_ex.ex_func = __EX_FUNC__, \ + __ex_mctx_restore(__ex_ctx->ctx_mctx_prev), \ 0 \ ) \ ) /* re-throw a caught exception */ #define ex_rethrow \ - (__ex_ctx->ctx_jbprev == NULL ? \ + (__ex_ctx->ctx_mctx_prev == NULL ? \ (abort(), 0) : \ - (longjmp(*(__ex_ctx->ctx_jbprev), 1), 0) \ + (__ex_mctx_restore(__ex_ctx->ctx_mctx_prev), 0) \ ) /* optional namespace mapping */ -#if !defined(__cplusplus) && !defined(__TEXAS_NO_CXX_NS__) +#if !defined(__cplusplus) && !defined(__EX_NO_CXX_NS__) #define try ex_try #define catch ex_catch #define throw ex_throw #define rethrow ex_rethrow #endif -#if !defined(__TEXAS_NO_SIMPLE_NS__) +#if !defined(__EX_NO_SIMPLE_NS__) #define Try ex_try #define Catch ex_catch #define Throw ex_throw #define Rethrow ex_rethrow #endif -#endif /* __TEXAS_H__ */ +#endif /* __EX_H__ */