[PD-cvs] externals/grill/py/source bound.cpp, 1.15, 1.16 clmeth.cpp, 1.19, 1.20 main.cpp, 1.34, 1.35 main.h, 1.39, 1.40 py.cpp, 1.24, 1.25 pydsp.cpp, 1.4, 1.5 pyext.cpp, 1.33, 1.34 pyext.h, 1.22, 1.23 register.cpp, 1.6, 1.7

Thomas Grill xovo at users.sourceforge.net
Mon Apr 18 17:11:45 CEST 2005


Update of /cvsroot/pure-data/externals/grill/py/source
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30504/source

Modified Files:
	bound.cpp clmeth.cpp main.cpp main.h py.cpp pydsp.cpp 
	pyext.cpp pyext.h register.cpp 
Log Message:
check for PD version
better reload handling, but still far fom perfect
fixed minor other issues
fixed buglet
fixing strange gcc behavior
updates for DSP processing
better argument checking


Index: clmeth.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/py/source/clmeth.cpp,v
retrieving revision 1.19
retrieving revision 1.20
diff -C2 -d -r1.19 -r1.20
*** clmeth.cpp	10 Apr 2005 22:24:13 -0000	1.19
--- clmeth.cpp	18 Apr 2005 15:11:43 -0000	1.20
***************
*** 125,128 ****
--- 125,132 ----
  				if(ext)
  					ret = PyLong_FromLong(ext->shouldexit?1:0);
+                 else {
+                     Py_INCREF(Py_True);
+                     ret = Py_True;
+                 }
  			}
  //			post("pyext::getattr %s",sname);
***************
*** 189,209 ****
                  else
                      ext->ToOutAtom(o-1,*lst.Atoms());
  			}
  			else
! 				post("pyext: outlet index out of range");
! 
! 			ok = true;
  		}
  		else 
! 			post("py/pyext - No data to send");
  
  		if(!tp) Py_DECREF(val);
  	}
! 
!     if(!ok)	{
  		PyErr_SetString(PyExc_SyntaxError,"pyext - Syntax: _outlet(self,outlet,args...)");
-         return NULL;
-     }
  
      Py_INCREF(Py_None);
      return Py_None;
--- 193,210 ----
                  else
                      ext->ToOutAtom(o-1,*lst.Atoms());
+     			ok = true;
  			}
  			else
!                 PyErr_SetString(PyExc_ValueError,"pyext - _outlet: index out of range");
  		}
  		else 
!             PyErr_SetString(PyExc_ValueError,"pyext - _outlet: invalid arguments");
  
  		if(!tp) Py_DECREF(val);
  	}
!     else
  		PyErr_SetString(PyExc_SyntaxError,"pyext - Syntax: _outlet(self,outlet,args...)");
  
+     if(!ok) return NULL;
      Py_INCREF(Py_None);
      return Py_None;
***************
*** 220,229 ****
      if(!PyArg_ParseTuple(args, "Oi:pyext_detach",&self,&val)) {
          // handle error
! 		PyErr_SetString(PyExc_SyntaxError,"pyext - Syntax: _detach(self,[0/1])");
          return NULL;
      }
  	else {
  		pyext *ext = GetThis(self);
! 		ext->detach = val != 0;
  	}
  
--- 221,234 ----
      if(!PyArg_ParseTuple(args, "Oi:pyext_detach",&self,&val)) {
          // handle error
! 		PyErr_SetString(PyExc_SyntaxError,"pyext - Syntax: _detach(self,[0/1/2])");
!         return NULL;
!     }
!     else if(val < 0 || val > 2) {
! 		PyErr_SetString(PyExc_ValueError,"pyext - _detach must be in the range 0..2");
          return NULL;
      }
  	else {
  		pyext *ext = GetThis(self);
! 		ext->detach = val;
  	}
  
***************
*** 242,245 ****
--- 247,254 ----
          return NULL;
      }
+     else if(val < 0) {
+ 		PyErr_SetString(PyExc_ValueError,"pyext - _stop time must be >= 0");
+         return NULL;
+     }
  	else {
  		pyext *ext = GetThis(self);
***************
*** 333,336 ****
--- 342,349 ----
          return NULL;
      }
