[pygi] Set a default constructor for boxed structs that don't have one



commit 66c34805223af9e63c7d61f21a3dbd7505a8f256
Author: Tomeu Vizoso <tomeu sugarlabs org>
Date:   Mon Nov 30 10:03:34 2009 +0000

    Set a default constructor for boxed structs that don't have one
    
    https://bugzilla.gnome.org/show_bug.cgi?id=602735

 gi/Makefile.am     |    2 +
 gi/gimodule.c      |    1 +
 gi/module.py       |    2 +-
 gi/pygi-argument.c |   14 ++++-
 gi/pygi-boxed.c    |  184 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 gi/pygi-boxed.h    |   40 +++++++++++
 gi/pygi-info.c     |    2 +-
 gi/pygi-private.h  |    1 +
 gi/pygi.h          |    6 ++
 gi/types.py        |   18 -----
 tests/libtestgi.c  |   72 ++++++++++----------
 tests/libtestgi.h  |   18 +++---
 tests/test_gi.py   |   47 ++++++++------
 13 files changed, 321 insertions(+), 86 deletions(-)
---
diff --git a/gi/Makefile.am b/gi/Makefile.am
index 2657d3f..bda8a34 100644
--- a/gi/Makefile.am
+++ b/gi/Makefile.am
@@ -34,6 +34,8 @@ _gi_la_SOURCES = \
 	pygi-argument.h \
 	pygi-type.c \
 	pygi-type.h \
+	pygi-boxed.c \
+	pygi-boxed.h \
 	pygi.h \
 	pygi-private.h \
 	pygobject-external.h \
diff --git a/gi/gimodule.c b/gi/gimodule.c
index bc5f9ca..8811539 100644
--- a/gi/gimodule.c
+++ b/gi/gimodule.c
@@ -166,6 +166,7 @@ init_gi(void)
     _pygi_repository_register_types(m);
     _pygi_info_register_types(m);
     _pygi_struct_register_types(m);
+    _pygi_boxed_register_types(m);
     _pygi_argument_init();
 
     api = PyCObject_FromVoidPtr((void *)&PyGI_API, NULL);
diff --git a/gi/module.py b/gi/module.py
index 1a54971..efc8af8 100644
--- a/gi/module.py
+++ b/gi/module.py
@@ -35,12 +35,12 @@ from ._gi import \
     ConstantInfo, \
     StructInfo, \
     Struct, \
+    Boxed, \
     enum_add, \
     flags_add
 from .types import \
     GObjectMeta, \
     StructMeta, \
-    Boxed, \
     Function
 
 repository = Repository.get_default()
