gobject-introspection r133 - trunk/girepository



Author: johan
Date: Mon Mar 10 17:47:24 2008
New Revision: 133
URL: http://svn.gnome.org/viewvc/gobject-introspection?rev=133&view=rev

Log:
2008-02-21  Mark Doffman  <mark doffman codethink co uk>

    * girepository/ginfo.c

      Add the ability to get the value of a constant of
      type TYPE_TAG_SYMBOL. In the case of a symbol the value
      is provided as a string.

      This would deal properly with:
      typedef char* random;
      const random = "A string";

WARNING: This commit does not compile. It is a partial change.


Modified:
   trunk/girepository/ginfo.c
   trunk/girepository/gmetadata.h

Modified: trunk/girepository/ginfo.c
==============================================================================
--- trunk/girepository/ginfo.c	(original)
+++ trunk/girepository/ginfo.c	Mon Mar 10 17:47:24 2008
@@ -860,10 +860,13 @@
 g_error_domain_info_get_codes (GIErrorDomainInfo *info)
 {
   GIBaseInfo *base = (GIBaseInfo *)info;
-  ErrorDomainBlob *blob = (ErrorDomainBlob *)&base->metadata->data[base->offset];
-  
-  return (GIInterfaceInfo *) g_info_from_entry (base->metadata,
-						blob->error_codes);
+  ErrorDomainBlob *blob = (ErrorDomainBlob *)&base->metadata->data[base->offset]; 
+
+  /* FIXME need to check if blob really is an enum */
+  return (GIInterfaceInfo *) g_info_new (BLOB_TYPE_ENUM,
+					 NULL,
+					 base->metadata,
+					 blob->error_codes);
 }
 
 
@@ -1114,9 +1117,11 @@
 {
   GIBaseInfo *base = (GIBaseInfo *)info;
   ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
+  guint16 *interface;
 
-  return (GIInterfaceInfo *) g_info_from_entry (base->metadata,
-						blob->interfaces[n]);
+  interface = (guint16 *)&base->metadata->data[base->offset + sizeof(ObjectBlob)];
+
+  return (GIInterfaceInfo *) g_info_from_entry (base->metadata, interface[n]);
 }
 
 gint
@@ -1324,8 +1329,11 @@
 {
   GIBaseInfo *base = (GIBaseInfo *)info;
   InterfaceBlob *blob = (InterfaceBlob *)&base->metadata->data[base->offset];
+  guint16 *prerequisite;
+
+  prerequisite = (guint16 *)&base->metadata->data[base->offset + sizeof(InterfaceBlob)];
 
-  return g_info_from_entry (base->metadata, blob->prerequisites[n]);
+  return g_info_from_entry (base->metadata, prerequisite[n]);
 }
 
 
