From 6a36ddcab611cb253bc589c61a2ef87a6d033867 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Fri, 15 Apr 2011 20:36:51 -0400 Subject: [PATCH] Dynamic scope: child position is MAX_INT Ensure that lookup knows the parent fields are prior to the child location. Signed-off-by: Mathieu Desnoyers --- .../ctf/metadata/ctf-visitor-generate-io-struct.c | 15 ++++++++++----- include/babeltrace/types.h | 3 ++- types/types.c | 9 ++++++++- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c index f54a276a..2c01a9a2 100644 --- a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c +++ b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c @@ -515,7 +515,8 @@ int ctf_event_visit(FILE *fd, int depth, struct ctf_node *node, event->context = event->context_decl->definition_new(event->context_decl, parent_def_scope, 0, 0); - set_dynamic_definition_scope(event->context->scope, + set_dynamic_definition_scope(&event->context->p, + event->context->scope, g_quark_from_string("event.context")); parent_def_scope = event->context->scope; declaration_unref(event->context_decl); @@ -524,7 +525,8 @@ int ctf_event_visit(FILE *fd, int depth, struct ctf_node *node, event->fields = event->fields_decl->definition_new(event->fields_decl, parent_def_scope, 0, 0); - set_dynamic_definition_scope(event->fields->scope, + set_dynamic_definition_scope(&event->fields->p, + event->fields->scope, g_quark_from_string("event.fields")); parent_def_scope = event->fields->scope; declaration_unref(event->fields_decl); @@ -652,7 +654,8 @@ int ctf_stream_visit(FILE *fd, int depth, struct ctf_node *node, stream->packet_context = stream->packet_context_decl->definition_new(stream->packet_context_decl, parent_def_scope, 0, 0); - set_dynamic_definition_scope(stream->packet_context->scope, + set_dynamic_definition_scope(&stream->packet_context->p, + stream->packet_context->scope, g_quark_from_string("stream.packet.context")); parent_def_scope = stream->packet_context->scope; declaration_unref(stream->packet_context_decl); @@ -661,7 +664,8 @@ int ctf_stream_visit(FILE *fd, int depth, struct ctf_node *node, stream->event_header = stream->event_header_decl->definition_new(stream->event_header_decl, parent_def_scope, 0, 0); - set_dynamic_definition_scope(stream->event_header->scope, + set_dynamic_definition_scope(&stream->event_header->p, + stream->event_header->scope, g_quark_from_string("stream.event.header")); parent_def_scope = stream->event_header->scope; declaration_unref(stream->event_header_decl); @@ -670,7 +674,8 @@ int ctf_stream_visit(FILE *fd, int depth, struct ctf_node *node, stream->event_context = stream->event_context_decl->definition_new(stream->event_context_decl, parent_def_scope, 0, 0); - set_dynamic_definition_scope(stream->event_context_scope, + set_dynamic_definition_scope(&stream->event_context->p, + stream->event_context->scope, g_quark_from_string("stream.event.context")); parent_def_scope = stream->event_context->scope; declaration_unref(stream->event_context_decl); diff --git a/include/babeltrace/types.h b/include/babeltrace/types.h index 44c9e5b2..21dd66f2 100644 --- a/include/babeltrace/types.h +++ b/include/babeltrace/types.h @@ -380,7 +380,8 @@ int register_field_definition(GQuark field_name, struct definition_scope * new_definition_scope(struct definition_scope *parent_scope, GQuark field_name); -void set_dynamic_definition_scope(struct definition_scope *scope, +void set_dynamic_definition_scope(struct definition *definition, + struct definition_scope *scope, GQuark root_name); void free_definition_scope(struct definition_scope *scope); diff --git a/types/types.c b/types/types.c index 1f93da4e..fe1538f0 100644 --- a/types/types.c +++ b/types/types.c @@ -19,6 +19,7 @@ */ #include +#include #include #include @@ -445,11 +446,17 @@ struct definition_scope * return scope; } -void set_dynamic_definition_scope(struct definition_scope *scope, +void set_dynamic_definition_scope(struct definition *definition, + struct definition_scope *scope, GQuark root_name) { g_array_set_size(scope->scope_path, 1); g_array_index(scope->scope_path, GQuark, 0) = root_name; + /* + * Use INT_MAX order to ensure that all fields of the parent + * scope are seen as being prior to this scope. + */ + definition->index = INT_MAX; } void free_definition_scope(struct definition_scope *scope) -- 2.34.1