Update of /cvsroot/pure-data/externals/grill/py/source In directory sc8-pr-cvs1:/tmp/cvs-serv30144/source
Modified Files: clmeth.cpp main.h modmeth.cpp py.cpp pyext.cpp Log Message: ""
Index: clmeth.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/clmeth.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** clmeth.cpp 21 Oct 2003 02:38:31 -0000 1.5 --- clmeth.cpp 22 Jan 2004 03:38:36 -0000 1.6 *************** *** 1,7 **** /*
! py/pyext - python external object for PD and MaxMSP
! Copyright (c) 2002-2003 Thomas Grill (xovo@gmx.net) For information on usage and redistribution, and for a DISCLAIMER OF ALL WARRANTIES, see the file, "license.txt," in this distribution. --- 1,7 ---- /*
! py/pyext - python external object for PD and Max/MSP
! Copyright (c) 2002-2004 Thomas Grill (xovo@gmx.net) For information on usage and redistribution, and for a DISCLAIMER OF ALL WARRANTIES, see the file, "license.txt," in this distribution. *************** *** 41,54 ****
const C *pyext::pyext_doc = ! "py/pyext - python external object for PD and MaxMSP, (C)2002 Thomas Grill\n" "\n" "This is the pyext base class. Available methods:\n" "_outlet(self,ix,args...): Send a message to an indexed outlet\n" "_tocanvas(self,args...): Send a message to the parent canvas\n" - #ifdef FLEXT_THREADS - "_detach(self,int): Define whether a called Python method has its own thread\n" #endif "_bind(self,name,func): Bind a python function to a symbol\n" "_unbind(self,name,func): Unbind a python function from a symbol\n" ;
--- 41,58 ----
const C *pyext::pyext_doc = ! "py/pyext - python external object for PD and Max/MSP, (C)2002-2004 Thomas Grill\n" "\n" "This is the pyext base class. Available methods:\n" "_outlet(self,ix,args...): Send a message to an indexed outlet\n" + #if FLEXT_SYS == FLEXT_SYS_PD "_tocanvas(self,args...): Send a message to the parent canvas\n" #endif "_bind(self,name,func): Bind a python function to a symbol\n" "_unbind(self,name,func): Unbind a python function from a symbol\n" + #ifdef FLEXT_THREADS + "_detach(self,int): Define whether a called Python method has its own thread\n" + "_stop(self): Stop running threads\n" + #endif + "_isthreaded(self): Query whether threading is enabled\n" ;
Index: main.h =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/main.h,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** main.h 14 Jan 2004 03:38:02 -0000 1.16 --- main.h 22 Jan 2004 03:38:37 -0000 1.17 *************** *** 91,94 **** --- 91,96 ---- virtual V Reload() = 0;
+ V Respond(BL b) { if(respond) { t_atom a[1]; SetBool(a[0],b); ToOutAnything(GetOutAttr(),MakeSymbol("response"),1,a); } } + static BL IsAnything(const t_symbol *s) { return s && s != sym_bang && s != sym_float && s != sym_int && s != sym_symbol && s != sym_list && s != sym_pointer; }
*************** *** 115,119 **** virtual V m_stop(int argc,const t_atom *argv);
! BL detach,shouldexit; I thrcount; I stoptick; --- 117,121 ---- virtual V m_stop(int argc,const t_atom *argv);
! BL detach,shouldexit,respond; I thrcount; I stoptick; *************** *** 139,142 **** --- 141,145 ----
FLEXT_ATTRVAR_B(detach) + FLEXT_ATTRVAR_B(respond) FLEXT_CALLBACK_V(m_stop) FLEXT_CALLBACK(m_dir)
Index: modmeth.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/modmeth.cpp,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** modmeth.cpp 20 Oct 2003 02:38:10 -0000 1.7 --- modmeth.cpp 22 Jan 2004 03:38:37 -0000 1.8 *************** *** 1,7 **** /*
! py/pyext - python external object for PD and MaxMSP
! Copyright (c) 2002-2003 Thomas Grill (xovo@gmx.net) For information on usage and redistribution, and for a DISCLAIMER OF ALL WARRANTIES, see the file, "license.txt," in this distribution. --- 1,7 ---- /*
! py/pyext - python external object for PD and Max/MSP
! Copyright (c) 2002-2004 Thomas Grill (xovo@gmx.net) For information on usage and redistribution, and for a DISCLAIMER OF ALL WARRANTIES, see the file, "license.txt," in this distribution. *************** *** 29,33 ****
const C *py::py_doc = ! "py/pyext - python external object for PD and MaxMSP, (C)2002 Thomas Grill\n" "\n" "This is the pyext module. Available function:\n" --- 29,33 ----
const C *py::py_doc = ! "py/pyext - python external object for PD and Max/MSP, (C)2002-2004 Thomas Grill\n" "\n" "This is the pyext module. Available function:\n"
Index: py.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/py.cpp,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** py.cpp 20 Jan 2004 03:38:46 -0000 1.9 --- py.cpp 22 Jan 2004 03:38:37 -0000 1.10 *************** *** 1,7 **** /*
! py/pyext - python script object for PD and MaxMSP
! Copyright (c) 2002-2003 Thomas Grill (xovo@gmx.net) For information on usage and redistribution, and for a DISCLAIMER OF ALL WARRANTIES, see the file, "license.txt," in this distribution. --- 1,7 ---- /*
! py/pyext - python script object for PD and Max/MSP
! Copyright (c) 2002-2004 Thomas Grill (xovo@gmx.net) For information on usage and redistribution, and for a DISCLAIMER OF ALL WARRANTIES, see the file, "license.txt," in this distribution. *************** *** 24,30 **** BL m_method_(I n,const t_symbol *s,I argc,const t_atom *argv);
! V work(const t_symbol *s,I argc,const t_atom *argv);
! V m_bang() { work(sym_bang,0,NULL); } V m_reload(); V m_reload_(I argc,const t_atom *argv); --- 24,30 ---- BL m_method_(I n,const t_symbol *s,I argc,const t_atom *argv);
! BL work(const t_symbol *s,I argc,const t_atom *argv);
! V m_bang() { callwork(sym_bang,0,NULL); } V m_reload(); V m_reload_(I argc,const t_atom *argv); *************** *** 95,98 **** --- 95,100 ---- FLEXT_CADDMETHOD(c,1,m_py_list); FLEXT_CADDMETHOD(c,1,m_py_any); + + FLEXT_CADDATTR_VAR1(c,"respond",respond); }
*************** *** 228,231 **** --- 230,235 ---- post("\tdoc: display module doc string"); post("\tdoc+: display function doc string"); + post("\tdir: dump module dictionary"); + post("\tdir+: dump function dictionary"); #ifdef FLEXT_THREADS post("\tdetach 0/1: detach threads"); *************** *** 272,278 ****
! V pyobj::work(const t_symbol *s,I argc,const t_atom *argv) { AtomList *rargs = NULL;
++thrcount; --- 276,283 ----
! BL pyobj::work(const t_symbol *s,I argc,const t_atom *argv) { AtomList *rargs = NULL; + BL ret;
++thrcount; *************** *** 288,294 **** --- 293,301 ---- Py_XDECREF(pArgs); Py_XDECREF(pValue); + ret = true; } else { post("%s: no function defined",thisName()); + ret = false; }
*************** *** 302,318 **** delete rargs; } }
V pyobj::callwork(const t_symbol *s,I argc,const t_atom *argv) { if(detach) { if(shouldexit) post("%s - New threads can't be launched now!",thisName()); ! else ! if(!FLEXT_CALLMETHOD_A(work,s,argc,argv)) ! post("%s - Failed to launch thread!",thisName()); } ! else ! work(s,argc,argv); }
--- 309,330 ---- delete rargs; } + + return ret; }
V pyobj::callwork(const t_symbol *s,I argc,const t_atom *argv) { + BL ret = false; if(detach) { if(shouldexit) post("%s - New threads can't be launched now!",thisName()); ! else { ! ret = FLEXT_CALLMETHOD_A(work,s,argc,argv); ! if(!ret) post("%s - Failed to launch thread!",thisName()); ! } } ! else ! ret = work(s,argc,argv); ! Respond(ret); }
Index: pyext.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/pyext.cpp,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** pyext.cpp 20 Jan 2004 03:38:46 -0000 1.14 --- pyext.cpp 22 Jan 2004 03:38:37 -0000 1.15 *************** *** 1,5 **** /*
! py/pyext - python script object for PD and MaxMSP
Copyright (c)2002-2004 Thomas Grill (xovo@gmx.net) --- 1,5 ---- /*
! py/pyext - python script object for PD and Max/MSP
Copyright (c)2002-2004 Thomas Grill (xovo@gmx.net) *************** *** 33,36 **** --- 33,38 ---- FLEXT_CADDMETHOD_(c,0,"get",m_get); FLEXT_CADDMETHOD_(c,0,"set",m_set); + + FLEXT_CADDATTR_VAR1(c,"respond",respond); }
*************** *** 225,229 ****
Py_XDECREF(pyobj); - Py_XDECREF(class_obj); Py_XDECREF(class_dict); --- 227,230 ---- *************** *** 245,281 **** if(!pref) PyErr_Print(); ! else if(PyClass_Check(pref)) { ! // make instance, but don't call __init__ ! pyobj = PyInstance_NewRaw(pref,NULL);
! Py_DECREF(pref); ! if(pyobj == NULL) ! PyErr_Print(); ! else { ! // remember the this pointer ! PyObject *th = PyLong_FromVoidPtr(this); ! int ret = PyObject_SetAttrString(pyobj,"_this",th); // ref is taken
! // call init now, after _this has been set, which is ! // important for eventual callbacks from __init__ to c ! PyObject *pargs = MakePyArgs(NULL,args,-1,true); ! if (pargs == NULL) PyErr_Print();
! PyObject *init; ! init = PyObject_GetAttrString(pyobj,"__init__"); // get ref ! if(init && PyCallable_Check(init)) { ! PyObject *res = PyEval_CallObject(init,pargs); ! if(!res) ! PyErr_Print(); ! else ! Py_DECREF(res); ! Py_DECREF(init); ! } ! ! Py_XDECREF(pargs); ! } } - else - post("%s - Type of "%s" is unhandled!",thisName(),GetString(methname)); return true; } --- 246,288 ---- if(!pref) PyErr_Print(); ! else { ! if(PyClass_Check(pref)) { ! // make instance, but don't call __init__ ! pyobj = PyInstance_NewRaw(pref,NULL);
! Py_DECREF(pref); ! if(pyobj == NULL) ! PyErr_Print(); ! else { ! // remember the this pointer ! PyObject *th = PyLong_FromVoidPtr(this); ! int ret = PyObject_SetAttrString(pyobj,"_this",th); // ref is taken
! // call init now, after _this has been set, which is ! // important for eventual callbacks from __init__ to c ! PyObject *pargs = MakePyArgs(NULL,args,-1,true); ! if (pargs == NULL) PyErr_Print();
! PyObject *init; ! init = PyObject_GetAttrString(pyobj,"__init__"); // get ref ! if(init) { ! if(PyCallable_Check(init)) { ! PyObject *res = PyEval_CallObject(init,pargs); ! if(!res) ! PyErr_Print(); ! else ! Py_DECREF(res); ! } ! Py_DECREF(init); ! } ! ! Py_XDECREF(pargs); ! } ! } ! else ! post("%s - Type of "%s" is unhandled!",thisName(),GetString(methname)); ! ! Py_DECREF(pref); } return true; } *************** *** 288,291 **** --- 295,299 ---- ClearBinding(); Py_XDECREF(pyobj); + // by here, the Python class destructor should have been called!
*************** *** 322,326 ****
PyObject *pvar = PyObject_GetAttrString(pyobj,const_cast<char *>(GetString(s))); /* fetch bound method */ ! if(pvar == NULL) { PyErr_Clear(); // no method found post("%s - get: Python variable %s not found",thisName(),GetString(s)); --- 330,334 ----
PyObject *pvar = PyObject_GetAttrString(pyobj,const_cast<char *>(GetString(s))); /* fetch bound method */ ! if(!pvar) { PyErr_Clear(); // no method found post("%s - get: Python variable %s not found",thisName(),GetString(s)); *************** *** 385,395 **** BL pyext::m_method_(I n,const t_symbol *s,I argc,const t_atom *argv) { ! if(pyobj && n >= 1) { ! return callwork(n,s,argc,argv); ! } ! else { post("%s - no method for type '%s' into inlet %i",thisName(),GetString(s),n); ! return false; ! } }
--- 393,402 ---- BL pyext::m_method_(I n,const t_symbol *s,I argc,const t_atom *argv) { ! BL ret = false; ! if(pyobj && n >= 1) ! ret = callwork(n,s,argc,argv); ! else post("%s - no method for type '%s' into inlet %i",thisName(),GetString(s),n); ! return ret; }
*************** *** 414,417 **** --- 421,426 ---- post("\tdoc: display module doc string"); post("\tdoc+: display class doc string"); + post("\tdir: dump module dictionary"); + post("\tdir+: dump class dictionary"); #ifdef FLEXT_THREADS post("\tdetach 0/1: detach threads"); *************** *** 503,519 **** BL pyext::callwork(I n,const t_symbol *s,I argc,const t_atom *argv) { ! if(detach) { ! if(shouldexit) { post("%s - Stopping.... new threads can't be launched now!",thisName()); - return true; - } else { ! BL ret = FLEXT_CALLMETHOD_X(work_wrapper,new work_data(n,s,argc,argv)); if(!ret) post("%s - Failed to launch thread!",thisName()); - return true; } } ! else ! return work(n,s,argc,argv); }
--- 512,528 ---- BL pyext::callwork(I n,const t_symbol *s,I argc,const t_atom *argv) { ! BL ret = true,ok = false; ! if(detach) { ! if(shouldexit) post("%s - Stopping.... new threads can't be launched now!",thisName()); else { ! ret = FLEXT_CALLMETHOD_X(work_wrapper,new work_data(n,s,argc,argv)); if(!ret) post("%s - Failed to launch thread!",thisName()); } } ! else ! ret = ok = work(n,s,argc,argv); ! Respond(ok); ! return ret; }