From 367536b2aad4c076141d6075b766c246a102d763 Mon Sep 17 00:00:00 2001 From: Renato Filho Date: Mon, 17 May 2010 16:50:25 -0300 Subject: Removed init[slot,signal] from public api. Use PyObject_dir to discovery signals methods. (this is very slow) Reviewer: Hugo Parente Lima , Luciano Wolf --- libpyside/pyside.cpp | 4 ++-- libpyside/qsignal.cpp | 27 ++++++++++----------------- libpyside/qslot.cpp | 2 +- tests/signals/signal_object_test.py | 14 ++++++++------ 4 files changed, 21 insertions(+), 26 deletions(-) diff --git a/libpyside/pyside.cpp b/libpyside/pyside.cpp index 02eea7867..3fa63a498 100644 --- a/libpyside/pyside.cpp +++ b/libpyside/pyside.cpp @@ -35,8 +35,8 @@ #include "pyside.h" -extern "C" PyAPI_FUNC(void) init_signal(PyObject* module); -extern "C" PyAPI_FUNC(void) init_slot(PyObject* module); +extern "C" void init_signal(PyObject* module); +extern "C" void init_slot(PyObject* module); namespace PySide { diff --git a/libpyside/qsignal.cpp b/libpyside/qsignal.cpp index 2aa07d5c2..508d9e557 100644 --- a/libpyside/qsignal.cpp +++ b/libpyside/qsignal.cpp @@ -152,7 +152,7 @@ PyTypeObject SignalInstance_Type = { }; -PyAPI_FUNC(void) init_signal(PyObject* module) +void init_signal(PyObject* module) { if (PyType_Ready(&Signal_Type) < 0) return; @@ -192,17 +192,16 @@ PyObject* signal_instance_get_item(PyObject* self, PyObject* key) void signal_update_source(PyObject* source) { - PyObject* key; - PyObject* value; - Py_ssize_t pos = 0; - PyTypeObject* obType = source->ob_type; - - while (PyDict_Next(obType->tp_dict, &pos, &key, &value)) { - if (value->ob_type == &Signal_Type) { + PyObject* attrs = PyObject_Dir(source); + for(int i = 0, i_max = PyList_Size(attrs); i < i_max; i++) { + PyObject *attrName = PyList_GET_ITEM(attrs, i); + PyObject *attr = PyObject_GetAttr(source, attrName); + if (attr->ob_type == &Signal_Type) { Shiboken::AutoDecRef signalInstance(reinterpret_cast(PyObject_New(SignalInstanceData, &SignalInstance_Type))); - signal_instance_initialize(signalInstance, key, reinterpret_cast(value), source, 0); - PyObject_SetAttr(source, key, signalInstance); + signal_instance_initialize(signalInstance, attrName, reinterpret_cast(attr), source, 0); + PyObject_SetAttr(source, attrName, signalInstance); } + Py_DECREF(attr); } } @@ -307,7 +306,7 @@ void signal_free(void *self) free(data->signatures); free(data->signalName); - data->initialized = false; + data->initialized = 0; data->signaturesSize = 0; pySelf->ob_type->tp_base->tp_free(self); @@ -330,9 +329,6 @@ void signal_instance_free(void* self) void signal_instance_initialize(PyObject* instance, PyObject* name, SignalData* data, PyObject* source, int index) { - if (data->initialized) - return; - SignalInstanceData *self = reinterpret_cast(instance); if (data->signalName) self->signalName = strdup(data->signalName); @@ -347,9 +343,6 @@ void signal_instance_initialize(PyObject* instance, PyObject* name, SignalData* self->next = reinterpret_cast(PyObject_New(SignalInstanceData, &SignalInstance_Type)); signal_instance_initialize(self->next, name, data, source, index); } - - if (index == 0) - data->initialized = true; } PyObject* signal_instance_connect(PyObject* self, PyObject* args, PyObject* kwds) diff --git a/libpyside/qslot.cpp b/libpyside/qslot.cpp index 85ab30d71..8ff04887c 100644 --- a/libpyside/qslot.cpp +++ b/libpyside/qslot.cpp @@ -74,7 +74,7 @@ static PyTypeObject Slot_Type = { 0, /*tp_del */ }; -PyAPI_FUNC(void) init_slot(PyObject *module) +void init_slot(PyObject *module) { if (PyType_Ready(&Slot_Type) < 0) return; diff --git a/tests/signals/signal_object_test.py b/tests/signals/signal_object_test.py index d4a35dced..ead4b68b9 100644 --- a/tests/signals/signal_object_test.py +++ b/tests/signals/signal_object_test.py @@ -5,8 +5,9 @@ import unittest import functools from PySide.QtCore import * +from helper import UsesQCoreApplication -class MyObject(QObject): +class MyObject(QTimer): sig1 = Signal() sig2 = Signal(int, name='rangeChanged') sig3 = Signal(int) @@ -15,10 +16,8 @@ class MyObject(QObject): @Slot(int) def myRange(self, r): - print "Range changed:", r self._range = r - def slot1(self): self._called = True @@ -26,9 +25,10 @@ class MyObject(QObject): self._s = s -class SignalObjectTest(unittest.TestCase): +class SignalObjectTest(UsesQCoreApplication): def cb(self): self._cb_called = True + self.app.exit() def testsingleConnect(self): o = MyObject() @@ -55,8 +55,10 @@ class SignalObjectTest(unittest.TestCase): def testGeneretedSignal(self): o = MyObject() - o.destroyed.connect(self.cb) - self.assertEqual(self._cb_called) + o.timeout.connect(self.cb) + o.start(100) + self.app.exec_() + self.assert_(self._cb_called) if __name__ == '__main__': unittest.main() -- cgit v1.2.3