summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Feltman <sfeltman@src.gnome.org>2014-01-01 19:57:06 -0800
committerSimon Feltman <sfeltman@src.gnome.org>2014-01-01 19:57:06 -0800
commite8359847136e9ad76a670a382c0abc61cb4e81d3 (patch)
treeae514accfc7450852c3b2ab81e336ddc9fde4598
parent9ce527b09ed032f2cc83c2d83de8bb6d7b19be02 (diff)
downloadpygobject-e8359847136e9ad76a670a382c0abc61cb4e81d3.tar.gz
Cleanup disguised struct constructor error and add it to boxed
Give a cleaner error message when an attempt is made to create a disguised struct which also gives a hint to look at the pydoc. Add similar error to disguised boxed/unions. https://bugzilla.gnome.org/show_bug.cgi?id=647249
-rw-r--r--gi/pygi-boxed.c17
-rw-r--r--gi/pygi-struct.c2
-rw-r--r--tests/test_everything.py1
-rw-r--r--tests/test_glib.py4
4 files changed, 19 insertions, 5 deletions
diff --git a/gi/pygi-boxed.c b/gi/pygi-boxed.c
index d352e232..ea798ff6 100644
--- a/gi/pygi-boxed.c
+++ b/gi/pygi-boxed.c
@@ -47,7 +47,8 @@ _boxed_dealloc (PyGIBoxed *self)
void *
_pygi_boxed_alloc (GIBaseInfo *info, gsize *size_out)
{
- gsize size;
+ gpointer boxed = NULL;
+ gsize size = 0;
switch (g_base_info_get_type (info)) {
case GI_INFO_TYPE_UNION:
@@ -64,10 +65,21 @@ _pygi_boxed_alloc (GIBaseInfo *info, gsize *size_out)
return NULL;
}
+ if (size == 0) {
+ PyErr_Format (PyExc_TypeError,
+ "boxed cannot be created directly; try using a constructor, see: help(%s.%s)",
+ g_base_info_get_namespace (info),
+ g_base_info_get_name (info));
+ return NULL;
+ }
+
if( size_out != NULL)
*size_out = size;
- return g_slice_alloc0 (size);
+ boxed = g_slice_alloc0 (size);
+ if (boxed == NULL)
+ PyErr_NoMemory();
+ return boxed;
}
static PyObject *
@@ -90,7 +102,6 @@ _boxed_new (PyTypeObject *type,
boxed = _pygi_boxed_alloc (info, &size);
if (boxed == NULL) {
- PyErr_NoMemory();
goto out;
}
diff --git a/gi/pygi-struct.c b/gi/pygi-struct.c
index 29ea38e8..38f6a8ae 100644
--- a/gi/pygi-struct.c
+++ b/gi/pygi-struct.c
@@ -72,7 +72,7 @@ _struct_new (PyTypeObject *type,
size = g_struct_info_get_size ( (GIStructInfo *) info);
if (size == 0) {
PyErr_Format (PyExc_TypeError,
- "cannot allocate disguised struct %s.%s; consider adding a constructor to the library or to the overrides",
+ "struct cannot be created directly; try using a constructor, see: help(%s.%s)",
g_base_info_get_namespace (info),
g_base_info_get_name (info));
goto out;
diff --git a/tests/test_everything.py b/tests/test_everything.py
index 5c4ba6bc..61b40e14 100644
--- a/tests/test_everything.py
+++ b/tests/test_everything.py
@@ -540,7 +540,6 @@ class TestEverything(unittest.TestCase):
(e_type, e_value, e_tb) = sys.exc_info()
self.assertEqual(e_type, TypeError)
self.assertTrue('TestBoxedPrivate' in str(e_value), str(e_value))
- self.assertTrue('override' in str(e_value), str(e_value))
self.assertTrue('constructor' in str(e_value), str(e_value))
tb = ''.join(traceback.format_exception(e_type, e_value, e_tb))
self.assertTrue('tests/test_everything.py", line' in tb, tb)
diff --git a/tests/test_glib.py b/tests/test_glib.py
index a01e83e5..995d8471 100644
--- a/tests/test_glib.py
+++ b/tests/test_glib.py
@@ -225,3 +225,7 @@ https://my.org/q?x=1&y=2
self.assertGreaterEqual(major, 3)
self.assertGreaterEqual(minor, 0)
self.assertGreaterEqual(micro, 0)
+
+ def test_timezone_constructor_error(self):
+ self.assertRaisesRegexp(TypeError, '.*constructor.*help\(GLib.TimeZone\).*',
+ GLib.TimeZone)