[pygobject/gsoc2009: 133/160] Fix structures constructor



commit 6f23ea0da3bea8079f3b228502bbae7070139b99
Author: Simon van der Linden <svdlinden src gnome org>
Date:   Tue Aug 11 23:15:05 2009 +0200

    Fix structures constructor

 gi/gimodule.c      |    2 +-
 gi/module.py       |    4 +-
 gi/pygi-argument.c |   41 +++++--
 gi/pygi-argument.h |    3 +-
 gi/pygi-info.c     |  298 +++++++++++++++++++++++++++++++++-------------------
 gi/pygi.h          |    8 +-
 gi/types.py        |   18 +---
 gobject/pygboxed.c |    2 +-
 8 files changed, 235 insertions(+), 141 deletions(-)
---
diff --git a/gi/gimodule.c b/gi/gimodule.c
index d9a3372..f5e44c3 100644
--- a/gi/gimodule.c
+++ b/gi/gimodule.c
@@ -124,7 +124,7 @@ static PyMethodDef _pygi_functions[] = {
 
 struct PyGI_API PyGI_API = {
     pygi_type_find_by_gi_info,
-    pygi_boxed_new
+    pygi_boxed_new_from_type
 };
 
 PyMODINIT_FUNC
diff --git a/gi/module.py b/gi/module.py
index a06db4e..943d14a 100644
--- a/gi/module.py
+++ b/gi/module.py
@@ -39,7 +39,7 @@ from ._gi import \
     StructInfo
 from .types import \
     GObjectMeta, \
-    GBoxedMeta, \
+    StructMeta, \
     Function
 
 repository = Repository.get_default()
@@ -107,7 +107,7 @@ class DynamicModule(object):
                 metaclass = GObjectMeta
             elif isinstance(info, StructInfo):
                 bases = (GBoxed,)
-                metaclass = GBoxedMeta
+                metaclass = StructMeta
             else:
                 raise NotImplementedError(info)
 
diff --git a/gi/pygi-argument.c b/gi/pygi-argument.c
index 8145109..dfd3118 100644
--- a/gi/pygi-argument.c
+++ b/gi/pygi-argument.c
@@ -946,12 +946,16 @@ array_item_error:
                         break;
                     }
 
-                    if (object == Py_None) {
-                        arg.v_pointer = NULL;
-                        break;
+                    arg.v_pointer = pyg_boxed_get(object, void);
+
+                    if (g_type_is_a(type, G_TYPE_BOXED)) {
+                        if (transfer == GI_TRANSFER_EVERYTHING) {
+                            arg.v_pointer = g_boxed_copy(type, arg.v_pointer);
+                        }
+                    } else if (transfer == GI_TRANSFER_EVERYTHING) {
+                        PyErr_SetString(PyExc_RuntimeError, "non-boxed types ownership cannot be transferred");
                     }
 
-                    arg.v_pointer = pyg_boxed_get(object, void);
                     break;
                 }
                 case GI_INFO_TYPE_OBJECT:
