[pygobject] Optimize property get/set when using GObject.props
- From: Simon Feltman <sfeltman src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pygobject] Optimize property get/set when using GObject.props
- Date: Wed, 17 Apr 2013 02:21:18 +0000 (UTC)
commit 8981ea0422c6837d488311dafe8937593372e736
Author: Daniel Drake <dsd laptop org>
Date: Mon Mar 18 14:25:45 2013 -0600
Optimize property get/set when using GObject.props
Skip GI repository lookup for properties defined on Python
defined GObject types.
Signed-off-by: Simon Feltman <sfeltman src gnome org>
https://bugzilla.gnome.org/show_bug.cgi?id=696143
gi/_gobject/pygobject.c | 37 +++++++++++++++++++------------------
1 file changed, 19 insertions(+), 18 deletions(-)
---
diff --git a/gi/_gobject/pygobject.c b/gi/_gobject/pygobject.c
index 102041c..c92a3f7 100644
--- a/gi/_gobject/pygobject.c
+++ b/gi/_gobject/pygobject.c
@@ -299,15 +299,16 @@ PyGProps_getattro(PyGProps *self, PyObject *attr)
return pyg_param_spec_new(pspec);
}
- /* See if the property's class is from the gi repository. If so,
- * use gi to correctly read the property value. */
- ret = pygi_get_property_value (self->pygobject, pspec);
- if (ret != NULL) {
- return ret;
+ if (!pyg_gtype_is_custom (pspec->owner_type)) {
+ /* The GType is not implemented at the Python level: see if we can
+ * read the property value via gi. */
+ ret = pygi_get_property_value (self->pygobject, pspec);
+ if (ret)
+ return ret;
}
-
- /* If we reach here, it must be a property defined outside of gi.
- * Just do a straightforward read. */
+
+ /* The GType is implemented in Python, or we failed to read it via gi:
+ * do a straightforward read. */
g_value_init(&value, G_PARAM_SPEC_VALUE_TYPE(pspec));
pyg_begin_allow_threads;
g_object_get_property(self->pygobject->obj, pspec->name, &value);
@@ -402,18 +403,18 @@ PyGProps_setattro(PyGProps *self, PyObject *attr, PyObject *pvalue)
if (!pspec) {
return PyObject_GenericSetAttr((PyObject *)self, attr, pvalue);
}
-
- /* See if the property's class is from the gi repository. If so,
- * use gi to correctly read the property value. */
- ret = pygi_set_property_value (self->pygobject, pspec, pvalue);
- if (ret == 0)
- return 0;
- else if (ret == -1)
- if (PyErr_Occurred())
+ if (!pyg_gtype_is_custom (pspec->owner_type)) {
+ /* This GType is not implemented in Python: see if we can set the
+ * property via gi. */
+ ret = pygi_set_property_value (self->pygobject, pspec, pvalue);
+ if (ret == 0)
+ return 0;
+ else if (ret == -1 && PyErr_Occurred())
return -1;
+ }
- /* If we reach here, it must be a property defined outside of gi.
- * Just do a straightforward set. */
+ /* This GType is implemented in Python, or we failed to set it via gi:
+ * do a straightforward set. */
if (!set_property_from_pspec(obj, pspec, pvalue))
return -1;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]