summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--gobject/gobjectmodule.c8
-rw-r--r--tests/test_signal.py10
3 files changed, 27 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index f3d139e..92292f7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
2008-08-11 Paul Pogonyshev <pogonyshev@gmx.net>
+ Bug 540376 – No TypeError raised when type is None
+
+ * gobject/gobjectmodule.c (pyg_signal_new): Add check on second
+ argument type.
+
+ * tests/test_signal.py (TestSignalCreation): New test case.
+
+2008-08-11 Paul Pogonyshev <pogonyshev@gmx.net>
+
Bug 547104 – improve type wrapper creation
* gio/gappinfo.override (_wrap_g_app_info_tp_richcompare)
diff --git a/gobject/gobjectmodule.c b/gobject/gobjectmodule.c
index b7fadfd..29ccdf2 100644
--- a/gobject/gobjectmodule.c
+++ b/gobject/gobjectmodule.c
@@ -1314,12 +1314,20 @@ pyg_signal_new(PyObject *self, PyObject *args)
&py_type, &signal_flags, &py_return_type,
&py_param_types))
return NULL;
+
instance_type = pyg_type_from_object(py_type);
if (!instance_type)
return NULL;
+ if (!(G_TYPE_IS_INSTANTIATABLE(instance_type) || G_TYPE_IS_INTERFACE(instance_type))) {
+ PyErr_SetString(PyExc_TypeError,
+ "argument 2 must be an object type or interface type");
+ return NULL;
+ }
+
return_type = pyg_type_from_object(py_return_type);
if (!return_type)
return NULL;
+
if (!PySequence_Check(py_param_types)) {
PyErr_SetString(PyExc_TypeError,
"argument 5 must be a sequence of GType codes");
diff --git a/tests/test_signal.py b/tests/test_signal.py
index 6c41ece..96e0731 100644
--- a/tests/test_signal.py
+++ b/tests/test_signal.py
@@ -17,6 +17,16 @@ class D(C):
self.arg2 = arg2
C.do_my_signal(self, arg2)
+class TestSignalCreation(unittest.TestCase):
+ # Bug 540376.
+ def test_illegals(self):
+ self.assertRaises(TypeError, lambda: gobject.signal_new('test',
+ None,
+ 0,
+ gobject.TYPE_NONE,
+ (gobject.TYPE_LONG,)))
+
+
class TestChaining(unittest.TestCase):
def setUp(self):
self.inst = C()