aboutsummaryrefslogtreecommitdiff
path: root/externals/grill/py/source/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'externals/grill/py/source/main.cpp')
-rw-r--r--externals/grill/py/source/main.cpp60
1 files changed, 41 insertions, 19 deletions
diff --git a/externals/grill/py/source/main.cpp b/externals/grill/py/source/main.cpp
index 636435b3..33200c8b 100644
--- a/externals/grill/py/source/main.cpp
+++ b/externals/grill/py/source/main.cpp
@@ -56,6 +56,8 @@ void py::FreeThreadState()
#endif
+void initsymbol();
+
void py::lib_setup()
{
post("");
@@ -76,8 +78,7 @@ void py::lib_setup()
Py_Initialize();
#ifdef FLEXT_DEBUG
-// Py_DebugFlag = 1;
- Py_VerboseFlag = 1;
+// Py_VerboseFlag = 1;
#endif
#ifdef FLEXT_THREADS
@@ -99,6 +100,18 @@ void py::lib_setup()
PyModule_AddStringConstant(module_obj,"__doc__",(char *)py_doc);
+ // add symbol type
+ initsymbol();
+ PyModule_AddObject(module_obj,"Symbol",(PyObject *)&pySymbol_Type);
+
+ // pre-defined symbols
+ PyModule_AddObject(module_obj,"_s_",(PyObject *)pySymbol__);
+ PyModule_AddObject(module_obj,"_s_bang",(PyObject *)pySymbol_bang);
+ PyModule_AddObject(module_obj,"_s_list",(PyObject *)pySymbol_list);
+ PyModule_AddObject(module_obj,"_s_symbol",(PyObject *)pySymbol_symbol);
+ PyModule_AddObject(module_obj,"_s_float",(PyObject *)pySymbol_float);
+ PyModule_AddObject(module_obj,"_s_int",(PyObject *)pySymbol_int);
+
// redirect stdout
PyObject* py_out;
py_out = Py_InitModule("stdout", StdOut_Methods);
@@ -124,6 +137,16 @@ PyObject *py::module_obj = NULL;
PyObject *py::module_dict = NULL;
+void py::Setup(t_classid c)
+{
+ FLEXT_CADDMETHOD_(c,0,"doc",m_doc);
+ FLEXT_CADDMETHOD_(c,0,"dir",m_dir);
+#ifdef FLEXT_THREADS
+ FLEXT_CADDATTR_VAR1(c,"detach",detach);
+ FLEXT_CADDMETHOD_(c,0,"stop",m_stop);
+#endif
+}
+
py::py():
module(NULL),
detach(0),shouldexit(false),thrcount(0),
@@ -150,7 +173,7 @@ py::~py()
// Wait forever
post("%s - Waiting for thread termination!",thisName());
- while(thrcount) Sleep(0.2f);
+ while(thrcount) Sleep(0.01f);
post("%s - Okay, all threads have terminated",thisName());
}
@@ -198,7 +221,7 @@ void py::m__doc(PyObject *obj)
PyObject *docf = PyDict_GetItemString(obj,"__doc__"); // borrowed!!!
if(docf && PyString_Check(docf)) {
post("");
- const char *s = PyString_AsString(docf);
+ const char *s = PyString_AS_STRING(docf);
// FIX: Python doc strings can easily be larger than 1k characters
// -> split into separate lines
@@ -226,6 +249,10 @@ void py::m__doc(PyObject *obj)
}
}
+void py::m_click()
+{
+ // this should once open the editor....
+}
void py::SetArgs(int argc,const t_atom *argv)
{
@@ -251,8 +278,7 @@ void py::ImportModule(const char *name)
if(!name) return;
module = PyImport_ImportModule((char *)name); // increases module_obj ref count by one
- if (!module) {
-
+ if(!module) {
PyErr_Print();
dict = NULL;
}
@@ -264,7 +290,7 @@ void py::UnimportModule()
{
if(!module) return;
- assert(dict && module_obj && module_dict);
+ FLEXT_ASSERT(dict && module_obj && module_dict);
Py_DECREF(module);
@@ -343,17 +369,12 @@ void py::AddToPath(const char *dir)
if(dir && *dir) {
PyObject *pobj = PySys_GetObject("path");
if(pobj && PyList_Check(pobj)) {
- int i,n = PyList_Size(pobj);
- for(i = 0; i < n; ++i) {
- PyObject *pt = PyList_GetItem(pobj,i); // borrowed reference
- if(PyString_Check(pt) && !strcmp(dir,PyString_AS_STRING(pt))) break;
- }
- if(i == n) { // string is not yet existent in path
- PyObject *ps = PyString_FromString(dir);
- PyList_Append(pobj,ps);
- }
+ PyObject *ps = PyString_FromString(dir);
+ if(!PySequence_Contains(pobj,ps))
+ PyList_Append(pobj,ps); // makes new reference
+ Py_DECREF(ps);
}
- PySys_SetObject("path",pobj);
+ PySys_SetObject("path",pobj); // steals reference to pobj
}
}
@@ -378,9 +399,10 @@ PyObject* py::StdOut_Write(PyObject* self, PyObject* args)
// should always be a tuple
FLEXT_ASSERT(PyTuple_Check(args));
- int sz = PyTuple_Size(args);
+ const int sz = PyTuple_GET_SIZE(args);
+
for(int i = 0; i < sz; ++i) {
- PyObject *val = PyTuple_GetItem(args,i); // borrowed reference
+ PyObject *val = PyTuple_GET_ITEM(args,i); // borrowed reference
PyObject *str = PyObject_Str(val); // new reference
char *cstr = PyString_AS_STRING(str);
char *lf = strchr(cstr,'\n');