From: Jérémie Galarneau Date: Sat, 16 Sep 2017 01:47:49 +0000 (-0400) Subject: Enumeration mapping iterator's initial position is inconsistent X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=commitdiff_plain;h=74fb045227fb3f01c59bd469c76f466fbd7a25a0 Enumeration mapping iterator's initial position is inconsistent Signed-off-by: Jérémie Galarneau --- diff --git a/bindings/python/bt2/bt2/field_types.py b/bindings/python/bt2/bt2/field_types.py index 3a4e820f..47249372 100644 --- a/bindings/python/bt2/bt2/field_types.py +++ b/bindings/python/bt2/bt2/field_types.py @@ -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): diff --git a/lib/ctf-ir/field-types.c b/lib/ctf-ir/field-types.c index 23093ebd..5063ea65 100644 --- a/lib/ctf-ir/field-types.c +++ b/lib/ctf-ir/field-types.c @@ -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; diff --git a/plugins/text/pretty/print.c b/plugins/text/pretty/print.c index 75edcc7e..7234b8a4 100644 --- a/plugins/text/pretty/print.c +++ b/plugins/text/pretty/print.c @@ -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; diff --git a/tests/lib/test_ctf_writer.c b/tests/lib/test_ctf_writer.c index 2eac697c..d45953d3 100644 --- a/tests/lib/test_ctf_writer.c +++ b/tests/lib/test_ctf_writer.c @@ -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"),