Update of /cvsroot/pure-data/externals/grill/py/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30732/source
Modified Files: bound.cpp clmeth.cpp main.cpp modmeth.cpp pyargs.cpp pyext.cpp register.cpp Log Message: ""
Index: clmeth.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/clmeth.cpp,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** clmeth.cpp 21 Jun 2004 14:04:15 -0000 1.8 --- clmeth.cpp 31 Aug 2004 04:07:35 -0000 1.9 *************** *** 123,129 **** --- 123,131 ---- if(!ret) { #if PY_VERSION_HEX >= 0x02020000 + // \todo borrowed or new??? ret = PyObject_GenericGetAttr(self,name); #else if(PyInstance_Check(self)) + // borrowed reference ret = PyDict_GetItem(((PyInstanceObject *)self)->in_dict,name); #endif *************** *** 136,181 **** { BL ok = false; - if(PySequence_Check(args)) { - PyObject *self = PySequence_GetItem(args,0); - PyObject *outl = PySequence_GetItem(args,1); - if( - self && PyInstance_Check(self) && - outl && PyInt_Check(outl) - ) { - pyext *ext = GetThis(self);
! I sz = PySequence_Size(args); ! PyObject *val; ! BL tp = sz == 3 && PySequence_Check(PySequence_GetItem(args,2));
! if(tp) ! val = PySequence_GetItem(args,2); // borrowed ! else ! val = PySequence_GetSlice(args,2,sz); // new ref
! AtomList *lst = GetPyArgs(val); ! if(lst) { ! I o = PyInt_AsLong(outl); ! if(o >= 1 && o <= ext->Outlets()) { ! // by using the queue there is no immediate call of the next object ! // deadlock would occur if this was another py/pyext object! ! if(lst->Count() && IsSymbol((*lst)[0])) ! ext->ToQueueAnything(o-1,GetSymbol((*lst)[0]),lst->Count()-1,lst->Atoms()+1); // ext->ToOutAnything(o-1,GetSymbol((*lst)[0]),lst->Count()-1,lst->Atoms()+1); - else - ext->ToQueueList(o-1,*lst); - // ext->ToOutList(o-1,*lst); - } else ! post("pyext: outlet index out of range"); ! ! ok = true; } ! else ! post("py/pyext - No data to send"); ! if(lst) delete lst;
! if(!tp) Py_DECREF(val); } }
--- 138,189 ---- { BL ok = false;
! // should always be a tuple! ! FLEXT_ASSERT(PyTuple_Check(args));
! // borrowed references! ! PyObject *self = PyTuple_GetItem(args,0); ! PyObject *outl = PyTuple_GetItem(args,1); ! if( ! self && PyInstance_Check(self) && ! outl && PyInt_Check(outl) ! ) { ! pyext *ext = GetThis(self);
! I sz = PyTuple_Size(args); ! PyObject *val; ! ! BL tp = ! sz == 3 && ! PySequence_Check( ! val = PyTuple_GetItem(args,2) // borrow reference ! ); ! ! if(!tp) ! val = PySequence_GetSlice(args,2,sz); // new ref ! ! AtomList *lst = GetPyArgs(val); ! if(lst) { ! I o = PyInt_AsLong(outl); ! if(o >= 1 && o <= ext->Outlets()) { ! // by using the queue there is no immediate call of the next object ! // deadlock would occur if this was another py/pyext object! ! if(lst->Count() && IsSymbol((*lst)[0])) ! ext->ToQueueAnything(o-1,GetSymbol((*lst)[0]),lst->Count()-1,lst->Atoms()+1); // ext->ToOutAnything(o-1,GetSymbol((*lst)[0]),lst->Count()-1,lst->Atoms()+1); else ! ext->ToQueueList(o-1,*lst); ! // ext->ToOutList(o-1,*lst); } ! else ! post("pyext: outlet index out of range");
! ok = true; } + else + post("py/pyext - No data to send"); + if(lst) delete lst; + + if(!tp) Py_DECREF(val); }
*************** *** 246,283 **** PyObject *pyext::pyext_tocanvas(PyObject *,PyObject *args) { BL ok = false; ! if(PySequence_Check(args)) { ! PyObject *self = PySequence_GetItem(args,0); ! if(self && PyInstance_Check(self)) { ! pyext *ext = GetThis(self);
! I sz = PySequence_Size(args); ! PyObject *val; ! BL tp = sz == 2 && PySequence_Check(PyTuple_GetItem(args,1));
! if(tp) ! val = PySequence_GetItem(args,1); // borrowed ! else ! val = PySequence_GetSlice(args,1,sz); // new ref
! AtomList *lst = GetPyArgs(val); ! if(lst) { ! t_glist *gl = ext->thisCanvas(); //canvas_getcurrent(); ! t_class **cl = (t_pd *)gl; ! if(cl) { ! pd_forwardmess(cl,lst->Count(),lst->Atoms()); ! } #ifdef FLEXT_DEBUG ! else ! post("pyext - no parent canvas?!"); #endif ! ok = true; ! } ! else ! post("py/pyext - No data to send"); ! if(lst) delete lst; ! ! if(!tp) Py_DECREF(val); } }
--- 254,294 ---- PyObject *pyext::pyext_tocanvas(PyObject *,PyObject *args) { + FLEXT_ASSERT(PyTuple_Check(args)); + BL ok = false; ! PyObject *self = PyTuple_GetItem(args,0); // borrowed ref ! if(self && PyInstance_Check(self)) { ! pyext *ext = GetThis(self);
! I sz = PySequence_Size(args); ! PyObject *val;
! BL tp = ! sz == 2 && ! PySequence_Check( ! val = PyTuple_GetItem(args,1) // borrowed ref ! );
! if(!tp) ! val = PyTuple_GetSlice(args,1,sz); // new ref ! ! AtomList *lst = GetPyArgs(val); ! if(lst) { ! t_glist *gl = ext->thisCanvas(); //canvas_getcurrent(); ! t_class **cl = (t_pd *)gl; ! if(cl) { ! pd_forwardmess(cl,lst->Count(),lst->Atoms()); ! } #ifdef FLEXT_DEBUG ! else ! post("pyext - no parent canvas?!"); #endif ! ok = true; } + else + post("py/pyext - No data to send"); + if(lst) delete lst; + + if(!tp) Py_DECREF(val); }
Index: pyargs.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/pyargs.cpp,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** pyargs.cpp 21 Jun 2004 14:04:15 -0000 1.6 --- pyargs.cpp 31 Aug 2004 04:07:35 -0000 1.7 *************** *** 117,124 **** for(I ix = 0; ix < rargc; ++ix) { PyObject *arg; ! switch(tp) { ! case sequ: arg = PySequence_GetItem(pValue,ix); break; ! default: arg = pValue; ! }
if(PyInt_Check(arg)) SetInt((*ret)[ix],PyInt_AsLong(arg)); --- 117,124 ---- for(I ix = 0; ix < rargc; ++ix) { PyObject *arg; ! if(tp == sequ) ! arg = PySequence_GetItem(pValue,ix); // new reference ! else ! arg = pValue;
if(PyInt_Check(arg)) SetInt((*ret)[ix],PyInt_AsLong(arg)); *************** *** 128,131 **** --- 128,132 ---- else if(ix == 0 && self && PyInstance_Check(arg)) { // assumed to be self ... that should be checked _somehow_ !!! + Py_INCREF(arg); *self = arg; } *************** *** 140,144 **** ok = false; } ! // No DECREF for arg -> borrowed from pValue! }
--- 141,146 ---- ok = false; } ! ! if(tp == sequ) Py_DECREF(arg); }
Index: main.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/main.cpp,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** main.cpp 22 Jun 2004 22:45:53 -0000 1.14 --- main.cpp 31 Aug 2004 04:07:35 -0000 1.15 *************** *** 280,284 **** int i,n = PyList_Size(pobj); for(i = 0; i < n; ++i) { ! PyObject *pt = PyList_GetItem(pobj,i); if(PyString_Check(pt) && !strcmp(dir,PyString_AS_STRING(pt))) break; } --- 280,284 ---- int i,n = PyList_Size(pobj); for(i = 0; i < n; ++i) { ! PyObject *pt = PyList_GetItem(pobj,i); // borrowed reference if(PyString_Check(pt) && !strcmp(dir,PyString_AS_STRING(pt))) break; } *************** *** 297,327 **** PyObject* py::StdOut_Write(PyObject* self, PyObject* args) { ! if(PySequence_Check(args)) { ! int sz = PySequence_Size(args); ! for(int i = 0; i < sz; ++i) { ! PyObject *val = PySequence_GetItem(args,i); // borrowed ! PyObject *str = PyObject_Str(val); ! char *cstr = PyString_AS_STRING(str); ! char *lf = strchr(cstr,'\n');
! // line feed in string ! if(!lf) { ! // no -> just append ! if(output) ! PyString_ConcatAndDel(&output,str); ! else ! output = str; ! } ! else { ! // yes -> append up to line feed, reset output buffer to string remainder ! PyObject *part = PyString_FromStringAndSize(cstr,lf-cstr); ! if(output) ! PyString_ConcatAndDel(&output,part); ! else ! output = part; ! post(PyString_AS_STRING(output)); ! Py_DECREF(output); ! output = PyString_FromString(lf+1); ! } } } --- 297,331 ---- PyObject* py::StdOut_Write(PyObject* self, PyObject* args) { ! // should always be a tuple ! FLEXT_ASSERT(PyTuple_Check(args));
! int sz = PyTuple_Size(args); ! for(int i = 0; i < sz; ++i) { ! PyObject *val = PyTuple_GetItem(args,i); // borrowed reference ! PyObject *str = PyObject_Str(val); // new reference ! char *cstr = PyString_AS_STRING(str); ! char *lf = strchr(cstr,'\n'); ! ! // line feed in string ! if(!lf) { ! // no -> just append ! if(output) ! PyString_ConcatAndDel(&output,str); // str is decrefd ! else ! output = str; // take str reference ! } ! else { ! // yes -> append up to line feed, reset output buffer to string remainder ! PyObject *part = PyString_FromStringAndSize(cstr,lf-cstr); // new reference ! if(output) ! PyString_ConcatAndDel(&output,part); // str is decrefd ! else ! output = part; // take str reference ! ! // output concatenated string ! post(PyString_AS_STRING(output)); ! ! Py_DECREF(output); ! output = PyString_FromString(lf+1); // new reference } }
Index: modmeth.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/modmeth.cpp,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** modmeth.cpp 21 Jun 2004 14:04:15 -0000 1.9 --- modmeth.cpp 31 Aug 2004 04:07:35 -0000 1.10 *************** *** 105,109 **** I ch = sys_get_inchannels(); #elif FLEXT_SYS == FLEXT_SYS_MAX ! I ch = sys_getch(); // not functioning #else #pragma message("Not implemented!") --- 105,109 ---- I ch = sys_get_inchannels(); #elif FLEXT_SYS == FLEXT_SYS_MAX ! I ch = sys_getch(); // not working #else #pragma message("Not implemented!") *************** *** 118,122 **** I ch = sys_get_outchannels(); #elif FLEXT_SYS == FLEXT_SYS_MAX ! I ch = sys_getch(); // not functioning #else #pragma message("Not implemented!") --- 118,122 ---- I ch = sys_get_outchannels(); #elif FLEXT_SYS == FLEXT_SYS_MAX ! I ch = sys_getch(); // not working #else #pragma message("Not implemented!") *************** *** 128,166 **** PyObject *py::py_send(PyObject *,PyObject *args) { ! if(PySequence_Check(args)) { ! PyObject *name = PySequence_GetItem(args,0); // borrowed ! if(name && PyString_Check(name)) { ! const t_symbol *recv = MakeSymbol(PyString_AsString(name)); ! I sz = PySequence_Size(args); ! PyObject *val; ! BL tp = sz == 2 && PySequence_Check(PySequence_GetItem(args,1));
! if(tp) ! val = PySequence_GetItem(args,1); // borrowed ! else ! val = PySequence_GetSlice(args,1,sz); // new ref
! AtomList *lst = GetPyArgs(val); ! if(lst) { ! bool ok; ! if(lst->Count() && IsSymbol((*lst)[0])) ! ok = Forward(recv,GetSymbol((*lst)[0]),lst->Count()-1,lst->Atoms()+1); ! else ! ok = Forward(recv,*lst);
#ifdef FLEXT_DEBUG ! if(!ok) ! post("py/pyext - Receiver doesn't exist"); #endif - } - else - post("py/pyext - No data to send"); - if(lst) delete lst; - - if(!tp) Py_DECREF(val); } ! else ! post("py/pyext - Send name is invalid"); }
Py_INCREF(Py_None); --- 128,170 ---- PyObject *py::py_send(PyObject *,PyObject *args) { ! // should always be a tuple ! FLEXT_ASSERT(PyTuple_Check(args));
! PyObject *name = PyTuple_GetItem(args,0); // borrowed reference ! if(name && PyString_Check(name)) { ! const t_symbol *recv = MakeSymbol(PyString_AsString(name)); ! int sz = PySequence_Size(args); ! PyObject *val;
! bool tp = ! sz == 2 && ! PySequence_Check( ! val = PyTuple_GetItem(args,1) // borrowed ref ! ); ! ! if(!tp) ! val = PySequence_GetSlice(args,1,sz); // new ref ! ! AtomList *lst = GetPyArgs(val); ! if(lst) { ! bool ok; ! if(lst->Count() && IsSymbol((*lst)[0])) ! ok = Forward(recv,GetSymbol((*lst)[0]),lst->Count()-1,lst->Atoms()+1); ! else ! ok = Forward(recv,*lst);
#ifdef FLEXT_DEBUG ! if(!ok) ! post("py/pyext - Receiver doesn't exist"); #endif } ! else ! post("py/pyext - No data to send"); ! if(lst) delete lst; ! ! if(!tp) Py_DECREF(val); } + else + post("py/pyext - Send name is invalid");
Py_INCREF(Py_None);
Index: bound.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/bound.cpp,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** bound.cpp 21 Jun 2004 14:04:15 -0000 1.9 --- bound.cpp 31 Aug 2004 04:07:35 -0000 1.10 *************** *** 39,42 **** --- 39,44 ---- }
+ Py_XDECREF(args); + PY_UNLOCK return true;
Index: register.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/register.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** register.cpp 4 Jan 2003 04:36:49 -0000 1.2 --- register.cpp 31 Aug 2004 04:07:35 -0000 1.3 *************** *** 67,71 **** I cnt = PySequence_Size(reg); for(I i = 0; i < cnt; ++i) { ! PyObject *it = PySequence_GetItem(reg,i); // borrowed!! if(!it || !PyInt_Check(it)) { post("%s - Corrupt registry?!",thisName()); --- 67,71 ---- I cnt = PySequence_Size(reg); for(I i = 0; i < cnt; ++i) { ! PyObject *it = PySequence_GetItem(reg,i); // new reference if(!it || !PyInt_Check(it)) { post("%s - Corrupt registry?!",thisName()); *************** *** 77,80 **** --- 77,82 ---- th->Reload(); } + + Py_XDECREF(it); } }
Index: pyext.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/pyext.cpp,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** pyext.cpp 21 Aug 2004 04:13:48 -0000 1.18 --- pyext.cpp 31 Aug 2004 04:07:35 -0000 1.19 *************** *** 77,84 **** { PyObject *th = PyObject_GetAttrString(self,"_this"); ! pyext *ret = th?(pyext *)PyLong_AsVoidPtr(th):NULL; ! PyErr_Clear(); ! Py_XDECREF(th); ! return ret; }
--- 77,89 ---- { PyObject *th = PyObject_GetAttrString(self,"_this"); ! if(th) { ! pyext *ret = static_cast<pyext *>(PyLong_AsVoidPtr(th)); ! Py_DECREF(th); ! return ret; ! } ! else { ! PyErr_Clear(); ! return NULL; ! } }
*************** *** 386,390 **** // reduce lists of one element to element itself
! PyObject *val1 = PySequence_GetItem(pval,0); Py_DECREF(pval); pval = val1; --- 391,395 ---- // reduce lists of one element to element itself
! PyObject *val1 = PySequence_GetItem(pval,0); // new reference Py_DECREF(pval); pval = val1;