git: 97dea13acee5 - main - devel/py-optree: Fix build with 32-bit architectures (e.g., i386)
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 18 Jun 2024 04:08:15 UTC
The branch main has been updated by sunpoet: URL: https://cgit.FreeBSD.org/ports/commit/?id=97dea13acee55a5c5ab4cd6ac1294c3ef3f42e1f commit 97dea13acee55a5c5ab4cd6ac1294c3ef3f42e1f Author: Po-Chuan Hsieh <sunpoet@FreeBSD.org> AuthorDate: 2024-06-18 03:59:59 +0000 Commit: Po-Chuan Hsieh <sunpoet@FreeBSD.org> CommitDate: 2024-06-18 03:59:59 +0000 devel/py-optree: Fix build with 32-bit architectures (e.g., i386) - Bump PORTREVISION for package change Obtained from: https://github.com/metaopt/optree/commit/9a613a705ee18e18784ba3a16b2786f56f9c74d2 (based on) --- devel/py-optree/Makefile | 1 + devel/py-optree/files/patch-i386 | 397 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 398 insertions(+) diff --git a/devel/py-optree/Makefile b/devel/py-optree/Makefile index 6a480a634f0d..f0002928bf47 100644 --- a/devel/py-optree/Makefile +++ b/devel/py-optree/Makefile @@ -1,5 +1,6 @@ PORTNAME= optree PORTVERSION= 0.11.0 +PORTREVISION= 1 CATEGORIES= devel python MASTER_SITES= PYPI PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX} diff --git a/devel/py-optree/files/patch-i386 b/devel/py-optree/files/patch-i386 new file mode 100644 index 000000000000..3bb59348376e --- /dev/null +++ b/devel/py-optree/files/patch-i386 @@ -0,0 +1,397 @@ +Obtained from: https://github.com/metaopt/optree/commit/9a613a705ee18e18784ba3a16b2786f56f9c74d2 (based on) + +--- include/treespec.h.orig 2024-03-25 18:01:43 UTC ++++ include/treespec.h +@@ -19,6 +19,7 @@ limitations under the License. + + #include <pybind11/pybind11.h> + ++#include <algorithm> // std::min + #include <memory> // std::unique_ptr + #include <optional> // std::optional, std::nullopt + #include <string> // std::string +@@ -38,7 +39,10 @@ using ssize_t = py::ssize_t; + using ssize_t = py::ssize_t; + + // The maximum depth of a pytree. +-constexpr ssize_t MAX_RECURSION_DEPTH = 1000; ++#ifndef Py_C_RECURSION_LIMIT ++#define Py_C_RECURSION_LIMIT 1000 ++#endif ++constexpr ssize_t MAX_RECURSION_DEPTH = std::min(1000, Py_C_RECURSION_LIMIT); + + // Test whether the given object is a leaf node. + bool IsLeaf(const py::object &object, +--- include/utils.h.orig 2024-03-25 18:01:43 UTC ++++ include/utils.h +@@ -208,6 +208,9 @@ inline ssize_t GET_SIZE<py::list>(const py::handle& si + inline ssize_t GET_SIZE<py::list>(const py::handle& sized) { + return PyList_GET_SIZE(sized.ptr()); + } ++#ifndef PyDict_GET_SIZE ++#define PyDict_GET_SIZE PyDict_GetSize ++#endif + template <> + inline ssize_t GET_SIZE<py::dict>(const py::handle& sized) { + return PyDict_GET_SIZE(sized.ptr()); +@@ -222,91 +225,35 @@ template <> + return PyTuple_GET_ITEM(container.ptr(), item); + } + template <> +-inline py::handle GET_ITEM_HANDLE<py::tuple>(const py::handle& container, const py::size_t& item) { +- return PyTuple_GET_ITEM(container.ptr(), py::ssize_t_cast(item)); +-} +-template <> +-inline py::handle GET_ITEM_HANDLE<py::tuple>(const py::handle& container, const int& item) { +- return PyTuple_GET_ITEM(container.ptr(), py::ssize_t_cast(item)); +-} +-template <> + inline py::handle GET_ITEM_HANDLE<py::list>(const py::handle& container, const py::ssize_t& item) { + return PyList_GET_ITEM(container.ptr(), item); + } +-template <> +-inline py::handle GET_ITEM_HANDLE<py::list>(const py::handle& container, const py::size_t& item) { +- return PyList_GET_ITEM(container.ptr(), py::ssize_t_cast(item)); +-} +-template <> +-inline py::handle GET_ITEM_HANDLE<py::list>(const py::handle& container, const int& item) { +- return PyList_GET_ITEM(container.ptr(), py::ssize_t_cast(item)); +-} + + template <typename Container, typename Item> + inline py::object GET_ITEM_BORROW(const py::handle& container, const Item& item) { +- return container[item]; ++ return py::reinterpret_borrow<py::object>(container[item]); + } + template <> + inline py::object GET_ITEM_BORROW<py::tuple>(const py::handle& container, const py::ssize_t& item) { + return py::reinterpret_borrow<py::object>(PyTuple_GET_ITEM(container.ptr(), item)); + } + template <> +-inline py::object GET_ITEM_BORROW<py::tuple>(const py::handle& container, const py::size_t& item) { +- return py::reinterpret_borrow<py::object>( +- PyTuple_GET_ITEM(container.ptr(), py::ssize_t_cast(item))); +-} +-template <> +-inline py::object GET_ITEM_BORROW<py::tuple>(const py::handle& container, const int& item) { +- return py::reinterpret_borrow<py::object>( +- PyTuple_GET_ITEM(container.ptr(), py::ssize_t_cast(item))); +-} +-template <> + inline py::object GET_ITEM_BORROW<py::list>(const py::handle& container, const py::ssize_t& item) { + return py::reinterpret_borrow<py::object>(PyList_GET_ITEM(container.ptr(), item)); + } +-template <> +-inline py::object GET_ITEM_BORROW<py::list>(const py::handle& container, const py::size_t& item) { +- return py::reinterpret_borrow<py::object>( +- PyList_GET_ITEM(container.ptr(), py::ssize_t_cast(item))); +-} +-template <> +-inline py::object GET_ITEM_BORROW<py::list>(const py::handle& container, const int& item) { +- return py::reinterpret_borrow<py::object>( +- PyList_GET_ITEM(container.ptr(), py::ssize_t_cast(item))); +-} + + template <typename Container, typename Item> + inline py::object GET_ITEM_STEAL(const py::handle& container, const Item& item) { +- return container[item]; ++ return py::reinterpret_steal<py::object>(container[item]); + } + template <> + inline py::object GET_ITEM_STEAL<py::tuple>(const py::handle& container, const py::ssize_t& item) { + return py::reinterpret_steal<py::object>(PyTuple_GET_ITEM(container.ptr(), item)); + } + template <> +-inline py::object GET_ITEM_STEAL<py::tuple>(const py::handle& container, const py::size_t& item) { +- return py::reinterpret_steal<py::object>( +- PyTuple_GET_ITEM(container.ptr(), py::ssize_t_cast(item))); +-} +-template <> +-inline py::object GET_ITEM_STEAL<py::tuple>(const py::handle& container, const int& item) { +- return py::reinterpret_steal<py::object>( +- PyTuple_GET_ITEM(container.ptr(), py::ssize_t_cast(item))); +-} +-template <> + inline py::object GET_ITEM_STEAL<py::list>(const py::handle& container, const py::ssize_t& item) { + return py::reinterpret_steal<py::object>(PyList_GET_ITEM(container.ptr(), item)); + } +-template <> +-inline py::object GET_ITEM_STEAL<py::list>(const py::handle& container, const py::size_t& item) { +- return py::reinterpret_steal<py::object>( +- PyList_GET_ITEM(container.ptr(), py::ssize_t_cast(item))); +-} +-template <> +-inline py::object GET_ITEM_STEAL<py::list>(const py::handle& container, const int& item) { +- return py::reinterpret_steal<py::object>( +- PyList_GET_ITEM(container.ptr(), py::ssize_t_cast(item))); +-} + + template <typename Container, typename Item> + inline void SET_ITEM(const py::handle& container, const Item& item, const py::handle& value) { +@@ -314,39 +261,15 @@ inline void SET_ITEM<py::tuple>(const py::handle& cont + } + template <> + inline void SET_ITEM<py::tuple>(const py::handle& container, +- const ssize_t& item, ++ const py::ssize_t& item, + const py::handle& value) { + PyTuple_SET_ITEM(container.ptr(), item, value.inc_ref().ptr()); + } + template <> +-inline void SET_ITEM<py::tuple>(const py::handle& container, +- const py::size_t& item, +- const py::handle& value) { +- PyTuple_SET_ITEM(container.ptr(), py::ssize_t_cast(item), value.inc_ref().ptr()); +-} +-template <> +-inline void SET_ITEM<py::tuple>(const py::handle& container, +- const int& item, +- const py::handle& value) { +- PyTuple_SET_ITEM(container.ptr(), py::ssize_t_cast(item), value.inc_ref().ptr()); +-} +-template <> + inline void SET_ITEM<py::list>(const py::handle& container, +- const ssize_t& item, ++ const py::ssize_t& item, + const py::handle& value) { + PyList_SET_ITEM(container.ptr(), item, value.inc_ref().ptr()); +-} +-template <> +-inline void SET_ITEM<py::list>(const py::handle& container, +- const py::size_t& item, +- const py::handle& value) { +- PyList_SET_ITEM(container.ptr(), py::ssize_t_cast(item), value.inc_ref().ptr()); +-} +-template <> +-inline void SET_ITEM<py::list>(const py::handle& container, +- const int& item, +- const py::handle& value) { +- PyList_SET_ITEM(container.ptr(), py::ssize_t_cast(item), value.inc_ref().ptr()); + } + + inline std::string PyRepr(const py::handle& object) { +--- src/treespec/constructor.cpp.orig 2024-03-25 18:01:43 UTC ++++ src/treespec/constructor.cpp +@@ -78,7 +78,7 @@ template <bool NoneIsLeaf> + std::vector<PyTreeSpec>& treespecs, + std::string& register_namespace) { + for (const py::object& child : children) { +- if (!py::isinstance<PyTreeSpec>(child)) { ++ if (!py::isinstance<PyTreeSpec>(child)) [[unlikely]] { + std::ostringstream oss{}; + oss << "Expected a(n) " << NodeKindToString(node) << " of PyTreeSpec(s), got " + << PyRepr(handle) << "."; +@@ -213,15 +213,15 @@ template <bool NoneIsLeaf> + throw std::runtime_error(oss.str()); + } + node.arity = 0; +- node.node_data = GET_ITEM_BORROW<py::tuple>(out, 1); ++ node.node_data = GET_ITEM_BORROW<py::tuple>(out, ssize_t(1)); + for (const py::handle& child : +- py::cast<py::iterable>(GET_ITEM_BORROW<py::tuple>(out, 0))) { ++ py::cast<py::iterable>(GET_ITEM_BORROW<py::tuple>(out, ssize_t(0)))) { + ++node.arity; + children.emplace_back(py::reinterpret_borrow<py::object>(child)); + } + verify_children(children, treespecs, registry_namespace); + if (num_out == 3) [[likely]] { +- py::object node_entries = GET_ITEM_BORROW<py::tuple>(out, 2); ++ py::object node_entries = GET_ITEM_BORROW<py::tuple>(out, ssize_t(2)); + if (!node_entries.is_none()) [[likely]] { + node.node_entries = py::cast<py::tuple>(std::move(node_entries)); + const ssize_t num_entries = GET_SIZE<py::tuple>(node.node_entries); +--- src/treespec/flatten.cpp.orig 2024-03-25 18:01:43 UTC ++++ src/treespec/flatten.cpp +@@ -144,14 +144,14 @@ bool PyTreeSpec::FlattenIntoImpl(const py::handle& han + throw std::runtime_error(oss.str()); + } + node.arity = 0; +- node.node_data = GET_ITEM_BORROW<py::tuple>(out, 1); ++ node.node_data = GET_ITEM_BORROW<py::tuple>(out, ssize_t(1)); + for (const py::handle& child : +- py::cast<py::iterable>(GET_ITEM_BORROW<py::tuple>(out, 0))) { ++ py::cast<py::iterable>(GET_ITEM_BORROW<py::tuple>(out, ssize_t(0)))) { + ++node.arity; + recurse(child); + } + if (num_out == 3) [[likely]] { +- py::object node_entries = GET_ITEM_BORROW<py::tuple>(out, 2); ++ py::object node_entries = GET_ITEM_BORROW<py::tuple>(out, ssize_t(2)); + if (!node_entries.is_none()) [[likely]] { + node.node_entries = py::cast<py::tuple>(std::move(node_entries)); + const ssize_t num_entries = GET_SIZE<py::tuple>(node.node_entries); +@@ -338,16 +338,16 @@ bool PyTreeSpec::FlattenIntoWithPathImpl(const py::han + throw std::runtime_error(oss.str()); + } + node.arity = 0; +- node.node_data = GET_ITEM_BORROW<py::tuple>(out, 1); ++ node.node_data = GET_ITEM_BORROW<py::tuple>(out, ssize_t(1)); + py::object node_entries; + if (num_out == 3) [[likely]] { +- node_entries = GET_ITEM_BORROW<py::tuple>(out, 2); ++ node_entries = GET_ITEM_BORROW<py::tuple>(out, ssize_t(2)); + } else [[unlikely]] { + node_entries = py::none(); + } + if (node_entries.is_none()) [[unlikely]] { + for (const py::handle& child : +- py::cast<py::iterable>(GET_ITEM_BORROW<py::tuple>(out, 0))) { ++ py::cast<py::iterable>(GET_ITEM_BORROW<py::tuple>(out, ssize_t(0)))) { + recurse(child, py::int_(node.arity++)); + } + } else [[likely]] { +@@ -355,7 +355,7 @@ bool PyTreeSpec::FlattenIntoWithPathImpl(const py::han + node.arity = GET_SIZE<py::tuple>(node.node_entries); + ssize_t num_children = 0; + for (const py::handle& child : +- py::cast<py::iterable>(GET_ITEM_BORROW<py::tuple>(out, 0))) { ++ py::cast<py::iterable>(GET_ITEM_BORROW<py::tuple>(out, ssize_t(0)))) { + if (num_children >= node.arity) [[unlikely]] { + throw std::runtime_error( + "PyTree custom flatten function for type " + +@@ -500,9 +500,10 @@ py::list PyTreeSpec::FlattenUpTo(const py::object& ful + case PyTreeKind::DefaultDict: { + AssertExactStandardDict(object); + auto dict = py::reinterpret_borrow<py::dict>(object); +- py::list expected_keys = (node.kind != PyTreeKind::DefaultDict +- ? node.node_data +- : GET_ITEM_BORROW<py::tuple>(node.node_data, 1)); ++ py::list expected_keys = ++ (node.kind != PyTreeKind::DefaultDict ++ ? node.node_data ++ : GET_ITEM_BORROW<py::tuple>(node.node_data, ssize_t(1))); + if (!DictKeysEqual(expected_keys, dict)) [[unlikely]] { + py::list keys = SortedDictKeys(dict); + auto [missing_keys, extra_keys] = DictKeysDifference(expected_keys, dict); +@@ -619,7 +620,7 @@ py::list PyTreeSpec::FlattenUpTo(const py::object& ful + << " should return a 2- or 3-tuple, got " << num_out << "."; + throw std::runtime_error(oss.str()); + } +- py::object node_data = GET_ITEM_BORROW<py::tuple>(out, 1); ++ py::object node_data = GET_ITEM_BORROW<py::tuple>(out, ssize_t(1)); + if (node.node_data.not_equal(node_data)) [[unlikely]] { + std::ostringstream oss{}; + oss << "Mismatch custom node data; expected: " << PyRepr(node.node_data) +@@ -628,7 +629,7 @@ py::list PyTreeSpec::FlattenUpTo(const py::object& ful + } + ssize_t arity = 0; + for (const py::handle& child : +- py::cast<py::iterable>(GET_ITEM_BORROW<py::tuple>(out, 0))) { ++ py::cast<py::iterable>(GET_ITEM_BORROW<py::tuple>(out, ssize_t(0)))) { + ++arity; + agenda.emplace_back(py::reinterpret_borrow<py::object>(child)); + } +--- src/treespec/traversal.cpp.orig 2024-03-25 18:01:43 UTC ++++ src/treespec/traversal.cpp +@@ -123,10 +123,10 @@ py::object PyTreeIter::NextImpl() { + << " should return a 2- or 3-tuple, got " << num_out << "."; + throw std::runtime_error(oss.str()); + } +- auto children = py::cast<py::tuple>(GET_ITEM_BORROW<py::tuple>(out, 0)); ++ auto children = py::cast<py::tuple>(GET_ITEM_BORROW<py::tuple>(out, ssize_t(0))); + ssize_t arity = GET_SIZE<py::tuple>(children); + if (num_out == 3) [[likely]] { +- py::object node_entries = GET_ITEM_BORROW<py::tuple>(out, 2); ++ py::object node_entries = GET_ITEM_BORROW<py::tuple>(out, ssize_t(2)); + if (!node_entries.is_none()) [[likely]] { + const ssize_t num_entries = + GET_SIZE<py::tuple>(py::cast<py::tuple>(std::move(node_entries))); +--- src/treespec/treespec.cpp.orig 2024-03-25 18:01:43 UTC ++++ src/treespec/treespec.cpp +@@ -138,8 +138,8 @@ namespace optree { + + case PyTreeKind::DefaultDict: { + py::dict dict{}; +- py::object default_factory = GET_ITEM_BORROW<py::tuple>(node.node_data, 0); +- py::list keys = GET_ITEM_BORROW<py::tuple>(node.node_data, 1); ++ py::object default_factory = GET_ITEM_BORROW<py::tuple>(node.node_data, ssize_t(0)); ++ py::list keys = GET_ITEM_BORROW<py::tuple>(node.node_data, ssize_t(1)); + if (node.original_keys) [[unlikely]] { + for (ssize_t i = 0; i < node.arity; ++i) { + dict[GET_ITEM_HANDLE<py::list>(node.original_keys, i)] = py::none(); +@@ -254,11 +254,11 @@ namespace optree { + auto expected_keys = py::reinterpret_borrow<py::list>( + root.kind != PyTreeKind::DefaultDict + ? root.node_data +- : GET_ITEM_BORROW<py::tuple>(root.node_data, 1)); ++ : GET_ITEM_BORROW<py::tuple>(root.node_data, ssize_t(1))); + auto other_keys = py::reinterpret_borrow<py::list>( + other_root.kind != PyTreeKind::DefaultDict + ? other_root.node_data +- : GET_ITEM_BORROW<py::tuple>(other_root.node_data, 1)); ++ : GET_ITEM_BORROW<py::tuple>(other_root.node_data, ssize_t(1))); + py::dict dict{}; + for (ssize_t i = 0; i < other_root.arity; ++i) { + dict[GET_ITEM_HANDLE<py::list>(other_keys, i)] = py::int_(i); +@@ -530,7 +530,7 @@ ssize_t PyTreeSpec::PathsImpl(Span& paths, + auto keys = py::reinterpret_borrow<py::list>( + root.kind != PyTreeKind::DefaultDict + ? root.node_data +- : GET_ITEM_BORROW<py::tuple>(root.node_data, 1)); ++ : GET_ITEM_BORROW<py::tuple>(root.node_data, ssize_t(1))); + for (ssize_t i = root.arity - 1; i >= 0; --i) { + cur -= recurse(cur, GET_ITEM_HANDLE<py::list>(keys, i)); + } +@@ -595,7 +595,8 @@ py::list PyTreeSpec::Entries() const { + return py::getattr(root.node_data, Py_Get_ID(copy))(); + } + case PyTreeKind::DefaultDict: { +- return py::getattr(GET_ITEM_BORROW<py::tuple>(root.node_data, 1), Py_Get_ID(copy))(); ++ return py::getattr(GET_ITEM_BORROW<py::tuple>(root.node_data, ssize_t(1)), ++ Py_Get_ID(copy))(); + } + + default: +@@ -631,7 +632,8 @@ py::object PyTreeSpec::Entry(ssize_t index) const { + return GET_ITEM_BORROW<py::list>(root.node_data, index); + } + case PyTreeKind::DefaultDict: { +- return GET_ITEM_BORROW<py::list>(GET_ITEM_BORROW<py::tuple>(root.node_data, 1), index); ++ return GET_ITEM_BORROW<py::list>(GET_ITEM_BORROW<py::tuple>(root.node_data, ssize_t(1)), ++ index); + } + + case PyTreeKind::None: +@@ -804,11 +806,11 @@ bool PyTreeSpec::IsPrefix(const PyTreeSpec& other, con + auto expected_keys = py::reinterpret_borrow<py::list>( + a->kind != PyTreeKind::DefaultDict + ? a->node_data +- : GET_ITEM_BORROW<py::tuple>(a->node_data, 1)); ++ : GET_ITEM_BORROW<py::tuple>(a->node_data, ssize_t(1))); + auto other_keys = py::reinterpret_borrow<py::list>( + b->kind != PyTreeKind::DefaultDict + ? b->node_data +- : GET_ITEM_BORROW<py::tuple>(b->node_data, 1)); ++ : GET_ITEM_BORROW<py::tuple>(b->node_data, ssize_t(1))); + py::dict dict{}; + for (ssize_t i = 0; i < b->arity; ++i) { + dict[GET_ITEM_HANDLE<py::list>(other_keys, i)] = py::int_(i); +@@ -1023,9 +1025,9 @@ std::string PyTreeSpec::ToStringImpl() const { + case PyTreeKind::DefaultDict: { + EXPECT_EQ( + GET_SIZE<py::tuple>(node.node_data), 2, "Number of auxiliary data mismatch."); +- py::object default_factory = GET_ITEM_BORROW<py::tuple>(node.node_data, 0); +- auto keys = +- py::reinterpret_borrow<py::list>(GET_ITEM_BORROW<py::tuple>(node.node_data, 1)); ++ py::object default_factory = GET_ITEM_BORROW<py::tuple>(node.node_data, ssize_t(0)); ++ auto keys = py::reinterpret_borrow<py::list>( ++ GET_ITEM_BORROW<py::tuple>(node.node_data, ssize_t(1))); + EXPECT_EQ(GET_SIZE<py::list>(keys), + node.arity, + "Number of keys and entries does not match."); +@@ -1146,13 +1148,13 @@ std::string PyTreeSpec::ToString() const { + if (node.kind == PyTreeKind::DefaultDict) [[unlikely]] { + EXPECT_EQ( + GET_SIZE<py::tuple>(node.node_data), 2, "Number of auxiliary data mismatch."); +- py::object default_factory = GET_ITEM_BORROW<py::tuple>(node.node_data, 0); ++ py::object default_factory = GET_ITEM_BORROW<py::tuple>(node.node_data, ssize_t(0)); + data_hash = py::hash(default_factory); + } + auto keys = py::reinterpret_borrow<py::list>( + node.kind != PyTreeKind::DefaultDict + ? node.node_data +- : GET_ITEM_BORROW<py::tuple>(node.node_data, 1)); ++ : GET_ITEM_BORROW<py::tuple>(node.node_data, ssize_t(1))); + EXPECT_EQ( + GET_SIZE<py::list>(keys), node.arity, "Number of keys and entries does not match."); + for (const py::handle& key : keys) {