From 2da0ab06b720e5b22fb3a81585ef9eecc752a99f Mon Sep 17 00:00:00 2001 From: Andreas Sandberg Date: Wed, 10 May 2017 13:16:43 +0100 Subject: python: Fix weird memory issue in wrapped AddrRange vectors There is a weird issue with the PyBind wrapper of vector. 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 Reviewed-by: Sascha Bischoff Reviewed-by: Curtis Dunham Reviewed-by: Timothy Hayes Reviewed-on: https://gem5-review.googlesource.com/3223 Reviewed-by: Jason Lowe-Power --- src/python/m5/SimObject.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'src/python/m5') 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) -- cgit v1.2.3