[pygobject/value-overrides-cleanup: 3/3] GObject.Value: add a static helper for fetching the GType
- From: Christoph Reiter <creiter src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pygobject/value-overrides-cleanup: 3/3] GObject.Value: add a static helper for fetching the GType
- Date: Fri, 18 Jan 2019 19:16:09 +0000 (UTC)
commit 48f80f8b763d84294c73f428bf7ede39cef57027
Author: Christoph Reiter <reiter christoph gmail com>
Date: Fri Jan 18 20:07:17 2019 +0100
GObject.Value: add a static helper for fetching the GType
The field marshalling code is slow and doesn't do any caching at all
which in turn makes accessing Value.g_type slow.
Add a static helper function for fetching the GType and use that instead.
This reduced the time for creating a GValue + setting it by ~30%
gi/gimodule.c | 2 ++
gi/overrides/GObject.py | 16 +++++++++++-----
gi/pygi-value.c | 16 ++++++++++++++++
gi/pygi-value.h | 1 +
4 files changed, 30 insertions(+), 5 deletions(-)
---
diff --git a/gi/gimodule.c b/gi/gimodule.c
index 7ff9b0eb..2be5e478 100644
--- a/gi/gimodule.c
+++ b/gi/gimodule.c
@@ -2291,6 +2291,8 @@ static PyMethodDef _gi_functions[] = {
(PyCFunction)pyg__install_metaclass, METH_O },
{ "_gvalue_get",
(PyCFunction)pyg__gvalue_get, METH_O },
+ { "_gvalue_get_type",
+ (PyCFunction)pyg__gvalue_get_type, METH_O },
{ "_gvalue_set",
(PyCFunction)pyg__gvalue_set, METH_VARARGS },
{ NULL, NULL, 0 }
diff --git a/gi/overrides/GObject.py b/gi/overrides/GObject.py
index 4cc08a9a..04b5be65 100644
--- a/gi/overrides/GObject.py
+++ b/gi/overrides/GObject.py
@@ -209,8 +209,14 @@ class Value(GObjectModule.Value):
if py_value is not None:
self.set_value(py_value)
+ @property
+ def __g_type(self):
+ # XXX: This is the same as self.g_type, but the field marshalling
+ # code is currently very slow.
+ return _gi._gvalue_get_type(self)
+
def set_boxed(self, boxed):
- if not self.g_type.is_a(TYPE_BOXED):
+ if not self.__g_type.is_a(TYPE_BOXED):
warnings.warn('Calling set_boxed() on a non-boxed type deprecated',
PyGIDeprecationWarning, stacklevel=2)
# Workaround the introspection marshalers inability to know
@@ -219,13 +225,13 @@ class Value(GObjectModule.Value):
_gi._gvalue_set(self, boxed)
def get_boxed(self):
- if not self.g_type.is_a(TYPE_BOXED):
+ if not self.__g_type.is_a(TYPE_BOXED):
warnings.warn('Calling get_boxed() on a non-boxed type deprecated',
PyGIDeprecationWarning, stacklevel=2)
return _gi._gvalue_get(self)
def set_value(self, py_value):
- gtype = self.g_type
+ gtype = self.__g_type
if gtype == _gi.TYPE_INVALID:
raise TypeError("GObject.Value needs to be initialized first")
@@ -288,7 +294,7 @@ class Value(GObjectModule.Value):
_gi._gvalue_set(self, py_value)
def get_value(self):
- gtype = self.g_type
+ gtype = self.__g_type
if gtype == TYPE_BOOLEAN:
return self.get_boolean()
@@ -340,7 +346,7 @@ class Value(GObjectModule.Value):
return _gi._gvalue_get(self)
def __repr__(self):
- return '<Value (%s) %s>' % (self.g_type.name, self.get_value())
+ return '<Value (%s) %s>' % (self.__g_type.name, self.get_value())
Value = override(Value)
diff --git a/gi/pygi-value.c b/gi/pygi-value.c
index 93669345..8376231e 100644
--- a/gi/pygi-value.c
+++ b/gi/pygi-value.c
@@ -886,6 +886,22 @@ pyg__gvalue_get(PyObject *module, PyObject *pygvalue)
/*copy_boxed=*/ TRUE);
}
+PyObject *
+pyg__gvalue_get_type(PyObject *module, PyObject *pygvalue)
+{
+ GValue *value;
+ GType type;
+
+ if (!pyg_boxed_check (pygvalue, G_TYPE_VALUE)) {
+ PyErr_SetString (PyExc_TypeError, "Expected GValue argument.");
+ return NULL;
+ }
+
+ value = pyg_boxed_get (pygvalue, GValue);
+ type = G_VALUE_TYPE (value);
+ return pyg_type_wrapper_new (type);
+}
+
PyObject *
pyg__gvalue_set(PyObject *module, PyObject *args)
{
diff --git a/gi/pygi-value.h b/gi/pygi-value.h
index 6450112d..5778a22c 100644
--- a/gi/pygi-value.h
+++ b/gi/pygi-value.h
@@ -45,6 +45,7 @@ PyObject *pygi_value_to_py_basic_type (const GValue *value,
PyObject *pyg__gvalue_get(PyObject *module, PyObject *pygvalue);
PyObject *pyg__gvalue_set(PyObject *module, PyObject *args);
+PyObject *pyg__gvalue_get_type(PyObject *module, PyObject *pygvalue);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]