|
@@ -234,22 +234,41 @@ static inline struct event_format *find_cache_event(struct perf_evsel *evsel)
|
|
|
static PyObject *get_field_numeric_entry(struct event_format *event,
|
|
|
struct format_field *field, void *data)
|
|
|
{
|
|
|
- PyObject *obj;
|
|
|
+ bool is_array = field->flags & FIELD_IS_ARRAY;
|
|
|
+ PyObject *obj, *list = NULL;
|
|
|
unsigned long long val;
|
|
|
+ unsigned int item_size, n_items, i;
|
|
|
|
|
|
- val = read_size(event, data + field->offset, field->size);
|
|
|
- if (field->flags & FIELD_IS_SIGNED) {
|
|
|
- if ((long long)val >= LONG_MIN &&
|
|
|
- (long long)val <= LONG_MAX)
|
|
|
- obj = PyInt_FromLong(val);
|
|
|
- else
|
|
|
- obj = PyLong_FromLongLong(val);
|
|
|
+ if (is_array) {
|
|
|
+ list = PyList_New(field->arraylen);
|
|
|
+ item_size = field->size / field->arraylen;
|
|
|
+ n_items = field->arraylen;
|
|
|
} else {
|
|
|
- if (val <= LONG_MAX)
|
|
|
- obj = PyInt_FromLong(val);
|
|
|
- else
|
|
|
- obj = PyLong_FromUnsignedLongLong(val);
|
|
|
+ item_size = field->size;
|
|
|
+ n_items = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (i = 0; i < n_items; i++) {
|
|
|
+
|
|
|
+ val = read_size(event, data + field->offset + i * item_size,
|
|
|
+ item_size);
|
|
|
+ if (field->flags & FIELD_IS_SIGNED) {
|
|
|
+ if ((long long)val >= LONG_MIN &&
|
|
|
+ (long long)val <= LONG_MAX)
|
|
|
+ obj = PyInt_FromLong(val);
|
|
|
+ else
|
|
|
+ obj = PyLong_FromLongLong(val);
|
|
|
+ } else {
|
|
|
+ if (val <= LONG_MAX)
|
|
|
+ obj = PyInt_FromLong(val);
|
|
|
+ else
|
|
|
+ obj = PyLong_FromUnsignedLongLong(val);
|
|
|
+ }
|
|
|
+ if (is_array)
|
|
|
+ PyList_SET_ITEM(list, i, obj);
|
|
|
}
|
|
|
+ if (is_array)
|
|
|
+ obj = list;
|
|
|
return obj;
|
|
|
}
|
|
|
|