diff --git a/gi/pygi-argument.c b/gi/pygi-argument.c
index 8411b62..eab48f6 100644
--- a/gi/pygi-argument.c
+++ b/gi/pygi-argument.c
@@ -1557,8 +1557,20 @@ _pygi_argument_to_object (GArgument  *arg,
                         g_assert(is_pointer);
                         object = pyg_value_as_pyobject(arg->v_pointer, FALSE);
                     } else if (g_type_is_a(type, G_TYPE_BOXED)) {
+                        PyObject *py_type;
+
                         g_assert(is_pointer);
-                        object = pyg_boxed_new(type, arg->v_pointer, FALSE, transfer == GI_TRANSFER_EVERYTHING);
+
+                        py_type = _pygi_type_get_from_g_type(type);
+                        if (py_type == NULL) {
+                            PyErr_Format(PyExc_ValueError, "couldn't find a wrapper for type '%s'",
+                                         g_type_name(type));
+                            break;
+                        }
+
+                        object = _pygi_boxed_new((PyTypeObject *)py_type, arg->v_pointer, transfer == GI_TRANSFER_EVERYTHING);
+
+                        Py_DECREF(py_type);
                     } else if (g_type_is_a(type, G_TYPE_POINTER)) {
                         PyObject *py_type;
 
diff --git a/gi/pygi-boxed.c b/gi/pygi-boxed.c
new file mode 100644
index 0000000..d17da2d
--- /dev/null
+++ b/gi/pygi-boxed.c
@@ -0,0 +1,184 @@
+/* -*- Mode: C; c-basic-offset: 4 -*-
+ * vim: tabstop=4 shiftwidth=4 expandtab
+ *
+ * Copyright (C) 2009 Simon van der Linden <svdlinden src gnome org>
+ *
+ *   pygi-boxed.c: wrapper to handle registered structures.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
+ * USA
+ */
+
+#include "pygi-private.h"
+
+#include <pygobject.h>
+#include <girepository.h>
+
+static void
+_boxed_dealloc (PyGIBoxed *self)
+{
+    GType g_type;
+
+    PyObject_GC_UnTrack((PyObject *)self);
+
+    PyObject_ClearWeakRefs((PyObject *)self);
+
+    if (((PyGBoxed *)self)->free_on_dealloc) {
+        if (self->slice_allocated) {
+            g_slice_free1(self->size, ((PyGBoxed *)self)->boxed);
+        } else {
+            g_type = pyg_type_from_object((PyObject *)self);
+            g_boxed_free (g_type, ((PyGBoxed *)self)->boxed);
+        }
+    }
+
+    ((PyGObject *)self)->ob_type->tp_free((PyObject *)self);
+}
+
+static PyObject *
+_boxed_new (PyTypeObject *type,
+            PyObject     *args,
+            PyObject     *kwargs)
+{
+    static char *kwlist[] = { NULL };
+
+    GIBaseInfo *info;
+    gboolean is_simple;
+    gsize size;
+    gpointer boxed;
+    PyGIBoxed *self = NULL;
+
+    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "", kwlist)) {
+        return NULL;
+    }
+
+    info = _pygi_object_get_gi_info((PyObject *)type, &PyGIStructInfo_Type);
+    if (info == NULL) {
+        if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
+            PyErr_Format(PyExc_TypeError, "missing introspection information");
+        }
+        return NULL;
+    }
+
+    size = g_struct_info_get_size((GIStructInfo *)info);
+    boxed = g_slice_alloc0(size);
+    if (boxed == NULL) {
+        PyErr_NoMemory();
+        goto out;
+    }
+
+    self = (PyGIBoxed *)_pygi_boxed_new(type, boxed, TRUE);
+    if (self == NULL) {
+        g_slice_free1(size, boxed);
+        goto out;
+    }
+
+    self->size = size;
+    self->slice_allocated = TRUE;
+
+out:
+    g_base_info_unref(info);
+
+    return (PyObject *)self;
+}
+
+static int
+_boxed_init (PyObject *self,
+              PyObject *args,
+              PyObject *kwargs)
+{
+    /* Don't call PyGBoxed's init, which raises an exception. */
+    return 0;
+}
+
+
+PyTypeObject PyGIBoxed_Type = {
+    PyObject_HEAD_INIT(NULL)
+    0,
+    "gi.Boxed",                                /* tp_name */
+    sizeof(PyGIBoxed),                         /* tp_basicsize */
+    0,                                         /* tp_itemsize */
+    (destructor)_boxed_dealloc,                /* tp_dealloc */
+    (printfunc)NULL,                           /* tp_print */
+    (getattrfunc)NULL,                         /* tp_getattr */
+    (setattrfunc)NULL,                         /* tp_setattr */
+    (cmpfunc)NULL,                             /* tp_compare */
+    (reprfunc)NULL,                            /* tp_repr */
+    NULL,                                      /* tp_as_number */
+    NULL,                                      /* tp_as_sequence */
+    NULL,                                      /* tp_as_mapping */
+    (hashfunc)NULL,                            /* tp_hash */
+    (ternaryfunc)NULL,                         /* tp_call */
+    (reprfunc)NULL,                            /* tp_str */
+    (getattrofunc)NULL,                        /* tp_getattro */
+    (setattrofunc)NULL,                        /* tp_setattro */
+    NULL,                                      /* tp_as_buffer */
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,  /* tp_flags */
+    NULL,                                      /* tp_doc */
+    (traverseproc)NULL,                        /* tp_traverse */
+    (inquiry)NULL,                             /* tp_clear */
+    (richcmpfunc)NULL,                         /* tp_richcompare */
+    0,                                         /* tp_weaklistoffset */
+    (getiterfunc)NULL,                         /* tp_iter */
+    (iternextfunc)NULL,                        /* tp_iternext */
+    NULL,                                      /* tp_methods */
+    NULL,                                      /* tp_members */
+    NULL,                                      /* tp_getset */
+    (PyTypeObject *)NULL,                      /* tp_base */
+};
+
+PyObject *
+_pygi_boxed_new (PyTypeObject *type,
+                 gpointer      boxed,
+                 gboolean      free_on_dealloc)
+{
+    PyGIBoxed *self;
+    GType g_type;
+
+    if (!boxed) {
+        Py_RETURN_NONE;
+    }
+
+    if (!PyType_IsSubtype(type, &PyGIBoxed_Type)) {
+        PyErr_SetString(PyExc_TypeError, "must be a subtype of gi.Boxed");
+        return NULL;
+    }
+
+    self = (PyGIBoxed *)type->tp_alloc(type, 0);
+    if (self == NULL) {
+        return NULL;
+    }
+
+    ((PyGBoxed *)self)->gtype = pyg_type_from_object((PyObject *)type);
+    ((PyGBoxed *)self)->boxed = boxed;
+    ((PyGBoxed *)self)->free_on_dealloc = free_on_dealloc;
+    self->size = 0;
+    self->slice_allocated = FALSE;
+
+    return (PyObject *)self;
+}
+
+void
+_pygi_boxed_register_types (PyObject *m)
+{
+    PyGIBoxed_Type.ob_type = &PyType_Type;
+    PyGIBoxed_Type.tp_base = &PyGBoxed_Type;
+    PyGIBoxed_Type.tp_new = (newfunc)_boxed_new;
+    PyGIBoxed_Type.tp_init = (initproc)_boxed_init;
+    if (PyType_Ready(&PyGIBoxed_Type))
+        return;
+    if (PyModule_AddObject(m, "Boxed", (PyObject *)&PyGIBoxed_Type))
+        return;
+}
diff --git a/gi/pygi-boxed.h b/gi/pygi-boxed.h
new file mode 100644
index 0000000..4f84060
--- /dev/null
+++ b/gi/pygi-boxed.h
@@ -0,0 +1,40 @@
+/* -*- Mode: C; c-basic-offset: 4 -*-
+ * vim: tabstop=4 shiftwidth=4 expandtab
+ *
+ * Copyright (C) 2009 Simon van der Linden <svdlinden src gnome org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
+ * USA
+ */
+
+#ifndef __PYGI_BOXED_H__
+#define __PYGI_BOXED_H__
+
+#include <Python.h>
+
+G_BEGIN_DECLS
+
+extern PyTypeObject PyGIBoxed_Type;
+
+PyObject *
+_pygi_boxed_new (PyTypeObject *type,
+                 gpointer      boxed,
+                 gboolean      free_on_dealloc);
+
+void _pygi_boxed_register_types (PyObject *m);
+
+G_END_DECLS
+
+#endif /* __PYGI_BOXED_H__ */
diff --git a/gi/pygi-info.c b/gi/pygi-info.c
index 5f4a174..56aee16 100644
--- a/gi/pygi-info.c
+++ b/gi/pygi-info.c
@@ -981,7 +981,7 @@ _wrap_g_function_info_invoke (PyGIBaseInfo *self,
                         break;
                     }
                     g_warn_if_fail(transfer == GI_TRANSFER_EVERYTHING);
