From 128000b03ad1332bed57eee2854ff70ced97b277 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 28 Jan 2024 13:07:50 +0100 Subject: [PATCH] dtoolutil: writelines() should accept any iterable --- dtool/src/dtoolutil/iostream_ext.cxx | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/dtool/src/dtoolutil/iostream_ext.cxx b/dtool/src/dtoolutil/iostream_ext.cxx index 352927b0d6..be22f9d548 100644 --- a/dtool/src/dtoolutil/iostream_ext.cxx +++ b/dtool/src/dtoolutil/iostream_ext.cxx @@ -283,19 +283,18 @@ write(PyObject *b) { */ void Extension:: writelines(PyObject *lines) { - PyObject *seq = PySequence_Fast(lines, "writelines() expects a sequence"); - if (seq == nullptr) { + PyObject *iter = PyObject_GetIter(lines); + if (iter == nullptr) { return; } - PyObject **items = PySequence_Fast_ITEMS(seq); - Py_ssize_t len = PySequence_Fast_GET_SIZE(seq); - - for (Py_ssize_t i = 0; i < len; ++i) { - write(items[i]); + PyObject *next = PyIter_Next(iter); + while (next != nullptr) { + write(next); + Py_DECREF(next); + next = PyIter_Next(iter); } - - Py_DECREF(seq); + Py_DECREF(iter); } #endif // HAVE_PYTHON