8 return PyUnicode_Check(python_string) || PyBytes_Check(python_string);
13 Py2NRNString(PyObject* python_string,
bool disable_release =
false) {
16 if (PyUnicode_Check(python_string)) {
17 PyObject* py_bytes = PyUnicode_AsASCIIString(python_string);
19 str_ = strdup(PyBytes_AsString(py_bytes));
21 PyErr_SetString(PyExc_MemoryError,
"strdup in Py2NRNString");
25 }
else if (PyBytes_Check(python_string)) {
26 str_ = strdup(PyBytes_AsString(python_string));
30 PyErr_SetString(PyExc_MemoryError,
"strdup in Py2NRNString");
33 PyErr_SetString(PyExc_TypeError,
"Neither Unicode or PyBytes");
45 inline bool err()
const {
49 PyObject* ptype =
NULL;
50 PyObject* pvalue =
NULL;
51 PyObject* ptraceback =
NULL;
53 PyErr_Fetch(&ptype, &pvalue, &ptraceback);
55 if (pvalue && ptype) {
56 PyObject* umes = PyUnicode_FromFormat(
"%s (Note: %S: %S)", message, ptype, pvalue);
57 PyErr_SetObject(
type, umes);
60 PyErr_SetString(
type, message);
64 Py_XDECREF(ptraceback);
67 PyObject* ptype =
NULL;
68 PyObject* pvalue =
NULL;
69 PyObject* ptraceback =
NULL;
71 PyErr_Fetch(&ptype, &pvalue, &ptraceback);
73 PyObject* pstr = PyObject_Str(pvalue);
75 const char* err_msg = PyUnicode_AsUTF8(pstr);
77 str_ = strdup(err_msg);
79 str_ = strdup(
"get_pyerr failed at PyUnicode_AsUTF8");
83 str_ = strdup(
"get_pyerr failed at PyObject_Str");
86 str_ = strdup(
"get_pyerr failed at PyErr_Fetch");
92 Py_XDECREF(ptraceback);
109 :
state_(PyGILState_Ensure())
118 PyGILState_Release(
state_);
134 #define CHECK_SEC_INVALID(sec) \
137 nrnpy_sec_referr(); \
Py2NRNString(PyObject *python_string, bool disable_release=false)
Py2NRNString(const Py2NRNString &)
Py2NRNString & operator=(const Py2NRNString &)
void set_pyerr(PyObject *type, const char *message)
PyLockGIL(const PyLockGIL &)
PyLockGIL & operator=(const PyLockGIL &)
bool is_python_string(PyObject *python_string)