Add support for variant fields in the Python bindings
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Fri, 13 Sep 2013 01:37:21 +0000 (21:37 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Wed, 13 Nov 2013 02:57:11 +0000 (21:57 -0500)
get_value() now returns the variant's selected field's value
when called on a variant.

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
bindings/python/babeltrace.i.in
formats/ctf/events.c
include/babeltrace/ctf/events.h
include/babeltrace/types.h

index 3e228ecccc7aed2c056b6346587d3ef349cb0645..c39b53ad08866b06fbd9811aac74e3c0e7b6e750 100644 (file)
@@ -569,6 +569,7 @@ struct bt_ctf_event *bt_ctf_iter_read_event(struct bt_ctf_iter *iter);
 %rename("_bt_ctf_get_char_array") bt_ctf_get_char_array(const struct bt_definition *field);
 %rename("_bt_ctf_get_string") bt_ctf_get_string(const struct bt_definition *field);
 %rename("_bt_ctf_get_float") bt_ctf_get_float(const struct bt_definition *field);
+%rename("_bt_ctf_get_variant") bt_ctf_get_variant(const struct bt_definition *field);
 %rename("_bt_ctf_field_get_error") bt_ctf_field_get_error(void);
 %rename("_bt_ctf_get_decl_event_name") bt_ctf_get_decl_event_name(const struct
                bt_ctf_event_decl *event);
@@ -607,6 +608,7 @@ int64_t bt_ctf_get_int64(const struct bt_definition *field);
 char *bt_ctf_get_char_array(const struct bt_definition *field);
 char *bt_ctf_get_string(const struct bt_definition *field);
 double bt_ctf_get_float(const struct bt_definition *field);
+const struct bt_definition *bt_ctf_get_variant(const struct bt_definition *field);
 int bt_ctf_field_get_error(void);
 const char *bt_ctf_get_decl_event_name(const struct bt_ctf_event_decl *event);
 const char *bt_ctf_get_decl_field_name(const struct bt_ctf_field_decl *field);
@@ -1047,6 +1049,15 @@ class ctf:
                        """
                        return _bt_ctf_get_float(self._d)
 
+               def get_variant(self):
+                       """
+                       Return the variant's selected field.
+                       If the field does not exist or is not of the type requested,
+                       the value returned is undefined. To check if an error occured,
+                       use the ctf.field_error() function after accessing a field.
+                       """
+                       return _bt_ctf_get_variant(self._d)
+
                def get_value(self):
                        """
                        Return the value associated with the field according to its type.
@@ -1076,6 +1087,10 @@ class ctf:
                                        value.append(evDef.get_value())
                        elif id == ctf.type_id.FLOAT:
                                value = self.get_float()
+                       elif id == ctf.type_id.VARIANT:
+                               variant = ctf.Definition.__new__(ctf.Definition)
+                               variant._d = self.get_variant();
+                               value = variant.get_value()
 
                        if ctf.field_error():
                                raise ctf.FieldError("Error occured while accessing field {} of type {}".format(self.field_name(), ctf.type_id.get_type_id_name(self.field_type())))
index 15d5a7dcde0147205a585baff63e7422cd596c20..f38278aadc6d64ebd4be1f5d9165bf31b313f339 100644 (file)
@@ -621,6 +621,29 @@ double bt_ctf_get_float(const struct bt_definition *field)
        return ret;
 }
 
+const struct bt_definition *bt_ctf_get_variant(const struct bt_definition *field)
+{
+       const struct bt_definition *ret = NULL;
+
+       if (field && bt_ctf_field_type(
+               bt_ctf_get_decl_from_def(field)) == CTF_TYPE_VARIANT) {
+               struct definition_variant *variant = container_of(field,
+                       struct definition_variant, p);
+
+               ret = bt_variant_get_current_field(variant);
+       } else {
+               bt_ctf_field_set_error(-EINVAL);
+       }
+
+       return ret;
+}
+       } else {
+               bt_ctf_field_set_error(-EINVAL);
+       }
+
+       return ret;
+}
+
 int bt_ctf_get_event_decl_list(int handle_id, struct bt_context *ctx,
                struct bt_ctf_event_decl * const **list,
                unsigned int *count)
index c57cde74310b7d42f286bbb730cee8670e1764e2..414716d2c079b631936e19330fd82846c810a45e 100644 (file)
@@ -232,6 +232,7 @@ const char *bt_ctf_get_enum_str(const struct bt_definition *field);
 char *bt_ctf_get_char_array(const struct bt_definition *field);
 char *bt_ctf_get_string(const struct bt_definition *field);
 double bt_ctf_get_float(const struct bt_definition *field);
+const struct bt_definition *bt_ctf_get_variant(const struct bt_definition *field);
 
 /*
  * bt_ctf_field_get_error: returns the last error code encountered while
index 7db83164f6c36eead37443dd05a83ec312555426..438e79f3cff805fe535e564a78c52b5ab458a82f 100644 (file)
@@ -437,6 +437,8 @@ enum ctf_string_encoding bt_get_string_encoding(const struct bt_definition *fiel
 
 double bt_get_float(const struct bt_definition *field);
 
+const struct bt_definition *bt_get_variant_field(struct bt_definition *definition);
+
 struct declaration_struct *
        bt_struct_declaration_new(struct declaration_scope *parent_scope,
                               uint64_t min_align);
This page took 0.037218 seconds and 4 git commands to generate.