collide: Use virtual read_datagram/write_datagram on handlers

This commit is contained in:
rdb 2021-01-02 02:40:52 +01:00
parent e099d9e787
commit f003e3434e
3 changed files with 6 additions and 54 deletions

View File

@ -72,8 +72,8 @@ PUBLISHED:
EXTENSION(PyObject *__reduce__(PyObject *self) const);
EXTENSION(void __setstate__(PyObject *self, vector_uchar data));
void write_datagram(Datagram &destination) const;
void read_datagram(DatagramIterator &source);
virtual void write_datagram(Datagram &destination) const;
virtual void read_datagram(DatagramIterator &source);
protected:
void throw_event_for(const vector_string &patterns, CollisionEntry *entry);

View File

@ -23,22 +23,8 @@
*/
PyObject *Extension<CollisionHandlerEvent>::
__reduce__(PyObject *self) const {
extern struct Dtool_PyTypedObject Dtool_Datagram;
// Call the write_datagram method via Python, since it's not a virtual method
// on the C++ end.
PyObject *method_name = PyUnicode_FromString("write_datagram");
Datagram dg;
PyObject *destination = DTool_CreatePyInstance(&dg, Dtool_Datagram, false, false);
PyObject *retval = PyObject_CallMethodOneArg(self, method_name, destination);
Py_DECREF(method_name);
Py_DECREF(destination);
if (retval == nullptr) {
return nullptr;
}
Py_DECREF(retval);
_this->write_datagram(dg);
const char *data = (const char *)dg.get_data();
Py_ssize_t size = dg.get_length();
@ -51,20 +37,9 @@ __reduce__(PyObject *self) const {
*/
void Extension<CollisionHandlerEvent>::
__setstate__(PyObject *self, vector_uchar data) {
extern struct Dtool_PyTypedObject Dtool_DatagramIterator;
// Call the read_datagram method via Python, since it's not a virtual method
// on the C++ end.
PyObject *method_name = PyUnicode_FromString("read_datagram");
Datagram dg(std::move(data));
DatagramIterator scan(dg);
PyObject *source = DTool_CreatePyInstance(&scan, Dtool_DatagramIterator, false, false);
PyObject *retval = PyObject_CallMethodOneArg(self, method_name, source);
Py_DECREF(method_name);
Py_DECREF(source);
Py_XDECREF(retval);
_this->read_datagram(scan);
}
#endif

View File

@ -47,20 +47,8 @@ __reduce__(PyObject *self) const {
DTool_CreatePyInstance((void *)target, Dtool_NodePath, false, true));
}
// Call the write_datagram method via Python, since it's not a virtual method
// on the C++ end.
PyObject *method_name = PyUnicode_FromString("write_datagram");
Datagram dg;
PyObject *destination = DTool_CreatePyInstance(&dg, Dtool_Datagram, false, false);
PyObject *retval = PyObject_CallMethodOneArg(self, method_name, destination);
Py_DECREF(method_name);
Py_DECREF(destination);
if (retval == nullptr) {
return nullptr;
}
Py_DECREF(retval);
_this->write_datagram(dg);
const char *data = (const char *)dg.get_data();
Py_ssize_t size = dg.get_length();
@ -73,21 +61,10 @@ __reduce__(PyObject *self) const {
*/
void Extension<CollisionHandlerPhysical>::
__setstate__(PyObject *self, vector_uchar data, PyObject *nodepaths) {
extern struct Dtool_PyTypedObject Dtool_DatagramIterator;
// Call the read_datagram method via Python, since it's not a virtual method
// on the C++ end.
PyObject *method_name = PyUnicode_FromString("read_datagram");
{
Datagram dg(std::move(data));
DatagramIterator scan(dg);
PyObject *source = DTool_CreatePyInstance(&scan, Dtool_DatagramIterator, false, false);
PyObject *retval = PyObject_CallMethodOneArg(self, method_name, source);
Py_DECREF(method_name);
Py_DECREF(source);
Py_XDECREF(retval);
_this->read_datagram(scan);
}
PyObject *center = PyTuple_GET_ITEM(nodepaths, 0);