Update of /cvsroot/pure-data/externals/grill/py/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5153/source
Modified Files: main.h py.cpp pyext.cpp pyext.h Log Message: ""
Index: pyext.h =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/pyext.h,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** pyext.h 21 Jun 2004 14:04:15 -0000 1.14 --- pyext.h 21 Aug 2004 04:13:48 -0000 1.15 *************** *** 68,71 **** --- 68,72 ---- V ClearBinding(); BL MakeInstance(); + BL DoInit();
AtomList args;
Index: main.h =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/main.h,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -d -r1.20 -r1.21 *** main.h 22 Jun 2004 22:45:53 -0000 1.20 --- main.h 21 Aug 2004 04:13:48 -0000 1.21 *************** *** 30,34 **** #endif
! #define PY__VERSION "0.1.3"
--- 30,34 ---- #endif
! #define PY__VERSION "0.1.4pre"
Index: pyext.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/pyext.cpp,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** pyext.cpp 22 Jun 2004 22:45:53 -0000 1.17 --- pyext.cpp 21 Aug 2004 04:13:48 -0000 1.18 *************** *** 168,178 **** MakeInstance();
! if(inlets < 0 && outlets < 0) { ! // now get number of inlets and outlets ! inlets = 1,outlets = 1;
! if(pyobj) { ! PyObject *res; ! res = PyObject_GetAttrString(pyobj,"_inlets"); // get ref if(res) { if(PyCallable_Check(res)) { --- 168,192 ---- MakeInstance();
! if(pyobj) { ! if(inlets >= 0) { ! // set number of inlets ! PyObject *res = PyInt_FromLong(inlets); ! int ret = PyObject_SetAttrString(pyobj,"_inlets",res); ! FLEXT_ASSERT(!ret); ! } ! if(outlets >= 0) { ! // set number of outlets ! PyObject *res = PyInt_FromLong(outlets); ! int ret = PyObject_SetAttrString(pyobj,"_outlets",res); ! FLEXT_ASSERT(!ret); ! }
! DoInit(); // call __init__ constructor ! // __init__ can override the number of inlets and outlets ! ! if(inlets < 0) { ! // get number of inlets ! inlets = 1; ! PyObject *res = PyObject_GetAttrString(pyobj,"_inlets"); // get ref if(res) { if(PyCallable_Check(res)) { *************** *** 187,192 **** else PyErr_Clear(); ! ! res = PyObject_GetAttrString(pyobj,"_outlets"); // get ref if(res) { if(PyCallable_Check(res)) { --- 201,209 ---- else PyErr_Clear(); ! } ! if(outlets < 0) { ! // get number of outlets ! outlets = 1; ! PyObject *res = PyObject_GetAttrString(pyobj,"_outlets"); // get ref if(res) { if(PyCallable_Check(res)) { *************** *** 201,211 **** else PyErr_Clear(); ! } } } ! else inlets = outlets = 0;
PY_UNLOCK AddInAnything(1+inlets); AddOutAnything(outlets); --- 218,231 ---- else PyErr_Clear(); ! } } } ! else ! inlets = outlets = 0;
PY_UNLOCK + FLEXT_ASSERT(inlets >= 0 && outlets >= 0); + AddInAnything(1+inlets); AddOutAnything(outlets); *************** *** 228,231 **** --- 248,278 ---- }
+ BL pyext::DoInit() + { + // remember the this pointer + PyObject *th = PyLong_FromVoidPtr(this); + int ret = PyObject_SetAttrString(pyobj,"_this",th); // ref is taken + + // call init now, after _this has been set, which is + // important for eventual callbacks from __init__ to c + PyObject *pargs = MakePyArgs(NULL,args.Count(),args.Atoms(),-1,true); + if(!pargs) PyErr_Print(); + + PyObject *init = PyObject_GetAttrString(pyobj,"__init__"); // get ref + if(init) { + if(PyCallable_Check(init)) { + PyObject *res = PyEval_CallObject(init,pargs); + if(!res) + PyErr_Print(); + else + Py_DECREF(res); + } + Py_DECREF(init); + } + + Py_XDECREF(pargs); + return true; + } + BL pyext::MakeInstance() { *************** *** 241,272 **** pyobj = PyInstance_NewRaw(pref,NULL);
! if(pyobj == NULL) ! PyErr_Print(); ! else { ! // remember the this pointer ! PyObject *th = PyLong_FromVoidPtr(this); ! int ret = PyObject_SetAttrString(pyobj,"_this",th); // ref is taken ! ! // call init now, after _this has been set, which is ! // important for eventual callbacks from __init__ to c ! PyObject *pargs = MakePyArgs(NULL,args.Count(),args.Atoms(),-1,true); ! if (pargs == NULL) ! PyErr_Print(); ! ! PyObject *init; ! init = PyObject_GetAttrString(pyobj,"__init__"); // get ref ! if(init) { ! if(PyCallable_Check(init)) { ! PyObject *res = PyEval_CallObject(init,pargs); ! if(!res) ! PyErr_Print(); ! else ! Py_DECREF(res); ! } ! Py_DECREF(init); ! } ! ! Py_XDECREF(pargs); ! } } else --- 288,292 ---- pyobj = PyInstance_NewRaw(pref,NULL);
! if(!pyobj) PyErr_Print(); } else
Index: py.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/py/source/py.cpp,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** py.cpp 21 Jun 2004 14:04:15 -0000 1.12 --- py.cpp 21 Aug 2004 04:13:48 -0000 1.13 *************** *** 128,134 **** --- 128,137 ---- AddToPath(GetString(canvas_getcurrentdir())); #elif FLEXT_SYS == FLEXT_SYS_MAX + #if FLEXT_OS == FLEXT_OS_WIN + #else short path = patcher_myvol(thisCanvas()); path_topathname(path,NULL,dir); AddToPath(dir); + #endif #else #pragma message("Adding current dir to path is not implemented")