Enumeration mapping iterator's initial position is inconsistent
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Sat, 16 Sep 2017 01:47:49 +0000 (21:47 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Sat, 16 Sep 2017 01:49:41 +0000 (21:49 -0400)
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
bindings/python/bt2/bt2/field_types.py
lib/ctf-ir/field-types.c
plugins/text/pretty/print.c
tests/lib/test_ctf_writer.c

index 3a4e820f8ec1a0c05f3d792529859f2e2307ab19..472493721ba3eef2213cf96c87c1d8bbcdeb09b1 100644 (file)
@@ -299,6 +299,11 @@ class _EnumerationFieldTypeMappingIterator(object._Object,
         if self._done:
             raise StopIteration
 
+        ret = native_bt.ctf_field_type_enumeration_mapping_iterator_next(self._ptr)
+        if ret < 0:
+            self._done = True
+            raise StopIteration
+
         if self._is_signed:
             ret, name, lower, upper = native_bt.ctf_field_type_enumeration_mapping_iterator_get_signed(self._ptr)
         else:
@@ -306,10 +311,6 @@ class _EnumerationFieldTypeMappingIterator(object._Object,
 
         assert(ret == 0)
         mapping = _EnumerationFieldTypeMapping(name, lower, upper)
-        ret = native_bt.ctf_field_type_enumeration_mapping_iterator_next(self._ptr)
-
-        if ret < 0:
-            self._done = True
 
         return mapping
 
@@ -416,6 +417,7 @@ class EnumerationFieldType(IntegerFieldType, collections.abc.Sequence):
     def mappings_by_name(self, name):
         utils._check_str(name)
         iter_ptr = native_bt.ctf_field_type_enumeration_find_mappings_by_name(self._ptr, name)
+        print('iter_ptr', iter_ptr)
         return self._get_mapping_iter(iter_ptr)
 
     def mappings_by_value(self, value):
index 23093ebdab7a8a3c1e86eaa23474178290859daa..5063ea65b87f7f8a842610d421c3923ecafb5276 100644 (file)
@@ -1279,21 +1279,12 @@ bt_ctf_field_type_enumeration_find_mappings_by_name(
 
        iter->u.name_quark = g_quark_try_string(name);
        if (!iter->u.name_quark) {
-               BT_LOGV("No such enumeration field type mapping name: "
-                       "ft-addr=%p, mapping-name=\"%s\"",
-                       type, name);
-               goto error;
-       }
-
-       /* Advance iterator to first entry, or leave index at -1. */
-       if (bt_ctf_field_type_enumeration_mapping_iterator_next(iter)) {
-               /* No entry found. */
-               BT_LOGV("No such enumeration field type mapping name: "
-                       "ft-addr=%p, mapping-name=\"%s\"",
-                       type, name);
-               goto error;
+               /*
+                * No results are possible, set the iterator's position at the
+                * end.
+                */
+               iter->index = iter->enumeration_type->entries->len;
        }
-
        return iter;
 error:
        bt_put(iter);
@@ -1384,13 +1375,6 @@ bt_ctf_field_type_enumeration_find_mappings_by_signed_value(
        }
 
        iter->u.signed_value = value;
-
-       /* Advance iterator to first entry, or leave index at -1. */
-       if (bt_ctf_field_type_enumeration_mapping_iterator_next(iter)) {
-               /* No entry found. */
-               goto error;
-       }
-
        return iter;
 error:
        bt_put(iter);
@@ -1401,12 +1385,7 @@ struct bt_ctf_field_type_enumeration_mapping_iterator *
 bt_ctf_field_type_enumeration_find_mappings_by_unsigned_value(
                struct bt_ctf_field_type *type, uint64_t value)
 {
-       struct bt_ctf_field_type_enumeration_mapping_iterator *iter = NULL;
-
-       if (!type) {
-               BT_LOGW_STR("Invalid parameter: field type is NULL.");
-               goto error;
-       }
+       struct bt_ctf_field_type_enumeration_mapping_iterator *iter;
 
        iter = bt_ctf_field_type_enumeration_find_mappings_type(
                        type, ITERATOR_BY_UNSIGNED_VALUE);
@@ -1424,13 +1403,6 @@ bt_ctf_field_type_enumeration_find_mappings_by_unsigned_value(
                goto error;
        }
        iter->u.unsigned_value = value;
-
-       /* Advance iterator to first entry, or leave index at -1. */
-       if (bt_ctf_field_type_enumeration_mapping_iterator_next(iter)) {
-               /* No entry found. */
-               goto error;
-       }
-
        return iter;
 error:
        bt_put(iter);
@@ -1450,6 +1422,12 @@ int bt_ctf_field_type_enumeration_mapping_iterator_get_signed(
                goto end;
        }
 
+       if (iter->index == -1) {
+               BT_LOGW_STR("Invalid enumeration field type mapping iterator access: position=-1");
+               ret = -1;
+               goto end;
+       }
+
        ret = bt_ctf_field_type_enumeration_get_mapping_signed(
                        &iter->enumeration_type->parent, iter->index,
                        mapping_name, range_begin, range_end);
@@ -1470,6 +1448,12 @@ int bt_ctf_field_type_enumeration_mapping_iterator_get_unsigned(
                goto end;
        }
 
+       if (iter->index == -1) {
+               BT_LOGW_STR("Invalid enumeration field type mapping iterator access: position=-1");
+               ret = -1;
+               goto end;
+       }
+
        ret = bt_ctf_field_type_enumeration_get_mapping_unsigned(
                        &iter->enumeration_type->parent, iter->index,
                        mapping_name, range_begin, range_end);
@@ -2525,7 +2509,8 @@ struct bt_ctf_field_type *bt_ctf_field_type_variant_get_field_type_from_tag(
        }
 
        iter = bt_ctf_field_enumeration_get_mappings(tag);
-       if (!iter) {
+       ret = bt_ctf_field_type_enumeration_mapping_iterator_next(iter);
+       if (!iter || ret) {
                BT_LOGE("Cannot get enumeration field type mapping iterator from enumeration field: "
                        "enum-field-addr=%p", tag);
                goto end;
index 75edcc7eed7541fa46354401ae597b8250d494b9..7234b8a485bbe4d94e4bbc3e37e6c5b3dd1a5535 100644 (file)
@@ -838,7 +838,8 @@ enum bt_component_status print_enum(struct pretty_component *pretty,
                                enumeration_field_type, value);
        }
        g_string_append(pretty->string, "( ");
-       if (!iter) {
+       ret = bt_ctf_field_type_enumeration_mapping_iterator_next(iter);
+       if (ret) {
                if (pretty->use_colors) {
                        g_string_append(pretty->string, COLOR_UNKNOWN);
                }
@@ -1243,7 +1244,9 @@ enum bt_component_status print_variant(struct pretty_component *pretty,
                }
 
                iter = bt_ctf_field_enumeration_get_mappings(tag_field);
-               if (!iter) {
+               iter_ret = bt_ctf_field_type_enumeration_mapping_iterator_next(
+                       iter);
+               if (!iter || ret) {
                        bt_put(tag_field);
                        ret = BT_COMPONENT_STATUS_ERROR;
                        goto end;
index 2eac697c7b17becb7c6d1f8d53c79fb1d100c288..d45953d3823a98096e6f526c63575df79936aa92 100644 (file)
@@ -247,11 +247,14 @@ void append_simple_event(struct bt_ctf_stream_class *stream_class,
        ok(iter == NULL, "bt_ctf_field_type_enumeration_find_mappings_by_signed_value handles a NULL field type correctly");
 
        iter = bt_ctf_field_type_enumeration_find_mappings_by_signed_value(enum_type, -4200000);
-       ok(iter == NULL, "bt_ctf_field_type_enumeration_find_mappings_by_signed_value rejects non-mapped values");
+       ret = bt_ctf_field_type_enumeration_mapping_iterator_next(iter);
+       ok(iter && ret, "bt_ctf_field_type_enumeration_find_mappings_by_signed_value rejects non-mapped values");
+       BT_PUT(iter);
 
        iter = bt_ctf_field_type_enumeration_find_mappings_by_signed_value(enum_type, 3);
        ok(iter != NULL, "bt_ctf_field_type_enumeration_find_mappings_by_signed_value succeeds with mapped value");
-       ok(bt_ctf_field_type_enumeration_mapping_iterator_get_signed(iter, NULL, NULL, NULL) == 0,
+       ret = bt_ctf_field_type_enumeration_mapping_iterator_next(iter);
+       ok(!ret && bt_ctf_field_type_enumeration_mapping_iterator_get_signed(iter, NULL, NULL, NULL) == 0,
                "bt_ctf_field_type_enumeration_mapping_iterator_get_signed handles mapped values correctly");
        BT_PUT(iter);
 
@@ -438,6 +441,8 @@ void append_simple_event(struct bt_ctf_stream_class *stream_class,
                "Set signed enumeration container value");
        iter = bt_ctf_field_enumeration_get_mappings(enum_field);
        ok(iter, "bt_ctf_field_enumeration_get_mappings returns an iterator to matching mappings");
+       ret = bt_ctf_field_type_enumeration_mapping_iterator_next(iter);
+       ok(!ret, "bt_ctf_field_enumeration_get_mappings returned a non-empty match");
        ret = bt_ctf_field_type_enumeration_mapping_iterator_get_signed(iter, &ret_char, NULL, NULL);
        ok(!ret && ret_char, "bt_ctf_field_type_enumeration_mapping_iterator_get_signed return a mapping name");
        assert(ret_char);
@@ -459,6 +464,8 @@ void append_simple_event(struct bt_ctf_stream_class *stream_class,
        assert(!ret);
        iter = bt_ctf_field_enumeration_get_mappings(enum_field_unsigned);
        assert(iter);
+       ret = bt_ctf_field_type_enumeration_mapping_iterator_next(iter);
+       assert(!ret);
        (void) bt_ctf_field_type_enumeration_mapping_iterator_get_unsigned(iter, &ret_char, NULL, NULL);
        ok(ret_char && !strcmp(ret_char, mapping_name_test),
                "bt_ctf_field_type_enumeration_mapping_iterator_get_unsigned returns the correct mapping name with an unsigned container");
@@ -556,7 +563,7 @@ static
 void append_complex_event(struct bt_ctf_stream_class *stream_class,
                struct bt_ctf_stream *stream, struct bt_ctf_clock *clock)
 {
-       int i;
+       int i, ret;
        struct event_class_attrs_counts ;
        const char *complex_test_event_string = "Complex Test Event";
        const char *test_string_1 = "Test ";
@@ -652,25 +659,31 @@ void append_complex_event(struct bt_ctf_stream_class *stream_class,
        ok(iter == NULL, "bt_ctf_field_type_enumeration_find_mappings_by_name handles a NULL field type correctly");
 
        iter = bt_ctf_field_type_enumeration_find_mappings_by_name(enum_variant_type, "INT16_TYPE");
-       ok(iter != NULL, "bt_ctf_field_type_enumeration_find_mappings_by_name handles an existing mapping correctly");
+       ok(iter != NULL, "bt_ctf_field_type_enumeration_find_mappings_by_name returns a non-NULL iterator");
+       ret = bt_ctf_field_type_enumeration_mapping_iterator_next(iter);
+       ok(!ret, "bt_ctf_field_type_enumeration_find_mappings_by_name handles an existing mapping correctly");
        ok(bt_ctf_field_type_enumeration_mapping_iterator_get_unsigned(iter, NULL, NULL, NULL) == 0,
                "bt_ctf_field_type_enumeration_mapping_iterator_get_unsigned handles mapped values correctly");
        BT_PUT(iter);
 
        iter = bt_ctf_field_type_enumeration_find_mappings_by_name(enum_variant_type, NULL);
-       ok(iter == NULL, "bt_ctf_field_type_enumeration_find_mappings_by_name handles a NULL name correctly");
+       ret = bt_ctf_field_type_enumeration_mapping_iterator_next(iter);
+       ok(iter && ret, "bt_ctf_field_type_enumeration_find_mappings_by_name handles a NULL name correctly");
+       BT_PUT(iter);
 
        iter = bt_ctf_field_type_enumeration_find_mappings_by_unsigned_value(NULL, 1);
        ok(iter == NULL, "bt_ctf_field_type_enumeration_find_mappings_by_unsigned_value handles a NULL field type correctly");
 
        iter = bt_ctf_field_type_enumeration_find_mappings_by_unsigned_value(enum_variant_type, -42);
-       ok(iter == NULL, "bt_ctf_field_type_enumeration_find_mappings_by_unsigned_value handles invalid values correctly");
+       ret = bt_ctf_field_type_enumeration_mapping_iterator_next(iter);
+       ok(iter && ret, "bt_ctf_field_type_enumeration_find_mappings_by_unsigned_value handles invalid values correctly");
        ok(bt_ctf_field_type_enumeration_mapping_iterator_get_unsigned(iter, NULL, NULL, NULL) != 0,
                "bt_ctf_field_type_enumeration_mapping_iterator_get_unsigned handles invalid values correctly");
        BT_PUT(iter);
 
        iter = bt_ctf_field_type_enumeration_find_mappings_by_unsigned_value(enum_variant_type, 5);
-       ok(iter != NULL, "bt_ctf_field_type_enumeration_find_mappings_by_unsigned_value handles valid values correctly");
+       ret = bt_ctf_field_type_enumeration_mapping_iterator_next(iter);
+       ok(iter != NULL && !ret, "bt_ctf_field_type_enumeration_find_mappings_by_unsigned_value handles valid values correctly");
        ok(bt_ctf_field_type_enumeration_mapping_iterator_get_unsigned(iter, NULL, NULL, NULL) == 0,
                "bt_ctf_field_type_enumeration_mapping_iterator_get_unsigned handles valid values correctly");
        BT_PUT(iter);
@@ -1464,6 +1477,7 @@ void field_copy_tests()
 
        /* validate e copy */
        e_iter = bt_ctf_field_enumeration_get_mappings(e_copy);
+       (void) bt_ctf_field_type_enumeration_mapping_iterator_next(e_iter);
        (void) bt_ctf_field_type_enumeration_mapping_iterator_get_signed(e_iter,
                &str_val, NULL, NULL);
        ok(str_val && !strcmp(str_val, "LABEL2"),
This page took 0.032235 seconds and 4 git commands to generate.