Update of /cvsroot/pure-data/externals/grill/py/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24934/source
Modified Files: py.cpp pybase.cpp pybase.h pyext.cpp Log Message: added message bundle functionality (pyext.Bundle class) enable compiled-only scripts (without .py) small optimizations and fixes some optimizations and py reload fix better error message for reload with invalid args enable module packages (module/__init__.py[co]), now also for Max
Index: pybase.h =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/pybase.h,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** pybase.h 12 Dec 2005 00:18:42 -0000 1.10 --- pybase.h 23 Mar 2006 01:42:05 -0000 1.11 *************** *** 54,58 ****
void AddCurrentPath(flext_base *o); - void GetModulePath(const char *mod,char *dir,int len); void SetArgs();
--- 54,57 ----
Index: pybase.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/pybase.cpp,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** pybase.cpp 12 Dec 2005 00:18:42 -0000 1.13 --- pybase.cpp 23 Mar 2006 01:42:05 -0000 1.14 *************** *** 102,106 **** post("------------------------------------------------"); post("py/pyext %s - python script objects",PY__VERSION); ! post("(C)2002-2005 Thomas Grill - http://grrrr.org/ext"); post(""); post("using Python %s",Py_GetVersion()); --- 102,106 ---- post("------------------------------------------------"); post("py/pyext %s - python script objects",PY__VERSION); ! post("(C)2002-2006 Thomas Grill - http://grrrr.org/ext"); post(""); post("using Python %s",Py_GetVersion()); *************** *** 221,224 **** --- 221,225 ---- pybase::pybase() : module(NULL) + , dict(NULL) #ifdef FLEXT_THREADS , thrcount(0) *************** *** 388,392 **** 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"; --- 389,393 ---- 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"; *************** *** 425,436 **** }
bool pybase::ImportModule(const char *name) { if(name) { ! if(modname == name) return true; ! modname = name; } else modname.clear(); return ReloadModule(); } --- 426,546 ---- }
+ static bool getmodulesub(const char *mod,char *dir,int len,char *ext) + { + #if FLEXT_SYS == FLEXT_SYS_PD + char *name; + int fd = open_via_path("",mod,ext,dir,&name,len,0); + if(fd > 0) { + FLEXT_ASSERT(name && *name); + close(fd); + } + else { + // look for mod/__init__.py + std::string tmp(mod); + int l = tmp.size(); + tmp += "/__init__"; + fd = open_via_path("",tmp.c_str(),ext,dir,&name,len,0); + if(fd > 0) { + FLEXT_ASSERT(name && *name); + close(fd); + // we must remove the module name from dir + char *t = dir+strlen(dir)-l; + FLEXT_ASSERT(!strcmp(mod,t) && t[-1] == '/'); + t[-1] = 0; + } + else + name = NULL; + } + + // if dir is current working directory... name points to dir + if(dir == name) strcpy(dir,"."); + #elif FLEXT_SYS == FLEXT_SYS_MAX + short path; + long type; + char smod[1024]; + strcpy(smod,mod); + strcat(smod,ext); + bool ok = !locatefile_extended(smod,&path,&type,&type,0); + if(ok) + // convert pathname to unix style + path_topathname(path,NULL,smod); + else { + // do path/file.ext combinations work at all under Max? + strcpy(smod,mod); + + short path; + type = 'fold'; + ok = !locatefile_extended(smod,&path,&type,&type,1); + if(ok) { + // convert pathname to unix style (including trailing slash) + path_topathname(path,NULL,smod); + char *end = smod+strlen(smod); + strcpy(end,mod); + strcat(end,"/__init__"); + strcat(end,ext); + + // check if file is really existing: try to open it + FILE *f = fopen(smod,"r"); + if(f) { + *end = 0; // clear module part ... we only need base path + fclose(f); + } + else + ok = false; + } + } + + if(ok) { + // convert path into slash style needed for Python + #if 1 + path_nameconform(smod,dir,PATH_STYLE_SLASH,PATH_TYPE_ABSOLUTE); + #else + #if FLEXT_OS == FLEXT_OS_WIN + char *colon = NULL; + #else + char *colon = strchr(smod,':'); + #endif + if(colon) { + *colon = 0; + strcpy(dir,"/Volumes/"); + strcat(dir,smod); + strcat(dir,colon+1); + } + else + strcpy(dir,smod); + #endif + return true; + } + else + // not found + return false; + #else + #pragma message("Not implemented"); + return false; + #endif + } + + static bool getmodulepath(const char *mod,char *dir,int len) + { + return + getmodulesub(mod,dir,len,".py") || + getmodulesub(mod,dir,len,".pyc") || + getmodulesub(mod,dir,len,".pyo"); + } + bool pybase::ImportModule(const char *name) { if(name) { ! if(modname == name) { ! // module with the same name is already loaded ! if(module) return true; ! } ! else ! modname = name; } else modname.clear(); + + UnimportModule(); return ReloadModule(); } *************** *** 438,466 **** void pybase::UnimportModule() { ! if(!module) return; ! ! FLEXT_ASSERT(dict && module_obj && module_dict);
! Py_DECREF(module);
! // reference count to module is not 0 here, altough probably the last instance was unloaded ! // Python retains one reference to the module all the time ! // we don't care
! module = NULL; ! dict = NULL; }
bool pybase::ReloadModule() { - bool ok = false; - SetArgs(); PyObject *newmod;
! if(modname.length()) ! newmod = module ! ?PyImport_ReloadModule(module) ! :PyImport_ImportModule((char *)modname.c_str()); else { // if no module name given, take py module --- 548,586 ---- void pybase::UnimportModule() { ! if(module) { ! FLEXT_ASSERT(dict && module_obj && module_dict);
! Py_DECREF(module);
! // reference count to module is not 0 here, altough probably the last instance was unloaded ! // Python retains one reference to the module all the time ! // we don't care
! module = NULL; ! dict = NULL; ! } }
bool pybase::ReloadModule() { SetArgs(); PyObject *newmod;
! if(modname.length()) { ! if(module) ! newmod = PyImport_ReloadModule(module); ! else { ! // search in module path ! char dir[1024]; ! if(getmodulepath(modname.c_str(),dir,sizeof(dir))) { ! AddToPath(dir); ! newmod = PyImport_ImportModule((char *)modname.c_str()); ! } ! else { ! PyErr_SetString(PyExc_ImportError,"Module not found in path"); ! newmod = NULL; ! } ! } ! } else { // if no module name given, take py module *************** *** 471,475 **** if(!newmod) { // unload faulty module ! if(module) UnimportModule(); } else { --- 591,596 ---- if(!newmod) { // unload faulty module ! UnimportModule(); ! return false; } else { *************** *** 477,526 **** module = newmod; dict = PyModule_GetDict(module); // borrowed ! ok = true; } - return ok; - } - - void pybase::GetModulePath(const char *mod,char *dir,int len) - { - #if FLEXT_SYS == FLEXT_SYS_PD - // uarghh... pd doesn't show its path for extra modules - - char *name; - int fd = open_via_path("",mod,".py",dir,&name,len,0); - if(fd > 0) close(fd); - else name = NULL; - - // if dir is current working directory... name points to dir - if(dir == name) strcpy(dir,"."); - #elif FLEXT_SYS == FLEXT_SYS_MAX - // how do i get the path in Max/MSP? - short path; - long type; - char smod[1024]; - strcat(strcpy(smod,mod),".py"); - if(!locatefile_extended(smod,&path,&type,&type,-1)) { - #if FLEXT_OS == FLEXT_OS_WIN - path_topathname(path,NULL,dir); - #else - // convert pathname to unix style - path_topathname(path,NULL,smod); - char *colon = strchr(smod,':'); - if(colon) { - *colon = 0; - strcpy(dir,"/Volumes/"); - strcat(dir,smod); - strcat(dir,colon+1); - } - else - strcpy(dir,smod); - #endif - } - else - // not found - *dir = 0; - #else - *dir = 0; - #endif }
--- 598,603 ---- module = newmod; dict = PyModule_GetDict(module); // borrowed ! return true; } }
Index: pyext.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/pyext.cpp,v retrieving revision 1.45 retrieving revision 1.46 diff -C2 -d -r1.45 -r1.46 *** pyext.cpp 12 Dec 2005 14:42:54 -0000 1.45 --- pyext.cpp 23 Mar 2006 01:42:05 -0000 1.46 *************** *** 163,170 **** }
- char dir[1024]; - GetModulePath(modnm,dir,sizeof(dir)); - AddToPath(dir); - ImportModule(modnm); } --- 163,166 ----
Index: py.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/py.cpp,v retrieving revision 1.34 retrieving revision 1.35 diff -C2 -d -r1.34 -r1.35 *** py.cpp 11 Aug 2005 15:00:58 -0000 1.34 --- py.cpp 23 Mar 2006 01:42:05 -0000 1.35 *************** *** 157,166 **** }
! if(*modnm) { ! char dir[1024]; ! GetModulePath(modnm,dir,sizeof(dir)); ! AddToPath(dir); ImportModule(modnm); - } else ImportModule(NULL); --- 157,162 ---- }
! if(*modnm) ImportModule(modnm); else ImportModule(NULL); *************** *** 220,224 ****
if(sn) { ! if(!module || !strcmp(sn,PyModule_GetName(module))) { ImportModule(sn); Register(GetRegistry(REGNAME)); --- 216,221 ----
if(sn) { ! // if(!module || !strcmp(sn,PyModule_GetName(module))) ! { ImportModule(sn); Register(GetRegistry(REGNAME)); *************** *** 245,249 **** { post(""); ! post("%s %s - python script object, (C)2002-2005 Thomas Grill",thisName(),PY__VERSION); #ifdef FLEXT_DEBUG post("DEBUG VERSION, compiled on " __DATE__ " " __TIME__); --- 242,246 ---- { post(""); ! post("%s %s - python script object, (C)2002-2006 Thomas Grill",thisName(),PY__VERSION); #ifdef FLEXT_DEBUG post("DEBUG VERSION, compiled on " __DATE__ " " __TIME__);