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 47 48 49
|
/*========================== begin_copyright_notice ============================
Copyright (C) 2019-2021 Intel Corporation
SPDX-License-Identifier: MIT
============================= end_copyright_notice ===========================*/
#ifndef UFO_FAKE_SEH_H
#define UFO_FAKE_SEH_H
/**
* This file provides trivial mapping of Microsoft specific structured exception handling mechanism:
* __try
* __leave
* __finally
* __except(e)
* NOTE: This mapping will just enable compilation of your code. SEH will *NOT* work as on MSVC!
*/
#if !defined(_MSC_VER)
// __try may be defined as internal macro in GNU C++ library
#if defined(__cplusplus)
// NOTE: Any C++ standard header must be included _before_ any attempt of keyword
// redefinition (i.e. try/catch) in other case a fatal error is generated according
// to C++11 standard.
#include <exception>
#endif
#ifndef __try
#define __try { if(1)
#define __leave goto _end_of_guarded_block
#define __finally __leave; } _end_of_guarded_block: if(1)
#define __except(e) __leave; } _end_of_guarded_block: if(0)
#elif defined(__catch)
// __try is likely defined as "try" or "if(true)"
// and __catch is likely defined as "catch" or "if(false)"
#define __leave goto _end_of_guarded_block
#define __finally __catch(...) { __leave; } _end_of_guarded_block: if(true)
#define __except(e) __catch(...) { __leave; } _end_of_guarded_block: if(false)
#else
#pragma message "FIXME unknown config (found __try without __catch)"
#error "FIXME unknown config (found __try without __catch)"
#endif
#endif
#endif // UFO_FAKE_SEH_H
|