From 897b80c5585f7c9031ff1aafb504c21a9d3b1606 Mon Sep 17 00:00:00 2001 From: Thomas Grill Date: Fri, 8 Jul 2005 14:30:31 +0000 Subject: better reload handling, but still far fom perfect fixed minor other issues cleaned up float vs. int pyext tags simplifications in py and pyext bumped version number python-like dotted module.function syntax send and receive wrapped PyObjects through inlets/outlets multiply inlets for py (hot and cold inlets) svn path=/trunk/; revision=3308 --- externals/grill/py/source/pyext.cpp | 141 ++++++++++++++++++------------------ 1 file changed, 71 insertions(+), 70 deletions(-) (limited to 'externals/grill/py/source/pyext.cpp') diff --git a/externals/grill/py/source/pyext.cpp b/externals/grill/py/source/pyext.cpp index e500e264..88b5de0c 100644 --- a/externals/grill/py/source/pyext.cpp +++ b/externals/grill/py/source/pyext.cpp @@ -41,6 +41,7 @@ void pyext::Setup(t_classid c) FLEXT_CADDMETHOD_(c,0,"get",m_get); FLEXT_CADDMETHOD_(c,0,"set",m_set); + FLEXT_CADDATTR_VAR1(c,"xlate",xlate); FLEXT_CADDATTR_VAR1(c,"respond",respond); // ---------------------------------------------------- @@ -123,71 +124,72 @@ pyext::pyext(int argc,const t_atom *argv,bool sig): FLEXT_CALLMETHOD(threadworker); #endif - int apre = 0; - if(argc >= apre+2 && CanbeInt(argv[apre]) && CanbeInt(argv[apre+1])) { - inlets = GetAInt(argv[apre]); - outlets = GetAInt(argv[apre+1]); - apre += 2; + if(argc >= 2 && CanbeInt(argv[0]) && CanbeInt(argv[1])) { + inlets = GetAInt(argv[0]); + outlets = GetAInt(argv[1]); + argv += 2,argc -= 2; } - if(sig && argc >= apre+2 && CanbeInt(argv[apre]) && CanbeInt(argv[apre+1])) { - siginlets = GetAInt(argv[apre]); - sigoutlets = GetAInt(argv[apre+1]); - apre += 2; + if(sig && argc >= 2 && CanbeInt(argv[0]) && CanbeInt(argv[1])) { + siginlets = GetAInt(argv[0]); + sigoutlets = GetAInt(argv[1]); + argv += 2,argc -= 2; } const t_symbol *clname = NULL; + // check if the object name is pyext. , pyx. or similar + bool dotted = strrchr(thisName(),'.') != NULL; + PyThreadState *state = PyLockSys(); // init script module - if(argc > apre) { - char dir[1024]; - -#if FLEXT_SYS == FLEXT_SYS_PD - // add dir of current patch to path - AddToPath(GetString(canvas_getdir(thisCanvas()))); - // add current dir to path - AddToPath(GetString(canvas_getcurrentdir())); -#elif FLEXT_SYS == FLEXT_SYS_MAX - short path = patcher_myvol(thisCanvas()); - path_topathname(path,NULL,dir); - AddToPath(dir); -#else - #pragma message("Adding current dir to path is not implemented") -#endif - const t_symbol *scr = GetASymbol(argv[apre]); + if(argc) { + AddCurrentPath(thisCanvas()); + + const t_symbol *scr = GetASymbol(*argv); + argv++,argc--; + if(scr) { - GetModulePath(GetString(scr),dir,sizeof(dir)); - // add to path - AddToPath(dir); + char modnm[64]; + strcpy(modnm,GetString(scr)); + + if(!dotted) { + char *pt = strrchr(modnm,'.'); // search for last dot + if(pt && *pt) { + clname = MakeSymbol(pt+1); + *pt = 0; + } + } -// SetArgs(0,NULL); + char dir[1024]; + GetModulePath(modnm,dir,sizeof(dir)); + AddToPath(dir); - ImportModule(GetString(scr)); + ImportModule(modnm); } else - post("%s - script name argument is invalid",thisName()); - - ++apre; + PyErr_SetString(PyExc_ValueError,"Invalid module name"); // check for alias creation names - if(strrchr(thisName(),'.')) clname = scr; + if(dotted) clname = scr; } Register(GetRegistry(REGNAME)); - if(argc > apre || clname) { - if(!clname) clname = GetASymbol(argv[apre++]); + if(argc || clname) { + if(!clname) { + clname = GetASymbol(*argv); + argv++,argc--; + } - // class name - if(!clname) - post("%s - class name argument is invalid",thisName()); - else + if(clname) methname = clname; + else + PyErr_SetString(PyExc_ValueError,"Invalid class name"); } - if(argc > apre) initargs(argc-apre,argv+apre); + if(argc) initargs(argc,argv); Report(); @@ -240,7 +242,7 @@ bool pyext::DoInit() { // call init now, after _this has been set, which is // important for eventual callbacks from __init__ to c - PyObject *pargs = MakePyArgs(NULL,initargs.Count(),initargs.Atoms(),-1,true); + PyObject *pargs = MakePyArgs(NULL,initargs.Count(),initargs.Atoms()); if(pargs) { bool ok = true; @@ -443,7 +445,7 @@ void pyext::m_set(int argc,const t_atom *argv) else { char *ch = const_cast(GetString(argv[0])); if(PyObject_HasAttrString(pyobj,ch)) { - PyObject *pval = MakePyArgs(NULL,argc-1,argv+1,-1,false); + PyObject *pval = MakePyArgs(NULL,argc-1,argv+1); if(pval) { if(PySequence_Size(pval) == 1) { // reduce lists of one element to element itself @@ -467,10 +469,7 @@ void pyext::m_set(int argc,const t_atom *argv) bool pyext::CbMethodResort(int n,const t_symbol *s,int argc,const t_atom *argv) { - if(pyobj && n >= 1) - return work(n,s,argc,argv); - else - return flext_dsp::CbMethodResort(n,s,argc,argv); + return (pyobj && n >= 1 && work(n,s,argc,argv)) || flext_dsp::CbMethodResort(n,s,argc,argv); } @@ -527,7 +526,7 @@ bool pyext::call(const char *meth,int inlet,const t_symbol *s,int argc,const t_a PyErr_Clear(); // no method found } else { - PyObject *pargs = MakePyArgs(s,argc,argv,inlet?inlet:-1,true); + PyObject *pargs = MakePyArgs(s,argc,argv,inlet?inlet:-1); //,true); if(!pargs) { PyErr_Print(); Py_DECREF(pmeth); @@ -547,29 +546,29 @@ bool pyext::work(int n,const t_symbol *s,int argc,const t_atom *argv) // should be enough... char str[256]; - bool isfloat = s == sym_float && argc == 1; - // offset inlet index by signal inlets // \note first one is shared with messages! if(siginlets) n += siginlets-1; - // if float equals an integer, try int_* method - if(isfloat && GetAFloat(argv[0]) == GetAInt(argv[0])) { - sprintf(str,"int_%i",n); - ret = call(str,0,NULL,1,argv); - } - // try tag/inlet if(!ret) { sprintf(str,"%s_%i",GetString(s),n); ret = call(str,0,NULL,argc,argv); } - // try truncated int - if(!ret && isfloat) { - t_atom at; SetInt(at,GetAInt(argv[0])); - sprintf(str,"int_%i",n); - ret = call(str,0,NULL,1,&at); + if(!ret && argc == 1) { + if(s == sym_float) { + // try truncated float + t_atom at; SetInt(at,GetAInt(argv[0])); + sprintf(str,"int_%i",n); + ret = call(str,0,NULL,1,&at); + } + else if(s == sym_int) { + // try floating int + t_atom at; SetFloat(at,GetAFloat(argv[0])); + sprintf(str,"float_%i",n); + ret = call(str,0,NULL,1,&at); + } } // try anything/inlet @@ -578,21 +577,23 @@ bool pyext::work(int n,const t_symbol *s,int argc,const t_atom *argv) ret = call(str,0,s,argc,argv); } - // try int at any inlet - if(!ret && isfloat && GetAFloat(argv[0]) == GetAInt(argv[0])) { - ret = call("int_",0,NULL,1,argv); - } - // try tag at any inlet if(!ret) { sprintf(str,"%s_",GetString(s)); ret = call(str,n,NULL,argc,argv); } - // try truncated int at any inlet - if(!ret && isfloat) { - t_atom at; SetInt(at,GetAInt(argv[0])); - ret = call("int_",0,NULL,1,&at); + if(!ret && argc == 1) { + if(s == sym_float) { + // try truncated float at any inlet + t_atom at; SetInt(at,GetAInt(argv[0])); + ret = call("int_",0,NULL,1,&at); + } + else if(s == sym_int) { + // try floating int at any inlet + t_atom at; SetFloat(at,GetAFloat(argv[0])); + ret = call("float_",0,NULL,1,&at); + } } if(!ret) { -- cgit v1.2.1