}
static void
-canonalize_key(gchar *key)
+canonalize_key (gchar *key)
{
- gchar *p, c;
-
- for (p = key; (c = *p) != 0; p++)
+ gchar *p;
+
+ for (p = key; *p != 0; p++)
{
+ gchar c = *p;
+
if (c != '-' &&
(c < '0' || c > '9') &&
(c < 'A' || c > 'Z') &&
GParamFlags flags)
{
GParamSpec *pspec;
-
+
g_return_val_if_fail (G_TYPE_IS_PARAM (param_type) && param_type != G_TYPE_PARAM, NULL);
g_return_val_if_fail (name != NULL, NULL);
g_return_val_if_fail ((name[0] >= 'A' && name[0] <= 'Z') || (name[0] >= 'a' && name[0] <= 'z'), NULL);
-
+
pspec = (gpointer) g_type_create_instance (param_type);
pspec->name = g_strdup (name);
canonalize_key (pspec->name);
pspec->_nick = g_strdup (nick);
pspec->_blurb = g_strdup (blurb);
pspec->flags = (flags & G_PARAM_USER_MASK) | (flags & G_PARAM_MASK);
-
+
return pspec;
}
gpointer data);
static IFaceHolder* type_iface_peek_holder_L (TypeNode *iface,
GType instance_type);
+static gboolean type_node_is_a_L (TypeNode *node,
+ TypeNode *iface_node);
/* --- structures --- */
TypeNode *iface = lookup_type_node_I (iface_type);
IFaceEntry *entry;
TypeNode *tnode;
+ GType *prerequisites;
+ guint i;
+
if (!node || !node->is_instantiatable)
{
NODE_NAME (tnode));
return FALSE;
}
+ prerequisites = IFACE_NODE_PREREQUISITES (iface);
+ for (i = 0; i < IFACE_NODE_N_PREREQUISITES (iface); i++)
+ {
+ tnode = lookup_type_node_I (prerequisites[i]);
+ if (!type_node_is_a_L (node, tnode))
+ {
+ g_warning ("cannot add interface type `%s' to type `%s' which does not conform to prerequisite `%s'",
+ NODE_NAME (iface),
+ NODE_NAME (node),
+ NODE_NAME (tnode));
+ return FALSE;
+ }
+ }
return TRUE;
}
}
static inline gboolean
-type_node_is_a_U (TypeNode *node,
- TypeNode *iface_node,
- /* support_inheritance */
- gboolean support_interfaces,
- gboolean support_prerequisites)
+type_node_check_conformities_UorL (TypeNode *node,
+ TypeNode *iface_node,
+ /* support_inheritance */
+ gboolean support_interfaces,
+ gboolean support_prerequisites,
+ gboolean have_lock)
{
gboolean match;
match = FALSE;
if (support_interfaces || support_prerequisites)
{
- G_READ_LOCK (&type_rw_lock);
+ if (!have_lock)
+ G_READ_LOCK (&type_rw_lock);
if (support_interfaces && type_lookup_iface_entry_L (node, iface_node))
match = TRUE;
else if (support_prerequisites && type_lookup_prerequisite_L (node, NODE_TYPE (iface_node)))
match = TRUE;
- G_READ_UNLOCK (&type_rw_lock);
+ if (!have_lock)
+ G_READ_UNLOCK (&type_rw_lock);
}
return match;
}
+static gboolean
+type_node_is_a_L (TypeNode *node,
+ TypeNode *iface_node)
+{
+ return type_node_check_conformities_UorL (node, iface_node, TRUE, TRUE, TRUE);
+}
+
+static inline gboolean
+type_node_conforms_to_U (TypeNode *node,
+ TypeNode *iface_node,
+ gboolean support_interfaces,
+ gboolean support_prerequisites)
+{
+ return type_node_check_conformities_UorL (node, iface_node, support_interfaces, support_prerequisites, FALSE);
+}
+
gboolean
g_type_is_a (GType type,
GType iface_type)
node = lookup_type_node_I (type);
iface_node = lookup_type_node_I (iface_type);
- is_a = node && iface_node && type_node_is_a_U (node, iface_node, TRUE, TRUE);
+ is_a = node && iface_node && type_node_conforms_to_U (node, iface_node, TRUE, TRUE);
return is_a;
}
node = lookup_type_node_I (type_instance->g_class->g_type);
iface = lookup_type_node_I (iface_type);
- check = node && node->is_instantiatable && iface && type_node_is_a_U (node, iface, TRUE, FALSE);
+ check = node && node->is_instantiatable && iface && type_node_conforms_to_U (node, iface, TRUE, FALSE);
return check;
}
node = lookup_type_node_I (type_class->g_type);
iface = lookup_type_node_I (is_a_type);
- check = node && node->is_classed && iface && type_node_is_a_U (node, iface, FALSE, FALSE);
+ check = node && node->is_classed && iface && type_node_conforms_to_U (node, iface, FALSE, FALSE);
return check;
}
node = lookup_type_node_I (type_instance->g_class->g_type);
is_instantiatable = node && node->is_instantiatable;
iface = lookup_type_node_I (iface_type);
- check = is_instantiatable && iface && type_node_is_a_U (node, iface, TRUE, FALSE);
+ check = is_instantiatable && iface && type_node_conforms_to_U (node, iface, TRUE, FALSE);
if (check)
return type_instance;
node = lookup_type_node_I (type_class->g_type);
is_classed = node && node->is_classed;
iface = lookup_type_node_I (is_a_type);
- check = is_classed && iface && type_node_is_a_U (node, iface, FALSE, FALSE);
+ check = is_classed && iface && type_node_conforms_to_U (node, iface, FALSE, FALSE);
if (check)
return type_class;