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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
#ifndef WREPORT_PYTHON_COMMON_H
#define WREPORT_PYTHON_COMMON_H
#include <wreport/error.h>
#include <wreport/varinfo.h>
#include "utils/core.h"
namespace wreport {
namespace python {
/**
* Return a python string representing a varcode
*/
PyObject* wrpy_varcode_format(wreport::Varcode code);
/// Given a wreport exception, set the Python error indicator appropriately.
void set_wreport_exception(const wreport::error& e);
/**
* Given a wreport exception, set the Python error indicator appropriately.
*
* @retval
* Always returns NULL, so one can do:
* try {
* // ...code...
* } catch (wreport::error& e) {
* return raise_wreport_exception(e);
* }
*/
PyObject* raise_wreport_exception(const wreport::error& e);
/// Given a generic exception, set the Python error indicator appropriately.
void set_std_exception(const std::exception& e);
/**
* Given a generic exception, set the Python error indicator appropriately.
*
* @retval
* Always returns NULL, so one can do:
* try {
* // ...code...
* } catch (std::exception& e) {
* return raise_std_exception(e);
* }
*/
PyObject* raise_std_exception(const std::exception& e);
#define WREPORT_CATCH_RETURN_PYO \
catch (PythonException&) { \
return nullptr; \
} catch (wreport::error& e) { \
set_wreport_exception(e); return nullptr; \
} catch (std::exception& se) { \
set_std_exception(se); return nullptr; \
}
#define WREPORT_CATCH_RETURN_INT \
catch (PythonException&) { \
return -1; \
} catch (wreport::error& e) { \
set_wreport_exception(e); return -1; \
} catch (std::exception& se) { \
set_std_exception(se); return -1; \
}
#define WREPORT_CATCH_RETHROW_PYTHON \
catch (PythonException&) { \
throw; \
} catch (wreport::error& e) { \
set_wreport_exception(e); throw PythonException(); \
} catch (std::exception& se) { \
set_std_exception(se); throw PythonException(); \
}
/// Call repr() on \a o, and return the result in \a out
std::string object_repr(PyObject* o);
/**
* call o.fileno() and return its result.
*
* In case of AttributeError and IOError (parent of UnsupportedOperation, not
* available from C), it clear the error indicator.
*
* Returns -1 if fileno() was not available or some other exception happened.
* Use PyErr_Occurred to tell between the two.
*/
int file_get_fileno(PyObject* o);
/**
* call o.data() and return its result, both as a PyObject and as a buffer.
*
* The data returned in buf and len will be valid as long as the returned
* object stays valid.
*/
PyObject* file_get_data(PyObject* o, char*&buf, Py_ssize_t& len);
}
}
#endif
|