@@ -1639,63 +1647,67 @@
 {
   GIBaseInfo *base = (GIBaseInfo *)info;
   ConstantBlob *blob = (ConstantBlob *)&base->metadata->data[base->offset];
+  TypeHeader *header = (TypeHeader*) &blob->type;
 
-  /* FIXME non-basic types ? */
-  if (blob->type.reserved == 0)
+  if (TYPE_IS_SIMPLE (header->tag))
+    {
+      switch (header->tag)
+        {
+        case GI_TYPE_TAG_BOOLEAN:
+          value->v_boolean = *(gboolean*)&base->metadata->data[blob->offset];
+          break;
+        case GI_TYPE_TAG_INT8:
+          value->v_int8 = *(gint8*)&base->metadata->data[blob->offset];
+          break;
+        case GI_TYPE_TAG_UINT8:
+          value->v_uint8 = *(guint8*)&base->metadata->data[blob->offset];
+          break;
+        case GI_TYPE_TAG_INT16:
+          value->v_int16 = *(gint16*)&base->metadata->data[blob->offset];
+          break;
+        case GI_TYPE_TAG_UINT16:
+          value->v_uint16 = *(guint16*)&base->metadata->data[blob->offset];
+          break;
+        case GI_TYPE_TAG_INT32:
+          value->v_int32 = *(gint32*)&base->metadata->data[blob->offset];
+          break;
+        case GI_TYPE_TAG_UINT32:
+          value->v_uint32 = *(guint32*)&base->metadata->data[blob->offset];
+          break;
+        case GI_TYPE_TAG_INT64:
+          value->v_int64 = *(gint64*)&base->metadata->data[blob->offset];
+          break;
+        case GI_TYPE_TAG_UINT64:
+          value->v_uint64 = *(guint64*)&base->metadata->data[blob->offset];
+          break;
+        case GI_TYPE_TAG_FLOAT:
+          value->v_float = *(gfloat*)&base->metadata->data[blob->offset];
+          break;
+        case GI_TYPE_TAG_DOUBLE:
+          value->v_double = *(gdouble*)&base->metadata->data[blob->offset];
+          break;
+        case GI_TYPE_TAG_INT:
+          value->v_int = *(gint*)&base->metadata->data[blob->offset];
+          break;
+        case GI_TYPE_TAG_UINT:
+          value->v_uint = *(guint*)&base->metadata->data[blob->offset];
+          break;
+        case GI_TYPE_TAG_LONG:
+          value->v_long = *(glong*)&base->metadata->data[blob->offset];
+          break;
+        case GI_TYPE_TAG_ULONG:
+          value->v_ulong = *(gulong*)&base->metadata->data[blob->offset];
+          break;
+        }
+    }
+  else
     {
-      if (blob->type.pointer)
-	value->v_pointer = g_memdup (&base->metadata->data[blob->offset], blob->size);
-      else
-	{
-	  switch (blob->type.tag)
-	    {
-	    case GI_TYPE_TAG_BOOLEAN:
-	      value->v_boolean = *(gboolean*)&base->metadata->data[blob->offset];
-	      break;
-	    case GI_TYPE_TAG_INT8:
-	      value->v_int8 = *(gint8*)&base->metadata->data[blob->offset];
-	      break;
-	    case GI_TYPE_TAG_UINT8:
-	      value->v_uint8 = *(guint8*)&base->metadata->data[blob->offset];
-	      break;
-	    case GI_TYPE_TAG_INT16:
-	      value->v_int16 = *(gint16*)&base->metadata->data[blob->offset];
-	      break;
-	    case GI_TYPE_TAG_UINT16:
-	      value->v_uint16 = *(guint16*)&base->metadata->data[blob->offset];
-	      break;
-	    case GI_TYPE_TAG_INT32:
-	      value->v_int32 = *(gint32*)&base->metadata->data[blob->offset];
-	      break;
-	    case GI_TYPE_TAG_UINT32:
-	      value->v_uint32 = *(guint32*)&base->metadata->data[blob->offset];
-	      break;
-	    case GI_TYPE_TAG_INT64:
-	      value->v_int64 = *(gint64*)&base->metadata->data[blob->offset];
-	      break;
-	    case GI_TYPE_TAG_UINT64:
-	      value->v_uint64 = *(guint64*)&base->metadata->data[blob->offset];
-	      break;
-	    case GI_TYPE_TAG_FLOAT:
-	      value->v_float = *(gfloat*)&base->metadata->data[blob->offset];
-	      break;
-	    case GI_TYPE_TAG_DOUBLE:
-	      value->v_double = *(gdouble*)&base->metadata->data[blob->offset];
-	      break;
-	    case GI_TYPE_TAG_INT:
-	      value->v_int = *(gint*)&base->metadata->data[blob->offset];
-	      break;
-	    case GI_TYPE_TAG_UINT:
-	      value->v_uint = *(guint*)&base->metadata->data[blob->offset];
-	      break;
-	    case GI_TYPE_TAG_LONG:
-	      value->v_long = *(glong*)&base->metadata->data[blob->offset];
-	      break;
-	    case GI_TYPE_TAG_ULONG:
-	      value->v_ulong = *(gulong*)&base->metadata->data[blob->offset];
-	      break;
-	    }
-	}
+      switch (header->tag)
+        {
+        case GI_TYPE_TAG_SYMBOL:
+          value->v_string = *(gchar**)&base->metadata->data[blob->offset];
+          break;
+        }
     }
 
   return blob->size;

Modified: trunk/girepository/gmetadata.h
==============================================================================
--- trunk/girepository/gmetadata.h	(original)
+++ trunk/girepository/gmetadata.h	Mon Mar 10 17:47:24 2008
@@ -174,7 +174,9 @@
 
   guint16        n_arguments;
 
+#if 0
   ArgBlob        arguments[];
+#endif
 } SignatureBlob;
 
 typedef struct
@@ -233,8 +235,9 @@
 
   guint8         reserved2;
   guint16        n_types;
-
+#if 0
   SimpleTypeBlob type[];
+#endif
 } ParamTypeBlob;
 
 typedef struct
@@ -243,7 +246,9 @@
 
   guint16    n_domains;
 
+#if 0
   guint16    domains[];
+#endif
 }  ErrorTypeBlob;
 
 typedef struct
@@ -357,7 +362,9 @@
   guint16   n_values;
   guint16   reserved2;
 
-  ValueBlob values[];    
+#if 0
+  ValueBlob values[];
+#endif
 } EnumBlob;
 
 typedef struct
@@ -432,10 +439,9 @@
   guint16   n_vfuncs;
   guint16   n_constants;
 
-  guint16   interfaces[];
- 
 #if 0
   /* variable-length parts of the blob */
+  guint16             interfaces[];
   FieldBlob           fields[];
   PropertyBlob        properties[];
   FunctionBlob        methods[];
@@ -462,10 +468,10 @@
   guint16 n_vfuncs;
   guint16 n_constants;  
 
-  guint16 prerequisites[];
 
-#if 0 
+#if 0
   /* variable-length parts of the blob */
+  guint16             prerequisites[];
   PropertyBlob        properties[];
   FunctionBlob        methods[];
   SignalBlob          signals[];



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]