python: Fix weird memory issue in wrapped AddrRange vectors

There is a weird issue with the PyBind wrapper of
vector<AddrRange>. Assigning new values to a param that is a vector of
AddrRange sometimes results in an out-of-bounds memory access.

We work around this issue by treating AddrRange vectors as opaque
types. This slightly changes the semantics of the wrapper since Python
now manipulates the real object rather than a copy that has been
converted to a list.

Change-Id: Ie027c06e7a7262214b43b19a76b24fe4b20426c5
Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-by: Sascha Bischoff <sascha.bischoff@arm.com>
Reviewed-by: Curtis Dunham <curtis.dunham@arm.com>
Reviewed-by: Timothy Hayes <timothy.hayes@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/3223
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
This commit is contained in:
Andreas Sandberg
2017-05-10 13:16:43 +01:00
parent e897c52f81
commit 2da0ab06b7
3 changed files with 66 additions and 1 deletions

View File

@@ -681,6 +681,7 @@ class MetaSimObject(type):
#include "pybind11/stl.h"
#include "params/$cls.hh"
#include "python/pybind11/core.hh"
#include "sim/init.hh"
#include "sim/sim_object.hh"
@@ -1418,7 +1419,14 @@ class SimObject(object):
assert isinstance(value, list)
vec = getattr(cc_params, param)
assert not len(vec)
setattr(cc_params, param, list(value))
# Some types are exposed as opaque types. They support
# the append operation unlike the automatically
# wrapped types.
if isinstance(vec, list):
setattr(cc_params, param, list(value))
else:
for v in value:
getattr(cc_params, param).append(v)
else:
setattr(cc_params, param, value)