Bug 572434 - Associate interfaces with their C structures

Similar to GObject class structs, we pair up GInterfaces with
their C structures.

Also, move some GLib-specific things into glibast.py, and make
the naming more generic.
This commit is contained in:
Colin Walters 2009-02-20 17:34:20 -05:00
parent f13354f9ea
commit 9dbb0bf80f
7 changed files with 64 additions and 33 deletions

40
ginfo.c
View File

@ -1182,22 +1182,22 @@ g_struct_info_get_alignment (GIStructInfo *info)
} }
/** /**
* g_struct_info_is_class_struct: * g_struct_info_is_gtype_struct:
* @info: GIStructInfo * @info: GIStructInfo
* *
* Return true if this structure represents the "class structure" for some * Return true if this structure represents the "class structure" for some
* GObject. This function is mainly useful to hide this kind of structure * #GObject or #GInterface. This function is mainly useful to hide this kind of structure
* from public APIs. * from generated public APIs.
* *
* Returns: TRUE if it's a class struct, otherwise FALSE * Returns: %TRUE if this is a class struct, %FALSE otherwise
*/ */
gboolean gboolean
g_struct_info_is_class_struct (GIStructInfo *info) g_struct_info_is_gtype_struct (GIStructInfo *info)
{ {
GIBaseInfo *base = (GIBaseInfo *)info; GIBaseInfo *base = (GIBaseInfo *)info;
StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset]; StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
return blob->is_class_struct; return blob->is_gtype_struct;
} }
gint gint
@ -1495,10 +1495,10 @@ g_object_info_get_constant (GIObjectInfo *info,
* g_object_info_get_class_struct: * g_object_info_get_class_struct:
* @info: A #GIObjectInfo to query * @info: A #GIObjectInfo to query
* *
* Every GObject has two structures; an instance structure and a class * Every #GObject has two structures; an instance structure and a class
* structure. This function returns the metadata for the class structure. * structure. This function returns the metadata for the class structure.
* *
* Returns: a GIStrucTInfo for the class struct or NULL if none found. * Returns: a #GIStructInfo for the class struct or %NULL if none found.
*/ */
GIStructInfo * GIStructInfo *
g_object_info_get_class_struct (GIObjectInfo *info) g_object_info_get_class_struct (GIObjectInfo *info)
@ -1506,9 +1506,9 @@ g_object_info_get_class_struct (GIObjectInfo *info)
GIBaseInfo *base = (GIBaseInfo *)info; GIBaseInfo *base = (GIBaseInfo *)info;
ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset]; ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
if (blob->class_struct) if (blob->gtype_struct)
return (GIStructInfo *) g_info_from_entry (base->repository, return (GIStructInfo *) g_info_from_entry (base->repository,
base->typelib, blob->class_struct); base->typelib, blob->gtype_struct);
else else
return NULL; return NULL;
} }
@ -1691,8 +1691,26 @@ g_interface_info_get_constant (GIInterfaceInfo *info,
base->typelib, offset); base->typelib, offset);
} }
/**
* g_interface_info_get_iface_struct:
* @info: A #GIInterfaceInfo to query
*
* Returns the layout C structure associated with this #GInterface.
*
* Returns: A #GIStructInfo for the class struct or %NULL if none found.
*/
GIStructInfo *
g_interface_info_get_iface_struct (GIInterfaceInfo *info)
{
GIBaseInfo *base = (GIBaseInfo *)info;
InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
if (blob->gtype_struct)
return (GIStructInfo *) g_info_from_entry (base->repository,
base->typelib, blob->gtype_struct);
else
return NULL;
}
/* GIPropertyInfo functions */ /* GIPropertyInfo functions */
GParamFlags GParamFlags

View File

