summaryrefslogtreecommitdiff
path: root/inc/Standard_ErrorHandler.lxx
blob: 90431d7cd8bcc73decef987ac19606f78de4f585 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <Standard_JmpBuf.hxx>

inline Standard_JmpBuf& Standard_ErrorHandler::Label()
{
  return myLabel;
}

/*Common part for jumps*/
// In the current version setjmp is used. The alternative solution is to
// use sigsetjmp that stores the signal mask (to be checked)
// In the original implementation sigsetjmp is tried to use for SUN and IRIX
// in the following way:
//    #ifdef SOLARIS
//      #define DoesNotAbort(aHandler) !sigsetjmp(aHandler.Label(),1)
//    #endif
//

#if defined(NO_CXX_EXCEPTION) || defined(OCC_CONVERT_SIGNALS)
  #ifdef SOLARIS
    #define DoesNotAbort(aHandler) !setjmp(aHandler.Label())
  #elif IRIX
    #define DoesNotAbort(aHandler) !setjmp(aHandler.Label())
  #else
    #define DoesNotAbort(aHandler) !setjmp(aHandler.Label())
  #endif
#endif


#ifdef NO_CXX_EXCEPTION
/* No CXX Exceeptions, only jumps in all the cases.*/
  #define try               Standard_ErrorHandler _Function; \
                            if(DoesNotAbort(_Function))
  #define catch(Error)        else if(_Function.Catches(STANDARD_TYPE(Error)))
  #define OCC_CATCH_SIGNALS 
#elif defined(OCC_CONVERT_SIGNALS)
/* Exceptions are raied as usual, signal are converted into jumps and 
   raused in the proper point.*/
  #define OCC_CATCH_SIGNALS   Standard_ErrorHandler _aHandler; \
                              if(!DoesNotAbort(_aHandler)) { \
				_aHandler.Catches(STANDARD_TYPE(Standard_Failure)); \
				_aHandler.Error()->Reraise(); \
			      }
#else
/*Normal Exceptions (for example WNT)*/
  #define OCC_CATCH_SIGNALS
#endif