python: Make GlobalExitEvent.getCode() return an int
authorAndreas Sandberg <andreas.sandberg@arm.com>
Mon, 31 Jul 2017 10:19:41 +0000 (11:19 +0100)
committerAndreas Sandberg <andreas.sandberg@arm.com>
Wed, 30 Aug 2017 16:25:44 +0000 (16:25 +0000)
PyBind normally casts integers returned from the C to long in
Python. This is normally fine since long in most cases behaves just
like an int. However, when passing the return value from getcode() to
sys.exit, unexpected behavior ensues. Due to the way the function is
defined, any type other than int (with the exception of None) will be
treated as an error and be equivalent to sys.exit(1).

Since we frequently use the sys.exit(event.getCode()) pattern, we need
to ensure that the function returns an integer. This change adds an
explicit type conversion to a Python integer in the wrapper code.

Change-Id: I73d6b881025064afa2b2e6eb4512fa2a4b0a87da
Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-by: Jose Marinho <jose.marinho@arm.com>
Reviewed-by: Curtis Dunham <curtis.dunham@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/4280
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Reviewed-by: Joe Gross <joe.gross@amd.com>
src/python/pybind11/event.cc

index f9e65685d22e0614f7e2010a70e4e6990eef7b3f..88ee6996aab9ff4507e34ec9e8b79a70661bb622 100644 (file)
@@ -135,7 +135,10 @@ pybind_init_event(py::module &m_native)
                std::unique_ptr<GlobalSimLoopExitEvent, py::nodelete>>(
                m, "GlobalSimLoopExitEvent")
         .def("getCause", &GlobalSimLoopExitEvent::getCause)
-        .def("getCode", &GlobalSimLoopExitEvent::getCode)
+        .def("getCode", [](GlobalSimLoopExitEvent *e) {
+                return py::reinterpret_steal<py::object>(
+                    PyInt_FromLong(e->getCode()));
+            })
         ;
 
     // Event base class. These should never be returned directly to