From a80fc07f324d415e4ebe75824775c416d504e968 Mon Sep 17 00:00:00 2001 From: Tim Janik Date: Wed, 15 Aug 2001 09:19:52 +0000 Subject: [PATCH] if __GNUC__ is defined, inline a test for an exact type match for Wed Jul 18 19:42:31 2001 Tim Janik * gtype.h: if __GNUC__ is defined, inline a test for an exact type match for instances and classes in G_TYPE_CHECK_INSTANCE_TYPE() and G_TYPE_CHECK_CLASS_TYPE() before calling g_type_instance_is_a(). --- gobject/ChangeLog | 6 ++++++ gobject/gtype.c | 16 +++++++++------- gobject/gtype.h | 23 +++++++++++++++++++++-- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/gobject/ChangeLog b/gobject/ChangeLog index 7ed3bbd..7a69dea 100644 --- a/gobject/ChangeLog +++ b/gobject/ChangeLog @@ -1,3 +1,9 @@ +Wed Jul 18 19:42:31 2001 Tim Janik + + * gtype.h: if __GNUC__ is defined, inline a test for an exact type + match for instances and classes in G_TYPE_CHECK_INSTANCE_TYPE() and + G_TYPE_CHECK_CLASS_TYPE() before calling g_type_instance_is_a(). + Sun Aug 12 02:07:10 2001 Tim Janik * gvaluearray.[hc]: fix preallocation logic, support DISABLE_MEM_POOLS diff --git a/gobject/gtype.c b/gobject/gtype.c index 8530c76..5df44e7 100644 --- a/gobject/gtype.c +++ b/gobject/gtype.c @@ -451,8 +451,8 @@ type_lookup_iface_entry_L (TypeNode *node, } static inline gboolean -type_lookup_prerequisite (TypeNode *iface, - GType prerequisite_type) +type_lookup_prerequisite_L (TypeNode *iface, + GType prerequisite_type) { if (NODE_IS_IFACE (iface) && IFACE_NODE_N_PREREQUISITES (iface)) { @@ -817,13 +817,14 @@ check_add_interface_L (GType instance_type, tnode = lookup_type_node_L (NODE_PARENT_TYPE (iface)); if (NODE_PARENT_TYPE (tnode) && !type_lookup_iface_entry_L (node, tnode)) { + /* 2001/7/31:timj: erk, i guess this warning is junk as interface derivation is flat */ g_warning ("cannot add sub-interface `%s' to type `%s' which does not conform to super-interface `%s'", NODE_NAME (iface), NODE_NAME (node), NODE_NAME (tnode)); return FALSE; } - tnode = find_conforming_type_L (node, iface); + tnode = find_conforming_type_L (node, iface); // FIXME: iface overriding if (tnode) { g_warning ("cannot add interface type `%s' to type `%s', since type `%s' already conforms to interface", @@ -1166,7 +1167,8 @@ g_type_interface_add_prerequisite (GType interface_type, if (prerequisite_node->is_instantiatable) { guint i; - + + /* can have at most one publically installable instantiatable prerequisite */ for (i = 0; i < IFACE_NODE_N_PREREQUISITES (iface); i++) { TypeNode *prnode = lookup_type_node_L (IFACE_NODE_PREREQUISITES (iface)[i]); @@ -1197,7 +1199,7 @@ g_type_interface_add_prerequisite (GType interface_type, type_iface_add_prerequisite_W (iface, prerequisite_node); } else - g_warning ("prerequisite `%s' for interface `%s' is not instantiatable or interface", + g_warning ("prerequisite `%s' for interface `%s' is neither instantiatable nor interface", type_descriptive_name_L (prerequisite_type), type_descriptive_name_L (interface_type)); G_WRITE_UNLOCK (&type_rw_lock); @@ -2132,7 +2134,7 @@ type_node_is_a_L (TypeNode *node, return TRUE; else if (support_prerequisites && NODE_IS_IFACE (node) && - type_lookup_prerequisite (node, NODE_TYPE (iface_node))) + type_lookup_prerequisite_L (node, NODE_TYPE (iface_node))) return TRUE; else return FALSE; @@ -2704,7 +2706,7 @@ g_type_value_table_peek (GType type) node = lookup_type_node_L (type); if (!node) { - g_warning ("type id `%u' is invalid", type); + g_warning (G_STRLOC ": type id `%u' is invalid", type); G_READ_UNLOCK (&type_rw_lock); return NULL; } diff --git a/gobject/gtype.h b/gobject/gtype.h index 1640f08..5ae806d 100644 --- a/gobject/gtype.h +++ b/gobject/gtype.h @@ -367,12 +367,31 @@ G_CONST_RETURN gchar* g_type_name_from_class (GTypeClass *g_class); # define _G_TYPE_CCC(cp, gt, ct) ((ct*) cp) #endif /* G_DISABLE_CAST_CHECKS */ #define _G_TYPE_CHI(ip) (g_type_check_instance ((GTypeInstance*) ip)) -#define _G_TYPE_CIT(ip, gt) (g_type_instance_is_a ((GTypeInstance*) ip, gt)) -#define _G_TYPE_CCT(cp, gt) (g_type_class_is_a ((GTypeClass*) cp, gt)) #define _G_TYPE_CVH(vl, gt) (g_type_check_value_holds ((GValue*) vl, gt)) #define _G_TYPE_CHV(vl) (g_type_check_value ((GValue*) vl)) #define _G_TYPE_IGC(ip, gt, ct) ((ct*) (((GTypeInstance*) ip)->g_class)) #define _G_TYPE_IGI(ip, gt, ct) ((ct*) g_type_interface_peek (((GTypeInstance*) ip)->g_class, gt)) +#ifdef __GNUC__ +# define _G_TYPE_CIT(ip, gt) ({ \ + GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \ + if (__inst && __inst->g_class && __inst->g_class->g_type == __t) \ + __r = TRUE; \ + else \ + __r = g_type_instance_is_a (__inst, __t); \ + __r; \ +}) +# define _G_TYPE_CCT(cp, gt) ({ \ + GTypeClass *__class = (GTypeClass*) cp; GType __t = gt; gboolean __r; \ + if (__class && __class->g_type == __t) \ + __r = TRUE; \ + else \ + __r = g_type_class_is_a (__class, __t); \ + __r; \ +}) +#else /* !__GNUC__ */ +# define _G_TYPE_CIT(ip, gt) (g_type_instance_is_a ((GTypeInstance*) ip, gt)) +# define _G_TYPE_CCT(cp, gt) (g_type_class_is_a ((GTypeClass*) cp, gt)) +#endif /* !__GNUC__ */ #define G_TYPE_FLAG_RESERVED_ID_BIT (1 << 30) extern GTypeDebugFlags _g_type_debug_flags; -- 2.7.4