X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=types%2Ftypes.c;h=08324acc481dd5e594525282d3329d4a15459f41;hp=e57624fb707b73225b2400d4b8f29d192e828132;hb=dc48ecad637fc7fb8479da563ef2dfd3948cee73;hpb=d00d17d1e06065eb31a699ce59e16ceb6b858029 diff --git a/types/types.c b/types/types.c index e57624fb..08324acc 100644 --- a/types/types.c +++ b/types/types.c @@ -24,37 +24,49 @@ #include static -struct definition * - lookup_typedef_declaration_scope(GQuark declaration_name, +GQuark prefix_quark(const char *prefix, GQuark quark) +{ + GQuark nq; + GString *str; + + str = g_string_new(prefix); + g_string_append(str, g_quark_to_string(quark)); + nq = g_quark_from_string(g_string_free(str, FALSE)); + return nq; +} + +static +struct declaration * + lookup_declaration_scope(GQuark declaration_name, struct declaration_scope *scope) { return g_hash_table_lookup(scope->typedef_declarations, (gconstpointer) (unsigned long) declaration_name); } -struct definition *lookup_typedef_declaration(GQuark declaration_name, +struct declaration *lookup_declaration(GQuark declaration_name, struct declaration_scope *scope) { - struct definition *definition; + struct declaration *declaration; while (scope) { - definition = lookup_typedef_declaration_scope(declaration_name, - scope); - if (definition) - return definition; + declaration = lookup_declaration_scope(declaration_name, + scope); + if (declaration) + return declaration; scope = scope->parent_scope; } return NULL; } -int register_typedef_declaration(GQuark name, struct declaration *declaration, +int register_declaration(GQuark name, struct declaration *declaration, struct declaration_scope *scope) { if (!name) return -EPERM; /* Only lookup in local scope */ - if (lookup_typedef_declaration_scope(name, scope)) + if (lookup_declaration_scope(name, scope)) return -EEXIST; g_hash_table_insert(scope->typedef_declarations, @@ -243,6 +255,8 @@ void declaration_ref(struct declaration *declaration) void declaration_unref(struct declaration *declaration) { + if (!declaration) + return; if (!--declaration->ref) declaration->declaration_free(declaration); } @@ -254,6 +268,8 @@ void definition_ref(struct definition *definition) void definition_unref(struct definition *definition) { + if (!definition) + return; if (!--definition->ref) definition->declaration->definition_free(definition); } @@ -314,6 +330,9 @@ int register_struct_declaration(GQuark struct_name, struct declaration_struct *struct_declaration, struct declaration_scope *scope) { + GQuark prefix_name; + int ret; + if (!struct_name) return -EPERM; @@ -325,11 +344,16 @@ int register_struct_declaration(GQuark struct_name, (gpointer) (unsigned long) struct_name, struct_declaration); declaration_ref(&struct_declaration->p); + + /* Also add in typedef/typealias scopes */ + prefix_name = prefix_quark("struct ", struct_name); + ret = register_declaration(prefix_name, &struct_declaration->p, scope); + assert(!ret); return 0; } static -struct declaration_variant * +struct declaration_untagged_variant * lookup_variant_declaration_scope(GQuark variant_name, struct declaration_scope *scope) { @@ -337,11 +361,11 @@ struct declaration_variant * (gconstpointer) (unsigned long) variant_name); } -struct declaration_variant * +struct declaration_untagged_variant * lookup_variant_declaration(GQuark variant_name, struct declaration_scope *scope) { - struct declaration_variant *declaration; + struct declaration_untagged_variant *declaration; while (scope) { declaration = lookup_variant_declaration_scope(variant_name, scope); @@ -353,9 +377,12 @@ struct declaration_variant * } int register_variant_declaration(GQuark variant_name, - struct declaration_variant *variant_declaration, + struct declaration_untagged_variant *untagged_variant_declaration, struct declaration_scope *scope) { + GQuark prefix_name; + int ret; + if (!variant_name) return -EPERM; @@ -365,8 +392,14 @@ int register_variant_declaration(GQuark variant_name, g_hash_table_insert(scope->variant_declarations, (gpointer) (unsigned long) variant_name, - variant_declaration); - declaration_ref(&variant_declaration->p); + untagged_variant_declaration); + declaration_ref(&untagged_variant_declaration->p); + + /* Also add in typedef/typealias scopes */ + prefix_name = prefix_quark("variant ", variant_name); + ret = register_declaration(prefix_name, + &untagged_variant_declaration->p, scope); + assert(!ret); return 0; } @@ -398,6 +431,9 @@ int register_enum_declaration(GQuark enum_name, struct declaration_enum *enum_declaration, struct declaration_scope *scope) { + GQuark prefix_name; + int ret; + if (!enum_name) return -EPERM; @@ -409,6 +445,11 @@ int register_enum_declaration(GQuark enum_name, (gpointer) (unsigned long) enum_name, enum_declaration); declaration_ref(&enum_declaration->p); + + /* Also add in typedef/typealias scopes */ + prefix_name = prefix_quark("enum ", enum_name); + ret = register_declaration(prefix_name, &enum_declaration->p, scope); + assert(!ret); return 0; } @@ -447,9 +488,8 @@ struct definition_scope * } /* - * in: path, out: q (GArray of GQuark) + * in: path (dot separated), out: q (GArray of GQuark) */ -static void append_scope_path(const char *path, GArray *q) { const char *ptrbegin, *ptrend = path; @@ -472,6 +512,7 @@ void append_scope_path(const char *path, GArray *q) quark = g_quark_from_string(str); g_array_append_val(q, quark); g_free(str); + ptrend++; /* skip current dot */ } /* last. Check for trailing dot (and discard). */ if (ptrbegin[0] != '\0') {