assert-pre-internal.h: add BT_ASSERT_PRE_VALID_INDEX()
[babeltrace.git] / lib / ctf-ir / validation.c
index dd9a7afdb6e437a3081f2b7b3e55774657058c82..cc653ec52e50f5a102516b08f40750874b380f1d 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Babeltrace - CTF IR: Validation of trace, stream class, and event class
  *
- * Copyright 2016 Philippe Proulx <pproulx@efficios.com>
+ * Copyright 2016-2018 Philippe Proulx <pproulx@efficios.com>
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
 #define BT_LOG_TAG "VALIDATION"
 #include <babeltrace/lib-logging-internal.h>
 
+#include <babeltrace/assert-pre-internal.h>
 #include <babeltrace/ctf-ir/validation-internal.h>
 #include <babeltrace/ctf-ir/resolve-internal.h>
 #include <babeltrace/ctf-ir/trace-internal.h>
 #include <babeltrace/ctf-ir/stream-class-internal.h>
 #include <babeltrace/ctf-ir/field-types-internal.h>
 #include <babeltrace/ctf-ir/event-class-internal.h>
+#include <babeltrace/ctf-ir/field-types-internal.h>
 #include <babeltrace/values.h>
 #include <babeltrace/babeltrace-internal.h>
 #include <babeltrace/ref.h>
@@ -240,11 +242,11 @@ int field_type_contains_sequence_or_variant_ft(struct bt_field_type *type)
 
                for (i = 0; i < field_count; ++i) {
                        struct bt_field_type *child_type =
-                               bt_field_type_get_field_at_index(type, i);
+                               bt_field_type_borrow_field_at_index(
+                                       type, i);
 
                        ret = field_type_contains_sequence_or_variant_ft(
                                child_type);
-                       BT_PUT(child_type);
                        if (ret != 0) {
                                goto end;
                        }
@@ -269,7 +271,8 @@ int bt_validate_class_types(struct bt_value *environment,
                struct bt_field_type *event_payload_type,
                int trace_valid, int stream_class_valid, int event_class_valid,
                struct bt_validation_output *output,
-               enum bt_validation_flag validate_flags)
+               enum bt_validation_flag validate_flags,
+               bt_validation_flag_copy_field_type_func copy_field_type_func)
 {
        int ret = 0;
        int contains_seq_var;
@@ -334,7 +337,7 @@ int bt_validate_class_types(struct bt_value *environment,
 
                        BT_LOGV_STR("Copying packet header field type because it contains at least one sequence or variant field type.");
                        packet_header_type_copy =
-                               bt_field_type_copy(packet_header_type);
+                               copy_field_type_func(packet_header_type);
                        if (!packet_header_type_copy) {
                                ret = -1;
                                BT_LOGE_STR("Cannot copy packet header field type.");
@@ -385,7 +388,7 @@ skip_packet_header_type_copy:
 
                        BT_LOGV_STR("Copying packet context field type because it contains at least one sequence or variant field type.");
                        packet_context_type_copy =
-                               bt_field_type_copy(packet_context_type);
+                               copy_field_type_func(packet_context_type);
                        if (!packet_context_type_copy) {
                                BT_LOGE_STR("Cannot copy packet context field type.");
                                goto sc_validation_error;
@@ -416,7 +419,7 @@ skip_packet_context_type_copy:
 
                        BT_LOGV_STR("Copying event header field type because it contains at least one sequence or variant field type.");
                        event_header_type_copy =
-                               bt_field_type_copy(event_header_type);
+                               copy_field_type_func(event_header_type);
                        if (!event_header_type_copy) {
                                BT_LOGE_STR("Cannot copy event header field type.");
                                goto sc_validation_error;
@@ -448,7 +451,7 @@ skip_event_header_type_copy:
 
                        BT_LOGV_STR("Copying stream event context field type because it contains at least one sequence or variant field type.");
                        stream_event_ctx_type_copy =
-                               bt_field_type_copy(stream_event_ctx_type);
+                               copy_field_type_func(stream_event_ctx_type);
                        if (!stream_event_ctx_type_copy) {
                                BT_LOGE_STR("Cannot copy stream event context field type.");
                                goto sc_validation_error;
@@ -510,7 +513,7 @@ sc_validation_done:
 
                        BT_LOGV_STR("Copying event context field type because it contains at least one sequence or variant field type.");
                        event_context_type_copy =
-                               bt_field_type_copy(event_context_type);
+                               copy_field_type_func(event_context_type);
                        if (!event_context_type_copy) {
                                BT_LOGE_STR("Cannot copy event context field type.");
                                goto ec_validation_error;
@@ -541,7 +544,7 @@ skip_event_context_type_copy:
 
                        BT_LOGV_STR("Copying event payload field type because it contains at least one sequence or variant field type.");
                        event_payload_type_copy =
-                               bt_field_type_copy(event_payload_type);
+                               copy_field_type_func(event_payload_type);
                        if (!event_payload_type_copy) {
                                BT_LOGE_STR("Cannot copy event payload field type.");
                                goto ec_validation_error;
@@ -611,27 +614,28 @@ void bt_validation_replace_types(struct bt_trace *trace,
                enum bt_validation_flag replace_flags)
 {
        if ((replace_flags & BT_VALIDATION_FLAG_TRACE) && trace) {
-               bt_field_type_freeze(trace->packet_header_type);
-               BT_MOVE(trace->packet_header_type, output->packet_header_type);
+               bt_field_type_freeze(trace->packet_header_field_type);
+               BT_MOVE(trace->packet_header_field_type,
+                       output->packet_header_type);
        }
 
        if ((replace_flags & BT_VALIDATION_FLAG_STREAM) && stream_class) {
-               bt_field_type_freeze(stream_class->packet_context_type);
-               bt_field_type_freeze(stream_class->event_header_type);
-               bt_field_type_freeze(stream_class->event_context_type);
-               BT_MOVE(stream_class->packet_context_type,
+               bt_field_type_freeze(stream_class->packet_context_field_type);
+               bt_field_type_freeze(stream_class->event_header_field_type);
+               bt_field_type_freeze(stream_class->event_context_field_type);
+               BT_MOVE(stream_class->packet_context_field_type,
                        output->packet_context_type);
-               BT_MOVE(stream_class->event_header_type,
+               BT_MOVE(stream_class->event_header_field_type,
                        output->event_header_type);
-               BT_MOVE(stream_class->event_context_type,
+               BT_MOVE(stream_class->event_context_field_type,
                        output->stream_event_ctx_type);
        }
 
        if ((replace_flags & BT_VALIDATION_FLAG_EVENT) && event_class) {
-               bt_field_type_freeze(event_class->context);
-               bt_field_type_freeze(event_class->fields);
-               BT_MOVE(event_class->context, output->event_context_type);
-               BT_MOVE(event_class->fields, output->event_payload_type);
+               bt_field_type_freeze(event_class->context_field_type);
+               bt_field_type_freeze(event_class->payload_field_type);
+               BT_MOVE(event_class->context_field_type, output->event_context_type);
+               BT_MOVE(event_class->payload_field_type, output->event_payload_type);
        }
 }
 
This page took 0.027183 seconds and 4 git commands to generate.