2 votes

Une erreur de type étrange s'est produite lors de l'appel d'une fonction de méthode exposée par boost python.

J'ai écrit un wrapper python pour box2d, tout fonctionne parfaitement mais une étrange erreur TypeError se produit parfois lors de l'appel d'une fonction de méthode exposée par boost python. C'est un comportement aléatoire, qui ne se produit pas à chaque fois.

Le problème du code python :

try:
    world = body.GetWorld()  # world is b2World instance, body is b2Body instance
    world.DestroyBody(body)  # raise TypeError: 'NoneType' object is not callable
except TypeError:  # catch it, and print some infomation
    print "xxxxx", world  # I got a b2World instance here
    print "xxxxx", sys.getrefcount(world)  # I got a value of 66 here
    print "xxxxx", world.DestroyBody  # I got a bound method object here
    raise

Tout semble aller bien. Comment c'est arrivé ?

Et une partie de mon code d'emballage :

// [file]: https://github.com/layzerar/box2d-py/blob/master/python/world.cpp
// [project]: https://github.com/layzerar/box2d-py
template<class T>
inline void b2Func_ClearUserData(T& self)
{
    using namespace boost::python;

    xdecref((PyObject*)self.GetUserData());
    self.SetUserData(NULL);
}
inline void b2World_DestroyBody(b2World& self, b2Body* body)
{
    b2Assert(self.GetBodyCount() > 0);
    b2Assert(self.IsLocked() == false);

    b2Func_ClearUserData(*body);
    self.DestroyBody(body);
}
class_<b2World, b2World_W , boost::noncopyable>("b2World")
    //...
    .def("CreateBody", b2World_CreateBody, return_internal_reference<>())
    .def("DestroyBody", b2World_DestroyBody)
    //...
;

Ai-je fait une erreur évidente ?

0voto

ifocus Points 127

Après quelques jours d'exploration, j'ai trouvé la réponse.

Je me suis trompé dans la question, l'exception n'est pas vraiment levée par DestroyBody. Elle est déclenchée par une fonction virtuelle qui est réécrite en python et appelée dans la fonction DestroyBody.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X