Add support for foreign structs

Foreign structs are special in the sense that there might
be native bindings (for instance PyCairo for PyGI) that provides
the same functionallity as the introspected variant.

https://bugzilla.gnome.org/show_bug.cgi?id=610357
This commit is contained in:
Johan Dahlin 2010-03-25 23:12:12 -03:00 committed by Johan Dahlin
parent 3b91df6678
commit 14f13c1760
6 changed files with 20 additions and 1 deletions

View File

@ -1392,6 +1392,15 @@ g_struct_info_get_alignment (GIStructInfo *info)
return blob->alignment;
}
gboolean
g_struct_info_is_foreign (GIStructInfo *info)
{
GIRealInfo *rinfo = (GIRealInfo *)info;
StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset];
return blob->foreign;
}
/**
* g_struct_info_is_gtype_struct:
* @info: GIStructInfo

View File

@ -461,6 +461,7 @@ GIFunctionInfo * g_struct_info_find_method (GIStructInfo *info,
gsize g_struct_info_get_size (GIStructInfo *info);
gsize g_struct_info_get_alignment (GIStructInfo *info);
gboolean g_struct_info_is_gtype_struct (GIStructInfo *info);
gboolean g_struct_info_is_foreign (GIStructInfo *info);
/* GIRegisteredTypeInfo */

View File

@ -1885,6 +1885,7 @@ g_ir_node_build_typelib (GIrNode *node,
GList *members;
blob->blob_type = BLOB_TYPE_STRUCT;
blob->foreign = struct_->foreign;
blob->deprecated = struct_->deprecated;
blob->is_gtype_struct = struct_->is_gtype_struct;
blob->reserved = 0;

View File

@ -312,6 +312,7 @@ struct _GIrNodeStruct
gboolean deprecated;
gboolean disguised;
gboolean is_gtype_struct;
gboolean foreign;
gchar *gtype_name;
gchar *gtype_init;

View File

@ -2201,6 +2201,7 @@ start_struct (GMarkupParseContext *context,
const gchar *gtype_name;
const gchar *gtype_init;
const gchar *gtype_struct;
const gchar *foreign;
GIrNodeStruct *struct_;
name = find_attribute ("name", attribute_names, attribute_values);
@ -2209,6 +2210,7 @@ start_struct (GMarkupParseContext *context,
gtype_name = find_attribute ("glib:type-name", attribute_names, attribute_values);
gtype_init = find_attribute ("glib:get-type", attribute_names, attribute_values);
gtype_struct = find_attribute ("glib:is-gtype-struct-for", attribute_names, attribute_values);
foreign = find_attribute ("foreign", attribute_names, attribute_values);
if (name == NULL && ctx->node_stack == NULL)
{
@ -2242,6 +2244,8 @@ start_struct (GMarkupParseContext *context,
struct_->gtype_name = g_strdup (gtype_name);
struct_->gtype_init = g_strdup (gtype_init);
struct_->foreign = (g_strcmp0 (foreign, "1") == 0);
if (ctx->node_stack == NULL)
ctx->current_module->entries =
g_list_append (ctx->current_module->entries, struct_);

View File

@ -669,6 +669,8 @@ typedef struct {
* @unregistered: If this is set, the type is not registered with GType.
* @alignment: The byte boundary that the struct is aligned to in memory
* @is_gtype_struct: Whether this structure is the class or interface layout for a GObject
* @foreign: If the type is foreign, eg if it's expected to be overridden by
* a native language binding instead of relying of introspected bindings.
* @size: The size of the struct in bytes.
* @gtype_name: String name of the associated #GType
* @gtype_init: String naming the symbol which gets the runtime #GType
@ -685,7 +687,8 @@ typedef struct {
guint16 unregistered : 1;
guint16 is_gtype_struct : 1;
guint16 alignment : 6;
guint16 reserved : 7;
guint16 foreign : 1;
guint16 reserved : 6;
guint32 name;