@@ -1167,7 +1171,8 @@ hash_table_release:
 
 PyObject *
 _pygi_argument_to_object (GArgument  *arg,
-                          GITypeInfo *type_info)
+                          GITypeInfo *type_info,
+                          GITransfer transfer)
 {
     GITypeTag type_tag;
     PyObject *object;
@@ -1280,6 +1285,7 @@ _pygi_argument_to_object (GArgument  *arg,
         {
             GArray *array;
             GITypeInfo *item_type_info;
+            GITransfer item_transfer;
             gsize i;
 
             array = arg->v_pointer;
@@ -1292,12 +1298,14 @@ _pygi_argument_to_object (GArgument  *arg,
             item_type_info = g_type_info_get_param_type(type_info, 0);
             g_assert(item_type_info != NULL);
 
+            item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
+
             for(i = 0; i < array->len; i++) {
                 GArgument item;
                 PyObject *py_item;
 
                 item = _g_array_index(array, GArgument, i);
-                py_item = _pygi_argument_to_object(&item, item_type_info);
+                py_item = _pygi_argument_to_object(&item, item_type_info, item_transfer);
                 if (py_item == NULL) {
                     Py_CLEAR(object);
                     _PyGI_ERROR_PREFIX("Item %zu: ", i);
@@ -1327,7 +1335,7 @@ _pygi_argument_to_object (GArgument  *arg,
                 case GI_INFO_TYPE_STRUCT:
                 {
                     GType type;
-                    PyObject *py_type = NULL;
+                    PyObject *py_type;
 
                     /* Handle special cases first. */
                     type = g_registered_type_info_get_g_type((GIRegisteredTypeInfo *)info);
@@ -1335,6 +1343,11 @@ _pygi_argument_to_object (GArgument  *arg,
                         object = pyg_value_as_pyobject(arg->v_pointer, FALSE);
                         g_value_unset(arg->v_pointer);
                         break;
+                    } else if (!g_type_is_a(type, G_TYPE_BOXED)) {
+                        if (transfer == GI_TRANSFER_EVERYTHING) {
+                            PyErr_SetString(PyExc_RuntimeError, "non-boxed types ownership cannot be transferred");
+                            break;
+                        }
                     }
 
                     py_type = pygi_type_find_by_gi_info(info);
@@ -1342,7 +1355,7 @@ _pygi_argument_to_object (GArgument  *arg,
                         break;
                     }
 
-                    object = pygi_boxed_new((PyTypeObject *)py_type, arg->v_pointer, TRUE /* FIXME */);
+                    object = pygi_boxed_new_from_type((PyTypeObject *)py_type, arg->v_pointer, transfer == GI_TRANSFER_EVERYTHING);
 
                     Py_DECREF(py_type);
 
@@ -1379,6 +1392,7 @@ _pygi_argument_to_object (GArgument  *arg,
             GSList *list;
             gsize length;
             GITypeInfo *item_type_info;
+            GITransfer item_transfer;
             gsize i;
 
             list = arg->v_pointer;
@@ -1392,13 +1406,15 @@ _pygi_argument_to_object (GArgument  *arg,
             item_type_info = g_type_info_get_param_type(type_info, 0);
             g_assert(item_type_info != NULL);
 
+            item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
+
             for (i = 0; list != NULL; list = g_slist_next(list), i++) {
                 GArgument item;
                 PyObject *py_item;
 
                 item.v_pointer = list->data;
 
-                py_item = _pygi_argument_to_object(&item, item_type_info);
+                py_item = _pygi_argument_to_object(&item, item_type_info, item_transfer);
                 if (py_item == NULL) {
                     Py_CLEAR(object);
                     _PyGI_ERROR_PREFIX("Item %zu: ", i);
@@ -1415,6 +1431,7 @@ _pygi_argument_to_object (GArgument  *arg,
         {
             GITypeInfo *key_type_info;
             GITypeInfo *value_type_info;
+            GITransfer item_transfer;
             GHashTableIter hash_table_iter;
             GArgument key;
             GArgument value;
@@ -1430,18 +1447,20 @@ _pygi_argument_to_object (GArgument  *arg,
             value_type_info = g_type_info_get_param_type(type_info, 1);
             g_assert(value_type_info != NULL);
 
+            item_transfer = transfer == GI_TRANSFER_CONTAINER ? GI_TRANSFER_NOTHING : transfer;
+
             g_hash_table_iter_init(&hash_table_iter, (GHashTable *)arg->v_pointer);
             while (g_hash_table_iter_next(&hash_table_iter, &key.v_pointer, &value.v_pointer)) {
                 PyObject *py_key;
                 PyObject *py_value;
                 int retval;
 
-                py_key = _pygi_argument_to_object(&key, key_type_info);
+                py_key = _pygi_argument_to_object(&key, key_type_info, item_transfer);
                 if (py_key == NULL) {
                     break;
                 }
 
-                py_value = _pygi_argument_to_object(&value, value_type_info);
+                py_value = _pygi_argument_to_object(&value, value_type_info, item_transfer);
                 if (py_value == NULL) {
                     Py_DECREF(py_key);
                     break;
diff --git a/gi/pygi-argument.h b/gi/pygi-argument.h
index c5abda5..59458fc 100644
--- a/gi/pygi-argument.h
+++ b/gi/pygi-argument.h
@@ -49,7 +49,8 @@ GArgument _pygi_argument_from_object (PyObject   *object,
                                       GITransfer  transfer);
 
 PyObject* _pygi_argument_to_object (GArgument  *arg,
-                                    GITypeInfo *type_info);
+                                    GITypeInfo *type_info,
+                                    GITransfer  transfer);
 
 
 void _pygi_argument_release (GArgument   *arg,
diff --git a/gi/pygi-info.c b/gi/pygi-info.c
index 24f705d..965d490 100644
--- a/gi/pygi-info.c
+++ b/gi/pygi-info.c
@@ -777,12 +777,67 @@ _wrap_g_function_info_invoke (PyGIBaseInfo *self,
 
     /* Convert the return value. */
     if (is_constructor) {
-        PyTypeObject *type;
+        PyTypeObject *py_type;
+        GIBaseInfo *info;
+        GIInfoType info_type;
+        GITransfer transfer;
 
         g_assert(n_py_args > 0);
-        type = (PyTypeObject *)PyTuple_GET_ITEM(py_args, 0);
+        py_type = (PyTypeObject *)PyTuple_GET_ITEM(py_args, 0);
+
+        info = g_type_info_get_interface(return_type_info);
+        g_assert(info != NULL);
+
+        info_type = g_base_info_get_type(info);
+
+        g_base_info_unref(info);
+
+        transfer = g_callable_info_get_caller_owns((GICallableInfo *)self->info);
+
+        switch (info_type) {
+            case GI_INFO_TYPE_UNION:
+                PyErr_SetString(PyExc_NotImplementedError, "creating unions is not supported yet");
+                /* TODO */
+                goto return_;
+            case GI_INFO_TYPE_STRUCT:
+            {
+                GType type;
+
+                type = g_registered_type_info_get_g_type((GIRegisteredTypeInfo *)info);
+
+                if (transfer == GI_TRANSFER_EVERYTHING && !g_type_is_a(type, G_TYPE_BOXED)) {
+                    gboolean is_simple;
 
-        return_value = pygobject_new_from_type(type, return_arg.v_pointer, TRUE);
+                    is_simple = _pygi_g_struct_info_is_simple((GIStructInfo *)info);
+
+                    if (is_simple) {
+                        PyErr_Format(PyExc_TypeError,
+                                "cannot create '%s' instances; non-boxed simple structures do not accept specific constructors",
+                                py_type->tp_name);
+                        /* TODO */
+                        goto return_;
+                    }
+                }
+                return_value = pygi_boxed_new_from_type(py_type, return_arg.v_pointer, transfer == GI_TRANSFER_EVERYTHING);
+                break;
+            }
+            case GI_INFO_TYPE_OBJECT:
+                return_value = pygobject_new_from_type(py_type, return_arg.v_pointer, TRUE);
+                break;
+            case GI_INFO_TYPE_INTERFACE:
+                /* Isn't instantiable. */
+            default:
+                /* Other types don't have methods. */
+                g_assert_not_reached();
+        }
+
+        _pygi_argument_release(&return_arg, return_type_info, transfer,
+            GI_DIRECTION_OUT);
+
+        if (return_value == NULL) {
+            /* TODO */
+            goto return_;
+        }
     } else {
         GITransfer transfer;
 
@@ -798,17 +853,14 @@ _wrap_g_function_info_invoke (PyGIBaseInfo *self,
             return_arg.v_pointer = array;
         }
 
-        return_value = _pygi_argument_to_object(&return_arg, return_type_info);
+        transfer = g_callable_info_get_caller_owns((GICallableInfo *)self->info);
+
+        return_value = _pygi_argument_to_object(&return_arg, return_type_info, transfer);
         if (return_value == NULL) {
             /* TODO */
             goto return_;
         }
 
-        transfer = g_callable_info_get_caller_owns((GICallableInfo *)self->info);
-
-        _pygi_argument_release(&return_arg, return_type_info, transfer,
-            GI_DIRECTION_OUT);
-
         if (return_type_tag == GI_TYPE_TAG_ARRAY
                 && transfer == GI_TRANSFER_NOTHING) {
             /* We created a #GArray, so free it. */
@@ -882,7 +934,7 @@ _wrap_g_function_info_invoke (PyGIBaseInfo *self,
                 /* Convert the argument. */
                 PyObject *obj;
 
-                obj = _pygi_argument_to_object(args[i], arg_type_infos[i]);
+                obj = _pygi_argument_to_object(args[i], arg_type_infos[i], transfer);
                 if (obj == NULL) {
                     /* TODO */
                     goto return_;
@@ -1371,182 +1423,210 @@ static PyObject *
 _wrap_g_field_info_get_value (PyGIBaseInfo *self,
                               PyObject     *args)
 {
-    PyObject *retval;
+    PyObject *instance;
     GIBaseInfo *container_info;
     GIInfoType container_info_type;
+    gpointer pointer;
     GITypeInfo *field_type_info;
     GArgument value;
-    PyObject *object;
-    gpointer buffer;
+    PyObject *py_value = NULL;
 
-    retval = NULL;
-
-    if (!PyArg_ParseTuple(args, "O:FieldInfo.get_value", &object)) {
+    if (!PyArg_ParseTuple(args, "O:FieldInfo.get_value", &instance)) {
         return NULL;
     }
 
     container_info = g_base_info_get_container(self->info);
-    container_info_type = g_base_info_get_type(container_info);
+    g_assert(container_info != NULL);
 
-    field_type_info = g_field_info_get_type((GIFieldInfo *)self->info);
+    /* Check the instance. */
+    if (!_pygi_g_registered_type_info_check_object((GIRegisteredTypeInfo *)container_info, TRUE, instance)) {
+        _PyGI_ERROR_PREFIX("argument 1: ");
+        return NULL;
+    }
 
-    if (container_info_type == GI_INFO_TYPE_STRUCT
-            || container_info_type == GI_INFO_TYPE_BOXED) {
-        buffer = pyg_boxed_get(object, void);
-        if (buffer == NULL) {
-            goto return_;
-        }
-    } else {
-        buffer = pygobject_get(object);
+    /* Get the pointer to the container. */
+    container_info_type = g_base_info_get_type(container_info);
+    switch (container_info_type) {
+        case GI_INFO_TYPE_UNION:
+            PyErr_SetString(PyExc_NotImplementedError, "getting a field from an union is not supported yet");
+            return NULL;
+        case GI_INFO_TYPE_STRUCT:
+            pointer = pyg_boxed_get(instance, void);
+            break;
+        case GI_INFO_TYPE_OBJECT:
+            pointer = pygobject_get(instance);
+            break;
+        default:
+            /* Other types don't have fields. */
+            g_assert_not_reached();
     }
 
+    /* Get the field's value. */
+    field_type_info = g_field_info_get_type((GIFieldInfo *)self->info);
+
     /* A few types are not handled by g_field_info_get_field, so do it here. */
     if (!g_type_info_is_pointer(field_type_info)
             && g_type_info_get_tag(field_type_info) == GI_TYPE_TAG_INTERFACE) {
         GIBaseInfo *info;
+        GIInfoType info_type;
 
         if (!(g_field_info_get_flags((GIFieldInfo *)self->info) & GI_FIELD_IS_READABLE)) {
-            PyErr_SetString(PyExc_RuntimeError, "Field is not readable");
-            goto return_;
+            PyErr_SetString(PyExc_RuntimeError, "field is not readable");
+            goto out;
         }
 
-        info = g_type_info_get_interface (field_type_info);
-        switch(g_base_info_get_type(info))
-        {
+        info = g_type_info_get_interface(field_type_info);
+
+        info_type = g_base_info_get_type(info);
+
+        g_base_info_unref(info);
+
+        switch(info_type) {
+            case GI_INFO_TYPE_UNION:
+                PyErr_SetString(PyExc_NotImplementedError, "getting an union is not supported yet");
+                goto out;
             case GI_INFO_TYPE_STRUCT:
             {
                 gsize offset;
-                gsize size;
 
                 offset = g_field_info_get_offset((GIFieldInfo *)self->info);
-                size = g_struct_info_get_size((GIStructInfo *)info);
-                g_assert(size > 0);
 
-                value.v_pointer = g_try_malloc(size);
-                if (value.v_pointer == NULL) {
-                    PyErr_SetString(PyExc_MemoryError, "Failed to allocate memory");
-                    break;
-                }
-                g_memmove(value.v_pointer, buffer + offset, size);
+                value.v_pointer = pointer + offset;
 
-                g_base_info_unref(info);
-                goto g_argument_to_py_object;
+                goto argument_to_object;
             }
-            case GI_INFO_TYPE_UNION:
-            case GI_INFO_TYPE_BOXED:
-                /* TODO */
-                g_assert_not_reached();
-                break;
             default:
                 /* Fallback. */
                 break;
         }
-
-        g_base_info_unref(info);
-
-        if (PyErr_Occurred()) {
-            goto return_;
-        }
     }
 
-    if (!g_field_info_get_field((GIFieldInfo *)self->info, buffer, &value)) {
-        PyErr_SetString(PyExc_RuntimeError, "Failed to get value for field");
-        goto return_;
+    if (!g_field_info_get_field((GIFieldInfo *)self->info, pointer, &value)) {
+        PyErr_SetString(PyExc_RuntimeError, "unable to get the value");
+        goto out;
     }
 
-g_argument_to_py_object:
-    retval = _pygi_argument_to_object(&value, field_type_info);
+argument_to_object:
+    py_value = _pygi_argument_to_object(&value, field_type_info, GI_TRANSFER_NOTHING);
 
-return_:
+out:
     g_base_info_unref((GIBaseInfo *)field_type_info);
 
-    Py_XINCREF(retval);
-    return retval;
+    return py_value;
 }
 
 static PyObject *
 _wrap_g_field_info_set_value (PyGIBaseInfo *self,
                               PyObject     *args)
 {
-    PyObject *object;
+    PyObject *instance;
     PyObject *py_value;
-    GArgument value;
-    gpointer buffer;
     GIBaseInfo *container_info;
     GIInfoType container_info_type;
+    gpointer pointer;
     GITypeInfo *field_type_info;
-    PyObject *retval;
-    gint check_retval;
-
-    retval = NULL;
+    GArgument value;
+    PyObject *retval = NULL;
 
-    if (!PyArg_ParseTuple(args, "OO:FieldInfo.set_value", &object, &py_value)) {
+    if (!PyArg_ParseTuple(args, "OO:FieldInfo.set_value", &instance, &py_value)) {
         return NULL;
     }
 
     container_info = g_base_info_get_container(self->info);
-    container_info_type = g_base_info_get_type(container_info);
+    g_assert(container_info != NULL);
 
-    field_type_info = g_field_info_get_type((GIFieldInfo *)self->info);
+    /* Check the instance. */
+    if (!_pygi_g_registered_type_info_check_object((GIRegisteredTypeInfo *)container_info, TRUE, instance)) {
+        _PyGI_ERROR_PREFIX("argument 1: ");
+        return NULL;
+    }
 
-    if (container_info_type == GI_INFO_TYPE_STRUCT
-            || container_info_type == GI_INFO_TYPE_BOXED) {
-        buffer = pyg_boxed_get(object, void);
-        if (buffer == NULL) {
-            goto return_;
-        }
-    } else {
-        buffer = pygobject_get(object);
+    /* Get the pointer to the container. */
+    container_info_type = g_base_info_get_type(container_info);
+    switch (container_info_type) {
+        case GI_INFO_TYPE_UNION:
+            PyErr_SetString(PyExc_NotImplementedError, "setting a field in an union is not supported yet");
+            return NULL;
+        case GI_INFO_TYPE_STRUCT:
+            pointer = pyg_boxed_get(instance, void);
+            break;
+        case GI_INFO_TYPE_OBJECT:
+            pointer = pygobject_get(instance);
+            break;
+        default:
+            /* Other types don't have fields. */
+            g_assert_not_reached();
     }
 
+    field_type_info = g_field_info_get_type((GIFieldInfo *)self->info);
+
     /* Check the value. */
-    check_retval = _pygi_g_type_info_check_object(field_type_info, TRUE, py_value);
+    {
+        gboolean retval;
 
-    if (check_retval < 0) {
-        goto return_;
-    }
+        retval = _pygi_g_type_info_check_object(field_type_info, TRUE, py_value);
+        if (retval < 0) {
+            goto out;
+        }
 
-    if (!check_retval) {
-        _PyGI_ERROR_PREFIX("%s.set_value() argument 1: ",
-                g_base_info_get_namespace(self->info));
-        goto return_;
+        if (!retval) {
+            _PyGI_ERROR_PREFIX("argument 2: ");
+            goto out;
+        }
     }
 
-    value = _pygi_argument_from_object(py_value, field_type_info, GI_TRANSFER_NOTHING);
-
+    /* Set the field's value. */
     /* A few types are not handled by g_field_info_set_field, so do it here. */
     if (!g_type_info_is_pointer(field_type_info)
             && g_type_info_get_tag(field_type_info) == GI_TYPE_TAG_INTERFACE) {
         GIBaseInfo *info;
+        GIInfoType info_type;
 
         if (!(g_field_info_get_flags((GIFieldInfo *)self->info) & GI_FIELD_IS_WRITABLE)) {
-            PyErr_SetString(PyExc_RuntimeError, "Field is not writable");
-            goto return_;
+            PyErr_SetString(PyExc_RuntimeError, "field is not writable");
+            goto out;
         }
 
         info = g_type_info_get_interface(field_type_info);
-        switch (g_base_info_get_type(info))
-        {
+
+        info_type = g_base_info_get_type(info);
+
+        switch (info_type) {
+            case GI_INFO_TYPE_UNION:
+                PyErr_SetString(PyExc_NotImplementedError, "setting an union is not supported yet");
+                goto out;
             case GI_INFO_TYPE_STRUCT:
             {
+                gboolean is_simple;
                 gsize offset;
-                gsize size;
+                gssize size;
+
+                is_simple = _pygi_g_struct_info_is_simple((GIStructInfo *)info);
+
+                if (!is_simple) {
+                    PyErr_SetString(PyExc_TypeError,
+                            "cannot set a structure which has no well-defined ownership transfer rules");
+                    g_base_info_unref(info);
+                    goto out;
+                }
+
+                value = _pygi_argument_from_object(py_value, field_type_info, GI_TRANSFER_NOTHING);
+                if (PyErr_Occurred()) {
+                    g_base_info_unref(info);
+                    goto out;
+                }
 
                 offset = g_field_info_get_offset((GIFieldInfo *)self->info);
                 size = g_struct_info_get_size((GIStructInfo *)info);
                 g_assert(size > 0);
 
-                g_memmove(buffer + offset, value.v_pointer, size);
+                g_memmove(pointer + offset, value.v_pointer, size);
 
-                retval = Py_None;
                 g_base_info_unref(info);
-                goto return_;
+
+                retval = Py_None;
+                goto out;
             }
-            case GI_INFO_TYPE_UNION:
-            case GI_INFO_TYPE_BOXED:
-                /* TODO */
-                g_assert_not_reached();
-                break;
             default:
                 /* Fallback. */
                 break;
@@ -1555,14 +1635,20 @@ _wrap_g_field_info_set_value (PyGIBaseInfo *self,
         g_base_info_unref(info);
     }
 
-    if (!g_field_info_set_field((GIFieldInfo *)self->info, buffer, &value)) {
-        PyErr_SetString(PyExc_RuntimeError, "Failed to set value for field");
-        goto return_;
+    value = _pygi_argument_from_object(py_value, field_type_info, GI_TRANSFER_EVERYTHING);
+    if (PyErr_Occurred()) {
+        goto out;
+    }
+
+    if (!g_field_info_set_field((GIFieldInfo *)self->info, pointer, &value)) {
+        _pygi_argument_release(&value, field_type_info, GI_TRANSFER_NOTHING, GI_DIRECTION_IN);
+        PyErr_SetString(PyExc_RuntimeError, "unable to set value for field");
+        goto out;
     }
 
     retval = Py_None;
 
-return_:
+out:
     g_base_info_unref((GIBaseInfo *)field_type_info);
 
     Py_XINCREF(retval);
diff --git a/gi/pygi.h b/gi/pygi.h
index 0187ebc..7681fc5 100644
--- a/gi/pygi.h
+++ b/gi/pygi.h
@@ -47,9 +47,9 @@ struct PyGI_API {
     PyObject* (*type_find_by_gi_info) (GIBaseInfo *info);
 
     /* Boxed */
-    PyObject* (*boxed_new) (PyTypeObject *type,
-                            gpointer      pointer,
-                            gboolean      own_pointer);
+    PyObject* (*boxed_new_from_type) (PyTypeObject *type,
+                                      gpointer      pointer,
+                                      gboolean      own_pointer);
 };
 
 
@@ -61,7 +61,7 @@ static struct PyGI_API *PyGI_API = NULL;
 #define pygi_type_find_by_gi_info (PyGI_API->type_find_by_gi_info)
 
 /* Boxed */
-#define pygi_boxed_new (PyGI_API->boxed_new)
+#define pygi_boxed_new_from_type (PyGI_API->boxed_new_from_type)
 
 
 static int
diff --git a/gi/types.py b/gi/types.py
index 7dfda04..2076e2e 100644
--- a/gi/types.py
+++ b/gi/types.py
@@ -42,18 +42,6 @@ def Function(info):
     return function
 
 
-class Field(object):
-
-    def __init__(self, info):
-        self.info = info
-
-    def __get__(self, instance, owner):
-        return self.info.get_value(instance)
-
-    def __set__(self, instance, value):
-        return self.info.set_value(instance, value)
-
-
 class MetaClassHelper(object):
 
     def _setup_methods(cls):
@@ -94,7 +82,7 @@ class MetaClassHelper(object):
     def _setup_fields(cls):
         for field_info in cls.__info__.get_fields():
             name = field_info.get_name().replace('-', '_')
-            setattr(cls, name, Field(field_info))
+            setattr(cls, name, property(field_info.get_value, field_info.set_value))
 
 
 class GObjectMeta(gobject.GObjectMeta, MetaClassHelper):
@@ -115,10 +103,10 @@ class GObjectMeta(gobject.GObjectMeta, MetaClassHelper):
             cls._setup_fields()
 
 
-class GBoxedMeta(type, MetaClassHelper):
+class StructMeta(type, MetaClassHelper):
 
     def __init__(cls, name, bases, dict_):
-        super(GBoxedMeta, cls).__init__(name, bases, dict_)
+        super(StructMeta, cls).__init__(name, bases, dict_)
 
         # Avoid touching anything else than the base class.
         if cls.__name__ != cls.__info__.get_name():
diff --git a/gobject/pygboxed.c b/gobject/pygboxed.c
index 2b8e6de..c3dc744 100644
--- a/gobject/pygboxed.c
+++ b/gobject/pygboxed.c
@@ -205,7 +205,7 @@ pyg_boxed_new_ (PyTypeObject *type,
         return NULL;
     }
 
-    return pygi_boxed_new(type, NULL, TRUE);
+    return pygi_boxed_new_from_type(type, NULL, TRUE);
 }
 #endif /* HAVE_PYGI_H */
 



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