Update of /cvsroot/pure-data/externals/grill/py/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18343/source
Modified Files: main.h modmeth.cpp py.cpp pybase.cpp pybase.h pybuffer.cpp pyext.cpp pyext.h pyprefix.h Log Message: adapting to new flext lockfree structures much better detach method handling (one thread for all object instances) use PyGILState_*() functionality (enabled with PY_USE_GIL) ooops, fixing typo fixing numpy initialization quirks pyext._init is now called after __init__ enabled use of inofficial PD functionality for search and help path access (#define PY_USE_INOFFICIAL) added sketch for new pye (Python expression) object buffer protocol adapted for Python 2.5
Index: pyprefix.h =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/pyprefix.h,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** pyprefix.h 7 Mar 2007 13:40:14 -0000 1.6 --- pyprefix.h 6 Jul 2007 21:44:56 -0000 1.7 *************** *** 3,7 **** py/pyext - python script object for PD and MaxMSP
! Copyright (c)2002-2005 Thomas Grill (gr@grrrr.org) For information on usage and redistribution, and for a DISCLAIMER OF ALL WARRANTIES, see the file, "license.txt," in this distribution. --- 3,7 ---- py/pyext - python script object for PD and MaxMSP
! Copyright (c)2002-2007 Thomas Grill (gr@grrrr.org) For information on usage and redistribution, and for a DISCLAIMER OF ALL WARRANTIES, see the file, "license.txt," in this distribution. *************** *** 40,43 **** --- 40,48 ---- #include <string>
+ #ifdef PY_USE_INOFFICIAL + extern "C" { + #include <s_stuff.h> + } + #endif
#endif
Index: pyext.h =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/pyext.h,v retrieving revision 1.31 retrieving revision 1.32 diff -C2 -d -r1.31 -r1.32 *** pyext.h 7 Mar 2007 13:40:14 -0000 1.31 --- pyext.h 6 Jul 2007 21:44:56 -0000 1.32 *************** *** 50,53 **** --- 50,54 ----
virtual bool Init(); + virtual bool Finalize(); virtual void Exit();
Index: modmeth.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/modmeth.cpp,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** modmeth.cpp 7 Mar 2007 13:40:14 -0000 1.24 --- modmeth.cpp 6 Jul 2007 21:44:56 -0000 1.25 *************** *** 24,27 **** --- 24,30 ---- { "_blocksize", pybase::py_blocksize, METH_NOARGS,"Get system block size" },
+ { "_searchpaths", pybase::py_searchpaths, METH_NOARGS,"Get system search paths" }, + { "_helppaths", pybase::py_helppaths, METH_NOARGS,"Get system help paths" }, + #if FLEXT_SYS == FLEXT_SYS_PD { "_getvalue", pybase::py_getvalue, METH_VARARGS,"Get value of a 'value' object" }, *************** *** 52,56 **** ;
- #ifdef FLEXT_THREADS void pybase::tick(void *) --- 55,58 ---- *************** *** 112,115 **** --- 114,145 ---- }
+ PyObject *pybase::py_searchpaths(PyObject *self,PyObject *args) + { + #if FLEXT_SYS == FLEXT_SYS_PD && defined(PY_USE_INOFFICIAL) + PyObject *ret = PyList_New(0); + char *dir; + for(int i = 0; (dir = namelist_get(sys_searchpath,i)) != NULL; ++i) + PyList_Append(ret,PyString_FromString(dir)); + return ret; + #else + Py_INCREF(Py_None); + return Py_None; + #endif + } + + PyObject *pybase::py_helppaths(PyObject *self,PyObject *args) + { + #if FLEXT_SYS == FLEXT_SYS_PD && defined(PY_USE_INOFFICIAL) + PyObject *ret = PyList_New(0); + char *dir; + for(int i = 0; (dir = namelist_get(sys_helppath,i)) != NULL; ++i) + PyList_Append(ret,PyString_FromString(dir)); + return ret; + #else + Py_INCREF(Py_None); + return Py_None; + #endif + } + PyObject *pybase::py_send(PyObject *,PyObject *args) {
Index: pyext.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/pyext.cpp,v retrieving revision 1.47 retrieving revision 1.48 diff -C2 -d -r1.47 -r1.48 *** pyext.cpp 7 Mar 2007 13:40:14 -0000 1.47 --- pyext.cpp 6 Jul 2007 21:44:56 -0000 1.48 *************** *** 220,223 **** --- 220,251 ---- }
+ bool pyext::Finalize() + { + bool ok = true; + ThrState state = PyLockSys(); + + PyObject *init = PyObject_GetAttrString(pyobj,"_init"); // get ref + if(init) { + if(PyMethod_Check(init)) { + PyObject *res = PyObject_CallObject(init,NULL); + if(!res) { + // exception is set + ok = false; + // we want to know why __init__ failed... + PyErr_Print(); + } + else + Py_DECREF(res); + } + Py_DECREF(init); + } + else + // __init__ has not been found - don't care + PyErr_Clear(); + + PyUnlock(state); + return ok && flext_dsp::Finalize(); + } + void pyext::Exit() {
Index: pybuffer.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/pybuffer.cpp,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** pybuffer.cpp 10 Feb 2007 03:20:57 -0000 1.12 --- pybuffer.cpp 6 Jul 2007 21:44:56 -0000 1.13 *************** *** 187,191 **** --- 187,196 ----
// support the buffer protocol + + #if PY_VERSION_HEX >= 0x02050000 + static Py_ssize_t buffer_readbuffer(PyObject *obj, Py_ssize_t segment, void **ptrptr) + #else static int buffer_readbuffer(PyObject *obj, int segment, void **ptrptr) + #endif { flext::buffer *b = ((pySamplebuffer *)obj)->buf; *************** *** 194,198 **** --- 199,207 ---- }
+ #if PY_VERSION_HEX >= 0x02050000 + static Py_ssize_t buffer_writebuffer(PyObject *obj, Py_ssize_t segment, void **ptrptr) + #else static int buffer_writebuffer(PyObject *obj, int segment, void **ptrptr) + #endif { flext::buffer *b = ((pySamplebuffer *)obj)->buf; *************** *** 201,205 **** --- 210,218 ---- }
+ #if PY_VERSION_HEX >= 0x02050000 + static Py_ssize_t buffer_segcount(PyObject *obj, Py_ssize_t *lenp) + #else static int buffer_segcount(PyObject *obj, int *lenp) + #endif { flext::buffer *b = ((pySamplebuffer *)obj)->buf; *************** *** 208,212 **** --- 221,229 ---- }
+ #if PY_VERSION_HEX >= 0x02050000 + static Py_ssize_t buffer_charbuffer(PyObject *obj, Py_ssize_t segment, char **ptrptr) + #else static int buffer_charbuffer(PyObject *obj, int segment, const char **ptrptr) + #endif { flext::buffer *b = ((pySamplebuffer *)obj)->buf;
Index: main.h =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/main.h,v retrieving revision 1.43 retrieving revision 1.44 diff -C2 -d -r1.43 -r1.44 *** main.h 19 Jul 2005 13:18:33 -0000 1.43 --- main.h 6 Jul 2007 21:44:56 -0000 1.44 *************** *** 29,33 ****
class FifoEl ! : public Fifo::Cell { public: --- 29,33 ----
class FifoEl ! : public FifoCell { public:
Index: pybase.h =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/pybase.h,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** pybase.h 7 Mar 2007 13:40:14 -0000 1.13 --- pybase.h 6 Jul 2007 21:44:56 -0000 1.14 *************** *** 109,113 **** static PyObject *module_obj,*module_dict; static PyObject *builtins_obj,*builtins_dict; ! static PyMethodDef func_tbl[];
static PyObject *py__doc__(PyObject *,PyObject *args); --- 109,113 ---- static PyObject *module_obj,*module_dict; static PyObject *builtins_obj,*builtins_dict; ! static PyMethodDef func_tbl[],attr_tbl[];
static PyObject *py__doc__(PyObject *,PyObject *args); *************** *** 121,124 **** --- 121,127 ---- static PyObject *py_blocksize(PyObject *,PyObject *args);
+ static PyObject *py_searchpaths(PyObject *,PyObject *args); + static PyObject *py_helppaths(PyObject *,PyObject *args); + #if FLEXT_SYS == FLEXT_SYS_PD static PyObject *py_getvalue(PyObject *,PyObject *args);
Index: pybase.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/pybase.cpp,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** pybase.cpp 7 Mar 2007 13:40:14 -0000 1.18 --- pybase.cpp 6 Jul 2007 21:44:56 -0000 1.19 *************** *** 130,134 ****
#ifdef FLEXT_DEBUG ! Py_DebugFlag = 1; // Py_VerboseFlag = 1; #else --- 130,134 ----
#ifdef FLEXT_DEBUG ! // Py_DebugFlag = 1; // Py_VerboseFlag = 1; #else *************** *** 200,203 **** --- 200,212 ----
// ------------------------------------------------------------- + #ifdef PY_USE_INOFFICIAL + // add PD paths + + char *dir; + for(int i = 0; (dir = namelist_get(sys_searchpath,i)) != NULL; ++i) { + AddToPath(dir); + } + #endif + // -------------------------------------------------------------
FLEXT_SETUP(pyobj);
Index: py.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/py.cpp,v retrieving revision 1.36 retrieving revision 1.37 diff -C2 -d -r1.36 -r1.37 *** py.cpp 7 Mar 2007 13:40:14 -0000 1.36 --- py.cpp 6 Jul 2007 21:44:56 -0000 1.37 *************** *** 189,192 **** --- 189,193 ---- pyobj::~pyobj() { + ThrState state = PyLockSys(); if(objects) { for(int i = 0; i < CntIn()-1; ++i) Py_DECREF(objects[i]); *************** *** 194,198 **** }
- ThrState state = PyLockSys(); Unregister(GetRegistry(REGNAME)); Report(); --- 195,198 ----