static PyObject* call_with_frame(PyCodeObject *c, PyObject* func, PyObject* args, xmlparseobject *self) { PyThreadState *tstate = PyThreadState_GET(); PyGILState_STATE state; PyFrameObject *f; PyObject *res; if (c == NULL) return NULL; f = PyFrame_New(tstate, c, PyEval_GetGlobals(), NULL); if (f == NULL) return NULL; tstate->frame = f; #ifdef FIX_TRACE if (trace_frame(tstate, f, PyTrace_CALL, Py_None) < 0) { return NULL; } #endif state = PyGILState_Acquire(); res = PyEval_CallObject(func, args); PyGILState_Release(state); if (res == NULL) { if (tstate->curexc_traceback == NULL) PyTraceBack_Here(f); XML_StopParser(self->itself, XML_FALSE); #ifdef FIX_TRACE if (trace_frame_exc(tstate, f) < 0) { return NULL; } } else { if (trace_frame(tstate, f, PyTrace_RETURN, res) < 0) { Py_XDECREF(res); res = NULL; } } #else } #endif tstate->frame = f->f_back; Py_DECREF(f); return res; }