gobject-introspection r133 - trunk/girepository
- From: johan svn gnome org
- To: svn-commits-list gnome org
- Subject: gobject-introspection r133 - trunk/girepository
- Date: Mon, 10 Mar 2008 17:47:24 +0000 (GMT)
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]