diff options
Diffstat (limited to 'src/analysis')
-rw-r--r-- | src/analysis/type-int.h | 66 | ||||
-rw-r--r-- | src/analysis/type.c | 78 | ||||
-rw-r--r-- | src/analysis/type.h | 2 | ||||
-rw-r--r-- | src/analysis/types/proto.c | 6 |
4 files changed, 81 insertions, 71 deletions
diff --git a/src/analysis/type-int.h b/src/analysis/type-int.h index 6c77954..8999b19 100644 --- a/src/analysis/type-int.h +++ b/src/analysis/type-int.h @@ -60,27 +60,34 @@ typedef bool (* type_is_reference_fc) (const GDataType *); /* Informations glissées dans la structure GObject de GBinSymbol */ -typedef union _type_obj_extra +typedef struct _type_extra_data_t { - struct - { - TypeQualifier qualifiers; /* Eventuels qualificatifs */ - char ns_sep[2]; /* Séparateur d'éléments */ - TypeFlag flags; /* Propriétés du type */ + char ns_sep[2]; /* Séparateur d'éléments */ + TypeFlag flags; /* Propriétés du type */ - }; + /** + * Afin de ne pas dépasser une taille de 31 bits, le champ de type + * TypeQualifier suivant est ramené à un champs de bits. + */ + + unsigned int qualifiers : 2; /* Eventuels qualificatifs */ + +} type_extra_data_t; + +/* Encapsulation avec un verrou d'accès */ +typedef union _type_obj_extra_t +{ + type_extra_data_t data; /* Données embarquées */ + lockable_obj_extra_t lockable; /* Gestion d'accès aux fanions */ - gint lock; /* Gestion d'accès aux fanions */ +} type_obj_extra_t; -} type_obj_extra; /* Description de type quelconque (instance) */ struct _GDataType { GObject parent; /* A laisser en premier */ - GDataType *namespace; /* Espace de noms / classe */ - #if __SIZEOF_INT__ == __SIZEOF_LONG__ /** @@ -90,29 +97,13 @@ struct _GDataType * ce dernier. */ - type_obj_extra extra; /* Externalisation embarquée */ + type_obj_extra_t extra; /* Externalisation embarquée */ #endif -}; - -/** - * Accès aux informations éventuellement déportées. - */ - -#if __SIZEOF_INT__ == __SIZEOF_LONG__ - -# define INIT_DATA_TYPE_EXTRA(tp) tp->extra.lock = 0 - -# define GET_DATA_TYPE_EXTRA(tp) &tp->extra - -#else - -# define INIT_DATA_TYPE_EXTRA(tp) INIT_GOBJECT_EXTRA(G_OBJECT(tp)) - -# define GET_DATA_TYPE_EXTRA(tp) GET_GOBJECT_EXTRA(G_OBJECT(tp), type_obj_extra) + GDataType *namespace; /* Espace de noms / classe */ -#endif +}; /* Description de type quelconque (classe) */ struct _GDataTypeClass @@ -133,5 +124,20 @@ struct _GDataTypeClass }; +/** + * Accès aux informations éventuellement déportées. + */ + +#if __SIZEOF_INT__ == __SIZEOF_LONG__ + +# define GET_DATA_TYPE_EXTRA(tp) (type_extra_data_t *)&tp->extra + +#else + +# define GET_DATA_TYPE_EXTRA(tp) GET_GOBJECT_EXTRA(G_OBJECT(tp), type_extra_data_t) + +#endif + + #endif /* _ANALYSIS_TYPE_INT_H */ diff --git a/src/analysis/type.c b/src/analysis/type.c index ca14fdc..f05b9a8 100644 --- a/src/analysis/type.c +++ b/src/analysis/type.c @@ -111,7 +111,11 @@ static void g_data_type_class_init(GDataTypeClass *klass) static void g_data_type_init(GDataType *type) { - INIT_DATA_TYPE_EXTRA(type); + type_extra_data_t *extra; /* Données insérées à modifier */ + + extra = GET_DATA_TYPE_EXTRA(type); + + INIT_GOBJECT_EXTRA_LOCK(extra); g_data_type_set_qualifiers(type, TQF_NONE); @@ -280,7 +284,7 @@ static bool g_data_type_load(GDataType *type, GObjectStorage *storage, packed_bu static bool _g_data_type_store(const GDataType *type, GObjectStorage *storage, packed_buffer_t *pbuf) { bool result; /* Bilan à retourner */ - type_obj_extra *extra; /* Données insérées à modifier */ + type_extra_data_t *extra; /* Données insérées à modifier */ result = pack_uleb128((uleb128_t []){ g_data_type_get_qualifiers(type) }, pbuf); if (!result) goto exit; @@ -290,7 +294,7 @@ static bool _g_data_type_store(const GDataType *type, GObjectStorage *storage, p extra = GET_DATA_TYPE_EXTRA(type); - g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + LOCK_GOBJECT_EXTRA(extra); result = extend_packed_buffer(pbuf, extra->ns_sep, 2 * sizeof(char), false); if (!result) goto unlocking_exit; @@ -306,7 +310,7 @@ static bool _g_data_type_store(const GDataType *type, GObjectStorage *storage, p unlocking_exit: - g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + UNLOCK_GOBJECT_EXTRA(extra); exit: @@ -390,7 +394,7 @@ GDataType *g_data_type_dup(const GDataType *type) { GDataType *result; /* Copie à retourner */ GDataTypeClass *class; /* Classe du type */ - type_obj_extra *extra; /* Données insérées à modifier */ + type_extra_data_t *extra; /* Données insérées à modifier */ GDataType *ns; /* Eventuel espace de noms */ bool status; /* Bilan d'un rattachement */ @@ -404,7 +408,7 @@ GDataType *g_data_type_dup(const GDataType *type) extra = GET_DATA_TYPE_EXTRA(type); - g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + LOCK_GOBJECT_EXTRA(extra); if (extra->ns_sep[0] != '\0') { @@ -422,7 +426,7 @@ GDataType *g_data_type_dup(const GDataType *type) } - g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + UNLOCK_GOBJECT_EXTRA(extra); return result; @@ -446,7 +450,7 @@ char *g_data_type_to_string(const GDataType *type, bool include) { char *result; /* Chaîne à retourner */ GDataTypeClass *class; /* Classe du type */ - type_obj_extra *extra; /* Données insérées à modifier */ + type_extra_data_t *extra; /* Données insérées à modifier */ char *namespace; /* Groupe d'appartenance */ TypeQualifier qualifiers; /* Qualificatifs du type */ @@ -461,7 +465,7 @@ char *g_data_type_to_string(const GDataType *type, bool include) { extra = GET_DATA_TYPE_EXTRA(type); - g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + LOCK_GOBJECT_EXTRA(extra); if (type->namespace != NULL && g_data_type_handle_namespaces(type)) { @@ -474,7 +478,7 @@ char *g_data_type_to_string(const GDataType *type, bool include) } - g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + UNLOCK_GOBJECT_EXTRA(extra); } @@ -509,15 +513,15 @@ char *g_data_type_to_string(const GDataType *type, bool include) void g_data_type_set_qualifiers(GDataType *type, TypeQualifier qualifiers) { - type_obj_extra *extra; /* Données insérées à modifier */ + type_extra_data_t *extra; /* Données insérées à modifier */ extra = GET_DATA_TYPE_EXTRA(type); - g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + LOCK_GOBJECT_EXTRA(extra); extra->qualifiers = qualifiers; - g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + UNLOCK_GOBJECT_EXTRA(extra); } @@ -537,15 +541,15 @@ void g_data_type_set_qualifiers(GDataType *type, TypeQualifier qualifiers) void g_data_type_add_qualifier(GDataType *type, TypeQualifier qualifier) { - type_obj_extra *extra; /* Données insérées à modifier */ + type_extra_data_t *extra; /* Données insérées à modifier */ extra = GET_DATA_TYPE_EXTRA(type); - g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + LOCK_GOBJECT_EXTRA(extra); extra->qualifiers |= qualifier; - g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + UNLOCK_GOBJECT_EXTRA(extra); } @@ -565,15 +569,15 @@ void g_data_type_add_qualifier(GDataType *type, TypeQualifier qualifier) TypeQualifier g_data_type_get_qualifiers(const GDataType *type) { TypeQualifier result; /* Qualificatifs à renvoyer */ - type_obj_extra *extra; /* Données insérées à modifier */ + type_extra_data_t *extra; /* Données insérées à modifier */ extra = GET_DATA_TYPE_EXTRA(type); - g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + LOCK_GOBJECT_EXTRA(extra); result = extra->qualifiers; - g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + UNLOCK_GOBJECT_EXTRA(extra); return result; @@ -597,7 +601,7 @@ TypeQualifier g_data_type_get_qualifiers(const GDataType *type) bool g_data_type_set_namespace(GDataType *type, GDataType *namespace, const char *sep) { bool result; /* Bilan à retourner */ - type_obj_extra *extra; /* Données insérées à modifier */ + type_extra_data_t *extra; /* Données insérées à modifier */ result = ((namespace == NULL && sep == NULL) || (namespace != NULL && sep != NULL && sep[0] != '\0')); @@ -605,7 +609,7 @@ bool g_data_type_set_namespace(GDataType *type, GDataType *namespace, const char { extra = GET_DATA_TYPE_EXTRA(type); - g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + LOCK_GOBJECT_EXTRA(extra); if (sep == NULL) { @@ -625,7 +629,7 @@ bool g_data_type_set_namespace(GDataType *type, GDataType *namespace, const char g_object_ref(G_OBJECT(namespace)); - g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + UNLOCK_GOBJECT_EXTRA(extra); } @@ -649,18 +653,18 @@ bool g_data_type_set_namespace(GDataType *type, GDataType *namespace, const char GDataType *g_data_type_get_namespace(const GDataType *type) { GDataType *result; /* Espace à renvoyer */ - type_obj_extra *extra; /* Données insérées à modifier */ + type_extra_data_t *extra; /* Données insérées à modifier */ extra = GET_DATA_TYPE_EXTRA(type); - g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + LOCK_GOBJECT_EXTRA(extra); result = type->namespace; if (result != NULL) g_object_ref(G_OBJECT(result)); - g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + UNLOCK_GOBJECT_EXTRA(extra); return result; @@ -682,11 +686,11 @@ GDataType *g_data_type_get_namespace(const GDataType *type) char *g_data_type_get_namespace_separator(const GDataType *type) { char *result; /* Séparateur à retourner */ - type_obj_extra *extra; /* Données insérées à modifier */ + type_extra_data_t *extra; /* Données insérées à modifier */ extra = GET_DATA_TYPE_EXTRA(type); - g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + LOCK_GOBJECT_EXTRA(extra); if (extra->ns_sep[0] == '\0') result = NULL; @@ -697,7 +701,7 @@ char *g_data_type_get_namespace_separator(const GDataType *type) else result = strndup(extra->ns_sep, 2); - g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + UNLOCK_GOBJECT_EXTRA(extra); return result; @@ -748,15 +752,15 @@ bool g_data_type_handle_namespaces(const GDataType *type) void g_data_type_set_flags(GDataType *type, TypeFlag flags) { - type_obj_extra *extra; /* Données insérées à modifier */ + type_extra_data_t *extra; /* Données insérées à modifier */ extra = GET_DATA_TYPE_EXTRA(type); - g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + LOCK_GOBJECT_EXTRA(extra); extra->flags = flags; - g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + UNLOCK_GOBJECT_EXTRA(extra); } @@ -776,15 +780,15 @@ void g_data_type_set_flags(GDataType *type, TypeFlag flags) void g_data_type_add_flag(GDataType *type, TypeFlag flag) { - type_obj_extra *extra; /* Données insérées à modifier */ + type_extra_data_t *extra; /* Données insérées à modifier */ extra = GET_DATA_TYPE_EXTRA(type); - g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + LOCK_GOBJECT_EXTRA(extra); extra->flags |= flag; - g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + UNLOCK_GOBJECT_EXTRA(extra); } @@ -804,15 +808,15 @@ void g_data_type_add_flag(GDataType *type, TypeFlag flag) TypeFlag g_data_type_get_flags(const GDataType *type) { TypeFlag result; /* Propriétés à renvoyer */ - type_obj_extra *extra; /* Données insérées à modifier */ + type_extra_data_t *extra; /* Données insérées à modifier */ extra = GET_DATA_TYPE_EXTRA(type); - g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + LOCK_GOBJECT_EXTRA(extra); result = extra->flags; - g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + UNLOCK_GOBJECT_EXTRA(extra); return result; diff --git a/src/analysis/type.h b/src/analysis/type.h index 819af38..f5cc242 100644 --- a/src/analysis/type.h +++ b/src/analysis/type.h @@ -65,7 +65,7 @@ typedef enum _TypeFlag TFL_SINGLETON = (1 << 1), /* Singleton effectif */ TFL_USER_LOW_BIT = (1 << 2), /* Premier bit libre */ - TFL_USER_HIGH_BIT = (1 << 6) /* Dernier bit libre */ + TFL_USER_HIGH_BIT = (1 << 7) /* Dernier bit libre */ } TypeFlag; diff --git a/src/analysis/types/proto.c b/src/analysis/types/proto.c index aad073a..3cb074a 100644 --- a/src/analysis/types/proto.c +++ b/src/analysis/types/proto.c @@ -400,7 +400,7 @@ static char *g_proto_type_to_string(const GProtoType *type, bool include) { char *result; /* Valeur à renvoyer */ GDataType *base; /* Version d'instance parente */ - type_obj_extra *extra; /* Données insérées à modifier */ + type_extra_data_t *extra; /* Données insérées à modifier */ char *namespace; /* Groupe d'appartenance */ size_t i; /* Boucle de parcours */ char *arg; /* Argument à décrire */ @@ -424,7 +424,7 @@ static char *g_proto_type_to_string(const GProtoType *type, bool include) { extra = GET_DATA_TYPE_EXTRA(base); - g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + LOCK_GOBJECT_EXTRA(extra); if (base->namespace != NULL) { @@ -438,7 +438,7 @@ static char *g_proto_type_to_string(const GProtoType *type, bool include) } - g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + UNLOCK_GOBJECT_EXTRA(extra); } |