Browse Source

dtoolutil: writelines() should accept any iterable

rdb 1 year ago
parent
commit
128000b03a
1 changed files with 8 additions and 9 deletions
  1. 8 9
      dtool/src/dtoolutil/iostream_ext.cxx

+ 8 - 9
dtool/src/dtoolutil/iostream_ext.cxx

@@ -283,19 +283,18 @@ write(PyObject *b) {
  */
  */
 void Extension<ostream>::
 void Extension<ostream>::
 writelines(PyObject *lines) {
 writelines(PyObject *lines) {
-  PyObject *seq = PySequence_Fast(lines, "writelines() expects a sequence");
-  if (seq == nullptr) {
+  PyObject *iter = PyObject_GetIter(lines);
+  if (iter == nullptr) {
     return;
     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
 #endif  // HAVE_PYTHON