diff options
author | Andreas Sandberg <andreas.sandberg@arm.com> | 2017-05-10 13:16:43 +0100 |
---|---|---|
committer | Andreas Sandberg <andreas.sandberg@arm.com> | 2017-05-22 17:14:34 +0000 |
commit | 2da0ab06b720e5b22fb3a81585ef9eecc752a99f (patch) | |
tree | a0a7eea8b3739419fbc8bb20c6784fc8fb62eb26 /src/python/pybind11/core.cc | |
parent | e897c52f81326ce0126f68a8c91bca56e6b49c11 (diff) | |
download | gem5-2da0ab06b720e5b22fb3a81585ef9eecc752a99f.tar.xz |
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>
Diffstat (limited to 'src/python/pybind11/core.cc')
-rw-r--r-- | src/python/pybind11/core.cc | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/src/python/pybind11/core.cc b/src/python/pybind11/core.cc index a11ad7f6b..7ad45b408 100644 --- a/src/python/pybind11/core.cc +++ b/src/python/pybind11/core.cc @@ -46,6 +46,8 @@ #include "pybind11/pybind11.h" +#include "python/pybind11/core.hh" + #include <ctime> #include "base/addr_range.hh" @@ -163,6 +165,10 @@ init_range(py::module &m_native) .def("isSubset", &AddrRange::isSubset) ; + // We need to make vectors of AddrRange opaque to avoid a weird + // memory allocation issues in PyBind's STL wrappers. + py::bind_vector<std::vector<AddrRange>>(m, "AddrRangeVector"); + m.def("RangeEx", &RangeEx); m.def("RangeIn", &RangeIn); m.def("RangeSize", &RangeSize); |