girepository/ginfo.c

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.

svn path=/trunk/; revision=133
This commit is contained in:
Mark Doffman 2008-03-10 17:47:24 +00:00 committed by Johan Dahlin
parent 4ab667b160
commit 7cd41630af
2 changed files with 86 additions and 68 deletions

136
ginfo.c
View File

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

View File

@ -174,7 +174,9 @@ typedef struct
guint16 n_arguments; guint16 n_arguments;
#if 0
ArgBlob arguments[]; ArgBlob arguments[];
#endif
} SignatureBlob; } SignatureBlob;
typedef struct typedef struct
@ -233,8 +235,9 @@ typedef struct
guint8 reserved2; guint8 reserved2;
guint16 n_types; guint16 n_types;
#if 0
SimpleTypeBlob type[]; SimpleTypeBlob type[];
#endif
} ParamTypeBlob; } ParamTypeBlob;
typedef struct typedef struct
@ -243,7 +246,9 @@ typedef struct
guint16 n_domains; guint16 n_domains;
#if 0
guint16 domains[]; guint16 domains[];
#endif
} ErrorTypeBlob; } ErrorTypeBlob;
typedef struct typedef struct
@ -357,7 +362,9 @@ typedef struct
guint16 n_values; guint16 n_values;
guint16 reserved2; guint16 reserved2;
ValueBlob values[]; #if 0
ValueBlob values[];
#endif
} EnumBlob; } EnumBlob;
typedef struct typedef struct
@ -432,10 +439,9 @@ typedef struct
guint16 n_vfuncs; guint16 n_vfuncs;
guint16 n_constants; guint16 n_constants;
guint16 interfaces[];
#if 0 #if 0
/* variable-length parts of the blob */ /* variable-length parts of the blob */
guint16 interfaces[];
FieldBlob fields[]; FieldBlob fields[];
PropertyBlob properties[]; PropertyBlob properties[];
FunctionBlob methods[]; FunctionBlob methods[];
@ -462,10 +468,10 @@ typedef struct
guint16 n_vfuncs; guint16 n_vfuncs;
guint16 n_constants; guint16 n_constants;
guint16 prerequisites[];
#if 0 #if 0
/* variable-length parts of the blob */ /* variable-length parts of the blob */
guint16 prerequisites[];
PropertyBlob properties[]; PropertyBlob properties[];
FunctionBlob methods[]; FunctionBlob methods[];
SignalBlob signals[]; SignalBlob signals[];