From 963b52e5188334fb68af3cb7a150a259361ac1e7 Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Tue, 8 Jan 2019 05:04:50 +0100 Subject: [PATCH 1/1] only use pybind11 when registering actors Mixing with the underlying C API only makes things harder --- src/bindings/python/simgrid_python.cpp | 46 ++++++++++++-------------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/src/bindings/python/simgrid_python.cpp b/src/bindings/python/simgrid_python.cpp index 15eae3d7b5..89c6f4c648 100644 --- a/src/bindings/python/simgrid_python.cpp +++ b/src/bindings/python/simgrid_python.cpp @@ -83,32 +83,30 @@ PYBIND11_MODULE(simgrid, m) .def("get_all_hosts", &Engine::get_all_hosts, "Returns the list of all hosts found in the platform") .def("get_clock", &Engine::get_clock, "Retrieve the simulation time") .def("load_platform", &Engine::load_platform, - "Load a platform file describing the environment, see :cpp:func:`simgrid::s4u::Engine::load_platform()`") + "Load a platform file describing the environment, see :cpp:func:`simgrid::s4u::Engine::load_platform()`") .def("load_deployment", &Engine::load_deployment, - "Load a deployment file and launch the actors that it contains, see :cpp:func:`simgrid::s4u::Engine::load_deployment()`") + "Load a deployment file and launch the actors that it contains, see " + ":cpp:func:`simgrid::s4u::Engine::load_deployment()`") .def("run", &Engine::run, "Run the simulation") - .def("register_actor", [](Engine*, std::string name, py::object obj) { - simgrid::simix::register_function(name, - [obj](std::vector args) -> simgrid::simix::ActorCode { - return [obj, args]() { - /* Convert the std::vector into a py::tuple */ - py::tuple params(args.size()-1); - for (size_t i=1; i(pybind11::handle(static_cast(result))); - obj2(); - } - }; - }); - }, "Registers the main function of an actor, see :cpp:func:`simgrid::s4u::Engine::register_function()`") - ; + .def("register_actor", + [](Engine*, std::string name, py::object fun_or_class) { + simgrid::simix::register_function( + name, [fun_or_class](std::vector args) -> simgrid::simix::ActorCode { + return [fun_or_class, args]() { + /* Convert the std::vector into a py::tuple */ + py::tuple params(args.size() - 1); + for (size_t i = 1; i < args.size(); i++) + params[i - 1] = py::cast(args[i]); + + py::object res = fun_or_class(*params); + + /* If I was passed a class, I just built an instance, so I need to call it now */ + if (py::isinstance(res)) + res(); + }; + }); + }, + "Registers the main function of an actor, see :cpp:func:`simgrid::s4u::Engine::register_function()`"); /* Class Host */ py::class_>(m, "Host", "Simulation Engine, see :ref:`class s4u::Host `") -- 2.20.1