Edgewall Software

Ticket #574: 574-markup-join-iter.patch

File 574-markup-join-iter.patch, 1.5 KB (added by rblank, 10 years ago)

Accept iterators for Markup.join().

  • genshi/_speedups.c

     
    242242Markup_join(PyObject *self, PyObject *args, PyObject *kwds)
    243243{
    244244    static char *kwlist[] = {"seq", "escape_quotes", 0};
    245     PyObject *seq = NULL, *seq2, *tmp, *tmp2;
     245    PyObject *seq = NULL, *seq2, *it, *tmp, *tmp2;
    246246    char quotes = 1;
    247     Py_ssize_t n;
    248     int i;
    249247
    250248    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|b", kwlist, &seq, &quotes)) {
    251249        return NULL;
    252250    }
    253     if (!PySequence_Check(seq)) {
     251    it = PyObject_GetIter(seq);
     252    if (it == NULL)
    254253        return NULL;
    255     }
    256     n = PySequence_Size(seq);
    257     if (n < 0) {
    258         return NULL;
    259     }
    260     seq2 = PyTuple_New(n);
     254    seq2 = PyList_New(0);
    261255    if (seq2 == NULL) {
     256        Py_DECREF(it);
    262257        return NULL;
    263258    }
    264     for (i = 0; i < n; i++) {
    265         tmp = PySequence_GetItem(seq, i);
    266         if (tmp == NULL) {
    267             Py_DECREF(seq2);
    268             return NULL;
    269         }
     259    while (tmp = PyIter_Next(it)) {
    270260        tmp2 = escape(tmp, quotes);
    271261        if (tmp2 == NULL) {
    272262            Py_DECREF(seq2);
     263            Py_DECREF(it);
    273264            return NULL;
    274265        }
    275         PyTuple_SET_ITEM(seq2, i, tmp2);
     266        PyList_Append(seq2, tmp2);
    276267        Py_DECREF(tmp);
    277268    }
     269    Py_DECREF(it);
     270    if (PyErr_Occurred()) {
     271        Py_DECREF(seq2);
     272        return NULL;
     273    }
    278274    tmp = PyUnicode_Join(self, seq2);
    279275    Py_DECREF(seq2);
    280276    if (tmp == NULL)