From 03c7468fcc51888c8271b904e4d6400ed5c1cbb1 Mon Sep 17 00:00:00 2001 From: Thomas Grill Date: Wed, 7 Mar 2007 13:40:14 +0000 Subject: multiply inlets for py (hot and cold inlets) small optimizations and fixes use PyGILState_\*() functionality (enabled with PY_USE_GIL) updates for DSP processing __str__ method for pyext, to enable print self calls added message bundle functionality (pyext.Bundle class) enable compiled-only scripts (without .py) enable optimization of Python code in reease build let _inlets and _outlets default to 0 fix for numpy some ASSERTs for explicitly created pyext classes (should be runtime checks i guess) open editor for script under OS X fixing numpy initialization quirks enable symbol binding for all callables (not only functions and methods) _isthreaded is now a data member instead of a method fix for gcc4 added pyext._list and pyext._tuple to convert input lists to Python sequence objects enable module packages (module/__init__.py[co]), now also for Max python-like dotted module.function syntax cleaned up float vs. int pyext tags compiler flag to exclude DSP objects some optimizations and py reload fix more safety for calls where association python-pd has already been removed always run Python interpreter in the background svn path=/trunk/; revision=7474 --- externals/grill/py/source/pysymbol.cpp | 508 ++++++++++++++++----------------- 1 file changed, 254 insertions(+), 254 deletions(-) (limited to 'externals/grill/py/source/pysymbol.cpp') diff --git a/externals/grill/py/source/pysymbol.cpp b/externals/grill/py/source/pysymbol.cpp index 2f023469..f907cc45 100644 --- a/externals/grill/py/source/pysymbol.cpp +++ b/externals/grill/py/source/pysymbol.cpp @@ -1,254 +1,254 @@ -/* - -py/pyext - python script object for PD and Max/MSP - -Copyright (c)2002-2005 Thomas Grill (gr@grrrr.org) -For information on usage and redistribution, and for a DISCLAIMER OF ALL -WARRANTIES, see the file, "license.txt," in this distribution. - -*/ - -#include "pyprefix.h" -#include "pysymbol.h" - -inline pySymbol *symbol_newsym(const t_symbol *sym) -{ - pySymbol *self = (pySymbol *)pySymbol_Type.tp_alloc(&pySymbol_Type, 0); - if(self) self->sym = sym; - return self; -} - -static PyObject *symbol_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - return (PyObject *)symbol_newsym(flext::sym__); -} - -static int symbol_init(PyObject *self, PyObject *args, PyObject *kwds) -{ - FLEXT_ASSERT(pySymbol_Check(self)); - - PyObject *arg = PySequence_GetItem(args,0); // new reference - if(!arg) return -1; - - int ret = 0; - - if(pySymbol_Check(arg)) - ((pySymbol *)self)->sym = pySymbol_AS_SYMBOL(arg); - else if(PyString_Check(arg)) - ((pySymbol *)self)->sym = flext::MakeSymbol(PyString_AS_STRING(arg)); - else { - PyErr_SetString(PyExc_TypeError,"string or symbol argument expected"); - ret = -1; - } - Py_DECREF(arg); - - return ret; -} - -static PyObject *symbol_str(PyObject *self) -{ - FLEXT_ASSERT(pySymbol_Check(self)); - return (PyObject *)PyString_FromString(pySymbol_AS_STRING(self)); -} - -static PyObject *symbol_repr(PyObject *self) -{ - FLEXT_ASSERT(pySymbol_Check(self)); - return (PyObject *)PyString_FromFormat("",pySymbol_AS_STRING(self)); -} - -static PyObject *symbol_richcompare(PyObject *a,PyObject *b,int cmp) -{ - if(pySymbol_Check(a) && pySymbol_Check(b)) { - const t_symbol *asym = pySymbol_AS_SYMBOL(a); - const t_symbol *bsym = pySymbol_AS_SYMBOL(b); - bool ret; - switch(cmp) { - case Py_LT: ret = asym < bsym; break; - case Py_LE: ret = asym <= bsym; break; - case Py_EQ: ret = asym == bsym; break; - case Py_NE: ret = asym != bsym; break; - case Py_GT: ret = asym > bsym; break; - case Py_GE: ret = asym >= bsym; break; - } - return PyBool_FromLong(ret); - } - Py_INCREF(Py_NotImplemented); - return Py_NotImplemented; -} - -static long symbol_hash(PyObject *self) -{ - FLEXT_ASSERT(pySymbol_Check(self)); - return (long)pySymbol_AS_SYMBOL(self); -} - - -static int symbol_length(pySymbol *self) -{ - return strlen(flext::GetString(self->sym)); -} - -static PyObject *symbol_item(pySymbol *self, int i) -{ - const char *str = flext::GetString(self->sym); - int len = strlen(str); - if(i < 0) i += len; - - if(i >= 0 && i < len) - return PyString_FromStringAndSize(str+i,1); - else { - Py_INCREF(Py_None); - return Py_None; - } -} - -static PyObject *symbol_slice(pySymbol *self,int ilow = 0,int ihigh = 1<<(sizeof(int)*8-2)) -{ - const char *str = flext::GetString(self->sym); - int len = strlen(str); - if(ilow < 0) { - ilow += len; - if(ilow < 0) ilow = 0; - } - if(ihigh < 0) ihigh += len; - if(ihigh >= len) ihigh = len-1; - - return PyString_FromStringAndSize(str+ilow,ilow <= ihigh?ihigh-ilow+1:0); -} - -static PyObject *symbol_concat(pySymbol *self,PyObject *op) -{ - PyObject *nobj = symbol_slice(self); // take all - if(nobj) { - PyObject *ret = PySequence_Concat(nobj,op); - Py_DECREF(nobj); - return ret; - } - else - return NULL; -} - -static PyObject *symbol_repeat(pySymbol *self,int rep) -{ - PyObject *nobj = symbol_slice(self); // take all - if(nobj) { - PyObject *ret = PySequence_Repeat(nobj,rep); - Py_DECREF(nobj); - return ret; - } - else - return NULL; -} - -static PySequenceMethods symbol_as_seq = { - (inquiry)symbol_length, /* inquiry sq_length; __len__ */ - (binaryfunc)symbol_concat, /* __add__ */ - (intargfunc)symbol_repeat, /* __mul__ */ - (intargfunc)symbol_item, /* intargfunc sq_item; __getitem__ */ - (intintargfunc)symbol_slice, /* intintargfunc sq_slice; __getslice__ */ - NULL, /* intobjargproc sq_ass_item; __setitem__ */ - NULL, /* intintobjargproc sq_ass_slice; __setslice__ */ -}; - -static PyObject *symbol_iter(PyObject *obj) -{ - pySymbol *self = (pySymbol *)obj; - PyObject *nobj = symbol_slice(self); - if(nobj) { - PyObject *it = PyObject_GetIter(nobj); - Py_DECREF(nobj); - return it; - } - else - return NULL; -} - - - -PyTypeObject pySymbol_Type = { - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ - "Symbol", /*tp_name*/ - sizeof(pySymbol), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - 0, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - symbol_repr, /*tp_repr*/ - 0, /*tp_as_number*/ - &symbol_as_seq, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - symbol_hash, /*tp_hash */ - 0, /*tp_call*/ - symbol_str, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT /*| Py_TPFLAGS_BASETYPE*/, /*tp_flags*/ - "Symbol objects", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - symbol_richcompare, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - symbol_iter, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - symbol_init, /* tp_init */ - 0, /* tp_alloc */ - symbol_new, /* tp_new */ -}; - -pySymbol *pySymbol__; -pySymbol *pySymbol_bang; -pySymbol *pySymbol_list; -pySymbol *pySymbol_symbol; -pySymbol *pySymbol_float; -pySymbol *pySymbol_int; - - -void initsymbol() -{ - if(PyType_Ready(&pySymbol_Type) < 0) - return; - - Py_INCREF(&pySymbol_Type); - - // initialize predefined objects - pySymbol__ = symbol_newsym(flext::sym__); - pySymbol_bang = symbol_newsym(flext::sym_bang); - pySymbol_list = symbol_newsym(flext::sym_list); - pySymbol_symbol = symbol_newsym(flext::sym_symbol); - pySymbol_float = symbol_newsym(flext::sym_float); - pySymbol_int = symbol_newsym(flext::sym_int); -} - - -PyObject *pySymbol_FromSymbol(const t_symbol *sym) -{ - pySymbol *op; - if(sym == flext::sym__) - Py_INCREF(op = pySymbol__); - else if(sym == flext::sym_bang) - Py_INCREF(op = pySymbol_bang); - else if(sym == flext::sym_list) - Py_INCREF(op = pySymbol_list); - else if(sym == flext::sym_symbol) - Py_INCREF(op = pySymbol_symbol); - else if(sym == flext::sym_float) - Py_INCREF(op = pySymbol_float); - else if(sym == flext::sym_int) - Py_INCREF(op = pySymbol_int); - else - op = symbol_newsym(sym); - return (PyObject *)op; -} +/* + +py/pyext - python script object for PD and Max/MSP + +Copyright (c)2002-2005 Thomas Grill (gr@grrrr.org) +For information on usage and redistribution, and for a DISCLAIMER OF ALL +WARRANTIES, see the file, "license.txt," in this distribution. + +*/ + +#include "pyprefix.h" +#include "pysymbol.h" + +inline pySymbol *symbol_newsym(const t_symbol *sym) +{ + pySymbol *self = (pySymbol *)pySymbol_Type.tp_alloc(&pySymbol_Type, 0); + if(self) self->sym = sym; + return self; +} + +static PyObject *symbol_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + return (PyObject *)symbol_newsym(flext::sym__); +} + +static int symbol_init(PyObject *self, PyObject *args, PyObject *kwds) +{ + FLEXT_ASSERT(pySymbol_Check(self)); + + PyObject *arg = PySequence_GetItem(args,0); // new reference + if(!arg) return -1; + + int ret = 0; + + if(pySymbol_Check(arg)) + ((pySymbol *)self)->sym = pySymbol_AS_SYMBOL(arg); + else if(PyString_Check(arg)) + ((pySymbol *)self)->sym = flext::MakeSymbol(PyString_AS_STRING(arg)); + else { + PyErr_SetString(PyExc_TypeError,"string or symbol argument expected"); + ret = -1; + } + Py_DECREF(arg); + + return ret; +} + +static PyObject *symbol_str(PyObject *self) +{ + FLEXT_ASSERT(pySymbol_Check(self)); + return (PyObject *)PyString_FromString(pySymbol_AS_STRING(self)); +} + +static PyObject *symbol_repr(PyObject *self) +{ + FLEXT_ASSERT(pySymbol_Check(self)); + return (PyObject *)PyString_FromFormat("",pySymbol_AS_STRING(self)); +} + +static PyObject *symbol_richcompare(PyObject *a,PyObject *b,int cmp) +{ + if(pySymbol_Check(a) && pySymbol_Check(b)) { + const t_symbol *asym = pySymbol_AS_SYMBOL(a); + const t_symbol *bsym = pySymbol_AS_SYMBOL(b); + bool ret; + switch(cmp) { + case Py_LT: ret = asym < bsym; break; + case Py_LE: ret = asym <= bsym; break; + case Py_EQ: ret = asym == bsym; break; + case Py_NE: ret = asym != bsym; break; + case Py_GT: ret = asym > bsym; break; + case Py_GE: ret = asym >= bsym; break; + } + return PyBool_FromLong(ret); + } + Py_INCREF(Py_NotImplemented); + return Py_NotImplemented; +} + +static long symbol_hash(PyObject *self) +{ + FLEXT_ASSERT(pySymbol_Check(self)); + return (long)pySymbol_AS_SYMBOL(self); +} + + +static int symbol_length(pySymbol *self) +{ + return strlen(flext::GetString(self->sym)); +} + +static PyObject *symbol_item(pySymbol *self, int i) +{ + const char *str = flext::GetString(self->sym); + int len = strlen(str); + if(i < 0) i += len; + + if(i >= 0 && i < len) + return PyString_FromStringAndSize(str+i,1); + else { + Py_INCREF(Py_None); + return Py_None; + } +} + +static PyObject *symbol_slice(pySymbol *self,int ilow = 0,int ihigh = 1<<(sizeof(int)*8-2)) +{ + const char *str = flext::GetString(self->sym); + int len = strlen(str); + if(ilow < 0) { + ilow += len; + if(ilow < 0) ilow = 0; + } + if(ihigh < 0) ihigh += len; + if(ihigh >= len) ihigh = len-1; + + return PyString_FromStringAndSize(str+ilow,ilow <= ihigh?ihigh-ilow+1:0); +} + +static PyObject *symbol_concat(pySymbol *self,PyObject *op) +{ + PyObject *nobj = symbol_slice(self); // take all + if(nobj) { + PyObject *ret = PySequence_Concat(nobj,op); + Py_DECREF(nobj); + return ret; + } + else + return NULL; +} + +static PyObject *symbol_repeat(pySymbol *self,int rep) +{ + PyObject *nobj = symbol_slice(self); // take all + if(nobj) { + PyObject *ret = PySequence_Repeat(nobj,rep); + Py_DECREF(nobj); + return ret; + } + else + return NULL; +} + +static PySequenceMethods symbol_as_seq = { + (inquiry)symbol_length, /* inquiry sq_length; __len__ */ + (binaryfunc)symbol_concat, /* __add__ */ + (intargfunc)symbol_repeat, /* __mul__ */ + (intargfunc)symbol_item, /* intargfunc sq_item; __getitem__ */ + (intintargfunc)symbol_slice, /* intintargfunc sq_slice; __getslice__ */ + NULL, /* intobjargproc sq_ass_item; __setitem__ */ + NULL, /* intintobjargproc sq_ass_slice; __setslice__ */ +}; + +static PyObject *symbol_iter(PyObject *obj) +{ + pySymbol *self = (pySymbol *)obj; + PyObject *nobj = symbol_slice(self); + if(nobj) { + PyObject *it = PyObject_GetIter(nobj); + Py_DECREF(nobj); + return it; + } + else + return NULL; +} + + + +PyTypeObject pySymbol_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "Symbol", /*tp_name*/ + sizeof(pySymbol), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + 0, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + symbol_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + &symbol_as_seq, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + symbol_hash, /*tp_hash */ + 0, /*tp_call*/ + symbol_str, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT /*| Py_TPFLAGS_BASETYPE*/, /*tp_flags*/ + "Symbol objects", /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + symbol_richcompare, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + symbol_iter, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + symbol_init, /* tp_init */ + 0, /* tp_alloc */ + symbol_new, /* tp_new */ +}; + +pySymbol *pySymbol__; +pySymbol *pySymbol_bang; +pySymbol *pySymbol_list; +pySymbol *pySymbol_symbol; +pySymbol *pySymbol_float; +pySymbol *pySymbol_int; + + +void initsymbol() +{ + if(PyType_Ready(&pySymbol_Type) < 0) + return; + + Py_INCREF(&pySymbol_Type); + + // initialize predefined objects + pySymbol__ = symbol_newsym(flext::sym__); + pySymbol_bang = symbol_newsym(flext::sym_bang); + pySymbol_list = symbol_newsym(flext::sym_list); + pySymbol_symbol = symbol_newsym(flext::sym_symbol); + pySymbol_float = symbol_newsym(flext::sym_float); + pySymbol_int = symbol_newsym(flext::sym_int); +} + + +PyObject *pySymbol_FromSymbol(const t_symbol *sym) +{ + pySymbol *op; + if(sym == flext::sym__) + Py_INCREF(op = pySymbol__); + else if(sym == flext::sym_bang) + Py_INCREF(op = pySymbol_bang); + else if(sym == flext::sym_list) + Py_INCREF(op = pySymbol_list); + else if(sym == flext::sym_symbol) + Py_INCREF(op = pySymbol_symbol); + else if(sym == flext::sym_float) + Py_INCREF(op = pySymbol_float); + else if(sym == flext::sym_int) + Py_INCREF(op = pySymbol_int); + else + op = symbol_newsym(sym); + return (PyObject *)op; +} -- cgit v1.2.1