-                    return_value = pyg_boxed_new(type, return_arg.v_pointer, FALSE, transfer == GI_TRANSFER_EVERYTHING);
+                    return_value = _pygi_boxed_new(py_type, return_arg.v_pointer, transfer == GI_TRANSFER_EVERYTHING);
                 } else if (g_type_is_a(type, G_TYPE_POINTER) || type == G_TYPE_NONE) {
                     if (return_arg.v_pointer == NULL) {
                         PyErr_SetString(PyExc_TypeError, "constructor returned NULL");
diff --git a/gi/pygi-private.h b/gi/pygi-private.h
index 6ca85c8..4e2615f 100644
--- a/gi/pygi-private.h
+++ b/gi/pygi-private.h
@@ -21,6 +21,7 @@
 #include "pygi-repository.h"
 #include "pygi-info.h"
 #include "pygi-struct.h"
+#include "pygi-boxed.h"
 #include "pygi-argument.h"
 #include "pygi-type.h"
 
diff --git a/gi/pygi.h b/gi/pygi.h
index 930017d..5ee8d94 100644
--- a/gi/pygi.h
+++ b/gi/pygi.h
@@ -44,6 +44,12 @@ typedef struct {
     gboolean free_on_dealloc;
 } PyGIStruct;
 
+typedef struct {
+    PyGBoxed base;
+    gboolean slice_allocated;
+    gsize size;
+} PyGIBoxed;
+
 
 struct PyGI_API {
     PyObject* (*type_import_by_g_type) (GType g_type);
diff --git a/gi/types.py b/gi/types.py
index 87dbe16..75b41b9 100644
--- a/gi/types.py
+++ b/gi/types.py
@@ -33,24 +33,6 @@ from ._gi import \
     register_interface_info
 
 
-class Boxed(gobject.GBoxed):
-    # Instances of boxed structures cannot be constructed unless they have a
-    # specific constructor.
-    #
-    # To achieve this behavior, PyGBoxed_Type's constructor creates an
-    # instance, and the initializer eventually raises an exception. If things
-    # had been implemented correctly, PyGBoxed_Type.tp_new would have been set to
-    # NULL, and neither a creator nor an initializer wouldn't have been needed.
-    #
-    # In order to keep the code generic, we need to revert the right behavior.
-
-    def __new__(cls):
-        raise TypeError, "instances of '%s' cannot be created" % cls.__name__
-
-    def __init__(self, *args, **kwargs):
-        pass
-
-
 def Function(info):
 
     def function(*args):
diff --git a/tests/libtestgi.c b/tests/libtestgi.c
index 613c0d9..ac18095 100644
--- a/tests/libtestgi.c
+++ b/tests/libtestgi.c
@@ -3023,12 +3023,12 @@ test_gi__pointer_struct_inout (TestGIPointerStruct **struct_)
 }
 
 
-TestGIBoxedStruct *
-test_gi_boxed_struct_copy (TestGIBoxedStruct *struct_)
+TestGIBoxedWithoutConstructorStruct *
+test_gi_boxed_without_constructor_struct_copy (TestGIBoxedWithoutConstructorStruct *struct_)
 {
-    TestGIBoxedStruct *new_struct;
+    TestGIBoxedWithoutConstructorStruct *new_struct;
 
-    new_struct = g_slice_new (TestGIBoxedStruct);
+    new_struct = g_slice_new (TestGIBoxedWithoutConstructorStruct);
 
     *new_struct = *struct_;
 
@@ -3036,32 +3036,32 @@ test_gi_boxed_struct_copy (TestGIBoxedStruct *struct_)
 }
 
 static void
-test_gi_boxed_struct_free (TestGIBoxedStruct *struct_)
+test_gi_boxed_without_constructor_struct_free (TestGIBoxedWithoutConstructorStruct *struct_)
 {
-    g_slice_free (TestGIBoxedStruct, struct_);
+    g_slice_free (TestGIBoxedWithoutConstructorStruct, struct_);
 }
 
 GType
-test_gi_boxed_struct_get_type (void)
+test_gi_boxed_without_constructor_struct_get_type (void)
 {
     static GType type = 0;
 
     if (type == 0) {
-        type = g_boxed_type_register_static ("TestGIBoxedStruct",
-                (GBoxedCopyFunc) test_gi_boxed_struct_copy,
-                (GBoxedFreeFunc) test_gi_boxed_struct_free);
+        type = g_boxed_type_register_static ("TestGIBoxedWithoutConstructorStruct",
+                (GBoxedCopyFunc) test_gi_boxed_without_constructor_struct_copy,
+                (GBoxedFreeFunc) test_gi_boxed_without_constructor_struct_free);
     }
 
     return type;
 }
 
 
-TestGIBoxedInstantiableStruct *
-test_gi_boxed_instantiable_struct_copy (TestGIBoxedInstantiableStruct *struct_)
+TestGIBoxedStruct *
+test_gi_boxed_struct_copy (TestGIBoxedStruct *struct_)
 {
-    TestGIBoxedInstantiableStruct *new_struct;
+    TestGIBoxedStruct *new_struct;
 
-    new_struct = g_slice_new (TestGIBoxedInstantiableStruct);
+    new_struct = g_slice_new (TestGIBoxedStruct);
 
     *new_struct = *struct_;
 
@@ -3069,42 +3069,42 @@ test_gi_boxed_instantiable_struct_copy (TestGIBoxedInstantiableStruct *struct_)
 }
 
 static void
-test_gi_boxed_instantiable_struct_free (TestGIBoxedInstantiableStruct *struct_)
+test_gi_boxed_struct_free (TestGIBoxedStruct *struct_)
 {
-    g_slice_free (TestGIBoxedInstantiableStruct, struct_);
+    g_slice_free (TestGIBoxedStruct, struct_);
 }
 
 GType
-test_gi_boxed_instantiable_struct_get_type (void)
+test_gi_boxed_struct_get_type (void)
 {
     static GType type = 0;
 
     if (type == 0) {
-        type = g_boxed_type_register_static ("TestGIBoxedInstantiableStruct",
-                (GBoxedCopyFunc) test_gi_boxed_instantiable_struct_copy,
-                (GBoxedFreeFunc) test_gi_boxed_instantiable_struct_free);
+        type = g_boxed_type_register_static ("TestGIBoxedStruct",
+                (GBoxedCopyFunc) test_gi_boxed_struct_copy,
+                (GBoxedFreeFunc) test_gi_boxed_struct_free);
     }
 
     return type;
 }
 
-TestGIBoxedInstantiableStruct *
-test_gi_boxed_instantiable_struct_new (void)
+TestGIBoxedStruct *
+test_gi_boxed_struct_new (void)
 {
-    return g_slice_new (TestGIBoxedInstantiableStruct);
+    return g_slice_new (TestGIBoxedStruct);
 }
 
 /**
- * test_gi__boxed_instantiable_struct_return:
+ * test_gi__boxed_struct_return:
  * Returns: (transfer none):
  */
-TestGIBoxedInstantiableStruct *
-test_gi__boxed_instantiable_struct_return (void)
+TestGIBoxedStruct *
+test_gi__boxed_struct_return (void)
 {
-    static TestGIBoxedInstantiableStruct *struct_ = NULL;
+    static TestGIBoxedStruct *struct_ = NULL;
 
     if (struct_ == NULL) {
-        struct_ = g_new(TestGIBoxedInstantiableStruct, 1);
+        struct_ = g_new(TestGIBoxedStruct, 1);
 
         struct_->long_ = 42;
     }
@@ -3113,26 +3113,26 @@ test_gi__boxed_instantiable_struct_return (void)
 }
 
 /**
- * test_gi__boxed_instantiable_struct_in:
+ * test_gi__boxed_struct_in:
  * @struct_: (transfer none):
  */
 void
-test_gi__boxed_instantiable_struct_in (TestGIBoxedInstantiableStruct *struct_)
+test_gi__boxed_struct_in (TestGIBoxedStruct *struct_)
 {
     g_assert(struct_->long_ == 42);
 }
 
 /**
- * test_gi__boxed_instantiable_struct_out:
+ * test_gi__boxed_struct_out:
  * @struct_: (out) (transfer none):
  */
 void
-test_gi__boxed_instantiable_struct_out (TestGIBoxedInstantiableStruct **struct_)
+test_gi__boxed_struct_out (TestGIBoxedStruct **struct_)
 {
-    static TestGIBoxedInstantiableStruct *new_struct = NULL;
+    static TestGIBoxedStruct *new_struct = NULL;
 
     if (new_struct == NULL) {
-        new_struct = g_new(TestGIBoxedInstantiableStruct, 1);
+        new_struct = g_new(TestGIBoxedStruct, 1);
 
         new_struct->long_ = 42;
     }
@@ -3141,11 +3141,11 @@ test_gi__boxed_instantiable_struct_out (TestGIBoxedInstantiableStruct **struct_)
 }
 
 /**
- * test_gi__boxed_instantiable_struct_inout:
+ * test_gi__boxed_struct_inout:
  * @struct_: (inout) (transfer none):
  */
 void
-test_gi__boxed_instantiable_struct_inout (TestGIBoxedInstantiableStruct **struct_)
+test_gi__boxed_struct_inout (TestGIBoxedStruct **struct_)
 {
     g_assert((*struct_)->long_ == 42);
 
diff --git a/tests/libtestgi.h b/tests/libtestgi.h
index 7c344af..cbf6f9b 100644
--- a/tests/libtestgi.h
+++ b/tests/libtestgi.h
@@ -544,26 +544,26 @@ void test_gi__pointer_struct_inout (TestGIPointerStruct **struct_);
 
 typedef struct {
     glong long_;
-} TestGIBoxedStruct;
+} TestGIBoxedWithoutConstructorStruct;
 
-GType test_gi_boxed_struct_get_type (void) G_GNUC_CONST;
+GType test_gi_boxed_without_constructor_struct_get_type (void) G_GNUC_CONST;
 
 
 typedef struct {
     glong long_;
-} TestGIBoxedInstantiableStruct;
+} TestGIBoxedStruct;
 
-GType test_gi_boxed_instantiable_struct_get_type (void) G_GNUC_CONST;
+GType test_gi_boxed_struct_get_type (void) G_GNUC_CONST;
 
-TestGIBoxedInstantiableStruct *test_gi_boxed_instantiable_struct_new (void);
+TestGIBoxedStruct *test_gi_boxed_struct_new (void);
 
-TestGIBoxedInstantiableStruct *test_gi__boxed_instantiable_struct_return (void);
+TestGIBoxedStruct *test_gi__boxed_struct_return (void);
 
-void test_gi__boxed_instantiable_struct_in (TestGIBoxedInstantiableStruct *struct_);
+void test_gi__boxed_struct_in (TestGIBoxedStruct *struct_);
 
-void test_gi__boxed_instantiable_struct_out (TestGIBoxedInstantiableStruct **struct_);
+void test_gi__boxed_struct_out (TestGIBoxedStruct **struct_);
 
-void test_gi__boxed_instantiable_struct_inout (TestGIBoxedInstantiableStruct **struct_);
+void test_gi__boxed_struct_inout (TestGIBoxedStruct **struct_);
 
 
 /* Object */
diff --git a/tests/test_gi.py b/tests/test_gi.py
index 4503d62..ecbc0c8 100644
--- a/tests/test_gi.py
+++ b/tests/test_gi.py
@@ -1228,54 +1228,61 @@ class TestStructure(unittest.TestCase):
         del in_struct
         del out_struct
 
+    def test_boxed_without_constructor_struct(self):
+        self.assertTrue(issubclass(TestGI.BoxedWithoutConstructorStruct, gobject.GBoxed))
 
-    def test_boxed_struct(self):
-        self.assertTrue(issubclass(TestGI.BoxedStruct, gobject.GBoxed))
+        struct = TestGI.BoxedWithoutConstructorStruct()
+
+        self.assertTrue(isinstance(struct, TestGI.BoxedWithoutConstructorStruct))
 
-        self.assertRaises(TypeError, TestGI.BoxedStruct)
+        new_struct = struct.copy()
+        self.assertTrue(isinstance(new_struct, TestGI.BoxedWithoutConstructorStruct))
 
-    def test_boxed_instantiable_struct(self):
-        struct = TestGI.BoxedInstantiableStruct()
+        del struct
+        del new_struct
+
+    def test_boxed_struct(self):
+        struct = TestGI.BoxedStruct()
 
-        self.assertTrue(isinstance(struct, TestGI.BoxedInstantiableStruct))
+        self.assertTrue(isinstance(struct, TestGI.BoxedStruct))
 
         new_struct = struct.copy()
-        self.assertTrue(isinstance(new_struct, TestGI.BoxedInstantiableStruct))
+        self.assertTrue(isinstance(new_struct, TestGI.BoxedStruct))
 
         del struct
         del new_struct
 
-    def test_boxed_instantiable_struct_return(self):
-        struct = TestGI.boxed_instantiable_struct_return()
+    def test_boxed_struct_return(self):
+        struct = TestGI.boxed_struct_return()
 
-        self.assertTrue(isinstance(struct, TestGI.BoxedInstantiableStruct))
+        self.assertTrue(isinstance(struct, TestGI.BoxedStruct))
         self.assertEquals(42, struct.long_)
 
         del struct
 
-    def test_boxed_instantiable_struct_in(self):
-        struct = TestGI.BoxedInstantiableStruct()
+    def test_boxed_struct_in(self):
+        struct = TestGI.BoxedStruct()
         struct.long_ = 42
 
-        TestGI.boxed_instantiable_struct_in(struct)
+        TestGI.boxed_struct_in(struct)
 
         del struct
 
-    def test_boxed_instantiable_struct_out(self):
-        struct = TestGI.boxed_instantiable_struct_out()
+    def test_boxed_struct_out(self):
+        struct = TestGI.boxed_struct_out()
 
-        self.assertTrue(isinstance(struct, TestGI.BoxedInstantiableStruct))
+        self.assertTrue(isinstance(struct, TestGI.BoxedStruct))
         self.assertEquals(42, struct.long_)
 
         del struct
 
-    def test_boxed_instantiable_struct_inout(self):
-        in_struct = TestGI.BoxedInstantiableStruct()
+    def test_boxed_struct_inout(self):
+        in_struct = TestGI.BoxedStruct()
         in_struct.long_ = 42
 
-        out_struct = TestGI.boxed_instantiable_struct_inout(in_struct)
+        out_struct = TestGI.boxed_struct_inout(in_struct)
 
-        self.assertTrue(isinstance(out_struct, TestGI.BoxedInstantiableStruct))
+        self.assertTrue(isinstance(out_struct, TestGI.BoxedStruct))
         self.assertEquals(0, out_struct.long_)
 
         del in_struct



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]