+     else if(val < 0) {
+         PyErr_SetString(PyExc_ValueError,"pyext - _invec: index out of range");
+         return NULL;
+     }
  	else {
  		pyext *ext = GetThis(self);
***************
*** 352,355 ****
--- 365,372 ----
          return NULL;
      }
+     else if(val < 0) {
+         PyErr_SetString(PyExc_ValueError,"pyext - _outvec: index out of range");
+         return NULL;
+     }
  	else {
  		pyext *ext = GetThis(self);

Index: bound.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/py/source/bound.cpp,v
retrieving revision 1.15
retrieving revision 1.16
diff -C2 -d -r1.15 -r1.16
*** bound.cpp	13 Mar 2005 04:59:47 -0000	1.15
--- bound.cpp	18 Apr 2005 15:11:43 -0000	1.16
***************
*** 175,179 ****
      if(!pyobj) return;
  
!     FLEXT_ASSERT(GetThis(pyobj));
  
      void *data = NULL;
--- 175,180 ----
      if(!pyobj) return;
  
!     pyext *th = GetThis(pyobj);
!     FLEXT_ASSERT(th);
  
      void *data = NULL;
***************
*** 181,185 ****
  
      // unbind all 
!     while(GetThis(pyobj)->UnbindMethod(sym,NULL,&data)) {
          bounddata *bdt = (bounddata *)data; 
          if(bdt) {
--- 182,186 ----
  
      // unbind all 
!     while(th->UnbindMethod(sym,NULL,&data)) {
          bounddata *bdt = (bounddata *)data; 
          if(bdt) {

Index: pydsp.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/py/source/pydsp.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** pydsp.cpp	10 Apr 2005 22:24:13 -0000	1.4
--- pydsp.cpp	18 Apr 2005 15:11:43 -0000	1.5
***************
*** 125,129 ****
              PyObject *ret = PyObject_CallObject(dspfun,NULL);
              if(ret) {
! 				dodsp = PyObject_IsTrue(ret);
                  Py_DECREF(ret);
  			}
--- 125,129 ----
              PyObject *ret = PyObject_CallObject(dspfun,NULL);
              if(ret) {
! 				dodsp = PyObject_IsTrue(ret) != 0;
                  Py_DECREF(ret);
  			}

Index: main.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/py/source/main.cpp,v
retrieving revision 1.34
retrieving revision 1.35
diff -C2 -d -r1.34 -r1.35
*** main.cpp	10 Apr 2005 22:24:13 -0000	1.34
--- main.cpp	18 Apr 2005 15:11:43 -0000	1.35
***************
*** 289,298 ****
  {
  	if(!name) return false;
! 
!     SetArgs();
! 	module = PyImport_ImportModule((char *)name);  // increases module_obj ref count by one
!     dict = module?PyModule_GetDict(module):NULL;
! 
!     return module != NULL;
  }
  
--- 289,295 ----
  {
  	if(!name) return false;
!     if(modname == name) return true;
!     modname = name;
!     return ReloadModule();
  }
  
***************
*** 316,335 ****
  {
      bool ok = false;
! 	if(module) {
!         SetArgs();
! 		PyObject *newmod = PyImport_ReloadModule(module);
! 		if(!newmod) {
! 			// old module still exists?!
! //			dict = NULL;
! 		}
! 		else {
! 			Py_XDECREF(module);
! 			module = newmod;
! 			dict = PyModule_GetDict(module); // borrowed
!             ok = true;
! 		}
  	}
-     else
- 		post("py/pyext - No module to reload");
      return ok;
  }
--- 313,332 ----
  {
      bool ok = false;
! 
!     SetArgs();
!     PyObject *newmod = module
!         ?PyImport_ReloadModule(module)
!         :PyImport_ImportModule((char *)modname.c_str());
! 
! 	if(!newmod) {
! 		// unload faulty module
!         if(module) UnimportModule();
! 	}
! 	else {
! 		Py_XDECREF(module);
! 		module = newmod;
! 		dict = PyModule_GetDict(module); // borrowed
!         ok = true;
  	}
      return ok;
  }
***************
*** 403,406 ****
--- 400,445 ----
  }
  
+ void pybase::Reload()
+ {
+ 	PyThreadState *state = PyLockSys();
+ 
+ 	PyObject *reg = GetRegistry(REGNAME);
+ 
+     if(reg) {
+         PyObject *key;
+         int pos = 0;
+         while(PyDict_Next(reg,&pos,&key,NULL)) {
+             pybase *th = (pybase *)PyLong_AsLong(key);
+             FLEXT_ASSERT(th);
+             th->Unload();
+         }
+ 
+         UnloadModule();
+     }
+ 
+ 	bool ok = ReloadModule();
+ 
+     if(ok) {
+         LoadModule();
+ 
+         if(reg) {
+             SetRegistry(REGNAME,reg);
+ 
+             PyObject *key;
+             int pos = 0;
+             while(PyDict_Next(reg,&pos,&key,NULL)) {
+                 pybase *th = (pybase *)PyLong_AsLong(key);
+                 FLEXT_ASSERT(th);
+                 th->Load();
+             }
+         }
+         else
+             Load();
+     }
+ 
+     Report();
+ 	PyUnlock(state);
+ }
+ 
  
  

Index: main.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/py/source/main.h,v
retrieving revision 1.39
retrieving revision 1.40
diff -C2 -d -r1.39 -r1.40
*** main.h	10 Apr 2005 22:24:13 -0000	1.39
--- main.h	18 Apr 2005 15:11:43 -0000	1.40
***************
*** 16,19 ****
--- 16,20 ----
  #include "pybuffer.h"
  #include <flcontainers.h>
+ #include <string>
  
  #if FLEXT_OS == FLEXT_LINUX || FLEXT_OS == FLEXT_IRIX
***************
*** 21,24 ****
--- 22,29 ----
  #endif
  
+ #if FLEXT_SYS == FLEXT_SYS_PD && (!defined (PD_MINOR_VERSION) || PD_MINOR_VERSION < 37)
+ #error PD version >= 0.37 required, please upgrade! 
+ #endif
+ 
  #define PY__VERSION "0.2.0pre"
  
***************
*** 27,30 ****
--- 32,37 ----
  #define PYEXT_CLASS "_class"  // name for base class
  
+ #define REGNAME "_registry"
+ 
  #define PY_STOP_WAIT 100  // ms
  #define PY_STOP_TICK 1  // ms
***************
*** 68,72 ****
      void m_doc() { m__doc(dict); }
  
! 	PyObject *module,*dict; // inherited user class module and associated dictionary
  
  	static const char *py_doc;
--- 75,80 ----
      void m_doc() { m__doc(dict); }
  
!     std::string modname; // module name
! 	PyObject *module,*dict; // object module and associated dictionary
  
  	static const char *py_doc;
***************
*** 79,90 ****
  	void AddToPath(const char *dir);
  	void SetArgs();
  	bool ImportModule(const char *name);
  	void UnimportModule();
  	bool ReloadModule();
  
! 	void Register(const char *reg);
! 	void Unregister(const char *reg);
! 	void Reregister(const char *reg);
! 	virtual bool Reload() = 0;
  
      void OpenEditor();
--- 87,113 ----
  	void AddToPath(const char *dir);
  	void SetArgs();
+ 
+     // reload module and all connected objects
+     void Reload();
+ 
  	bool ImportModule(const char *name);
  	void UnimportModule();
  	bool ReloadModule();
  
!     // Get module registry
! 	PyObject *GetRegistry(const char *regname);
!     // Set module registry
! 	void SetRegistry(const char *regname,PyObject *reg);
! 
!     // Register object
! 	void Register(PyObject *reg);
!     // Unregister object
! 	void Unregister(PyObject *reg);
! 
! 	virtual void LoadModule() = 0;
! 	virtual void UnloadModule() = 0;
! 
! 	virtual void Load() = 0;
! 	virtual void Unload() = 0;
  
      void OpenEditor();
***************
*** 200,204 ****
  	inline void Unlock() {}
  
! 	inline PyThreadState *PyLock(PyThreadState *) { return NULL; }
  	inline PyThreadState *PyLockSys() { return NULL; }
  	inline void PyUnlock(PyThreadState *st) {}
--- 223,227 ----
  	inline void Unlock() {}
  
! 	inline PyThreadState *PyLock(PyThreadState * = NULL) { return NULL; }
  	inline PyThreadState *PyLockSys() { return NULL; }
  	inline void PyUnlock(PyThreadState *st) {}

Index: register.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/py/source/register.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** register.cpp	13 Mar 2005 04:59:47 -0000	1.6
--- register.cpp	18 Apr 2005 15:11:43 -0000	1.7
***************
*** 11,14 ****
--- 11,82 ----
  #include "main.h"
  
+ #if 1
+ 
+ PyObject *pybase::GetRegistry(const char *regnm)
+ {
+ 	if(module) {
+         FLEXT_ASSERT(dict); // module must have a valid dict
+ 
+ 		// add this to module registry
+ 		PyObject *reg = PyDict_GetItemString(dict,(char *)regnm); // borrowed!!!
+ 		if(reg) 
+             FLEXT_ASSERT(PyDict_Check(reg));
+         else {
+             // make a new empty registry
+     		reg = PyDict_New();
+ 			PyDict_SetItemString(dict,(char *)regnm,reg);
+         }
+         return reg;
+ 	}
+     else
+         return NULL;
+ }
+ 
+ void pybase::SetRegistry(const char *regnm,PyObject *reg)
+ {
+     if(module) {
+         FLEXT_ASSERT(dict); // module must have a valid dict
+         FLEXT_ASSERT(reg && PyDict_Check(reg));
+         PyDict_SetItemString(dict,(char *)regnm,reg);
+     }
+ }
+ 
+ void pybase::Register(PyObject *reg)
+ {
+     if(!module) return;
+     FLEXT_ASSERT(reg && PyDict_Check(reg));
+ 	
+     // add this to module registry
+     Py_INCREF(Py_None);
+     PyObject *key = PyLong_FromUnsignedLong((size_t)this);
+     PyDict_SetItem(reg,key,Py_None);
+ }
+ 
+ void pybase::Unregister(PyObject *reg)
+ {
+     if(!module) return;
+     FLEXT_ASSERT(reg && PyDict_Check(reg));
+ 	
+     // remove this from module registry
+     PyObject *key = PyLong_FromUnsignedLong((size_t)this);
+     PyObject *item = PyDict_GetItem(reg,key);		
+     if(!item)
+         post("py/pyext - Internal error: object not found in registry");
+     else
+ 		PyDict_DelItem(reg,key);
+ }
+ 
+ /*
+ void pybase::RegLoad(PyObject *reg)
+ {
+ 
+ }
+ 
+ void pybase::RegUnload(PyObject *reg)
+ {
+ }
+ */
+ 
+ #else
  
  void pybase::Register(const char *regnm)
***************
*** 80,81 ****
--- 148,151 ----
  	}
  }
+ 
+ #endif

Index: pyext.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/py/source/pyext.h,v
retrieving revision 1.22
retrieving revision 1.23
diff -C2 -d -r1.22 -r1.23
*** pyext.h	7 Apr 2005 15:03:53 -0000	1.22
--- pyext.h	18 Apr 2005 15:11:43 -0000	1.23
***************
*** 62,67 ****
      void m_help();
  
! 	void m_reload();
!     void m_reload_(int argc,const t_atom *argv) { initargs(argc,argv); m_reload(); }
      void ms_initargs(const AtomList &a) { m_reload_(a.Count(),a.Atoms()); }
      void m_dir_() { m__dir(pyobj); }
--- 62,67 ----
      void m_help();
  
!     void m_reload() { Reload(); }
!     void m_reload_(int argc,const t_atom *argv) { initargs(argc,argv); Reload(); }
      void ms_initargs(const AtomList &a) { m_reload_(a.Count(),a.Atoms()); }
      void m_dir_() { m__dir(pyobj); }
***************
*** 79,83 ****
      flext::AtomListStatic<16> initargs;
  
! 	virtual bool Reload();
  	virtual bool DoInit();
  	virtual void DoExit();
--- 79,88 ----
      flext::AtomListStatic<16> initargs;
  
! 	virtual void LoadModule();
! 	virtual void UnloadModule();
! 
! 	virtual void Load();
! 	virtual void Unload();
! 
  	virtual bool DoInit();
  	virtual void DoExit();
***************
*** 91,94 ****
--- 96,100 ----
  
  	void SetThis();
+ 	void ClearThis();
  
  	void ClearBinding();

Index: pyext.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/py/source/pyext.cpp,v
retrieving revision 1.33
retrieving revision 1.34
diff -C2 -d -r1.33 -r1.34
*** pyext.cpp	10 Apr 2005 22:24:13 -0000	1.33
--- pyext.cpp	18 Apr 2005 15:11:43 -0000	1.34
***************
*** 12,15 ****
--- 12,16 ----
  #include <flinternal.h>
  
+ 
  FLEXT_LIB_V("pyext pyext. pyx pyx.",pyext)
  
***************
*** 101,104 ****
--- 102,110 ----
  }
  
+ void pyext::ClearThis()
+ {
+ 	int ret = PyObject_DelAttrString(pyobj,"_this");
+     FLEXT_ASSERT(ret != -1);
+ }
  
  PyObject *pyext::class_obj = NULL;
***************
*** 170,174 ****
  	}
  