@ -417,7 +417,7 @@ GIFunctionInfo * g_struct_info_find_method (GIStructInfo *info,
const gchar *name); const gchar *name);
gsize g_struct_info_get_size (GIStructInfo *info); gsize g_struct_info_get_size (GIStructInfo *info);
gsize g_struct_info_get_alignment (GIStructInfo *info); gsize g_struct_info_get_alignment (GIStructInfo *info);
gboolean g_struct_info_is_class_struct (GIStructInfo *info); gboolean g_struct_info_is_gtype_struct (GIStructInfo *info);
/* GIRegisteredTypeInfo */ /* GIRegisteredTypeInfo */
@ -487,6 +487,8 @@ gint g_interface_info_get_n_constants (GIInterfaceInfo *in
GIConstantInfo * g_interface_info_get_constant (GIInterfaceInfo *info, GIConstantInfo * g_interface_info_get_constant (GIInterfaceInfo *info,
gint n); gint n);
GIStructInfo * g_interface_info_get_iface_struct (GIInterfaceInfo *info);
/* GIPropertyInfo */ /* GIPropertyInfo */

View File

@ -286,7 +286,8 @@ g_ir_node_free (GIrNode *node)
g_free (iface->gtype_name); g_free (iface->gtype_name);
g_free (iface->gtype_init); g_free (iface->gtype_init);
g_free (iface->class_struct);
g_free (iface->glib_type_struct);
g_free (iface->parent); g_free (iface->parent);
for (l = iface->interfaces; l; l = l->next) for (l = iface->interfaces; l; l = l->next)
@ -652,8 +653,8 @@ g_ir_node_get_full_size_internal (GIrNode *parent,
size = sizeof(ObjectBlob); size = sizeof(ObjectBlob);
if (iface->parent) if (iface->parent)
size += ALIGN_VALUE (strlen (iface->parent) + 1, 4); size += ALIGN_VALUE (strlen (iface->parent) + 1, 4);
if (iface->class_struct) if (iface->glib_type_struct)
size += ALIGN_VALUE (strlen (iface->class_struct) + 1, 4); size += ALIGN_VALUE (strlen (iface->glib_type_struct) + 1, 4);
size += ALIGN_VALUE (strlen (node->name) + 1, 4); size += ALIGN_VALUE (strlen (node->name) + 1, 4);
size += ALIGN_VALUE (strlen (iface->gtype_name) + 1, 4); size += ALIGN_VALUE (strlen (iface->gtype_name) + 1, 4);
if (iface->gtype_init) if (iface->gtype_init)
@ -1781,7 +1782,7 @@ g_ir_node_build_typelib (GIrNode *node,
blob->blob_type = BLOB_TYPE_STRUCT; blob->blob_type = BLOB_TYPE_STRUCT;
blob->deprecated = struct_->deprecated; blob->deprecated = struct_->deprecated;
blob->is_class_struct = struct_->is_gclass_struct; blob->is_gtype_struct = struct_->is_gtype_struct;
blob->reserved = 0; blob->reserved = 0;
blob->name = write_string (node->name, strings, data, offset2); blob->name = write_string (node->name, strings, data, offset2);
blob->alignment = struct_->alignment; blob->alignment = struct_->alignment;
@ -1984,10 +1985,10 @@ g_ir_node_build_typelib (GIrNode *node,
blob->parent = find_entry (module, modules, object->parent); blob->parent = find_entry (module, modules, object->parent);
else else
blob->parent = 0; blob->parent = 0;
if (object->class_struct) if (object->glib_type_struct)
blob->class_struct = find_entry (module, modules, object->class_struct); blob->gtype_struct = find_entry (module, modules, object->glib_type_struct);
else else
blob->class_struct = 0; blob->gtype_struct = 0;
blob->n_interfaces = 0; blob->n_interfaces = 0;
blob->n_fields = 0; blob->n_fields = 0;
@ -2049,6 +2050,10 @@ g_ir_node_build_typelib (GIrNode *node,
blob->name = write_string (node->name, strings, data, offset2); blob->name = write_string (node->name, strings, data, offset2);
blob->gtype_name = write_string (iface->gtype_name, strings, data, offset2); blob->gtype_name = write_string (iface->gtype_name, strings, data, offset2);
blob->gtype_init = write_string (iface->gtype_init, strings, data, offset2); blob->gtype_init = write_string (iface->gtype_init, strings, data, offset2);
if (iface->glib_type_struct)
blob->gtype_struct = find_entry (module, modules, iface->glib_type_struct);
else
blob->gtype_struct = 0;
blob->n_prerequisites = 0; blob->n_prerequisites = 0;
blob->n_properties = 0; blob->n_properties = 0;
blob->n_methods = 0; blob->n_methods = 0;

View File

@ -237,7 +237,7 @@ struct _GIrNodeInterface
gchar *gtype_init; gchar *gtype_init;
gchar *parent; gchar *parent;
gchar *class_struct; /* Only applies to classes */ gchar *glib_type_struct;
GList *interfaces; GList *interfaces;
GList *prerequisites; GList *prerequisites;
@ -302,7 +302,7 @@ struct _GIrNodeStruct
gboolean deprecated; gboolean deprecated;
gboolean disguised; gboolean disguised;
gboolean is_gclass_struct; gboolean is_gtype_struct;
gchar *gtype_name; gchar *gtype_name;
gchar *gtype_init; gchar *gtype_init;

View File

@ -1482,10 +1482,12 @@ start_interface (GMarkupParseContext *context,
const gchar *typename; const gchar *typename;
const gchar *typeinit; const gchar *typeinit;
const gchar *deprecated; const gchar *deprecated;
const gchar *glib_type_struct;
name = find_attribute ("name", attribute_names, attribute_values); name = find_attribute ("name", attribute_names, attribute_values);
typename = find_attribute ("glib:type-name", attribute_names, attribute_values); typename = find_attribute ("glib:type-name", attribute_names, attribute_values);
typeinit = find_attribute ("glib:get-type", attribute_names, attribute_values); typeinit = find_attribute ("glib:get-type", attribute_names, attribute_values);
glib_type_struct = find_attribute ("glib:type-struct", attribute_names, attribute_values);
deprecated = find_attribute ("deprecated", attribute_names, attribute_values); deprecated = find_attribute ("deprecated", attribute_names, attribute_values);
if (name == NULL) if (name == NULL)
@ -1502,6 +1504,7 @@ start_interface (GMarkupParseContext *context,
((GIrNode *)iface)->name = g_strdup (name); ((GIrNode *)iface)->name = g_strdup (name);
iface->gtype_name = g_strdup (typename); iface->gtype_name = g_strdup (typename);
iface->gtype_init = g_strdup (typeinit); iface->gtype_init = g_strdup (typeinit);
iface->glib_type_struct = g_strdup (glib_type_struct);
if (deprecated) if (deprecated)
iface->deprecated = TRUE; iface->deprecated = TRUE;
else else
@ -1533,7 +1536,7 @@ start_class (GMarkupParseContext *context,
{ {
const gchar *name; const gchar *name;
const gchar *parent; const gchar *parent;
const gchar *class_struct; const gchar *glib_type_struct;
const gchar *typename; const gchar *typename;
const gchar *typeinit; const gchar *typeinit;
const gchar *deprecated; const gchar *deprecated;
@ -1541,7 +1544,7 @@ start_class (GMarkupParseContext *context,
name = find_attribute ("name", attribute_names, attribute_values); name = find_attribute ("name", attribute_names, attribute_values);
parent = find_attribute ("parent", attribute_names, attribute_values); parent = find_attribute ("parent", attribute_names, attribute_values);
class_struct = find_attribute ("glib:class-struct", attribute_names, attribute_values); glib_type_struct = find_attribute ("glib:type-struct", attribute_names, attribute_values);
typename = find_attribute ("glib:type-name", attribute_names, attribute_values); typename = find_attribute ("glib:type-name", attribute_names, attribute_values);
typeinit = find_attribute ("glib:get-type", attribute_names, attribute_values); typeinit = find_attribute ("glib:get-type", attribute_names, attribute_values);
deprecated = find_attribute ("deprecated", attribute_names, attribute_values); deprecated = find_attribute ("deprecated", attribute_names, attribute_values);
@ -1562,7 +1565,7 @@ start_class (GMarkupParseContext *context,
iface->gtype_name = g_strdup (typename); iface->gtype_name = g_strdup (typename);
iface->gtype_init = g_strdup (typeinit); iface->gtype_init = g_strdup (typeinit);
iface->parent = g_strdup (parent); iface->parent = g_strdup (parent);
iface->class_struct = g_strdup (class_struct); iface->glib_type_struct = g_strdup (glib_type_struct);
if (deprecated) if (deprecated)
iface->deprecated = TRUE; iface->deprecated = TRUE;
else else
@ -2128,7 +2131,7 @@ start_struct (GMarkupParseContext *context,
const gchar *disguised; const gchar *disguised;
const gchar *gtype_name; const gchar *gtype_name;
const gchar *gtype_init; const gchar *gtype_init;
const gchar *gclass_struct; const gchar *gtype_struct;
GIrNodeStruct *struct_; GIrNodeStruct *struct_;
name = find_attribute ("name", attribute_names, attribute_values); name = find_attribute ("name", attribute_names, attribute_values);
@ -2136,7 +2139,7 @@ start_struct (GMarkupParseContext *context,
disguised = find_attribute ("disguised", attribute_names, attribute_values); disguised = find_attribute ("disguised", attribute_names, attribute_values);
gtype_name = find_attribute ("glib:type-name", attribute_names, attribute_values); gtype_name = find_attribute ("glib:type-name", attribute_names, attribute_values);
gtype_init = find_attribute ("glib:get-type", attribute_names, attribute_values); gtype_init = find_attribute ("glib:get-type", attribute_names, attribute_values);
gclass_struct = find_attribute ("glib:is-class-struct-for", attribute_names, attribute_values); gtype_struct = find_attribute ("glib:is-gtype-struct-for", attribute_names, attribute_values);
if (name == NULL && ctx->node_stack == NULL) if (name == NULL && ctx->node_stack == NULL)
{ {
@ -2165,7 +2168,7 @@ start_struct (GMarkupParseContext *context,
if (disguised && strcmp (disguised, "1") == 0) if (disguised && strcmp (disguised, "1") == 0)
struct_->disguised = TRUE; struct_->disguised = TRUE;
struct_->is_gclass_struct = gclass_struct != NULL; struct_->is_gtype_struct = gtype_struct != NULL;
struct_->gtype_name = g_strdup (gtype_name); struct_->gtype_name = g_strdup (gtype_name);
struct_->gtype_init = g_strdup (gtype_init); struct_->gtype_init = g_strdup (gtype_init);

View File

@ -183,7 +183,7 @@ g_typelib_check_sanity (void)
CHECK_SIZE (SignalBlob, 16); CHECK_SIZE (SignalBlob, 16);
CHECK_SIZE (VFuncBlob, 20); CHECK_SIZE (VFuncBlob, 20);
CHECK_SIZE (ObjectBlob, 44); CHECK_SIZE (ObjectBlob, 44);
CHECK_SIZE (InterfaceBlob, 36); CHECK_SIZE (InterfaceBlob, 40);
CHECK_SIZE (ConstantBlob, 24); CHECK_SIZE (ConstantBlob, 24);
CHECK_SIZE (AnnotationBlob, 12); CHECK_SIZE (AnnotationBlob, 12);
CHECK_SIZE (UnionBlob, 40); CHECK_SIZE (UnionBlob, 40);
@ -1458,11 +1458,11 @@ validate_object_blob (ValidateContext *ctx,
} }
} }
if (blob->class_struct != 0) if (blob->gtype_struct != 0)
{ {
DirEntry *entry; DirEntry *entry;
entry = get_dir_entry_checked (typelib, blob->class_struct, error); entry = get_dir_entry_checked (typelib, blob->gtype_struct, error);
if (!entry) if (!entry)
return FALSE; return FALSE;
if (entry->blob_type != BLOB_TYPE_STRUCT && entry->local) if (entry->blob_type != BLOB_TYPE_STRUCT && entry->local)

View File

@ -72,6 +72,7 @@ G_BEGIN_DECLS
TYPELIB HISTORY TYPELIB HISTORY
----- -----
Version 1.0 Version 1.0
- Rename class_struct to gtype_struct, add to interfaces
Changes since 0.9: Changes since 0.9:
- Add padding to structures - Add padding to structures
@ -651,7 +652,7 @@ typedef struct {
* @deprecated: Whether this structure is deprecated * @deprecated: Whether this structure is deprecated
* @unregistered: If this is set, the type is not registered with GType. * @unregistered: If this is set, the type is not registered with GType.
* @alignment: The byte boundary that the struct is aligned to in memory * @alignment: The byte boundary that the struct is aligned to in memory
* @is_class_struct: Whether this structure is the "class structure" for a GObject * @is_gtype_struct: Whether this structure is the class or interface layout for a GObject
* @size: The size of the struct in bytes. * @size: The size of the struct in bytes.
* @gtype_name: String name of the associated #GType * @gtype_name: String name of the associated #GType
* @gtype_init: String naming the symbol which gets the runtime #GType * @gtype_init: String naming the symbol which gets the runtime #GType
@ -666,7 +667,7 @@ typedef struct {
guint16 deprecated : 1; guint16 deprecated : 1;
guint16 unregistered : 1; guint16 unregistered : 1;
guint16 is_class_struct : 1; guint16 is_gtype_struct : 1;
guint16 alignment : 6; guint16 alignment : 6;
guint16 reserved : 7; guint16 reserved : 7;
@ -900,7 +901,7 @@ typedef struct {
guint32 gtype_init; guint32 gtype_init;
guint16 parent; guint16 parent;
guint16 class_struct; guint16 gtype_struct;
guint16 n_interfaces; guint16 n_interfaces;
guint16 n_fields; guint16 n_fields;
@ -929,6 +930,7 @@ typedef struct {
/** /**
* InterfaceBlob: * InterfaceBlob:
* @gtype_struct: Name of the interface "class" C structure
* @n_prerequisites: Number of prerequisites * @n_prerequisites: Number of prerequisites
* @n_properties: Number of properties * @n_properties: Number of properties
* @n_methods: Number of methods * @n_methods: Number of methods
@ -952,6 +954,7 @@ typedef struct {
guint32 gtype_name; guint32 gtype_name;
guint32 gtype_init; guint32 gtype_init;
guint16 gtype_struct;
guint16 n_prerequisites; guint16 n_prerequisites;
guint16 n_properties; guint16 n_properties;