Commit 8ac631cd authored by Sebastian Andrzej Siewior's avatar Sebastian Andrzej Siewior Committed by Jiri Olsa

perf script: Handle the num array type in python properly

The raw_syscalls:sys_enter tracer for instance passes has one argument
named 'arg' which is an array of 6 integers. Right the python scripts
gets only 0 passed as an argument. The reason is that
pevent_read_number() can not handle data types of 48 and returns always
0.
This patch changes this by passing num array as list of nums which fit
the description. As a result python will now see a list named arg which
contains 6 (integer) items.
Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
Acked-by: default avatarNamhyung Kim <namhyung@kernel.org>
Link: http://lkml.kernel.org/n/1401207274-8170-2-git-send-email-bigeasy@linutronix.deSigned-off-by: default avatarJiri Olsa <jolsa@kernel.org>
parent 33058b94
...@@ -234,22 +234,41 @@ static inline struct event_format *find_cache_event(struct perf_evsel *evsel) ...@@ -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, static PyObject *get_field_numeric_entry(struct event_format *event,
struct format_field *field, void *data) 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 long long val;
unsigned int item_size, n_items, i;
val = read_size(event, data + field->offset, field->size); if (is_array) {
if (field->flags & FIELD_IS_SIGNED) { list = PyList_New(field->arraylen);
if ((long long)val >= LONG_MIN && item_size = field->size / field->arraylen;
(long long)val <= LONG_MAX) n_items = field->arraylen;
obj = PyInt_FromLong(val);
else
obj = PyLong_FromLongLong(val);
} else { } else {
if (val <= LONG_MAX) item_size = field->size;
obj = PyInt_FromLong(val); n_items = 1;
else }
obj = PyLong_FromUnsignedLongLong(val);
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; return obj;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment