PyObject_CallObject code dump after calling 4 times
grbgooglefan
ganeshborse at gmail.com
Thu Jan 3 07:49:57 EST 2008
On Jan 3, 8:02 pm, Phil Thompson <p... at riverbankcomputing.co.uk>
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));
More information about the Python-list
mailing list