summaryrefslogtreecommitdiff
path: root/src/python/m5
diff options
context:
space:
mode:
authorAndreas Sandberg <andreas.sandberg@arm.com>2017-05-10 13:16:43 +0100
committerAndreas Sandberg <andreas.sandberg@arm.com>2017-05-22 17:14:34 +0000
commit2da0ab06b720e5b22fb3a81585ef9eecc752a99f (patch)
treea0a7eea8b3739419fbc8bb20c6784fc8fb62eb26 /src/python/m5
parente897c52f81326ce0126f68a8c91bca56e6b49c11 (diff)
downloadgem5-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/m5')
-rw-r--r--src/python/m5/SimObject.py10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/python/m5/SimObject.py b/src/python/m5/SimObject.py
index d60d7cec1..569142e34 100644
--- a/src/python/m5/SimObject.py
+++ b/src/python/m5/SimObject.py
@@ -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)