/* Hash table mapping field name GQuark to "struct definition" */
GHashTable *definitions;
struct definition_scope *parent_scope;
+ /*
+ * Complete "path" leading to this definition scope.
+ * Includes dynamic scope name '.' field name '.' field name '.' ....
+ * Array of GQuark elements (which are each separated by dots).
+ * The dynamic scope name can contain dots, and is encoded into
+ * a single GQuark. Thus, scope_path[0] returns the GQuark
+ * identifying the dynamic scope.
+ */
+ GArray *scope_path; /* array of GQuark */
};
enum ctf_type_id {
CTF_TYPE_ENUM,
CTF_TYPE_STRING,
CTF_TYPE_STRUCT,
+ CTF_TYPE_UNTAGGED_VARIANT,
CTF_TYPE_VARIANT,
CTF_TYPE_ARRAY,
CTF_TYPE_SEQUENCE,
void (*declaration_free)(struct declaration *declaration);
struct definition *
(*definition_new)(struct declaration *declaration,
- struct definition_scope *parent_scope);
+ struct definition_scope *parent_scope,
+ GQuark field_name, int index);
/*
* definition_free called with definition ref is decremented to 0.
*/
struct definition {
struct declaration *declaration;
+ int index; /* Position of the definition in its container */
int ref; /* number of references to the definition */
};
GArray *fields; /* Array of struct field */
};
-struct declaration_variant {
+struct declaration_untagged_variant {
struct declaration p;
GHashTable *fields_by_tag; /* Tuples (field tag, field index) */
struct declaration_scope *scope;
GArray *fields; /* Array of declaration_field */
- GQuark tag_name; /* TODO */
- /* Tag name must be nonzero and must exist when defining the variant */
};
+struct declaration_variant {
+ struct declaration p;
+ struct declaration_untagged_variant *untagged_variant;
+ GArray *tag_name; /* Array of GQuark */
+};
+
+/* A variant needs to be tagged to be defined. */
struct definition_variant {
struct definition p;
struct declaration_variant *declaration;
* definition scopes.
*/
struct definition *
- lookup_field_definition(GQuark field_name,
- struct definition_scope *scope);
+ lookup_definition(GArray *cur_path, /* array of GQuark */
+ GArray *lookup_path, /* array of GQuark */
+ struct definition_scope *scope);
int register_field_definition(GQuark field_name,
struct definition *definition,
struct definition_scope *scope);
struct definition_scope *
- new_definition_scope(struct definition_scope *parent_scope);
+ new_definition_scope(struct definition_scope *parent_scope,
+ GQuark field_name);
+void set_dynamic_definition_scope(struct definition *definition,
+ struct definition_scope *scope,
+ const char *root_name);
void free_definition_scope(struct definition_scope *scope);
void declaration_ref(struct declaration *declaration);
* from numeric values to a single tag. Overlapping tag value ranges are
* therefore forbidden.
*/
-struct declaration_variant *variant_declaration_new(const char *name,
+struct declaration_untagged_variant *untagged_variant_declaration_new(const char *name,
struct declaration_scope *parent_scope);
-void variant_declaration_add_field(struct declaration_variant *variant_declaration,
- const char *tag_name,
- struct declaration *tag_declaration);
+struct declaration_variant *variant_declaration_new(struct declaration_untagged_variant *untagged_variant,
+ const char *tag);
+
+void untagged_variant_declaration_add_field(struct declaration_untagged_variant *untagged_variant_declaration,
+ const char *field_name,
+ struct declaration *field_declaration);
struct declaration_field *
- variant_declaration_get_field_from_tag(struct declaration_variant *variant_declaration,
+ untagged_variant_declaration_get_field_from_tag(struct declaration_untagged_variant *untagged_variant_declaration,
GQuark tag);
/*
* Returns 0 on success, -EPERM on error.
struct declaration *elem_declaration,
struct declaration_scope *parent_scope);
+/*
+ * in: path (dot separated), out: q (GArray of GQuark)
+ */
+void append_scope_path(const char *path, GArray *q);
+
#endif /* _BABELTRACE_declarationS_H */