Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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.de


Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
parent 33058b94
Loading
Loading
Loading
Loading
+31 −12
Original line number Diff line number Diff line
@@ -234,10 +234,24 @@ 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 (is_array) {
		list = PyList_New(field->arraylen);
		item_size = field->size / field->arraylen;
		n_items = field->arraylen;
	} else {
		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)
@@ -250,6 +264,11 @@ static PyObject *get_field_numeric_entry(struct event_format *event,
			else
				obj = PyLong_FromUnsignedLongLong(val);
		}
		if (is_array)
			PyList_SET_ITEM(list, i, obj);
	}
	if (is_array)
		obj = list;
	return obj;
}