!  	Register("_pyext");
  
  	if(argc > apre || clname) {
--- 176,180 ----
  	}
  
!     Register(GetRegistry(REGNAME));
  
  	if(argc > apre || clname) {
***************
*** 209,212 ****
--- 215,219 ----
      }
  
+     Report();
  	PyUnlock(state);
  
***************
*** 220,226 ****
  	PyThreadState *state = PyLockSys();
      DoExit();
!     Unregister("_pyext");
  	UnimportModule();
  
  	PyUnlock(state);
  
--- 227,235 ----
  	PyThreadState *state = PyLockSys();
      DoExit();
! 
!     Unregister(GetRegistry(REGNAME));
  	UnimportModule();
  
+     Report();
  	PyUnlock(state);
  
***************
*** 230,235 ****
  bool pyext::DoInit()
  {
-     SetThis();
- 
      // call init now, after _this has been set, which is
  	// important for eventual callbacks from __init__ to c
--- 239,242 ----
***************
*** 238,246 ****
          bool ok = true;
  
  	    PyObject *init = PyObject_GetAttrString(pyobj,"__init__"); // get ref
          if(init) {
              if(PyMethod_Check(init)) {
  			    PyObject *res = PyObject_CallObject(init,pargs);
! 			    if(!res)
  				    ok = false;
  			    else
--- 245,256 ----
          bool ok = true;
  
+         SetThis();
+ 
  	    PyObject *init = PyObject_GetAttrString(pyobj,"__init__"); // get ref
          if(init) {
              if(PyMethod_Check(init)) {
  			    PyObject *res = PyObject_CallObject(init,pargs);
!                 if(!res)
!                     // exception is set
  				    ok = false;
  			    else
***************
*** 279,282 ****
--- 289,294 ----
              PyErr_Clear();
  
+         ClearThis();
+ 
          gcrun = pyobj->ob_refcnt > 1;
      	Py_DECREF(pyobj);  // opposite of SetClssMeth
***************
*** 369,382 ****
  }
  
! bool pyext::Reload()
  {
! 	DoExit();
  
! 	// by here, the Python class destructor should have been called!
  
! //	SetArgs(0,NULL);
! 	bool ok = ReloadModule();
! 	
! 	if(ok) ok = MakeInstance();
  
      if(ok) {
--- 381,397 ----
  }
  
! void pyext::LoadModule() 
  {
! }
  
! void pyext::UnloadModule() 
! {
! }
  
! void pyext::Load()
! {
!     FLEXT_ASSERT(!pyobj);
!     
!     bool ok = MakeInstance();
  
      if(ok) {
***************
*** 388,411 ****
      }
  
!     return ok;
  }
  
! 
! void pyext::m_reload()
! {
! 	PyThreadState *state = PyLockSys();
! 
! 	Unregister("_pyext"); // self
! 
! 	Reload();
! 
! 	Reregister("_pyext"); // the others
! 	Register("_pyext"); // self
! 
!     SetThis();
! 
!     Report();
! 
! 	PyUnlock(state);
  }
  
--- 403,413 ----
      }
  
! //    return ok;
  }
  
! void pyext::Unload() 
! { 
!     DoExit(); 
!     pyobj = NULL;
  }
  

Index: py.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/py/source/py.cpp,v
retrieving revision 1.24
retrieving revision 1.25
diff -C2 -d -r1.24 -r1.25
*** py.cpp	10 Apr 2005 22:24:13 -0000	1.24
--- py.cpp	18 Apr 2005 15:11:43 -0000	1.25
***************
*** 30,35 ****
      void m_help();    
  
! 	void m_reload();
!     void m_reload_(int argc,const t_atom *argv) { args(argc,argv); m_reload(); }
  	void m_set(int argc,const t_atom *argv);
      void m_dir_() { m__dir(function); }
--- 30,35 ----
      void m_help();    
  
!     void m_reload() { Reload(); }
!     void m_reload_(int argc,const t_atom *argv) { args(argc,argv); Reload(); }
  	void m_set(int argc,const t_atom *argv);
      void m_dir_() { m__dir(function); }
***************
*** 49,53 ****
      bool withfunction;
  
! 	virtual bool Reload();
  
  	bool SetFunction(const char *func);
--- 49,57 ----
      bool withfunction;
  
! 	virtual void LoadModule();
! 	virtual void UnloadModule();
! 
! 	virtual void Load();
! 	virtual void Unload();
  
  	bool SetFunction(const char *func);
***************
*** 166,170 ****
  	}
  
! 	Register("_py");
  
      if(argc >= 2) {
--- 170,174 ----
  	}
  
! 	Register(GetRegistry(REGNAME));
  
      if(argc >= 2) {
***************
*** 184,188 ****
  {
  	PyThreadState *state = PyLockSys();
! 	Unregister("_py");
      Report();
  	PyUnlock(state);
--- 188,192 ----
  {
  	PyThreadState *state = PyLockSys();
! 	Unregister(GetRegistry(REGNAME));
      Report();
  	PyUnlock(state);
***************
*** 202,220 ****
  }
  
- void pyobj::m_reload()
- {
- 	PyThreadState *state = PyLockSys();
- 
- 	Unregister("_py");
- 
- 	ReloadModule();
- 	Reregister("_py");
- 	Register("_py");
- 	SetFunction(funname?GetString(funname):NULL);
- 
-     Report();
- 	PyUnlock(state);
- }
- 
  void pyobj::m_set(int argc,const t_atom *argv)
  {
--- 206,209 ----
***************
*** 229,233 ****
  		    if(!module || !strcmp(sn,PyModule_GetName(module))) {
  			    ImportModule(sn);
! 			    Register("_py");
  		    }
          }
--- 218,222 ----
  		    if(!module || !strcmp(sn,PyModule_GetName(module))) {
  			    ImportModule(sn);
! 			    Register(GetRegistry(REGNAME));
  		    }
          }
***************
*** 317,324 ****
  
  
! bool pyobj::Reload()
  {
  	ResetFunction();
!     return true;
  }
  
--- 306,326 ----
  
  
! void pyobj::LoadModule() 
! {
!     SetFunction(funname?GetString(funname):NULL);
! }
! 
! void pyobj::UnloadModule() 
! {
! }
! 
! void pyobj::Load()
  {
  	ResetFunction();
! }
! 
! void pyobj::Unload()
! {
!     SetFunction(NULL);
  }
  





More information about the Pd-cvs mailing list