On Jan 3, 8:02 pm, Phil Thompson <[EMAIL PROTECTED]> wrote: > On Thursday 03 January 2008, grbgooglefan wrote: > > > I have a following C++ code which uses PyObject_CallObject to evaluate > > expressions dynamically. This code sets the input parameters for the > > function also dynamically. After calling this function 4 times (with > > these shown values), PyObject_CallObject causes application to crash > > in frame_dealloc. > > 1) Can some one please help me understand why is this crash happening > > in frame_dealloc & how to solve it? > > 2) Is there anything wrong I am doing about incrementing or > > decrementing the reference counts of the object passed to > > PyObject_CallObject? > > Yes. > > > > > > > 3) Is it because of the big value (2299265.500000) I am trying to > > convert from double to float using PyFloat_FromDouble? > > > //========================= code reduced for readability > > =============== > > switch(ndtyp){ > > case(INT_T): > > { > > printf("PyInt_FromLong val %d, var %s > > \n",inputVar.nionum,pEvalFunc->pExprVarsArray[nCtr].szVarName); > > val = PyInt_FromLong(inputVar.nionum); > > break; > > } > > case(LONG_T): > > { > > printf("PyLong_FromLong val %ld, var %s > > \n",inputVar.lionum,pEvalFunc->pExprVarsArray[nCtr].szVarName); > > val = PyLong_FromLong(inputVar.lionum); > > break; > > } > > case(FLOAT_T): > > { > > printf("PyFloat_FromDouble val %f, var %s > > \n",inputVar.fionum,pEvalFunc->pExprVarsArray[nCtr].szVarName); > > val = PyFloat_FromDouble(inputVar.fionum); > > break; > > } > > case(DOUBLE_T): > > { > > printf("PyFloat_FromDouble val %f, var %s > > \n",inputVar.dionum,pEvalFunc->pExprVarsArray[nCtr].szVarName); > > val = PyFloat_FromDouble(inputVar.dionum); > > break; > > } > > case(STRING_T): > > { > > printf("PyString_FromString val %s, var %s > > \n",inputVar.ioString,pEvalFunc->pExprVarsArray[nCtr].szVarName); > > val = PyString_FromString(inputVar.ioString); > > break; > > } > > default: > > printf("Unknown data type [%d] for %s\n",ndtyp,pEvalFunc- > > > >pExprVarsArray[nCtr].szVarName); > > > } > > if(!val){ > > ret = -1; > > printf("Failed to convert %d %s to PyObject\n",ndtyp,pEvalFunc- > > > >pExprVarsArray[nCtr].szVarName); fflush(stdout); > > > Py_XDECREF(pTuple); > > break; > > } > > PyTuple_SetItem(pTuple, nCtr, val); > > Py_XDECREF(val); > > Don't do this - PyTuple_SetItem() steals a reference to val. > > > } > > // all variables are set, call Python function > > Py_XINCREF(pTuple); > > Why do this? > > > PyObject *pResult = PyObject_CallObject(pEvalFunc- > > > >pPyEvalFunction,pTuple); > > > Py_XDECREF(pTuple); > > Why do this? > > > if(PyErr_Occurred()){ > > PyErr_Print(); > > } else { > > char* plevel = NULL; > > if(NULL != (plevel = PyString_AsString(pResult))){ > > ret = 0; > > sprintf(szEvalResult,"%s",plevel); > > } > > } > > Py_XDECREF(pResult); > > pTuple will now have the same number of references as when you started the > above code, so you may want to Py_DECREF() it. > > Phil- Hide quoted text - > > - Show quoted text -
Thanks for all the responses. These help me. I could simulate this crash in my small test program & I think (I could be wrong also) it is because of extraneous Py_XDECREF of "PyObject *val" which I am using to convert variables to tuple. When I change the code to simple do like this, it works fine. PyTuple_SetItem(pytuple,0,PyLong_FromLong(size)); PyTuple_SetItem(pytuple,1,PyLong_FromLong(maxvol)); PyTuple_SetItem(pytuple,2,PyFloat_FromDouble(adv)); -- http://mail.python.org/mailman/listinfo/python-list