Add support for foreign structs
authorJohan Dahlin <jdahlin@litl.com>
Fri, 26 Mar 2010 02:12:12 +0000 (23:12 -0300)
committerJohan Dahlin <johan@gnome.org>
Fri, 26 Mar 2010 02:12:12 +0000 (23:12 -0300)
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

girepository/ginfo.c
girepository/girepository.h
girepository/girnode.c
girepository/girnode.h
girepository/girparser.c
girepository/gtypelib.h
tools/generate.c

index e39361794ad1a89ab0e5b26823e6d0dbba33ccb9..724109feb5ee22e8bebac1d330468035f6eb8db6 100644 (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
index 083b11c06dbc7101fdb97355fa46fb90d637a894..cfa5b39065c3fa42531f6658f1b980d80a1193a9 100644 (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 */
 
index 456ab7388486c6dc37da7db0e0c490b2c6f8441b..1694406da03658b42daa079f5096d019185f9cb8 100644 (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;
index 14848847776597e0d83c27b798dc1d315880a9e7..7fe235b8916c53fc1f1bdf62c09cafa165427162 100644 (file)
@@ -312,6 +312,7 @@ struct _GIrNodeStruct
   gboolean deprecated;
   gboolean disguised;
   gboolean is_gtype_struct;
+  gboolean foreign;
 
   gchar *gtype_name;
   gchar *gtype_init;
index 12c1d98902784c089ded9431d31d950abf276e30..5b24604af3bb208cfdff87953bddff92829b7941 100644 (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_);
index a69bccf0dc3d2b31a6a05f620346b79c3313deca..14edc9841aa739875bead21578b7638883fc2589 100644 (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;
 
index 2292de01fe37a16cf94b74e886227ebcda27f485..b813b12625aa9e333dbabd43a1808ade6b7bf924 100644 (file)
@@ -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)
     {