void register_(lua_State* L) const { object fn = make_function(L, f, deduce_signature(f), policies); add_overload( object(from_stack(L, -1)) , name , fn ); }
// Handle the getting of a lazy attribute, ie. a native Qt signal. int qpycore_get_lazy_attr(const sipTypeDef *td, PyObject *dict) { pyqt4ClassTypeDef *ctd = (pyqt4ClassTypeDef *)td; const pyqt4QtSignal *sigs = ctd->qt4_signals; // Handle the trvial case. if (!sigs) return 0; QByteArray curr_name; qpycore_pyqtSignal *curr = 0; do { // See if we have come to the end of the current signal. if (curr && !is_signal_name(sigs->signature, curr_name.constData(), curr_name.size())) { if (PyDict_SetItemString(dict, curr_name.constData(), (PyObject *)curr) < 0) return -1; curr = 0; } // See if we need to create a new signal. if (!curr) { // Get the name. curr_name = sigs->signature; curr_name.truncate(curr_name.indexOf('(')); curr = (qpycore_pyqtSignal *)PyType_GenericAlloc(&qpycore_pyqtSignal_Type, 0); if (!curr) return -1; curr->master = curr; curr->non_signals = sigs->non_signals; curr->overloads = new QList<Chimera::Signature *>; } // Add the new overload. if (add_overload(curr, sigs->signature, sigs->docstring) < 0) { Py_DECREF((PyObject *)curr); return -1; } } while ((++sigs)->signature); // Save the last one. return PyDict_SetItemString(dict, curr_name.constData(), (PyObject *)curr); }
// The type init slot. static int pyqtSignal_init(PyObject *self, PyObject *args, PyObject *kwd_args) { qpycore_pyqtSignal *ps = (qpycore_pyqtSignal *)self; // Get the keyword arguments. PyObject *name_obj = 0; const char *name = 0; if (kwd_args) { SIP_SSIZE_T pos = 0; PyObject *key, *value; while (PyDict_Next(kwd_args, &pos, &key, &value)) { #if PY_MAJOR_VERSION >= 3 if (PyUnicode_CompareWithASCIIString(key, "name") != 0) { PyErr_Format(PyExc_TypeError, "pyqtSignal() got an unexpected keyword argument '%U'", key); Py_XDECREF(name_obj); return -1; } #else Q_ASSERT(PyString_Check(key)); if (qstrcmp(PyString_AS_STRING(key), "name") != 0) { PyErr_Format(PyExc_TypeError, "pyqtSignal() got an unexpected keyword argument '%s'", PyString_AS_STRING(key)); Py_XDECREF(name_obj); return -1; } #endif name_obj = value; name = sipString_AsASCIIString(&name_obj); if (!name) return -1; } } // If there is at least one argument and it is a sequence then assume all // arguments are sequences. Unfortunately a string is also a sequence so // check for tuples and lists explicitly. if (PyTuple_GET_SIZE(args) > 0 && (PyTuple_Check(PyTuple_GET_ITEM(args, 0)) || PyList_Check(PyTuple_GET_ITEM(args, 0)))) { for (SIP_SSIZE_T i = 0; i < PyTuple_GET_SIZE(args); ++i) { PyObject *types = PySequence_Tuple(PyTuple_GET_ITEM(args, i)); if (!types) { PyErr_SetString(PyExc_TypeError, "pyqtSignal() argument expected to be sequence of types"); if (name) { Py_DECREF(name_obj); } return -1; } int rc = add_overload(ps, name, types); Py_DECREF(types); if (rc < 0) { if (name) { Py_DECREF(name_obj); } return -1; } } } else if (add_overload(ps, name, args) < 0) { if (name) { Py_DECREF(name_obj); } return -1; } if (name) { Py_DECREF(name_obj); } return 0; }