From f192a0cdb6c0b2d6b1466be42631f1ded2a33eeb Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 1 Apr 2020 18:44:37 +0200 Subject: [PATCH] gobj: more efficient pickling support for InternalName Rather than going through the TypedWritable/bam route, this encodes InternalNames in a more compact and efficient manner. --- panda/src/gobj/internalName.h | 2 ++ panda/src/gobj/internalName_ext.cxx | 12 ++++++++++++ panda/src/gobj/internalName_ext.h | 2 ++ 3 files changed, 16 insertions(+) diff --git a/panda/src/gobj/internalName.h b/panda/src/gobj/internalName.h index 5e61e81916..3edd3344a1 100644 --- a/panda/src/gobj/internalName.h +++ b/panda/src/gobj/internalName.h @@ -97,6 +97,8 @@ PUBLISHED: // These versions are exposed to Python, which have additional logic to map // from Python interned strings. EXTENSION(static PT(InternalName) make(PyObject *str)); + + EXTENSION(PyObject *__reduce__() const); #endif public: diff --git a/panda/src/gobj/internalName_ext.cxx b/panda/src/gobj/internalName_ext.cxx index 4821880677..1a28f8b4a1 100644 --- a/panda/src/gobj/internalName_ext.cxx +++ b/panda/src/gobj/internalName_ext.cxx @@ -17,6 +17,8 @@ using std::string; #ifdef HAVE_PYTHON +extern struct Dtool_PyTypedObject Dtool_InternalName; + /** * This extension method serves to allow coercion of Python interned strings * to InternalName objects more efficiently by storing a mapping between @@ -88,7 +90,17 @@ make(PyObject *str) { InternalName::_py_intern_table.insert(std::make_pair((PyObject *)str, iname.p())); return iname; } +} +/** + * This special Python method is implemented to provide support for the pickle + * module. + */ +PyObject *Extension:: +__reduce__() const { + std::string name = _this->get_name(); + return Py_BuildValue("(N(s#))", + PyObject_GetAttrString((PyObject *)&Dtool_InternalName._PyType, "make"), name.c_str(), name.size()); } #endif // HAVE_PYTHON diff --git a/panda/src/gobj/internalName_ext.h b/panda/src/gobj/internalName_ext.h index 8637eae16e..5fe3d8ec90 100644 --- a/panda/src/gobj/internalName_ext.h +++ b/panda/src/gobj/internalName_ext.h @@ -30,6 +30,8 @@ template<> class Extension : public ExtensionBase { public: static PT(InternalName) make(PyObject *str); + + PyObject *__reduce__() const; }; #endif // HAVE_PYTHON