aboutsummaryrefslogtreecommitdiff
path: root/externals/grill/py/source/pyext.cpp
diff options
context:
space:
mode:
authorThomas Grill <xovo@users.sourceforge.net>2005-07-08 14:30:31 +0000
committerThomas Grill <xovo@users.sourceforge.net>2005-07-08 14:30:31 +0000
commit897b80c5585f7c9031ff1aafb504c21a9d3b1606 (patch)
treeeaab38174de9e018827634ed079a885e232097a4 /externals/grill/py/source/pyext.cpp
parent6efb16b9040f7ba6db8c60559e0c815d54f05c43 (diff)
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
Diffstat (limited to 'externals/grill/py/source/pyext.cpp')
-rw-r--r--externals/grill/py/source/pyext.cpp141
1 files changed, 71 insertions, 70 deletions
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<char *>(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) {