mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-24 19:22:11 +01:00
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:
parent
3b91df6678
commit
14f13c1760
9
ginfo.c
9
ginfo.c
@ -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
|
||||
|
@ -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 */
|
||||
|
||||
|
@ -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;
|
||||
|
@ -312,6 +312,7 @@ struct _GIrNodeStruct
|
||||
gboolean deprecated;
|
||||
gboolean disguised;
|
||||
gboolean is_gtype_struct;
|
||||
gboolean foreign;
|
||||
|
||||
gchar *gtype_name;
|
||||
gchar *gtype_init;
|
||||
|
@ -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_);
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user