| static int |
| _mysql_ResultObject_Initialize( |
| _mysql_ResultObject *self, |
| PyObject *args, |
| PyObject *kwargs) |
| { |
| static char *kwlist[] = {"connection", "use", "converter", NULL}; |
| MYSQL_RES *result; |
| _mysql_ConnectionObject *conn=NULL; |
| int use=0; |
| PyObject *conv=NULL; |
| int n, i; |
| MYSQL_FIELD *fields; |
| if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|iO", kwlist, |
| &conn, &use, &conv)) |
| return -1; |
| if (!conv) { |
| if (!(conv = PyDict_New())) |
| return -1; |
| } |
| else |
| Py_INCREF(conv); |
| self->conn = (PyObject *) conn; |
| Py_INCREF(conn); |
| self->use = use; |
| Py_BEGIN_ALLOW_THREADS ; |
| if (use) |
| result = mysql_use_result(&(conn->connection)); |
| else |
| result = mysql_store_result(&(conn->connection)); |
| self->result = result; |
| Py_END_ALLOW_THREADS ; |
| if (!result) { |
| if (mysql_field_count(&(conn->connection)) > 0) { |
| _mysql_Exception(conn); |
| return -1; |
| } |
| self->converter = PyTuple_New(0); |
| Py_DECREF(conv); |
| return 0; |
| } |
| n = mysql_num_fields(result); |
| self->nfields = n; |
| if (!(self->converter = PyTuple_New(n))) { |
| Py_DECREF(conv); |
| return -1; |
| } |
| fields = mysql_fetch_fields(result); |
| for (i=0; i<n; i++) { |
| PyObject *tmp, *fun; |
| tmp = PyInt_FromLong((long) fields[i].type); |
| if (!tmp) { |
| Py_DECREF(conv); |
| return -1; |
| } |
| fun = PyObject_GetItem(conv, tmp); |
| Py_DECREF(tmp); |
| if (!fun) { |
| if (PyErr_Occurred()) { |
| if (!PyErr_ExceptionMatches(PyExc_KeyError)) { |
| Py_DECREF(conv); |
| return -1; |
| } |
| PyErr_Clear(); |
| } |
| fun = Py_None; |
| Py_INCREF(Py_None); |
| } |
| else if (PySequence_Check(fun)) { |
| int j, n2=PySequence_Size(fun); |
| PyObject *fun2=NULL; |
| for (j=0; j<n2; j++) { |
| PyObject *t = PySequence_GetItem(fun, j); |
| if (!t) { |
| Py_DECREF(fun); |
| Py_DECREF(conv); |
| return -1; |
| } |
| if (PyTuple_Check(t) && PyTuple_GET_SIZE(t) == 2) { |
| long mask, flags; |
| PyObject *pmask=NULL; |
| pmask = PyTuple_GET_ITEM(t, 0); |
| fun2 = PyTuple_GET_ITEM(t, 1); |
| Py_XINCREF(fun2); |
| if (PyInt_Check(pmask)) { |
| mask = PyInt_AS_LONG(pmask); |
| flags = fields[i].flags; |
| if (fields[i].charsetnr != 63) { /* maaagic */ |
| flags &= ~BINARY_FLAG; |
| } |
| if (mask & flags) { |
| Py_DECREF(t); |
| break; |
| } |
| else { |
| fun2 = NULL; |
| } |
| } else { |
| Py_DECREF(t); |
| break; |
| } |
| } |
| Py_DECREF(t); |
| } |
| if (!fun2) { |
| fun2 = Py_None; |
| Py_INCREF(fun2); |
| } |
| Py_DECREF(fun); |
| fun = fun2; |
| } |
| PyTuple_SET_ITEM(self->converter, i, fun); |
| } |
| Py_DECREF(conv); |
| return 0; |
| } |
was expecting final owned ob_refcnt of PyTupleObject to be 0 since nothing references it but final ob_refcnt is refs: 1 owned
found 50 similar trace(s) to this
when PyArg_ParseTupleAndKeywords() succeeds
taking False path
taking False path
releasing the GIL by calling PyEval_SaveThread()
when considering range: -0x80000000 <= value <= -1
taking True path
reacquiring the GIL by calling PyEval_RestoreThread()
when treating unknown struct MYSQL_RES * from _mysql.c:411 as non-NULL
taking False path
when PyTuple_New() succeeds
taking False path
PyTupleObject was allocated at: if (!(self->converter = PyTuple_New(n))) {
when considering range: 1 <= n <= 0xffffffff
taking True path
when treating unknown struct MYSQL_FIELD * from _mysql.c:434 as non-NULL
when PyInt_FromLong() succeeds
taking False path
when PyObject_GetItem() succeeds
when taking True path
taking False path
when considering range: -0x80000000 <= value <= -1
taking True path
when PySequence_Size() succeeds
when considering range: 1 <= n2 <= 0x7fffffff
taking True path
when PySequence_GetItem() succeeds
taking False path
when considering range: 1 <= value <= 0x4000000
taking True path
when considering value == (Py_ssize_t)2 from _mysql.c:462
taking True path
when treating unknown struct PyObject * from _mysql.c:466 as non-NULL
taking False path
when treating unknown struct PyObject * from _mysql.c:465 as non-NULL
when treating unknown struct _typeobject * from _mysql.c:468 as non-NULL
when considering range: 1 <= value <= 0x800000
taking True path
when treating unknown struct MYSQL_FIELD * from _mysql.c:470 as non-NULL
when treating unknown struct MYSQL_FIELD * from _mysql.c:471 as non-NULL
when considering range: 0 <= value <= 62
taking True path
when considering value == (long int)0 from _mysql.c:474
taking False path
when taking True path
when considering n2 == (int)1 from _mysql.c:453
taking False path
taking True path
when taking True path
when considering n == (unsigned int)1 from _mysql.c:425
taking False path
when considering range: -0x8000000000000000 <= value <= -1
taking True path