diff options
-rw-r--r-- | girepository/ginfo.c | 9 | ||||
-rw-r--r-- | girepository/girepository.h | 1 | ||||
-rw-r--r-- | girepository/girnode.c | 1 | ||||
-rw-r--r-- | girepository/girnode.h | 1 | ||||
-rw-r--r-- | girepository/girparser.c | 4 | ||||
-rw-r--r-- | girepository/gtypelib.h | 5 | ||||
-rw-r--r-- | tools/generate.c | 5 |
7 files changed, 25 insertions, 1 deletions
diff --git a/girepository/ginfo.c b/girepository/ginfo.c index e3936179..724109fe 100644 --- a/girepository/ginfo.c +++ b/girepository/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 diff --git a/girepository/girepository.h b/girepository/girepository.h index 083b11c0..cfa5b390 100644 --- a/girepository/girepository.h +++ b/girepository/girepository.h @@ -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 */ diff --git a/girepository/girnode.c b/girepository/girnode.c index 456ab738..1694406d 100644 --- a/girepository/girnode.c +++ b/girepository/girnode.c @@ -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; diff --git a/girepository/girnode.h b/girepository/girnode.h index 14848847..7fe235b8 100644 --- a/girepository/girnode.h +++ b/girepository/girnode.h @@ -312,6 +312,7 @@ struct _GIrNodeStruct gboolean deprecated; gboolean disguised; gboolean is_gtype_struct; + gboolean foreign; gchar *gtype_name; gchar *gtype_init; diff --git a/girepository/girparser.c b/girepository/girparser.c index 12c1d989..5b24604a 100644 --- a/girepository/girparser.c +++ b/girepository/girparser.c @@ -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_); diff --git a/girepository/gtypelib.h b/girepository/gtypelib.h index a69bccf0..14edc984 100644 --- a/girepository/gtypelib.h +++ b/girepository/gtypelib.h @@ -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; diff --git a/tools/generate.c b/tools/generate.c index 2292de01..b813b126 100644 --- a/tools/generate.c +++ b/tools/generate.c @@ -606,6 +606,7 @@ write_struct_info (const gchar *namespace, const gchar *type_init; gboolean deprecated; gboolean is_gtype_struct; + gboolean foreign; gint i; gint size; int n_elts; @@ -643,6 +644,10 @@ write_struct_info (const gchar *namespace, if (show_all && size >= 0) xml_printf (file, " size=\"%d\"", size); + foreign = g_struct_info_is_foreign (info); + if (foreign) + xml_printf (file, " foreign=\"1\""); + n_elts = g_struct_info_get_n_fields (info) + g_struct_info_get_n_methods (info); if (n_elts > 0) { |