From 214bb7279f354adf1344376e26465046fc2581ce Mon Sep 17 00:00:00 2001 From: Thomas Grill Date: Thu, 11 Aug 2005 15:00:58 +0000 Subject: oops, include libraries for editing the scripts some optimizations and py reload fix open editor for module file on "edit" message (or click) open editor for script under OS X added cygwin support svn path=/trunk/; revision=3417 --- externals/grill/py/build/gnumake-win-cygwin.inc | 2 +- externals/grill/py/build/nmake-win-msvc.inc | 1 + externals/grill/py/source/py.cpp | 11 +++------ externals/grill/py/source/pyargs.cpp | 2 +- externals/grill/py/source/pybase.cpp | 32 +++++++++++++++++-------- externals/grill/py/source/pybase.h | 18 ++++---------- externals/grill/py/source/pymeth.cpp | 2 +- 7 files changed, 33 insertions(+), 35 deletions(-) diff --git a/externals/grill/py/build/gnumake-win-cygwin.inc b/externals/grill/py/build/gnumake-win-cygwin.inc index 39f590bf..70cfca17 100644 --- a/externals/grill/py/build/gnumake-win-cygwin.inc +++ b/externals/grill/py/build/gnumake-win-cygwin.inc @@ -1,7 +1,7 @@ DEFS += -DPY_EXPORTS INCPATH += -I$(PYTHONPATH)/include LIBPATH += -L$(PYTHONPATH)/libs -LIBS += -lpython$(PYTHONVER) +LIBS += -lpython$(PYTHONVER) -lshell32 ifdef PY_NUMARRAY DEFS += -DPY_NUMARRAY diff --git a/externals/grill/py/build/nmake-win-msvc.inc b/externals/grill/py/build/nmake-win-msvc.inc index e9334065..0d4fa162 100644 --- a/externals/grill/py/build/nmake-win-msvc.inc +++ b/externals/grill/py/build/nmake-win-msvc.inc @@ -1,6 +1,7 @@ DEFS = $(DEFS) /DPY_EXPORTS INCPATH=/I$(PYTHONPATH)\include LIBPATH=/LIBPATH:$(PYTHONPATH)\libs +LIBS=$(LIBS) shell32.lib !ifdef PY_NUMARRAY DEFS = $(DEFS) /DPY_NUMARRAY diff --git a/externals/grill/py/source/py.cpp b/externals/grill/py/source/py.cpp index c7111faa..3ef823a0 100644 --- a/externals/grill/py/source/py.cpp +++ b/externals/grill/py/source/py.cpp @@ -154,12 +154,6 @@ pyobj::pyobj(int argc,const t_atom *argv) if(pt && *pt) { funnm = MakeSymbol(pt+1); *pt = 0; - -#if 0 - if(!*modnm) - // if module name is empty set it to __builtin__ - strcpy(modnm,"__builtin__"); -#endif } if(*modnm) { @@ -337,7 +331,8 @@ void pyobj::Load() void pyobj::Unload() { - SetFunction(NULL); +// SetFunction(NULL); + function = NULL; // just clear the PyObject, not the function name } void pyobj::callpy(PyObject *fun,PyObject *args) @@ -354,7 +349,7 @@ bool pyobj::CbMethodResort(int n,const t_symbol *s,int argc,const t_atom *argv) if(n == 0 && s != sym_bang) return flext_base::CbMethodResort(n,s,argc,argv); - PyThreadState *state = PyLock(); + PyThreadState *state = PyLockSys(); bool ret = false; diff --git a/externals/grill/py/source/pyargs.cpp b/externals/grill/py/source/pyargs.cpp index d9a91e10..38cfbc54 100644 --- a/externals/grill/py/source/pyargs.cpp +++ b/externals/grill/py/source/pyargs.cpp @@ -18,7 +18,7 @@ static PyObject *MakePyAtom(const t_atom &at) if(flext::IsSymbol(at)) return pySymbol_FromSymbol(flext::GetSymbol(at)); #if 1 - else if(flext::CanbeInt(at) || flext::CanbeFloat(at)) { + else if(flext::CanbeFloat(at)) { // if a number can be an integer... let it be an integer! int ival = flext::GetAInt(at); double fval = flext::GetAFloat(at); diff --git a/externals/grill/py/source/pybase.cpp b/externals/grill/py/source/pybase.cpp index 69bead28..462cad62 100644 --- a/externals/grill/py/source/pybase.cpp +++ b/externals/grill/py/source/pybase.cpp @@ -200,14 +200,14 @@ pybase::pybase() , detach(0) , pymsg(false) { - PyThreadState *state = PyLockSys(); + PyThreadState *state = PyLock(); Py_INCREF(module_obj); PyUnlock(state); } pybase::~pybase() { - PyThreadState *state = PyLockSys(); + PyThreadState *state = PyLock(); Py_XDECREF(module_obj); PyUnlock(state); } @@ -355,7 +355,24 @@ void pybase::OpenEditor() post("py/pyext - Couldn't launch editor"); } } -#elif FLEXT_OS == FLEXT_OS_LINUX +#else + // thanks to Tim Blechmann + + char *editor = getenv("EDITOR"); + + if(!editor || !strcmp(editor, "/usr/bin/nano") || !strcmp(editor, "/usr/bin/pico") || !strcmp(editor, "/usr/bin/vi")) { + // no environment variable or console text editor found ... use idle instead (should have come with Python) + editor = "idle"; + } + + pid_t child = fork(); + if(!child) { + char cmd[80]; + strcpy(cmd,editor); + strcat(cmd," "); + strcat(cmd,fname); + execl("/bin/sh", "sh", "-c", cmd, (char *) NULL); + } #endif } @@ -539,7 +556,7 @@ void pybase::Respond(bool b) void pybase::Reload() { - PyThreadState *state = PyLockSys(); + PyThreadState *state = PyLock(); PyObject *reg = GetRegistry(REGNAME); @@ -670,6 +687,7 @@ void pybase::exchandle() { #if 0 // want to use that, but exception keeps a reference to the object + // might be a Python bug! PyErr_Print(); #else // must use that instead... clear the exception @@ -776,9 +794,3 @@ bool pybase::collect() } return true; } - -/* -PY_EXPORT PyThreadState *py_Lock(PyThreadState *st = NULL) { return pybase::PyLock(st?st:pybase::FindThreadState()); } -PY_EXPORT PyThreadState *py_LockSys() { return pybase::PyLockSys(); } -PY_EXPORT void py_Unlock(PyThreadState *st) { pybase::PyUnlock(st); } -*/ diff --git a/externals/grill/py/source/pybase.h b/externals/grill/py/source/pybase.h index f0ec5640..49eccbbc 100644 --- a/externals/grill/py/source/pybase.h +++ b/externals/grill/py/source/pybase.h @@ -53,7 +53,6 @@ protected: void AddCurrentPath(flext_base *o); void GetModulePath(const char *mod,char *dir,int len); - void AddToPath(const char *dir); void SetArgs(); bool OutObject(flext_base *ext,int o,PyObject *obj); @@ -148,7 +147,6 @@ protected: return true; } -// virtual bool thrcall(void *data) = 0; virtual void callpy(PyObject *fun,PyObject *args) = 0; void exchandle(); @@ -168,11 +166,6 @@ protected: static PyFifo qufifo; static ThrCond qucond; static PyThreadState *pythrsys; - - static PyThreadState *FindThreadState(); - static void FreeThreadState(); -#else - static PyThreadState *FindThreadState() { return NULL; } #endif static const t_symbol *sym_fint; // float or int symbol, depending on native number message type @@ -182,10 +175,11 @@ protected: public: + static void AddToPath(const char *dir); + #ifdef FLEXT_THREADS - ThrMutex mutex; - inline void Lock() { mutex.Unlock(); } - inline void Unlock() { mutex.Unlock(); } + static PyThreadState *FindThreadState(); + static void FreeThreadState(); // this is especially needed when one py/pyext object calls another one // we don't want the message to be queued, but otoh we have to avoid deadlock @@ -209,11 +203,7 @@ public: PyThreadState *old = PyThreadState_Swap(st); if(old != pythrsys || !--lockcount) PyEval_ReleaseLock(); } - #else - inline void Lock() {} - inline void Unlock() {} - static PyThreadState *PyLock(PyThreadState * = NULL) { return NULL; } static PyThreadState *PyLockSys() { return NULL; } static void PyUnlock(PyThreadState *st) {} diff --git a/externals/grill/py/source/pymeth.cpp b/externals/grill/py/source/pymeth.cpp index 91ca2146..3bc90ee2 100644 --- a/externals/grill/py/source/pymeth.cpp +++ b/externals/grill/py/source/pymeth.cpp @@ -366,7 +366,7 @@ bool pymeth::CbMethodResort(int n,const t_symbol *s,int argc,const t_atom *argv) if(n == 0 && s != sym_bang) return flext_base::CbMethodResort(n,s,argc,argv); - PyThreadState *state = PyLock(); + PyThreadState *state = PyLockSys(); bool ret = false; -- cgit v1.2.1