X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=bindings%2Fpython%2Fbabeltrace.i.in;h=6a34e2550c1f0f5c2e9bb82c35ddf49753bc267f;hp=aaa400aab717754d9c37c95c28a2f63a8abef852;hb=46395f8f83447ec4c0ad0796de3a5b42835a2c4c;hpb=024e61817685a20caceb4e3ef3bdc019a7af6b6e diff --git a/bindings/python/babeltrace.i.in b/bindings/python/babeltrace.i.in index aaa400aa..6a34e255 100644 --- a/bindings/python/babeltrace.i.in +++ b/bindings/python/babeltrace.i.in @@ -60,6 +60,7 @@ trace to it." typedef unsigned long long uint64_t; typedef long long int64_t; typedef int bt_intern_str; +typedef int64_t ssize_t; /* ================================================================= PYTHON-COMPLEMENTS.H @@ -90,6 +91,9 @@ struct definition_array *_bt_python_get_array_from_def( struct bt_definition *field); struct definition_sequence *_bt_python_get_sequence_from_def( struct bt_definition *field); +struct bt_declaration *_bt_python_get_array_element_declaration( + struct bt_declaration *field); +const char *_bt_python_get_array_string(struct bt_definition *field); int _bt_python_field_integer_get_signedness(const struct bt_ctf_field *field); enum ctf_type_id _bt_python_get_field_type(const struct bt_ctf_field *field); @@ -386,7 +390,7 @@ int bt_ctf_event_get_handle_id(const struct bt_ctf_event *event); %pythoncode%{ -# Based on enum bt_clock_type in clock-type.h­ +# Based on enum bt_clock_type in clock-type.h class ClockType: CLOCK_CYCLES = 0 CLOCK_REAL = 1 @@ -935,6 +939,14 @@ class ArrayFieldDeclaration(FieldDeclaration): """ return _bt_ctf_get_array_len(self._fd) + @property + def element_declaration(self): + """ + Return element declaration. + """ + field_decl_ptr = _bt_python_get_array_element_declaration(self._fd) + return _create_field_declaration(field_decl_ptr, "", self.scope) + class SequenceFieldDeclaration(FieldDeclaration): """Do not instantiate.""" def __init__(self): @@ -1015,7 +1027,7 @@ class _Definition(object): """Return the name of a field or None on error.""" return _bt_ctf_field_name(self._d) - @property + @property def type(self): """Return the type of a field or -1 if unknown.""" return _bt_ctf_field_type(_bt_ctf_get_decl_from_def(self._d)) @@ -1145,13 +1157,20 @@ class _Definition(object): """ id = self.type value = None + if id == CTFTypeId.STRING: value = self._get_str() elif id == CTFTypeId.ARRAY: - value = [] - for i in range(self.declaration.length): - element = self._get_array_element_at(i) - value.append(element.value) + element_decl = self.declaration.element_declaration + if ((element_decl.type == CTFTypeId.INTEGER + and element_decl.length == 8) + and (element_decl.encoding == CTFStringEncoding.ASCII or element_decl.encoding == CTFStringEncoding.UTF8)): + value = _bt_python_get_array_string(self._d) + else: + value = [] + for i in range(self.declaration.length): + element = self._get_array_element_at(i) + value.append(element.value) elif id == CTFTypeId.INTEGER: if self.declaration.signedness == 0: value = self._get_uint64() @@ -1178,7 +1197,7 @@ class _Definition(object): value[member.name] = member.value if field_error(): - raise FieldError("Error occurred while accessing field {} of type {}".format(self.name, CTFTypeId.type_name(self.declaration.type))) + raise FieldError("Error occurred while accessing field {} of type {}".format(self.name, CTFTypeId.type_name(id))) return value @property @@ -1920,9 +1939,9 @@ class CTFWriter: """ @length.setter def length(self, length_field): - if not isinstance(length, CTFWriter.IntegerField): + if not isinstance(length_field, CTFWriter.IntegerField): raise TypeError("Invalid length field.") - ret = _bt_ctf_field_sequence_set_length(self._f, length._f) + ret = _bt_ctf_field_sequence_set_length(self._f, length_field._f) if ret < 0: raise ValueError("Could not set sequence length.") @@ -1993,7 +2012,7 @@ class CTFWriter: def set_payload(self, field_name, value_field): if not isinstance(value, CTFWriter.Field): raise TypeError("Invalid value type.") - ret = _bt_ctf_event_set_payload(self._e, str(field_name), value._f) + ret = _bt_ctf_event_set_payload(self._e, str(field_name), value_field._f) if ret < 0: raise ValueError("Could not set event field payload.")