+ if (fc_type == BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD) {
+ const bt_field_path *length_fp =
+ bt_field_class_array_dynamic_with_length_field_borrow_length_field_path_const(
+ in_field_class);
+ const bt_field_class *in_length_fc =
+ resolve_field_path_to_field_class(length_fp,
+ md_maps);
+
+ BT_ASSERT(in_length_fc);
+ out_length_fc = g_hash_table_lookup(md_maps->field_class_map,
+ in_length_fc);
+ BT_ASSERT(out_length_fc);
+ }
+
+ out_field_class = bt_field_class_array_dynamic_create(
+ md_maps->output_trace_class, out_elem_fc, out_length_fc);
+ } else if (bt_field_class_type_is(fc_type, BT_FIELD_CLASS_TYPE_OPTION)) {
+ const bt_field_class *in_content_fc =
+ bt_field_class_option_borrow_field_class_const(
+ in_field_class);
+ bt_field_class *out_selector_fc = NULL;
+ bt_field_class *out_content_fc;
+
+ out_content_fc = create_field_class_copy_internal(
+ md_maps, in_content_fc);
+ if (!out_content_fc) {
+ BT_COMP_LOGE_APPEND_CAUSE(self_comp,
+ "Cannot copy option's content field class: "
+ "in-content-fc-addr=%p", in_content_fc);
+ goto error;
+ }
+
+ status = copy_field_class_content_internal(md_maps,
+ in_content_fc, out_content_fc);
+ if (status != DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK) {
+ BT_COMP_LOGE_APPEND_CAUSE(self_comp,
+ "Error copying content of option's content field class: "
+ "in-content-fc-addr=%p, out-content-fc-addr=%p",
+ in_content_fc, out_content_fc);
+ BT_FIELD_CLASS_PUT_REF_AND_RESET(out_content_fc);
+ goto error;
+ }
+
+ if (fc_type == BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD) {
+ out_field_class =
+ bt_field_class_option_without_selector_create(
+ md_maps->output_trace_class,
+ out_content_fc);
+ } else {
+ const bt_field_path *in_selector_fp =
+ bt_field_class_option_with_selector_field_borrow_selector_field_path_const(
+ in_field_class);
+ const bt_field_class *in_selector_fc;
+
+ BT_ASSERT(in_selector_fp);
+ in_selector_fc = resolve_field_path_to_field_class(
+ in_selector_fp, md_maps);
+ BT_ASSERT(in_selector_fc);
+ out_selector_fc = g_hash_table_lookup(
+ md_maps->field_class_map, in_selector_fc);
+ BT_ASSERT(out_selector_fc);
+
+ if (fc_type == BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD) {
+ out_field_class =
+ bt_field_class_option_with_selector_field_bool_create(
+ md_maps->output_trace_class,
+ out_content_fc, out_selector_fc);
+ } else if (fc_type == BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD) {
+ const bt_integer_range_set_unsigned *ranges =
+ bt_field_class_option_with_selector_field_integer_unsigned_borrow_selector_ranges_const(
+ in_field_class);
+
+ BT_ASSERT(ranges);
+ out_field_class =
+ bt_field_class_option_with_selector_field_integer_unsigned_create(
+ md_maps->output_trace_class,
+ out_content_fc, out_selector_fc,
+ ranges);
+ } else if (fc_type == BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD) {
+ const bt_integer_range_set_signed *ranges =
+ bt_field_class_option_with_selector_field_integer_signed_borrow_selector_ranges_const(
+ in_field_class);
+
+ BT_ASSERT(ranges);
+ out_field_class =
+ bt_field_class_option_with_selector_field_integer_signed_create(
+ md_maps->output_trace_class,
+ out_content_fc, out_selector_fc,
+ ranges);
+ }
+ }
+ } else if (bt_field_class_type_is(fc_type,
+ BT_FIELD_CLASS_TYPE_VARIANT)) {
+ bt_field_class *out_sel_fc = NULL;
+
+ if (bt_field_class_type_is(fc_type,
+ BT_FIELD_CLASS_TYPE_VARIANT_WITH_SELECTOR_FIELD)) {
+ const bt_field_class *in_sel_fc;
+ const bt_field_path *sel_fp =
+ bt_field_class_variant_with_selector_field_borrow_selector_field_path_const(
+ in_field_class);
+
+ BT_ASSERT(sel_fp);
+ in_sel_fc = resolve_field_path_to_field_class(sel_fp,
+ md_maps);
+ BT_ASSERT(in_sel_fc);
+ out_sel_fc = g_hash_table_lookup(
+ md_maps->field_class_map, in_sel_fc);
+ BT_ASSERT(out_sel_fc);
+ }
+