Fix incorrect unref
[babeltrace.git] / types / enum.c
index 368c21a6910187dc8d6e9ce45dd80fc547b2757a..1c71f9e660f7436782a7c80618a2f8b876f76bae 100644 (file)
@@ -24,7 +24,8 @@
 static
 struct definition *_enum_definition_new(struct declaration *declaration,
                                        struct definition_scope *parent_scope,
-                                       GQuark field_name, int index);
+                                       GQuark field_name, int index,
+                                       const char *root_name);
 static
 void _enum_definition_free(struct definition *definition);
 
@@ -349,32 +350,6 @@ size_t enum_get_nr_enumerators(struct declaration_enum *enum_declaration)
        return g_hash_table_size(enum_declaration->table.quark_to_range_set);
 }
 
-void enum_copy(struct stream_pos *dest, const struct format *fdest, 
-              struct stream_pos *src, const struct format *fsrc,
-              struct definition *definition)
-{
-       struct definition_enum *_enum =
-               container_of(definition, struct definition_enum, p);
-       struct declaration_enum *enum_declaration= _enum->declaration;
-       GArray *array;
-       GQuark v;
-
-       array = fsrc->enum_read(src, enum_declaration);
-       assert(array);
-       /* unref previous array */
-       if (_enum->value)
-               g_array_unref(_enum->value);
-       _enum->value = array;
-       /*
-        * Arbitrarily choose the first one.
-        * TODO: use direct underlying declaration read/write intead. Not doing it for
-        * now to test enum read and write code.
-        */
-       v = g_array_index(array, GQuark, 0);
-       if (fdest)
-               fdest->enum_write(dest, enum_declaration, v);
-}
-
 static
 void _enum_declaration_free(struct declaration *declaration)
 {
@@ -411,7 +386,6 @@ struct declaration_enum *
        enum_declaration->integer_declaration = integer_declaration;
        enum_declaration->p.id = CTF_TYPE_ENUM;
        enum_declaration->p.alignment = 1;
-       enum_declaration->p.copy = enum_copy;
        enum_declaration->p.declaration_free = _enum_declaration_free;
        enum_declaration->p.definition_new = _enum_definition_new;
        enum_declaration->p.definition_free = _enum_definition_free;
@@ -423,23 +397,36 @@ static
 struct definition *
        _enum_definition_new(struct declaration *declaration,
                             struct definition_scope *parent_scope,
-                            GQuark field_name, int index)
+                            GQuark field_name, int index,
+                            const char *root_name)
 {
        struct declaration_enum *enum_declaration =
                container_of(declaration, struct declaration_enum, p);
        struct definition_enum *_enum;
        struct definition *definition_integer_parent;
+       int ret;
 
        _enum = g_new(struct definition_enum, 1);
        declaration_ref(&enum_declaration->p);
        _enum->p.declaration = declaration;
        _enum->declaration = enum_declaration;
        _enum->p.ref = 1;
-       _enum->p.index = index;
+       /*
+        * Use INT_MAX order to ensure that all fields of the parent
+        * scope are seen as being prior to this scope.
+        */
+       _enum->p.index = root_name ? INT_MAX : index;
+       _enum->p.name = field_name;
+       _enum->p.path = new_definition_path(parent_scope, field_name, root_name);
+       _enum->p.scope = new_definition_scope(parent_scope, field_name, root_name);
        _enum->value = NULL;
+       ret = register_field_definition(field_name, &_enum->p,
+                                       parent_scope);
+       assert(!ret);
        definition_integer_parent =
                enum_declaration->integer_declaration->p.definition_new(&enum_declaration->integer_declaration->p,
-                                       parent_scope, field_name, 0);
+                               _enum->p.scope,
+                               g_quark_from_static_string("container"), 0, NULL);
        _enum->integer = container_of(definition_integer_parent,
                                      struct definition_integer, p);
        return &_enum->p;
@@ -452,6 +439,7 @@ void _enum_definition_free(struct definition *definition)
                container_of(definition, struct definition_enum, p);
 
        definition_unref(&_enum->integer->p);
+       free_definition_scope(_enum->p.scope);
        declaration_unref(_enum->p.declaration);
        if (_enum->value)
                g_array_unref(_enum->value);
This page took 0.024073 seconds and 4 git commands to generate.