[glib/gobject-speedups: 25/25] Avoid g_type_class_peek
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib/gobject-speedups: 25/25] Avoid g_type_class_peek
- Date: Wed, 25 May 2022 15:02:07 +0000 (UTC)
commit 249db88a222f574dcd2e6a1c021030fa7ef685d2
Author: Matthias Clasen <mclasen redhat com>
Date: Thu May 19 21:53:31 2022 -0400
Avoid g_type_class_peek
Most of the time, properties belong to the class
we set them on. Check that first, before going
into GType, which takes locks and whatnot.
gobject/gobject.c | 31 +++++++++++++++++--------------
1 file changed, 17 insertions(+), 14 deletions(-)
---
diff --git a/gobject/gobject.c b/gobject/gobject.c
index e1e47d776b..e362c07ae8 100644
--- a/gobject/gobject.c
+++ b/gobject/gobject.c
@@ -1567,15 +1567,16 @@ object_get_property (GObject *object,
GParamSpec *pspec,
GValue *value)
{
- GObjectClass *class = g_type_class_peek (pspec->owner_type);
+ GTypeInstance *inst = (GTypeInstance *) object;
+ GObjectClass *class;
guint param_id = PARAM_SPEC_PARAM_ID (pspec);
- if (class == NULL)
- {
- g_warning ("'%s::%s' is not a valid property name; '%s' is not a GObject subtype",
- g_type_name (pspec->owner_type), pspec->name, g_type_name (pspec->owner_type));
- return;
- }
+ if (G_LIKELY (inst->g_class->g_type == pspec->owner_type))
+ class = (GObjectClass *) inst->g_class;
+ else
+ class = g_type_class_peek (pspec->owner_type);
+
+ g_assert (class != NULL);
if (((GTypeInstance *)pspec)->g_class->g_type == G_TYPE_PARAM_OVERRIDE)
pspec = ((GParamSpecOverride *)pspec)->overridden;
@@ -1591,16 +1592,18 @@ object_set_property (GObject *object,
const GValue *value,
GObjectNotifyQueue *nqueue)
{
- GObjectClass *class = g_type_class_peek (pspec->owner_type);
+ GTypeInstance *inst = (GTypeInstance *) object;
+ GValue tmp_value = G_VALUE_INIT;
+ GObjectClass *class;
GParamSpecClass *pclass;
guint param_id = PARAM_SPEC_PARAM_ID (pspec);
- if (G_UNLIKELY (class == NULL))
- {
- g_warning ("'%s::%s' is not a valid property name; '%s' is not a GObject subtype",
- g_type_name (pspec->owner_type), pspec->name, g_type_name (pspec->owner_type));
- return;
- }
+ if (G_LIKELY (inst->g_class->g_type == pspec->owner_type))
+ class = (GObjectClass *) inst->g_class;
+ else
+ class = g_type_class_peek (pspec->owner_type);
+
+ g_assert (class != NULL);
if (((GTypeInstance *)pspec)->g_class->g_type == G_TYPE_PARAM_OVERRIDE)
pspec = ((GParamSpecOverride *)pspec)->overridden;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]