2 /* -*- Mode: C; c-basic-offset: 4 -*-
3 * vim: tabstop=4 shiftwidth=4 expandtab
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
20 #include "pygi-value.h"
21 #include "pygi-struct.h"
22 #include "pyglib-python-compat.h"
23 #include "pygobject-object.h"
26 #include "pygpointer.h"
29 #include "pygparamspec.h"
32 _pygi_argument_from_g_value(const GValue
*value
,
33 GITypeInfo
*type_info
)
35 GIArgument arg
= { 0, };
37 GITypeTag type_tag
= g_type_info_get_tag (type_info
);
39 /* For the long handling: long can be equivalent to
40 int32 or int64, depending on the architecture, but
41 gi doesn't tell us (and same for ulong)
44 case GI_TYPE_TAG_BOOLEAN
:
45 arg
.v_boolean
= g_value_get_boolean (value
);
47 case GI_TYPE_TAG_INT8
:
48 arg
.v_int8
= g_value_get_schar (value
);
50 case GI_TYPE_TAG_INT16
:
51 case GI_TYPE_TAG_INT32
:
52 if (g_type_is_a (G_VALUE_TYPE (value
), G_TYPE_LONG
))
53 arg
.v_int
= g_value_get_long (value
);
55 arg
.v_int
= g_value_get_int (value
);
57 case GI_TYPE_TAG_INT64
:
58 if (g_type_is_a (G_VALUE_TYPE (value
), G_TYPE_LONG
))
59 arg
.v_int64
= g_value_get_long (value
);
61 arg
.v_int64
= g_value_get_int64 (value
);
63 case GI_TYPE_TAG_UINT8
:
64 arg
.v_uint8
= g_value_get_uchar (value
);
66 case GI_TYPE_TAG_UINT16
:
67 case GI_TYPE_TAG_UINT32
:
68 if (g_type_is_a (G_VALUE_TYPE (value
), G_TYPE_ULONG
))
69 arg
.v_uint
= g_value_get_ulong (value
);
71 arg
.v_uint
= g_value_get_uint (value
);
73 case GI_TYPE_TAG_UINT64
:
74 if (g_type_is_a (G_VALUE_TYPE (value
), G_TYPE_ULONG
))
75 arg
.v_uint64
= g_value_get_ulong (value
);
77 arg
.v_uint64
= g_value_get_uint64 (value
);
79 case GI_TYPE_TAG_UNICHAR
:
80 arg
.v_uint32
= g_value_get_schar (value
);
82 case GI_TYPE_TAG_FLOAT
:
83 arg
.v_float
= g_value_get_float (value
);
85 case GI_TYPE_TAG_DOUBLE
:
86 arg
.v_double
= g_value_get_double (value
);
88 case GI_TYPE_TAG_GTYPE
:
89 arg
.v_long
= g_value_get_gtype (value
);
91 case GI_TYPE_TAG_UTF8
:
92 case GI_TYPE_TAG_FILENAME
:
93 /* Callers are responsible for ensuring the GValue stays alive
94 * long enough for the string to be copied. */
95 arg
.v_string
= (char *)g_value_get_string (value
);
97 case GI_TYPE_TAG_GLIST
:
98 case GI_TYPE_TAG_GSLIST
:
99 case GI_TYPE_TAG_ARRAY
:
100 case GI_TYPE_TAG_GHASH
:
101 if (G_VALUE_HOLDS_BOXED (value
))
102 arg
.v_pointer
= g_value_get_boxed (value
);
104 /* e. g. GSettings::change-event */
105 arg
.v_pointer
= g_value_get_pointer (value
);
107 case GI_TYPE_TAG_INTERFACE
:
110 GIInfoType info_type
;
112 info
= g_type_info_get_interface (type_info
);
113 info_type
= g_base_info_get_type (info
);
115 g_base_info_unref (info
);
118 case GI_INFO_TYPE_FLAGS
:
119 arg
.v_uint
= g_value_get_flags (value
);
121 case GI_INFO_TYPE_ENUM
:
122 arg
.v_int
= g_value_get_enum (value
);
124 case GI_INFO_TYPE_INTERFACE
:
125 case GI_INFO_TYPE_OBJECT
:
126 if (G_VALUE_HOLDS_PARAM (value
))
127 arg
.v_pointer
= g_value_get_param (value
);
129 arg
.v_pointer
= g_value_get_object (value
);
131 case GI_INFO_TYPE_BOXED
:
132 case GI_INFO_TYPE_STRUCT
:
133 case GI_INFO_TYPE_UNION
:
134 if (G_VALUE_HOLDS (value
, G_TYPE_BOXED
)) {
135 arg
.v_pointer
= g_value_get_boxed (value
);
136 } else if (G_VALUE_HOLDS (value
, G_TYPE_VARIANT
)) {
137 arg
.v_pointer
= g_value_get_variant (value
);
138 } else if (G_VALUE_HOLDS (value
, G_TYPE_POINTER
)) {
139 arg
.v_pointer
= g_value_get_pointer (value
);
141 PyErr_Format (PyExc_NotImplementedError
,
142 "Converting GValue's of type '%s' is not implemented.",
143 g_type_name (G_VALUE_TYPE (value
)));
147 PyErr_Format (PyExc_NotImplementedError
,
148 "Converting GValue's of type '%s' is not implemented.",
149 g_info_type_to_string (info_type
));
154 case GI_TYPE_TAG_ERROR
:
155 arg
.v_pointer
= g_value_get_boxed (value
);
157 case GI_TYPE_TAG_VOID
:
158 arg
.v_pointer
= g_value_get_pointer (value
);
168 /* Ignore g_value_array deprecations. Although they are deprecated,
169 * we still need to support the marshaling of them in PyGObject.
171 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
174 pyg_value_array_from_pyobject(GValue
*value
,
176 const GParamSpecValueArray
*pspec
)
179 GValueArray
*value_array
;
182 seq_len
= PySequence_Length(obj
);
187 len
= (guint
)seq_len
;
189 if (pspec
&& pspec
->fixed_n_elements
> 0 && len
!= pspec
->fixed_n_elements
)
192 value_array
= g_value_array_new(len
);
194 for (i
= 0; i
< len
; ++i
) {
195 PyObject
*item
= PySequence_GetItem(obj
, i
);
197 GValue item_value
= { 0, };
202 g_value_array_free(value_array
);
206 if (pspec
&& pspec
->element_spec
)
207 type
= G_PARAM_SPEC_VALUE_TYPE(pspec
->element_spec
);
208 else if (item
== Py_None
)
209 type
= G_TYPE_POINTER
; /* store None as NULL */
211 type
= pyg_type_from_object((PyObject
*)Py_TYPE(item
));
214 g_value_array_free(value_array
);
220 g_value_init(&item_value
, type
);
221 status
= (pspec
&& pspec
->element_spec
)
222 ? pyg_param_gvalue_from_pyobject(&item_value
, item
, pspec
->element_spec
)
223 : pyg_value_from_pyobject(&item_value
, item
);
227 g_value_array_free(value_array
);
228 g_value_unset(&item_value
);
232 g_value_array_append(value_array
, &item_value
);
233 g_value_unset(&item_value
);
236 g_value_take_boxed(value
, value_array
);
240 G_GNUC_END_IGNORE_DEPRECATIONS
243 pyg_array_from_pyobject(GValue
*value
,
250 len
= PySequence_Length(obj
);
256 array
= g_array_new(FALSE
, TRUE
, sizeof(GValue
));
258 for (i
= 0; i
< len
; ++i
) {
259 PyObject
*item
= PySequence_GetItem(obj
, i
);
261 GValue item_value
= { 0, };
266 g_array_free(array
, FALSE
);
271 type
= G_TYPE_POINTER
; /* store None as NULL */
273 type
= pyg_type_from_object((PyObject
*)Py_TYPE(item
));
276 g_array_free(array
, FALSE
);
282 g_value_init(&item_value
, type
);
283 status
= pyg_value_from_pyobject(&item_value
, item
);
287 g_array_free(array
, FALSE
);
288 g_value_unset(&item_value
);
292 g_array_append_val(array
, item_value
);
295 g_value_take_boxed(value
, array
);
300 * pyg_value_from_pyobject_with_error:
301 * @value: the GValue object to store the converted value in.
302 * @obj: the Python object to convert.
304 * This function converts a Python object and stores the result in a
305 * GValue. The GValue must be initialised in advance with
306 * g_value_init(). If the Python object can't be converted to the
307 * type of the GValue, then an error is returned.
309 * Returns: 0 on success, -1 on error.
312 pyg_value_from_pyobject_with_error(GValue
*value
, PyObject
*obj
)
315 GType value_type
= G_VALUE_TYPE(value
);
317 switch (G_TYPE_FUNDAMENTAL(value_type
)) {
318 case G_TYPE_INTERFACE
:
319 /* we only handle interface types that have a GObject prereq */
320 if (g_type_is_a(value_type
, G_TYPE_OBJECT
)) {
322 g_value_set_object(value
, NULL
);
324 if (!PyObject_TypeCheck(obj
, &PyGObject_Type
)) {
325 PyErr_SetString(PyExc_TypeError
, "GObject is required");
328 if (!G_TYPE_CHECK_INSTANCE_TYPE(pygobject_get(obj
),
330 PyErr_SetString(PyExc_TypeError
, "Invalid GObject type for assignment");
333 g_value_set_object(value
, pygobject_get(obj
));
336 PyErr_SetString(PyExc_TypeError
, "Unsupported conversion");
341 if (PYGLIB_PyLong_Check(obj
)) {
343 val
= PYGLIB_PyLong_AsLong(obj
);
344 if (val
>= -128 && val
<= 127)
345 g_value_set_schar(value
, (gchar
) val
);
349 #if PY_VERSION_HEX < 0x03000000
350 else if (PyString_Check(obj
)) {
351 g_value_set_schar(value
, PyString_AsString(obj
)[0]);
354 else if (PyUnicode_Check(obj
)) {
355 tmp
= PyUnicode_AsUTF8String(obj
);
356 g_value_set_schar(value
, PYGLIB_PyBytes_AsString(tmp
)[0]);
359 PyErr_SetString(PyExc_TypeError
, "Cannot convert to TYPE_CHAR");
365 if (PYGLIB_PyLong_Check(obj
)) {
367 val
= PYGLIB_PyLong_AsLong(obj
);
368 if (val
>= 0 && val
<= 255)
369 g_value_set_uchar(value
, (guchar
) val
);
372 #if PY_VERSION_HEX < 0x03000000
373 } else if (PyString_Check(obj
)) {
374 g_value_set_uchar(value
, PyString_AsString(obj
)[0]);
376 } else if (PyUnicode_Check(obj
)) {
377 tmp
= PyUnicode_AsUTF8String(obj
);
378 g_value_set_uchar(value
, PYGLIB_PyBytes_AsString(tmp
)[0]);
386 g_value_set_boolean(value
, PyObject_IsTrue(obj
));
389 g_value_set_int(value
, PYGLIB_PyLong_AsLong(obj
));
393 if (PYGLIB_PyLong_Check(obj
)) {
396 /* check that number is not negative */
397 if (PyLong_AsLongLong(obj
) < 0)
400 val
= PyLong_AsUnsignedLong(obj
);
401 if (val
<= G_MAXUINT
)
402 g_value_set_uint(value
, (guint
) val
);
406 g_value_set_uint(value
, PyLong_AsUnsignedLong(obj
));
411 g_value_set_long(value
, PYGLIB_PyLong_AsLong(obj
));
414 #if PY_VERSION_HEX < 0x03000000
415 if (PyInt_Check(obj
)) {
418 val
= PYGLIB_PyLong_AsLong(obj
);
420 PyErr_SetString(PyExc_OverflowError
, "negative value not allowed for uint64 property");
423 g_value_set_ulong(value
, (gulong
)val
);
426 if (PyLong_Check(obj
))
427 g_value_set_ulong(value
, PyLong_AsUnsignedLong(obj
));
432 g_value_set_int64(value
, PyLong_AsLongLong(obj
));
435 #if PY_VERSION_HEX < 0x03000000
436 if (PyInt_Check(obj
)) {
437 long v
= PyInt_AsLong(obj
);
439 PyErr_SetString(PyExc_OverflowError
, "negative value not allowed for uint64 property");
442 g_value_set_uint64(value
, v
);
445 if (PyLong_Check(obj
))
446 g_value_set_uint64(value
, PyLong_AsUnsignedLongLong(obj
));
453 if (pyg_enum_get_value(G_VALUE_TYPE(value
), obj
, &val
) < 0) {
456 g_value_set_enum(value
, val
);
462 if (pyg_flags_get_value(G_VALUE_TYPE(value
), obj
, &val
) < 0) {
465 g_value_set_flags(value
, val
);
469 g_value_set_float(value
, PyFloat_AsDouble(obj
));
472 g_value_set_double(value
, PyFloat_AsDouble(obj
));
475 if (obj
== Py_None
) {
476 g_value_set_string(value
, NULL
);
478 PyObject
* tmp_str
= PyObject_Str(obj
);
479 if (tmp_str
== NULL
) {
481 if (PyUnicode_Check(obj
)) {
482 tmp
= PyUnicode_AsUTF8String(obj
);
483 g_value_set_string(value
, PYGLIB_PyBytes_AsString(tmp
));
486 PyErr_SetString(PyExc_TypeError
, "Expected string");
490 #if PY_VERSION_HEX < 0x03000000
491 g_value_set_string(value
, PyString_AsString(tmp_str
));
493 tmp
= PyUnicode_AsUTF8String(tmp_str
);
494 g_value_set_string(value
, PyBytes_AsString(tmp
));
503 g_value_set_pointer(value
, NULL
);
504 else if (PyObject_TypeCheck(obj
, &PyGPointer_Type
) &&
505 G_VALUE_HOLDS(value
, ((PyGPointer
*)obj
)->gtype
))
506 g_value_set_pointer(value
, pyg_pointer_get(obj
, gpointer
));
507 else if (PYGLIB_CPointer_Check(obj
))
508 g_value_set_pointer(value
, PYGLIB_CPointer_GetPointer(obj
, NULL
));
509 else if (G_VALUE_HOLDS_GTYPE (value
))
510 g_value_set_gtype (value
, pyg_type_from_object (obj
));
512 PyErr_SetString(PyExc_TypeError
, "Expected pointer");
518 gboolean holds_value_array
;
520 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
521 holds_value_array
= G_VALUE_HOLDS(value
, G_TYPE_VALUE_ARRAY
);
522 G_GNUC_END_IGNORE_DEPRECATIONS
525 g_value_set_boxed(value
, NULL
);
526 else if (G_VALUE_HOLDS(value
, PY_TYPE_OBJECT
))
527 g_value_set_boxed(value
, obj
);
528 else if (PyObject_TypeCheck(obj
, &PyGBoxed_Type
) &&
529 G_VALUE_HOLDS(value
, ((PyGBoxed
*)obj
)->gtype
))
530 g_value_set_boxed(value
, pyg_boxed_get(obj
, gpointer
));
531 else if (G_VALUE_HOLDS(value
, G_TYPE_VALUE
)) {
535 type
= pyg_type_from_object((PyObject
*)Py_TYPE(obj
));
536 if (G_UNLIKELY (! type
)) {
539 n_value
= g_new0 (GValue
, 1);
540 g_value_init (n_value
, type
);
541 g_value_take_boxed (value
, n_value
);
542 return pyg_value_from_pyobject_with_error (n_value
, obj
);
544 else if (PySequence_Check(obj
) && holds_value_array
)
545 return pyg_value_array_from_pyobject(value
, obj
, NULL
);
547 else if (PySequence_Check(obj
) &&
548 G_VALUE_HOLDS(value
, G_TYPE_ARRAY
))
549 return pyg_array_from_pyobject(value
, obj
);
550 else if (PYGLIB_PyUnicode_Check(obj
) &&
551 G_VALUE_HOLDS(value
, G_TYPE_GSTRING
)) {
555 if (PYGLIB_PyUnicode_AsStringAndSize(obj
, &buffer
, &len
))
557 string
= g_string_new_len(buffer
, len
);
558 g_value_set_boxed(value
, string
);
559 g_string_free (string
, TRUE
);
562 else if ((bm
= pyg_type_lookup(G_VALUE_TYPE(value
))) != NULL
)
563 return bm
->tovalue(value
, obj
);
564 else if (PYGLIB_CPointer_Check(obj
))
565 g_value_set_boxed(value
, PYGLIB_CPointer_GetPointer(obj
, NULL
));
567 PyErr_SetString(PyExc_TypeError
, "Expected Boxed");
573 /* we need to support both the wrapped _gobject.GParamSpec and the GI
574 * GObject.ParamSpec */
575 if (G_IS_PARAM_SPEC (pygobject_get (obj
)))
576 g_value_set_param(value
, G_PARAM_SPEC (pygobject_get (obj
)));
577 else if (pyg_param_spec_check (obj
))
578 g_value_set_param(value
, PYGLIB_CPointer_GetPointer(obj
, NULL
));
580 PyErr_SetString(PyExc_TypeError
, "Expected ParamSpec");
585 if (obj
== Py_None
) {
586 g_value_set_object(value
, NULL
);
587 } else if (PyObject_TypeCheck(obj
, &PyGObject_Type
) &&
588 G_TYPE_CHECK_INSTANCE_TYPE(pygobject_get(obj
),
589 G_VALUE_TYPE(value
))) {
590 g_value_set_object(value
, pygobject_get(obj
));
592 PyErr_SetString(PyExc_TypeError
, "Expected GObject");
599 g_value_set_variant(value
, NULL
);
600 else if (pyg_type_from_object_strict(obj
, FALSE
) == G_TYPE_VARIANT
)
601 g_value_set_variant(value
, pyg_boxed_get(obj
, GVariant
));
603 PyErr_SetString(PyExc_TypeError
, "Expected Variant");
611 if ((bm
= pyg_type_lookup(G_VALUE_TYPE(value
))) != NULL
) {
612 return bm
->tovalue(value
, obj
);
614 PyErr_SetString(PyExc_TypeError
, "Unknown value type");
621 /* If an error occurred, unset the GValue but don't clear the Python error. */
622 if (PyErr_Occurred()) {
623 g_value_unset(value
);
631 * pyg_value_from_pyobject:
632 * @value: the GValue object to store the converted value in.
633 * @obj: the Python object to convert.
635 * Same basic function as pyg_value_from_pyobject_with_error but clears
636 * any Python errors before returning.
638 * Returns: 0 on success, -1 on error.
641 pyg_value_from_pyobject(GValue
*value
, PyObject
*obj
)
643 int res
= pyg_value_from_pyobject_with_error (value
, obj
);
645 if (PyErr_Occurred()) {
653 * pygi_value_to_py_basic_type:
654 * @value: the GValue object.
656 * This function creates/returns a Python wrapper object that
657 * represents the GValue passed as an argument limited to supporting basic types
658 * like ints, bools, and strings.
660 * Returns: a PyObject representing the value.
663 pygi_value_to_py_basic_type (const GValue
*value
, GType fundamental
)
665 switch (fundamental
) {
667 return PYGLIB_PyLong_FromLong (g_value_get_schar (value
));
670 return PYGLIB_PyLong_FromLong (g_value_get_uchar (value
));
672 case G_TYPE_BOOLEAN
: {
673 return PyBool_FromLong(g_value_get_boolean(value
));
676 return PYGLIB_PyLong_FromLong(g_value_get_int(value
));
679 /* in Python, the Int object is backed by a long. If a
680 long can hold the whole value of an unsigned int, use
681 an Int. Otherwise, use a Long object to avoid overflow.
682 This matches the ULongArg behavior in codegen/argtypes.h */
683 #if (G_MAXUINT <= G_MAXLONG)
684 return PYGLIB_PyLong_FromLong((glong
) g_value_get_uint(value
));
686 return PyLong_FromUnsignedLong((gulong
) g_value_get_uint(value
));
690 return PYGLIB_PyLong_FromLong(g_value_get_long(value
));
693 gulong val
= g_value_get_ulong(value
);
695 if (val
<= G_MAXLONG
)
696 return PYGLIB_PyLong_FromLong((glong
) val
);
698 return PyLong_FromUnsignedLong(val
);
702 gint64 val
= g_value_get_int64(value
);
704 if (G_MINLONG
<= val
&& val
<= G_MAXLONG
)
705 return PYGLIB_PyLong_FromLong((glong
) val
);
707 return PyLong_FromLongLong(val
);
711 guint64 val
= g_value_get_uint64(value
);
713 if (val
<= G_MAXLONG
)
714 return PYGLIB_PyLong_FromLong((glong
) val
);
716 return PyLong_FromUnsignedLongLong(val
);
719 return pyg_enum_from_gtype(G_VALUE_TYPE(value
), g_value_get_enum(value
));
721 return pyg_flags_from_gtype(G_VALUE_TYPE(value
), g_value_get_flags(value
));
723 return PyFloat_FromDouble(g_value_get_float(value
));
725 return PyFloat_FromDouble(g_value_get_double(value
));
728 const gchar
*str
= g_value_get_string(value
);
731 return PYGLIB_PyUnicode_FromString(str
);
741 * pygi_value_to_py_structured_type:
742 * @value: the GValue object.
743 * @copy_boxed: true if boxed values should be copied.
745 * This function creates/returns a Python wrapper object that
746 * represents the GValue passed as an argument.
748 * Returns: a PyObject representing the value.
751 pygi_value_to_py_structured_type (const GValue
*value
, GType fundamental
, gboolean copy_boxed
)
753 switch (fundamental
) {
754 case G_TYPE_INTERFACE
:
755 if (g_type_is_a(G_VALUE_TYPE(value
), G_TYPE_OBJECT
))
756 return pygobject_new(g_value_get_object(value
));
761 if (G_VALUE_HOLDS_GTYPE (value
))
762 return pyg_type_wrapper_new (g_value_get_gtype (value
));
764 return pyg_pointer_new(G_VALUE_TYPE(value
),
765 g_value_get_pointer(value
));
768 gboolean holds_value_array
;
770 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
771 holds_value_array
= G_VALUE_HOLDS(value
, G_TYPE_VALUE_ARRAY
);
772 G_GNUC_END_IGNORE_DEPRECATIONS
774 if (G_VALUE_HOLDS(value
, PY_TYPE_OBJECT
)) {
775 PyObject
*ret
= (PyObject
*)g_value_dup_boxed(value
);
781 } else if (G_VALUE_HOLDS(value
, G_TYPE_VALUE
)) {
782 GValue
*n_value
= g_value_get_boxed (value
);
783 return pyg_value_as_pyobject(n_value
, copy_boxed
);
784 } else if (holds_value_array
) {
785 GValueArray
*array
= (GValueArray
*) g_value_get_boxed(value
);
786 Py_ssize_t n_values
= array
? array
->n_values
: 0;
787 PyObject
*ret
= PyList_New(n_values
);
789 for (i
= 0; i
< n_values
; ++i
)
790 PyList_SET_ITEM(ret
, i
, pyg_value_as_pyobject
791 (array
->values
+ i
, copy_boxed
));
793 } else if (G_VALUE_HOLDS(value
, G_TYPE_GSTRING
)) {
794 GString
*string
= (GString
*) g_value_get_boxed(value
);
795 PyObject
*ret
= PYGLIB_PyUnicode_FromStringAndSize(string
->str
, string
->len
);
798 bm
= pyg_type_lookup(G_VALUE_TYPE(value
));
800 return bm
->fromvalue(value
);
803 return pyg_boxed_new(G_VALUE_TYPE(value
),
804 g_value_get_boxed(value
), TRUE
, TRUE
);
806 return pyg_boxed_new(G_VALUE_TYPE(value
),
807 g_value_get_boxed(value
),FALSE
,FALSE
);
811 return pyg_param_spec_new(g_value_get_param(value
));
813 return pygobject_new(g_value_get_object(value
));
816 GVariant
*v
= g_value_get_variant(value
);
821 return _pygi_struct_new_from_g_type (G_TYPE_VARIANT
, g_variant_ref(v
), FALSE
);
826 if ((bm
= pyg_type_lookup(G_VALUE_TYPE(value
))))
827 return bm
->fromvalue(value
);
837 * pyg_value_as_pyobject:
838 * @value: the GValue object.
839 * @copy_boxed: true if boxed values should be copied.
841 * This function creates/returns a Python wrapper object that
842 * represents the GValue passed as an argument.
844 * Returns: a PyObject representing the value or %NULL and sets an exception.
847 pyg_value_as_pyobject (const GValue
*value
, gboolean copy_boxed
)
850 const gchar
*type_name
;
851 GType fundamental
= G_TYPE_FUNDAMENTAL (G_VALUE_TYPE (value
));
853 /* HACK: special case char and uchar to return PyBytes intstead of integers
854 * in the general case. Property access will skip this by calling
855 * pygi_value_to_py_basic_type() directly.
856 * See: https://bugzilla.gnome.org/show_bug.cgi?id=733893 */
857 if (fundamental
== G_TYPE_CHAR
) {
858 gint8 val
= g_value_get_schar(value
);
859 return PYGLIB_PyUnicode_FromStringAndSize ((char *)&val
, 1);
860 } else if (fundamental
== G_TYPE_UCHAR
) {
861 guint8 val
= g_value_get_uchar(value
);
862 return PYGLIB_PyBytes_FromStringAndSize ((char *)&val
, 1);
865 pyobj
= pygi_value_to_py_basic_type (value
, fundamental
);
870 pyobj
= pygi_value_to_py_structured_type (value
, fundamental
, copy_boxed
);
875 if (!PyErr_Occurred ()) {
876 type_name
= g_type_name (G_VALUE_TYPE (value
));
877 if (type_name
== NULL
) {
878 type_name
= "(null)";
880 PyErr_Format (PyExc_TypeError
, "unknown type %s", type_name
);
889 pyg_param_gvalue_from_pyobject(GValue
* value
,
891 const GParamSpec
* pspec
)
893 if (G_IS_PARAM_SPEC_UNICHAR(pspec
)) {
896 if (!pyg_pyobj_to_unichar_conv(py_obj
, &u
)) {
900 g_value_set_uint(value
, u
);
903 else if (G_IS_PARAM_SPEC_VALUE_ARRAY(pspec
))
904 return pyg_value_array_from_pyobject(value
, py_obj
,
905 G_PARAM_SPEC_VALUE_ARRAY(pspec
));
907 return pyg_value_from_pyobject(value
, py_obj
);
912 pyg_param_gvalue_as_pyobject(const GValue
* gvalue
,
914 const GParamSpec
* pspec
)
916 if (G_IS_PARAM_SPEC_UNICHAR(pspec
)) {
918 Py_UNICODE uni_buffer
[2] = { 0, 0 };
920 u
= g_value_get_uint(gvalue
);
922 return PyUnicode_FromUnicode(uni_buffer
, 1);
925 return pyg_value_as_pyobject(gvalue
, copy_boxed
);
930 pyg_strv_from_gvalue(const GValue
*value
)
932 gchar
**argv
= (gchar
**) g_value_get_boxed(value
);
940 py_argv
= PyList_New(argc
);
941 for (i
= 0; i
< argc
; ++i
)
942 PyList_SET_ITEM(py_argv
, i
, PYGLIB_PyUnicode_FromString(argv
[i
]));
947 pyg_strv_to_gvalue(GValue
*value
, PyObject
*obj
)
952 if (!(PyTuple_Check (obj
) || PyList_Check (obj
)))
955 argc
= PySequence_Length (obj
);
956 argv
= g_new (gchar
*, argc
+ 1);
957 for (i
= 0; i
< argc
; ++i
) {
958 PyObject
* item
= PySequence_Fast_GET_ITEM (obj
, i
);
959 /* same as _pygi_marshal_from_py_utf8 */
960 if (PyUnicode_Check (item
)) {
961 PyObject
*pystr_obj
= PyUnicode_AsUTF8String (item
);
965 argv
[i
] = g_strdup (PYGLIB_PyBytes_AsString (pystr_obj
));
966 Py_DECREF (pystr_obj
);
968 #if PY_VERSION_HEX < 0x03000000
969 else if (PyString_Check (item
)) {
970 argv
[i
] = g_strdup (PyString_AsString (item
));
979 g_value_take_boxed (value
, argv
);
983 for (i
= i
- 1; i
>= 0; i
--) {