From 9c3869a9d005111c48715720e4c9a100cb2d5ec7 Mon Sep 17 00:00:00 2001 From: Philippe Proulx Date: Thu, 10 Oct 2019 12:03:36 -0400 Subject: [PATCH] lib: use powers of two for object type enumerators MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit For all object type enumerators, that is, enumerators containing `_TYPE`, use powers of two instead of sequential values. This makes it possible to test that a given object has one or more given types with a single bitwise operation, for example: bt_field_class_type fc_type = bt_field_class_get_type(my_fc); if (fc_type & (BT_FIELD_CLASS_TYPE_STATIC_ARRAY | BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD | BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD)) { /* `my_fc` is an array */ } To make things easier, I'm also introducing one type enumerator per "abstract" field class type. For example: * `BT_FIELD_CLASS_TYPE_SIGNED_INTEGER` * `BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION` * `BT_FIELD_CLASS_TYPE_REAL` * `BT_FIELD_CLASS_TYPE_ARRAY` * `BT_FIELD_CLASS_TYPE_OPTION_WITH_SELECTOR_FIELD` No field class object has those exact types, but their type can have those bits set. For example, all the integer field class types have bit 2 set. Then, if you need to know if a given type is conceptually a given type, use bt_field_class_type_is(), which returns: (type & type_to_check) == type_to_check Each `BT_FIELD_CLASS_TYPE_*` enumerator conceptually matches, more or less, a field class `bt2` Python class. For example: * `BT_FIELD_CLASS_TYPE_ARRAY` → `bt2._ArrayFieldClass` * `BT_FIELD_CLASS_TYPE_REAL` → `bt2._RealFieldClass` The C to Python equivalent expressions are: Object has a specific type: C: bt_field_class_get_type(fc) == BT_FIELD_CLASS_TYPE_X Python: type(fc) is bt2._XFieldClassConst Object is an instance of a conceptual type: C: bt_field_class_type_is(bt_field_class_get_type(obj), BT_FIELD_CLASS_TYPE_ABC) Python: isinstance(fc, bt2._AbcFieldClassConst) Of course it's more natural in Python, but Python was not developed in 1972. All `BT_FIELD_CLASS_TYPE_*` enumerators are `unsigned long long` values and the non-API `__BT_FIELD_CLASS_TYPE_BIG_VALUE` is `1ULL << 62` because we could have more than 32 enumerators eventually so I want to make sure the `bt_field_class_type` type is a 64-bit integer for ABI compatibility reasons. Because the enumerators are not sequential anymore, we can't use them directly as the indexes of lookup tables. This is why bt_field_create() and bt_field_destroy() now check the FC type explicitly instead of using lookup tables. Those functions are not called often anyway as field objects are always created and destroyed from object pools. Signed-off-by: Philippe Proulx Change-Id: I1b5110f691e1eabc0ce9291c0281755a3c6a755b Reviewed-on: https://review.lttng.org/c/babeltrace/+/2171 CI-Build: Simon Marchi Reviewed-by: Francis Deslauriers Tested-by: jenkins --- include/babeltrace2/error-cause-const.h | 8 +- .../babeltrace2/graph/component-class-const.h | 6 +- include/babeltrace2/graph/message-const.h | 16 +- include/babeltrace2/graph/port-const.h | 4 +- .../babeltrace2/trace-ir/field-class-const.h | 66 ++++++--- .../babeltrace2/trace-ir/field-path-const.h | 6 +- include/babeltrace2/value-const.h | 25 +++- src/lib/trace-ir/field.c | 140 +++++++++++------- tests/cli/test_help | 2 +- 9 files changed, 174 insertions(+), 99 deletions(-) diff --git a/include/babeltrace2/error-cause-const.h b/include/babeltrace2/error-cause-const.h index 6771b0ad..004741fc 100644 --- a/include/babeltrace2/error-cause-const.h +++ b/include/babeltrace2/error-cause-const.h @@ -38,10 +38,10 @@ extern "C" { #endif typedef enum bt_error_cause_actor_type { - BT_ERROR_CAUSE_ACTOR_TYPE_UNKNOWN = 0, - BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT = 1, - BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT_CLASS = 2, - BT_ERROR_CAUSE_ACTOR_TYPE_MESSAGE_ITERATOR = 3, + BT_ERROR_CAUSE_ACTOR_TYPE_UNKNOWN = 1 << 0, + BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT = 1 << 1, + BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT_CLASS = 1 << 2, + BT_ERROR_CAUSE_ACTOR_TYPE_MESSAGE_ITERATOR = 1 << 3, } bt_error_cause_actor_type; extern diff --git a/include/babeltrace2/graph/component-class-const.h b/include/babeltrace2/graph/component-class-const.h index f265929a..da46d290 100644 --- a/include/babeltrace2/graph/component-class-const.h +++ b/include/babeltrace2/graph/component-class-const.h @@ -34,9 +34,9 @@ extern "C" { #endif typedef enum bt_component_class_type { - BT_COMPONENT_CLASS_TYPE_SOURCE = 0, - BT_COMPONENT_CLASS_TYPE_FILTER = 1, - BT_COMPONENT_CLASS_TYPE_SINK = 2, + BT_COMPONENT_CLASS_TYPE_SOURCE = 1 << 0, + BT_COMPONENT_CLASS_TYPE_FILTER = 1 << 1, + BT_COMPONENT_CLASS_TYPE_SINK = 1 << 2, } bt_component_class_type; extern const char *bt_component_class_get_name( diff --git a/include/babeltrace2/graph/message-const.h b/include/babeltrace2/graph/message-const.h index 080f3771..0612b3c8 100644 --- a/include/babeltrace2/graph/message-const.h +++ b/include/babeltrace2/graph/message-const.h @@ -37,14 +37,14 @@ extern "C" { * Message types. Unhandled message types should be ignored. */ typedef enum bt_message_type { - BT_MESSAGE_TYPE_EVENT = 0, - BT_MESSAGE_TYPE_MESSAGE_ITERATOR_INACTIVITY = 1, - BT_MESSAGE_TYPE_STREAM_BEGINNING = 2, - BT_MESSAGE_TYPE_STREAM_END = 3, - BT_MESSAGE_TYPE_PACKET_BEGINNING = 4, - BT_MESSAGE_TYPE_PACKET_END = 5, - BT_MESSAGE_TYPE_DISCARDED_EVENTS = 6, - BT_MESSAGE_TYPE_DISCARDED_PACKETS = 7, + BT_MESSAGE_TYPE_EVENT = 1 << 0, + BT_MESSAGE_TYPE_MESSAGE_ITERATOR_INACTIVITY = 1 << 1, + BT_MESSAGE_TYPE_STREAM_BEGINNING = 1 << 2, + BT_MESSAGE_TYPE_STREAM_END = 1 << 3, + BT_MESSAGE_TYPE_PACKET_BEGINNING = 1 << 4, + BT_MESSAGE_TYPE_PACKET_END = 1 << 5, + BT_MESSAGE_TYPE_DISCARDED_EVENTS = 1 << 6, + BT_MESSAGE_TYPE_DISCARDED_PACKETS = 1 << 7, } bt_message_type; /** diff --git a/include/babeltrace2/graph/port-const.h b/include/babeltrace2/graph/port-const.h index 5b22b884..eda9ccb9 100644 --- a/include/babeltrace2/graph/port-const.h +++ b/include/babeltrace2/graph/port-const.h @@ -36,8 +36,8 @@ extern "C" { #endif typedef enum bt_port_type { - BT_PORT_TYPE_INPUT = 0, - BT_PORT_TYPE_OUTPUT = 1, + BT_PORT_TYPE_INPUT = 1 << 0, + BT_PORT_TYPE_OUTPUT = 1 << 1, } bt_port_type; extern const char *bt_port_get_name(const bt_port *port); diff --git a/include/babeltrace2/trace-ir/field-class-const.h b/include/babeltrace2/trace-ir/field-class-const.h index f88a007e..2a5c88d6 100644 --- a/include/babeltrace2/trace-ir/field-class-const.h +++ b/include/babeltrace2/trace-ir/field-class-const.h @@ -37,26 +37,45 @@ extern "C" { #endif typedef enum bt_field_class_type { - BT_FIELD_CLASS_TYPE_BOOL = 0, - BT_FIELD_CLASS_TYPE_BIT_ARRAY = 1, - BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER = 2, - BT_FIELD_CLASS_TYPE_SIGNED_INTEGER = 3, - BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION = 4, - BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION = 5, - BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL = 6, - BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL = 7, - BT_FIELD_CLASS_TYPE_STRING = 8, - BT_FIELD_CLASS_TYPE_STRUCTURE = 9, - BT_FIELD_CLASS_TYPE_STATIC_ARRAY = 10, - BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD = 11, - BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD = 12, - BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD = 13, - BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD = 14, - BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD = 15, - BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD = 16, - BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD = 17, - BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD = 18, - BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD = 19, + BT_FIELD_CLASS_TYPE_BOOL = 1ULL << 0, + BT_FIELD_CLASS_TYPE_BIT_ARRAY = 1ULL << 1, + BT_FIELD_CLASS_TYPE_INTEGER = 1ULL << 2, + BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER = (1ULL << 3) | BT_FIELD_CLASS_TYPE_INTEGER, + BT_FIELD_CLASS_TYPE_SIGNED_INTEGER = (1ULL << 4) | BT_FIELD_CLASS_TYPE_INTEGER, + BT_FIELD_CLASS_TYPE_ENUMERATION = 1ULL << 5, + BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION = BT_FIELD_CLASS_TYPE_ENUMERATION | BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER, + BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION = BT_FIELD_CLASS_TYPE_ENUMERATION | BT_FIELD_CLASS_TYPE_SIGNED_INTEGER, + BT_FIELD_CLASS_TYPE_REAL = 1ULL << 6, + BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL = (1ULL << 7) | BT_FIELD_CLASS_TYPE_REAL, + BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL = (1ULL << 8) | BT_FIELD_CLASS_TYPE_REAL, + BT_FIELD_CLASS_TYPE_STRING = 1ULL << 9, + BT_FIELD_CLASS_TYPE_STRUCTURE = 1ULL << 10, + BT_FIELD_CLASS_TYPE_ARRAY = 1ULL << 11, + BT_FIELD_CLASS_TYPE_STATIC_ARRAY = (1ULL << 12) | BT_FIELD_CLASS_TYPE_ARRAY, + BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY = (1ULL << 13) | BT_FIELD_CLASS_TYPE_ARRAY, + BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD = (1ULL << 14) | BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY, + BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD = (1ULL << 15) | BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY, + BT_FIELD_CLASS_TYPE_OPTION = 1ULL << 16, + BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD = (1ULL << 17) | BT_FIELD_CLASS_TYPE_OPTION, + BT_FIELD_CLASS_TYPE_OPTION_WITH_SELECTOR_FIELD = (1ULL << 18) | BT_FIELD_CLASS_TYPE_OPTION, + BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD = (1ULL << 19) | BT_FIELD_CLASS_TYPE_OPTION_WITH_SELECTOR_FIELD, + BT_FIELD_CLASS_TYPE_OPTION_WITH_INTEGER_SELECTOR_FIELD = (1ULL << 20) | BT_FIELD_CLASS_TYPE_OPTION_WITH_SELECTOR_FIELD, + BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD = (1ULL << 21) | BT_FIELD_CLASS_TYPE_OPTION_WITH_INTEGER_SELECTOR_FIELD, + BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD = (1ULL << 22) | BT_FIELD_CLASS_TYPE_OPTION_WITH_INTEGER_SELECTOR_FIELD, + BT_FIELD_CLASS_TYPE_VARIANT = 1ULL << 23, + BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD = (1ULL << 24) | BT_FIELD_CLASS_TYPE_VARIANT, + BT_FIELD_CLASS_TYPE_VARIANT_WITH_SELECTOR_FIELD = (1ULL << 25) | BT_FIELD_CLASS_TYPE_VARIANT, + BT_FIELD_CLASS_TYPE_VARIANT_WITH_INTEGER_SELECTOR_FIELD = (1ULL << 26) | BT_FIELD_CLASS_TYPE_VARIANT_WITH_SELECTOR_FIELD, + BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD = (1ULL << 27) | BT_FIELD_CLASS_TYPE_VARIANT_WITH_INTEGER_SELECTOR_FIELD, + BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD = (1ULL << 28) | BT_FIELD_CLASS_TYPE_VARIANT_WITH_INTEGER_SELECTOR_FIELD, + + /* + * Make sure the enumeration type is a 64-bit integer in case + * the project needs field class types in the future. + * + * This is not part of the API. + */ + __BT_FIELD_CLASS_TYPE_BIG_VALUE = 1ULL << 62, } bt_field_class_type; typedef enum bt_field_class_integer_preferred_display_base { @@ -69,6 +88,13 @@ typedef enum bt_field_class_integer_preferred_display_base { extern bt_field_class_type bt_field_class_get_type( const bt_field_class *field_class); +static inline +bt_bool bt_field_class_type_is(const bt_field_class_type type, + const bt_field_class_type type_to_check) +{ + return (type & type_to_check) == type_to_check; +} + extern const bt_value *bt_field_class_borrow_user_attributes_const( const bt_field_class *field_class); diff --git a/include/babeltrace2/trace-ir/field-path-const.h b/include/babeltrace2/trace-ir/field-path-const.h index 0f44a63d..06dfe052 100644 --- a/include/babeltrace2/trace-ir/field-path-const.h +++ b/include/babeltrace2/trace-ir/field-path-const.h @@ -36,9 +36,9 @@ extern "C" { #endif typedef enum bt_field_path_item_type { - BT_FIELD_PATH_ITEM_TYPE_INDEX = 0, - BT_FIELD_PATH_ITEM_TYPE_CURRENT_ARRAY_ELEMENT = 1, - BT_FIELD_PATH_ITEM_TYPE_CURRENT_OPTION_CONTENT = 2, + BT_FIELD_PATH_ITEM_TYPE_INDEX = 1 << 0, + BT_FIELD_PATH_ITEM_TYPE_CURRENT_ARRAY_ELEMENT = 1 << 1, + BT_FIELD_PATH_ITEM_TYPE_CURRENT_OPTION_CONTENT = 1 << 2, } bt_field_path_item_type; typedef enum bt_field_path_scope { diff --git a/include/babeltrace2/value-const.h b/include/babeltrace2/value-const.h index 2f1ffe77..0001ddd8 100644 --- a/include/babeltrace2/value-const.h +++ b/include/babeltrace2/value-const.h @@ -38,32 +38,41 @@ extern "C" { typedef enum bt_value_type { /// Null value object. - BT_VALUE_TYPE_NULL = 0, + BT_VALUE_TYPE_NULL = 1 << 0, /// Boolean value object (holds #BT_TRUE or #BT_FALSE). - BT_VALUE_TYPE_BOOL = 1, + BT_VALUE_TYPE_BOOL = 1 << 1, + + BT_VALUE_TYPE_INTEGER = 1 << 2, /// Unsigned integer value object (holds an unsigned 64-bit integer raw value). - BT_VALUE_TYPE_UNSIGNED_INTEGER = 2, + BT_VALUE_TYPE_UNSIGNED_INTEGER = (1 << 3) | BT_VALUE_TYPE_INTEGER, /// Signed integer value object (holds a signed 64-bit integer raw value). - BT_VALUE_TYPE_SIGNED_INTEGER = 3, + BT_VALUE_TYPE_SIGNED_INTEGER = (1 << 4) | BT_VALUE_TYPE_INTEGER, /// Floating point number value object (holds a \c double raw value). - BT_VALUE_TYPE_REAL = 4, + BT_VALUE_TYPE_REAL = 1 << 5, /// String value object. - BT_VALUE_TYPE_STRING = 5, + BT_VALUE_TYPE_STRING = 1 << 6, /// Array value object. - BT_VALUE_TYPE_ARRAY = 6, + BT_VALUE_TYPE_ARRAY = 1 << 7, /// Map value object. - BT_VALUE_TYPE_MAP = 7, + BT_VALUE_TYPE_MAP = 1 << 8, } bt_value_type; extern bt_value_type bt_value_get_type(const bt_value *object); +static inline +bt_bool bt_value_type_is(const bt_value_type type, + const bt_value_type type_to_check) +{ + return (type & type_to_check) == type_to_check; +} + static inline bt_bool bt_value_is_null(const bt_value *object) { diff --git a/src/lib/trace-ir/field.c b/src/lib/trace-ir/field.c index ca7dbb20..0b8529b2 100644 --- a/src/lib/trace-ir/field.c +++ b/src/lib/trace-ir/field.c @@ -163,6 +163,7 @@ struct bt_field *create_string_field(struct bt_field_class *); static struct bt_field *create_structure_field(struct bt_field_class *); + static struct bt_field *create_static_array_field(struct bt_field_class *); @@ -175,30 +176,6 @@ struct bt_field *create_option_field(struct bt_field_class *); static struct bt_field *create_variant_field(struct bt_field_class *); -static -struct bt_field *(* const field_create_funcs[])(struct bt_field_class *) = { - [BT_FIELD_CLASS_TYPE_BOOL] = create_bool_field, - [BT_FIELD_CLASS_TYPE_BIT_ARRAY] = create_bit_array_field, - [BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER] = create_integer_field, - [BT_FIELD_CLASS_TYPE_SIGNED_INTEGER] = create_integer_field, - [BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION] = create_integer_field, - [BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION] = create_integer_field, - [BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL] = create_real_field, - [BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL] = create_real_field, - [BT_FIELD_CLASS_TYPE_STRING] = create_string_field, - [BT_FIELD_CLASS_TYPE_STRUCTURE] = create_structure_field, - [BT_FIELD_CLASS_TYPE_STATIC_ARRAY] = create_static_array_field, - [BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD] = create_dynamic_array_field, - [BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD] = create_dynamic_array_field, - [BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD] = create_option_field, - [BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD] = create_option_field, - [BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD] = create_option_field, - [BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD] = create_option_field, - [BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD] = create_variant_field, - [BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD] = create_variant_field, - [BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD] = create_variant_field, -}; - static void destroy_bool_field(struct bt_field *field); @@ -226,30 +203,6 @@ void destroy_option_field(struct bt_field *field); static void destroy_variant_field(struct bt_field *field); -static -void (* const field_destroy_funcs[])(struct bt_field *) = { - [BT_FIELD_CLASS_TYPE_BOOL] = destroy_bool_field, - [BT_FIELD_CLASS_TYPE_BIT_ARRAY] = destroy_bit_array_field, - [BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER] = destroy_integer_field, - [BT_FIELD_CLASS_TYPE_SIGNED_INTEGER] = destroy_integer_field, - [BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION] = destroy_integer_field, - [BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION] = destroy_integer_field, - [BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL] = destroy_real_field, - [BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL] = destroy_real_field, - [BT_FIELD_CLASS_TYPE_STRING] = destroy_string_field, - [BT_FIELD_CLASS_TYPE_STRUCTURE] = destroy_structure_field, - [BT_FIELD_CLASS_TYPE_STATIC_ARRAY] = destroy_array_field, - [BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD] = destroy_array_field, - [BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD] = destroy_array_field, - [BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD] = destroy_option_field, - [BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD] = destroy_option_field, - [BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD] = destroy_option_field, - [BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD] = destroy_option_field, - [BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD] = destroy_variant_field, - [BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD] = destroy_variant_field, - [BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD] = destroy_variant_field, -}; - struct bt_field_class *bt_field_borrow_class(struct bt_field *field) { BT_ASSERT_PRE_DEV_NON_NULL(field, "Field"); @@ -275,7 +228,52 @@ struct bt_field *bt_field_create(struct bt_field_class *fc) struct bt_field *field = NULL; BT_ASSERT(fc); - field = field_create_funcs[fc->type](fc); + + switch (fc->type) { + case BT_FIELD_CLASS_TYPE_BOOL: + field = create_bool_field(fc); + break; + case BT_FIELD_CLASS_TYPE_BIT_ARRAY: + field = create_bit_array_field(fc); + break; + case BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER: + case BT_FIELD_CLASS_TYPE_SIGNED_INTEGER: + case BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION: + case BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION: + field = create_integer_field(fc); + break; + case BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL: + case BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL: + field = create_real_field(fc); + break; + case BT_FIELD_CLASS_TYPE_STRING: + field = create_string_field(fc); + break; + case BT_FIELD_CLASS_TYPE_STRUCTURE: + field = create_structure_field(fc); + break; + case BT_FIELD_CLASS_TYPE_STATIC_ARRAY: + field = create_static_array_field(fc); + break; + case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD: + case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD: + field = create_dynamic_array_field(fc); + break; + case BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD: + case BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD: + case BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD: + case BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD: + field = create_option_field(fc); + break; + case BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD: + case BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD: + case BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD: + field = create_variant_field(fc); + break; + default: + abort(); + } + if (!field) { BT_LIB_LOGE_APPEND_CAUSE("Cannot create field object from field class: " "%![fc-]+F", fc); @@ -1325,7 +1323,49 @@ BT_HIDDEN void bt_field_destroy(struct bt_field *field) { BT_ASSERT(field); - field_destroy_funcs[field->class->type](field); + + switch (field->class->type) { + case BT_FIELD_CLASS_TYPE_BOOL: + destroy_bool_field(field); + break; + case BT_FIELD_CLASS_TYPE_BIT_ARRAY: + destroy_bit_array_field(field); + break; + case BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER: + case BT_FIELD_CLASS_TYPE_SIGNED_INTEGER: + case BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION: + case BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION: + destroy_integer_field(field); + break; + case BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL: + case BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL: + destroy_real_field(field); + break; + case BT_FIELD_CLASS_TYPE_STRING: + destroy_string_field(field); + break; + case BT_FIELD_CLASS_TYPE_STRUCTURE: + destroy_structure_field(field); + break; + case BT_FIELD_CLASS_TYPE_STATIC_ARRAY: + case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD: + case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD: + destroy_array_field(field); + break; + case BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD: + case BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD: + case BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD: + case BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD: + destroy_option_field(field); + break; + case BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD: + case BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD: + case BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD: + destroy_variant_field(field); + break; + default: + abort(); + } } static diff --git a/tests/cli/test_help b/tests/cli/test_help index da6460b7..2d620a3a 100755 --- a/tests/cli/test_help +++ b/tests/cli/test_help @@ -92,7 +92,7 @@ ok $? "help with unknown plugin name produces no output" bt_cli "${stdout}" "${stderr}" help src.ctf.bob isnt $? 0 "help with unknown component class name" -grep --silent 'Cannot find component class: plugin-name="ctf", comp-cls-name="bob", comp-cls-type=0' "${stderr}" +grep --silent 'Cannot find component class: plugin-name="ctf", comp-cls-name="bob", comp-cls-type=1' "${stderr}" ok $? "help with unknown component class name produces expected error" grep --silent 'Description: CTF input and output' "${stdout}" -- 2.34.1