2 * Babeltrace - Trace IR field copy
4 * Copyright (c) 2015-2019 EfficiOS Inc. and Linux Foundation
5 * Copyright (c) 2018 Philippe Proulx <pproulx@efficios.com>
6 * Copyright (c) 2019 Francis Deslauriers <francis.deslauriers@efficios.com>
8 * Permission is hereby granted, free of charge, to any person obtaining a copy
9 * of this software and associated documentation files (the "Software"), to deal
10 * in the Software without restriction, including without limitation the rights
11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 * copies of the Software, and to permit persons to whom the Software is
13 * furnished to do so, subject to the following conditions:
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27 #define BT_LOG_TAG "PLUGIN-LTTNG-UTILS-DEBUG-INFO-TRACE-IR-METADATA-FC-COPY"
30 #include <babeltrace/assert-internal.h>
31 #include <babeltrace/common-internal.h>
32 #include <babeltrace/compiler-internal.h>
33 #include <babeltrace/babeltrace.h>
35 #include "trace-ir-metadata-copy.h"
36 #include "trace-ir-metadata-field-class-copy.h"
39 * This fonction walks througth the nested structures field class to resolve a
40 * field path object. A field path is made of indexes inside possibly nested
41 * structures ultimately leading to a field class.
44 const bt_field_class
*walk_field_path(const bt_field_path
*fp
,
45 const bt_field_class
*fc
)
47 uint64_t i
, fp_item_count
;
48 const bt_field_class
*curr_fc
;
50 BT_ASSERT(bt_field_class_get_type(fc
) == BT_FIELD_CLASS_TYPE_STRUCTURE
);
51 BT_LOGD("Walking field path on field class: fp-addr=%p, fc-addr=%p",
54 fp_item_count
= bt_field_path_get_item_count(fp
);
56 for (i
= 0; i
< fp_item_count
; i
++) {
57 bt_field_class_type fc_type
= bt_field_class_get_type(curr_fc
);
58 const bt_field_path_item
*fp_item
=
59 bt_field_path_borrow_item_by_index_const(fp
, i
);
62 case BT_FIELD_CLASS_TYPE_STRUCTURE
:
64 const bt_field_class_structure_member
*member
;
66 BT_ASSERT(bt_field_path_item_get_type(fp_item
) ==
67 BT_FIELD_PATH_ITEM_TYPE_INDEX
);
68 member
= bt_field_class_structure_borrow_member_by_index_const(
70 bt_field_path_item_index_get_index(fp_item
));
71 curr_fc
= bt_field_class_structure_member_borrow_field_class_const(
75 case BT_FIELD_CLASS_TYPE_VARIANT
:
77 const bt_field_class_variant_option
*option
;
79 BT_ASSERT(bt_field_path_item_get_type(fp_item
) ==
80 BT_FIELD_PATH_ITEM_TYPE_INDEX
);
81 option
= bt_field_class_variant_borrow_option_by_index_const(
83 bt_field_path_item_index_get_index(fp_item
));
84 curr_fc
= bt_field_class_variant_option_borrow_field_class_const(
88 case BT_FIELD_CLASS_TYPE_STATIC_ARRAY
:
89 case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY
:
91 BT_ASSERT(bt_field_path_item_get_type(fp_item
) ==
92 BT_FIELD_PATH_ITEM_TYPE_CURRENT_ARRAY_ELEMENT
);
93 curr_fc
= bt_field_class_array_borrow_element_field_class_const(
106 const bt_field_class
*resolve_field_path_to_field_class(const bt_field_path
*fp
,
107 struct trace_ir_metadata_maps
*md_maps
)
109 struct field_class_resolving_context
*fc_resolving_ctx
;
110 const bt_field_class
*fc
;
113 BT_LOGD("Resolving field path: fp-addr=%p", fp
);
115 fc_resolving_ctx
= md_maps
->fc_resolving_ctx
;
116 fp_scope
= bt_field_path_get_root_scope(fp
);
119 case BT_SCOPE_PACKET_CONTEXT
:
120 fc
= walk_field_path(fp
, fc_resolving_ctx
->packet_context
);
122 case BT_SCOPE_EVENT_COMMON_CONTEXT
:
123 fc
= walk_field_path(fp
, fc_resolving_ctx
->event_common_context
);
125 case BT_SCOPE_EVENT_SPECIFIC_CONTEXT
:
126 fc
= walk_field_path(fp
, fc_resolving_ctx
->event_specific_context
);
128 case BT_SCOPE_EVENT_PAYLOAD
:
129 fc
= walk_field_path(fp
, fc_resolving_ctx
->event_payload
);
139 void field_class_integer_set_props(const bt_field_class
*input_fc
,
140 bt_field_class
*output_fc
)
142 bt_field_class_integer_set_preferred_display_base(output_fc
,
143 bt_field_class_integer_get_preferred_display_base(input_fc
));
144 bt_field_class_integer_set_field_value_range(output_fc
,
145 bt_field_class_integer_get_field_value_range(input_fc
));
149 int field_class_unsigned_integer_copy(
150 struct trace_ir_metadata_maps
*md_maps
,
151 const bt_field_class
*in_field_class
,
152 bt_field_class
*out_field_class
)
154 BT_LOGD("Copying content of unsigned integer field class: "
155 "in-fc-addr=%p, out-fc-addr=%p",
156 in_field_class
, out_field_class
);
158 field_class_integer_set_props(in_field_class
, out_field_class
);
160 BT_LOGD("Copied content of unsigned integer field class: "
161 "in-fc-addr=%p, out-fc-addr=%p",
162 in_field_class
, out_field_class
);
167 int field_class_signed_integer_copy(
168 struct trace_ir_metadata_maps
*md_maps
,
169 const bt_field_class
*in_field_class
,
170 bt_field_class
*out_field_class
)
172 BT_LOGD("Copying content of signed integer field class: "
173 "in-fc-addr=%p, out-fc-addr=%p",
174 in_field_class
, out_field_class
);
176 field_class_integer_set_props(in_field_class
, out_field_class
);
178 BT_LOGD("Copied content of signed integer field class: "
179 "in-fc-addr=%p, out-fc-addr=%p",
180 in_field_class
, out_field_class
);
185 int field_class_unsigned_enumeration_copy(
186 struct trace_ir_metadata_maps
*md_maps
,
187 const bt_field_class
*in_field_class
,
188 bt_field_class
*out_field_class
)
190 uint64_t i
, enum_mapping_count
;
193 BT_LOGD("Copying content of unsigned enumeration field class: "
194 "in-fc-addr=%p, out-fc-addr=%p",
195 in_field_class
, out_field_class
);
197 /* Copy properties of the inner integer. */
198 field_class_integer_set_props(in_field_class
, out_field_class
);
200 /* Copy all enumeration entries. */
201 enum_mapping_count
= bt_field_class_enumeration_get_mapping_count(in_field_class
);
202 for (i
= 0; i
< enum_mapping_count
; i
++) {
204 const bt_field_class_unsigned_enumeration_mapping_ranges
*ranges
;
205 uint64_t range_index
, range_count
;
207 /* Get the ranges and the range count. */
208 bt_field_class_unsigned_enumeration_borrow_mapping_by_index_const(
209 in_field_class
, i
, &label
, &ranges
);
211 bt_field_class_unsigned_enumeration_mapping_ranges_get_range_count(
214 * Iterate over all the ranges to add them to copied field
217 for (range_index
= 0; range_index
< range_count
; range_index
++) {
218 uint64_t lower
, upper
;
219 bt_field_class_status status
;
220 bt_field_class_unsigned_enumeration_mapping_ranges_get_range_by_index(
221 ranges
, range_index
, &lower
, &upper
);
223 BT_LOGD("Copying range in enumeration field class: "
224 "label=%s, lower=%"PRId64
", upper=%"PRId64
,
225 label
, lower
, upper
);
227 /* Add the label and its range to the copy field class. */
228 status
= bt_field_class_unsigned_enumeration_map_range(
229 out_field_class
, label
, lower
, upper
);
231 if (status
!= BT_FIELD_CLASS_STATUS_OK
) {
232 BT_LOGE_STR("Failed to add range to unsigned "
234 BT_FIELD_CLASS_PUT_REF_AND_RESET(out_field_class
);
241 BT_LOGD("Copied content of unsigned enumeration field class: "
242 "in-fc-addr=%p, out-fc-addr=%p",
243 in_field_class
, out_field_class
);
250 int field_class_signed_enumeration_copy(
251 struct trace_ir_metadata_maps
*md_maps
,
252 const bt_field_class
*in_field_class
,
253 bt_field_class
*out_field_class
)
255 uint64_t i
, enum_mapping_count
;
258 BT_LOGD("Copying content of signed enumeration field class: "
259 "in-fc-addr=%p, out-fc-addr=%p",
260 in_field_class
, out_field_class
);
262 /* Copy properties of the inner integer. */
263 field_class_integer_set_props(in_field_class
, out_field_class
);
265 /* Copy all enumeration entries. */
267 bt_field_class_enumeration_get_mapping_count(in_field_class
);
268 for (i
= 0; i
< enum_mapping_count
; i
++) {
270 const bt_field_class_signed_enumeration_mapping_ranges
*ranges
;
271 uint64_t range_index
, range_count
;
273 /* Get the ranges and the range count. */
274 bt_field_class_signed_enumeration_borrow_mapping_by_index_const(
275 in_field_class
, i
, &label
, &ranges
);
277 bt_field_class_signed_enumeration_mapping_ranges_get_range_count(
280 * Iterate over all the ranges to add them to copied field
283 for (range_index
= 0; range_index
< range_count
; range_index
++) {
284 int64_t lower
, upper
;
285 bt_field_class_status status
;
286 bt_field_class_signed_enumeration_mapping_ranges_get_range_by_index(
287 ranges
, range_index
, &lower
, &upper
);
289 BT_LOGD("Copying range in enumeration field class: "
290 "label=%s, lower=%ld, upper=%ld",
291 label
, lower
, upper
);
293 /* Add the label and its range to the copy field class. */
294 status
= bt_field_class_signed_enumeration_map_range(
295 out_field_class
, label
, lower
, upper
);
296 if (status
!= BT_FIELD_CLASS_STATUS_OK
) {
297 BT_LOGE_STR("Failed to add range to signed "
299 BT_FIELD_CLASS_PUT_REF_AND_RESET(out_field_class
);
306 BT_LOGD("Copied content of signed enumeration field class: "
307 "in-fc-addr=%p, out-fc-addr=%p",
308 in_field_class
, out_field_class
);
315 int field_class_real_copy(
316 struct trace_ir_metadata_maps
*md_maps
,
317 const bt_field_class
*in_field_class
,
318 bt_field_class
*out_field_class
)
320 BT_LOGD("Copying content of real field class: "
321 "in-fc-addr=%p, out-fc-addr=%p",
322 in_field_class
, out_field_class
);
324 bt_field_class_real_set_is_single_precision(out_field_class
,
325 bt_field_class_real_is_single_precision(in_field_class
));
327 BT_LOGD("Copied content real field class: in-fc-addr=%p, "
328 "out-fc-addr=%p", in_field_class
, out_field_class
);
334 int field_class_structure_copy(
335 struct trace_ir_metadata_maps
*md_maps
,
336 const bt_field_class
*in_field_class
,
337 bt_field_class
*out_field_class
)
339 uint64_t i
, struct_member_count
;
340 bt_field_class_status status
;
343 BT_LOGD("Copying content of structure field class: "
344 "in-fc-addr=%p, out-fc-addr=%p",
345 in_field_class
, out_field_class
);
346 /* Get the number of member in that struct. */
347 struct_member_count
=
348 bt_field_class_structure_get_member_count(in_field_class
);
350 /* Iterate over all the members of the struct. */
351 for (i
= 0; i
< struct_member_count
; i
++) {
352 const bt_field_class_structure_member
*member
;
353 const char *member_name
;
354 const bt_field_class
*member_fc
;
355 bt_field_class
*out_member_field_class
;
357 member
= bt_field_class_structure_borrow_member_by_index_const(
359 member_fc
= bt_field_class_structure_member_borrow_field_class_const(
361 member_name
= bt_field_class_structure_member_get_name(member
);
362 BT_LOGD("Copying structure field class's field: "
363 "index=%" PRId64
", "
364 "member-fc-addr=%p, field-name=\"%s\"",
365 i
, member_fc
, member_name
);
367 out_member_field_class
= create_field_class_copy(md_maps
,
369 if (!out_member_field_class
) {
370 BT_LOGE("Cannot copy structure field class's field: "
371 "index=%" PRId64
", "
372 "field-fc-addr=%p, field-name=\"%s\"",
373 i
, member_fc
, member_name
);
377 ret
= copy_field_class_content(md_maps
, member_fc
,
378 out_member_field_class
);
383 status
= bt_field_class_structure_append_member(out_field_class
,
384 member_name
, out_member_field_class
);
385 if (status
!= BT_FIELD_CLASS_STATUS_OK
) {
386 BT_LOGE("Cannot append structure field class's field: "
387 "index=%" PRId64
", "
388 "field-fc-addr=%p, field-name=\"%s\"",
389 i
, member_fc
, member_name
);
390 BT_FIELD_CLASS_PUT_REF_AND_RESET(out_member_field_class
);
396 BT_LOGD("Copied structure field class: original-fc-addr=%p, copy-fc-addr=%p",
397 in_field_class
, out_field_class
);
404 int field_class_variant_copy(
405 struct trace_ir_metadata_maps
*md_maps
,
406 const bt_field_class
*in_field_class
,
407 bt_field_class
*out_field_class
)
409 bt_field_class
*out_tag_field_class
;
410 uint64_t i
, variant_option_count
;
411 const bt_field_path
*tag_fp
;
412 const bt_field_class
*tag_fc
;
415 BT_LOGD("Copying content of variant field class: "
416 "in-fc-addr=%p, out-fc-addr=%p",
417 in_field_class
, out_field_class
);
419 tag_fp
= bt_field_class_variant_borrow_selector_field_path_const(
422 tag_fc
= resolve_field_path_to_field_class(tag_fp
,
425 out_tag_field_class
= g_hash_table_lookup(
426 md_maps
->field_class_map
, tag_fc
);
427 if (!out_tag_field_class
) {
428 BT_LOGE_STR("Cannot find the tag field class.");
432 bt_field_class_variant_set_selector_field_class(out_field_class
,
433 out_tag_field_class
);
436 variant_option_count
=
437 bt_field_class_variant_get_option_count(in_field_class
);
438 for (i
= 0; i
< variant_option_count
; i
++) {
439 const bt_field_class
*option_fc
;
440 const char *option_name
;
441 bt_field_class
*out_option_field_class
;
442 bt_field_class_status status
;
443 const bt_field_class_variant_option
*option
;
445 option
= bt_field_class_variant_borrow_option_by_index_const(
447 option_fc
= bt_field_class_variant_option_borrow_field_class_const(
449 option_name
= bt_field_class_variant_option_get_name(option
);
450 out_option_field_class
= create_field_class_copy_internal(
452 if (!out_option_field_class
) {
453 BT_LOGE_STR("Cannot copy field class.");
457 ret
= copy_field_class_content_internal(md_maps
, option_fc
,
458 out_option_field_class
);
460 BT_LOGE_STR("Error copying content of option variant "
465 status
= bt_field_class_variant_append_option(
466 out_field_class
, option_name
,
467 out_option_field_class
);
468 if (status
!= BT_FIELD_CLASS_STATUS_OK
) {
469 BT_LOGE_STR("Cannot append option to variant field class'");
470 BT_FIELD_CLASS_PUT_REF_AND_RESET(out_tag_field_class
);
476 BT_LOGD("Copied content of variant field class: in-fc-addr=%p, "
477 "out-fc-addr=%p", in_field_class
, out_field_class
);
484 int field_class_static_array_copy(
485 struct trace_ir_metadata_maps
*md_maps
,
486 const bt_field_class
*in_field_class
,
487 bt_field_class
*out_field_class
)
489 BT_LOGD("Copying content of static array field class: in-fc-addr=%p, "
490 "out-fc-addr=%p", in_field_class
, out_field_class
);
492 * There is no content to copy. Keep this function call anyway for
495 BT_LOGD("Copied content of static array field class: in-fc-addr=%p, "
496 "out-fc-addr=%p", in_field_class
, out_field_class
);
502 int field_class_dynamic_array_copy(
503 struct trace_ir_metadata_maps
*md_maps
,
504 const bt_field_class
*in_field_class
,
505 bt_field_class
*out_field_class
)
507 const bt_field_class
*len_fc
;
508 const bt_field_path
*len_fp
;
509 bt_field_class_status status
;
510 bt_field_class
*out_len_field_class
;
513 BT_LOGD("Copying content of dynamic array field class: "
514 "in-fc-addr=%p, out-fc-addr=%p",
515 in_field_class
, out_field_class
);
517 len_fp
= bt_field_class_dynamic_array_borrow_length_field_path_const(
521 BT_LOGD("Copying dynamic array length field class using "
522 "field path: in-len-fp=%p", len_fp
);
523 len_fc
= resolve_field_path_to_field_class(
525 out_len_field_class
= g_hash_table_lookup(
526 md_maps
->field_class_map
, len_fc
);
527 if (!out_len_field_class
) {
528 BT_LOGE_STR("Cannot find the output matching length"
534 status
= bt_field_class_dynamic_array_set_length_field_class(
535 out_field_class
, out_len_field_class
);
536 if (status
!= BT_FIELD_CLASS_STATUS_OK
) {
537 BT_LOGE_STR("Cannot set dynamic array field class' "
538 "length field class.");
539 BT_FIELD_CLASS_PUT_REF_AND_RESET(out_len_field_class
);
545 BT_LOGD("Copied dynamic array field class: in-fc-addr=%p, "
546 "out-fc-addr=%p", in_field_class
, out_field_class
);
553 int field_class_string_copy(struct trace_ir_metadata_maps
*md_maps
,
554 const bt_field_class
*in_field_class
,
555 bt_field_class
*out_field_class
)
557 BT_LOGD("Copying content of string field class: in-fc-addr=%p, "
558 "out-fc-addr=%p", in_field_class
, out_field_class
);
560 * There is no content to copy. Keep this function call anyway for
563 BT_LOGD("Copied content of string field class: in-fc-addr=%p, "
564 "out-fc-addr=%p", in_field_class
, out_field_class
);
570 bt_field_class
*copy_field_class_array_element(struct trace_ir_metadata_maps
*md_maps
,
571 const bt_field_class
*in_elem_fc
)
574 bt_field_class
*out_elem_fc
=
575 create_field_class_copy_internal(md_maps
, in_elem_fc
);
577 BT_LOGE("Error creating output elem field class "
578 "from input elem field class for static array: "
579 "in-fc-addr=%p", in_elem_fc
);
583 ret
= copy_field_class_content_internal(md_maps
, in_elem_fc
, out_elem_fc
);
585 BT_LOGE("Error creating output elem field class "
586 "from input elem field class for static array: "
587 "in-fc-addr=%p", in_elem_fc
);
588 BT_FIELD_CLASS_PUT_REF_AND_RESET(out_elem_fc
);
597 bt_field_class
*create_field_class_copy_internal(struct trace_ir_metadata_maps
*md_maps
,
598 const bt_field_class
*in_field_class
)
600 bt_field_class
*out_field_class
= NULL
;
602 BT_LOGD("Creating bare field class based on field class: in-fc-addr=%p",
605 switch(bt_field_class_get_type(in_field_class
)) {
606 case BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER
:
607 out_field_class
= bt_field_class_unsigned_integer_create(
608 md_maps
->output_trace_class
);
610 case BT_FIELD_CLASS_TYPE_SIGNED_INTEGER
:
611 out_field_class
= bt_field_class_signed_integer_create(
612 md_maps
->output_trace_class
);
614 case BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION
:
615 out_field_class
= bt_field_class_unsigned_enumeration_create(
616 md_maps
->output_trace_class
);
618 case BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION
:
619 out_field_class
= bt_field_class_signed_enumeration_create(
620 md_maps
->output_trace_class
);
622 case BT_FIELD_CLASS_TYPE_REAL
:
623 out_field_class
= bt_field_class_real_create(
624 md_maps
->output_trace_class
);
626 case BT_FIELD_CLASS_TYPE_STRING
:
627 out_field_class
= bt_field_class_string_create(
628 md_maps
->output_trace_class
);
630 case BT_FIELD_CLASS_TYPE_STRUCTURE
:
631 out_field_class
= bt_field_class_structure_create(
632 md_maps
->output_trace_class
);
634 case BT_FIELD_CLASS_TYPE_STATIC_ARRAY
:
636 const bt_field_class
*in_elem_fc
=
637 bt_field_class_array_borrow_element_field_class_const(
640 bt_field_class_static_array_get_length(in_field_class
);
642 bt_field_class
*out_elem_fc
= copy_field_class_array_element(
643 md_maps
, in_elem_fc
);
645 out_field_class
= NULL
;
649 out_field_class
= bt_field_class_static_array_create(
650 md_maps
->output_trace_class
,
651 out_elem_fc
, array_len
);
654 case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY
:
656 const bt_field_class
*in_elem_fc
=
657 bt_field_class_array_borrow_element_field_class_const(
660 bt_field_class
*out_elem_fc
= copy_field_class_array_element(
661 md_maps
, in_elem_fc
);
663 out_field_class
= NULL
;
667 out_field_class
= bt_field_class_dynamic_array_create(
668 md_maps
->output_trace_class
,
672 case BT_FIELD_CLASS_TYPE_VARIANT
:
673 out_field_class
= bt_field_class_variant_create(
674 md_maps
->output_trace_class
);
681 * Add mapping from in_field_class to out_field_class. This simplifies
682 * the resolution of field paths in variant and dynamic array field
685 g_hash_table_insert(md_maps
->field_class_map
,
686 (gpointer
) in_field_class
, out_field_class
);
690 BT_LOGD("Created bare field class based on field class: in-fc-addr=%p, "
691 "out-fc-addr=%p", in_field_class
, out_field_class
);
693 BT_LOGE("Error creating output field class from input field "
694 "class: in-fc-addr=%p", in_field_class
);
697 return out_field_class
;
701 int copy_field_class_content_internal(
702 struct trace_ir_metadata_maps
*md_maps
,
703 const bt_field_class
*in_field_class
,
704 bt_field_class
*out_field_class
)
707 switch(bt_field_class_get_type(in_field_class
)) {
708 case BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER
:
709 ret
= field_class_unsigned_integer_copy(md_maps
,
710 in_field_class
, out_field_class
);
712 case BT_FIELD_CLASS_TYPE_SIGNED_INTEGER
:
713 ret
= field_class_signed_integer_copy(md_maps
,
714 in_field_class
, out_field_class
);
716 case BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION
:
717 ret
= field_class_unsigned_enumeration_copy(md_maps
,
718 in_field_class
, out_field_class
);
720 case BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION
:
721 ret
= field_class_signed_enumeration_copy(md_maps
,
722 in_field_class
, out_field_class
);
724 case BT_FIELD_CLASS_TYPE_REAL
:
725 ret
= field_class_real_copy(md_maps
,
726 in_field_class
, out_field_class
);
728 case BT_FIELD_CLASS_TYPE_STRING
:
729 ret
= field_class_string_copy(md_maps
,
730 in_field_class
, out_field_class
);
732 case BT_FIELD_CLASS_TYPE_STRUCTURE
:
733 ret
= field_class_structure_copy(md_maps
,
734 in_field_class
, out_field_class
);
736 case BT_FIELD_CLASS_TYPE_STATIC_ARRAY
:
737 ret
= field_class_static_array_copy(md_maps
,
738 in_field_class
, out_field_class
);
740 case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY
:
741 ret
= field_class_dynamic_array_copy(md_maps
,
742 in_field_class
, out_field_class
);
744 case BT_FIELD_CLASS_TYPE_VARIANT
:
745 ret
= field_class_variant_copy(md_maps
,
746 in_field_class
, out_field_class
);