home *** CD-ROM | disk | FTP | other *** search
/ OpenStep (Enterprise) / OpenStepENTCD.toast / OEDEV / DEV.Z / error.h < prev    next >
Text File  |  1996-09-11  |  4KB  |  120 lines

  1.  
  2. /*
  3.     error.h
  4.  
  5.     This file defines the interface to the exception raising scheme.
  6.  
  7.     Copyright (c) 1988-1996 NeXT Software, Inc. as an unpublished work.
  8.     All rights reserved.
  9. */
  10.  
  11. #ifndef _OBJC_ERROR_H_
  12. #define _OBJC_ERROR_H_
  13.  
  14. #include <setjmp.h>
  15. #import <objc/objc-api.h>
  16.  
  17. #if defined(__svr4__)
  18.     #define _setjmp setjmp
  19.     #define _longjmp longjmp
  20. #endif
  21.  
  22. typedef struct _NXHandler {    /* a node in the handler chain */
  23.     jmp_buf jumpState;            /* place to longjmp to */
  24.     struct _NXHandler *next;        /* ptr to next handler */
  25.     int code;                /* error code of exception */
  26.     const void *data1, *data2;        /* blind data for describing error */
  27. } NXHandler;
  28.  
  29.  
  30. /* Handles RAISE's with nowhere to longjmp to */
  31. typedef void NXUncaughtExceptionHandler(int code, const void *data1,
  32.                         const void *data2);
  33. OBJC_EXPORT NXUncaughtExceptionHandler *_NXUncaughtExceptionHandler;
  34. #define NXGetUncaughtExceptionHandler() _NXUncaughtExceptionHandler
  35. #define NXSetUncaughtExceptionHandler(proc) \
  36.             (_NXUncaughtExceptionHandler = (proc))
  37.  
  38. /* NX_DURING, NX_HANDLER and NX_ENDHANDLER are always used like:
  39.  
  40.     NX_DURING
  41.         some code which might raise an error
  42.     NX_HANDLER
  43.         code that will be jumped to if an error occurs
  44.     NX_ENDHANDLER
  45.  
  46.    If any error is raised within the first block of code, the second block
  47.    of code will be jumped to.  Typically, this code will clean up any
  48.    resources allocated in the routine, possibly case on the error code
  49.    and perform special processing, and default to RERAISE the error to
  50.    the next handler.  Within the scope of the handler, a local variable
  51.    called NXLocalHandler of type NXHandler holds information about the
  52.    error raised.
  53.  
  54.    It is illegal to exit the first block of code by any other means than
  55.    NX_VALRETURN, NX_VOIDRETURN, or just falling out the bottom.
  56.  */
  57.  
  58. /* private support routines.  Do not call directly. */
  59. OBJC_EXPORT void _NXAddHandler( NXHandler *handler );
  60. OBJC_EXPORT void _NXRemoveHandler( NXHandler *handler );
  61.  
  62. #define NX_DURING { NXHandler NXLocalHandler;            \
  63.             _NXAddHandler(&NXLocalHandler);        \
  64.             if( !_setjmp(NXLocalHandler.jumpState) ) {
  65.  
  66. #define NX_HANDLER _NXRemoveHandler(&NXLocalHandler); } else {
  67.  
  68. #define NX_ENDHANDLER }}
  69.  
  70. #define NX_VALRETURN(val)  do { typeof(val) temp = (val);    \
  71.             _NXRemoveHandler(&NXLocalHandler);    \
  72.             return(temp); } while (0)
  73.  
  74. #define NX_VOIDRETURN    do { _NXRemoveHandler(&NXLocalHandler);    \
  75.             return; } while (0)
  76.  
  77. /* RAISE and RERAISE are called to indicate an error condition.  They
  78.    initiate the process of jumping up the chain of handlers.
  79.  */
  80.  
  81. OBJC_EXPORT
  82. #if defined(__GNUC__)
  83.     #if !defined(__STRICT_ANSI__)
  84.         #if !defined(NeXT_PDO)
  85.             __volatile    /* never returns */
  86.         #endif 
  87.     #endif
  88. #endif 
  89. void _NXRaiseError(int code, const void *data1, const void *data2)
  90. #if defined(__GNUC__)
  91.   __attribute__ ((noreturn))
  92. #endif
  93. ;
  94.  
  95. #define NX_RAISE( code, data1, data2 )    \
  96.         _NXRaiseError( (code), (data1), (data2) )
  97.  
  98. #define NX_RERAISE()     _NXRaiseError( NXLocalHandler.code,    \
  99.                 NXLocalHandler.data1, NXLocalHandler.data2 )
  100.  
  101. /* These routines set and return the procedure which is called when
  102.    exceptions are raised.  This procedure must NEVER return.  It will
  103.    usually either longjmp, or call the uncaught exception handler.
  104.    The default exception raiser is also declared
  105.  */
  106. typedef volatile void NXExceptionRaiser(int code, const void *data1, const void *data2);
  107. OBJC_EXPORT void NXSetExceptionRaiser(NXExceptionRaiser *proc);
  108. OBJC_EXPORT NXExceptionRaiser *NXGetExceptionRaiser(void);
  109. OBJC_EXPORT NXExceptionRaiser NXDefaultExceptionRaiser;
  110.  
  111.  
  112. /* The error buffer is used to allocate data which is passed up to other
  113.    handlers.  Clients should clear the error buffer in their top level
  114.    handler.  The Application Kit does this.
  115.  */
  116. OBJC_EXPORT void NXAllocErrorData(int size, void **data);
  117. OBJC_EXPORT void NXResetErrorData(void);
  118.  
  119. #endif /* _OBJC_ERROR_H_ */
  120.