~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/_static_tuple_c.c

Merged bzr.dev into shelve-editor.

Show diffs side-by-side

added added

removed removed

Lines of Context:
183
183
static StaticTuple *
184
184
StaticTuple_FromSequence(PyObject *sequence)
185
185
{
186
 
    StaticTuple *new;
 
186
    StaticTuple *new = NULL;
 
187
    PyObject *as_tuple = NULL;
187
188
    PyObject *item;
188
189
    Py_ssize_t i, size;
189
190
 
192
193
        return (StaticTuple *)sequence;
193
194
    }
194
195
    if (!PySequence_Check(sequence)) {
195
 
        PyErr_Format(PyExc_TypeError, "Type %s is not a sequence type",
196
 
                     Py_TYPE(sequence)->tp_name);
197
 
        return NULL;
 
196
        as_tuple = PySequence_Tuple(sequence);
 
197
        if (as_tuple == NULL)
 
198
            goto done;
 
199
        sequence = as_tuple;
198
200
    }
199
201
    size = PySequence_Size(sequence);
200
 
    if (size == -1)
201
 
        return NULL;
 
202
    if (size == -1) {
 
203
        goto done;
 
204
    }
202
205
    new = StaticTuple_New(size);
203
206
    if (new == NULL) {
204
 
        return NULL;
 
207
        goto done;
205
208
    }
206
209
    for (i = 0; i < size; ++i) {
207
210
        // This returns a new reference, which we then 'steal' with 
209
212
        item = PySequence_GetItem(sequence, i);
210
213
        if (item == NULL) {
211
214
            Py_DECREF(new);
212
 
            return NULL;
 
215
            new = NULL;
 
216
            goto done;
213
217
        }
214
218
        StaticTuple_SET_ITEM(new, i, item);
215
219
    }
 
220
done:
 
221
    Py_XDECREF(as_tuple);
216
222
    return (StaticTuple *)new;
217
223
}
218
224
 
304
310
    if (tuple_repr == NULL) {
305
311
        return NULL;
306
312
    }
307
 
    result = PyString_FromFormat("%s%s", Py_TYPE(self)->tp_name,
308
 
                                         PyString_AsString(tuple_repr));
 
313
    result = PyString_FromFormat("StaticTuple%s",
 
314
                                 PyString_AsString(tuple_repr));
309
315
    return result;
310
316
}
311
317
 
574
580
 
575
581
 
576
582
static PyObject *
 
583
StaticTuple_reduce(StaticTuple *self)
 
584
{
 
585
    PyObject *result = NULL, *as_tuple = NULL;
 
586
 
 
587
    result = PyTuple_New(2);
 
588
    if (!result) {
 
589
        return NULL;
 
590
    }
 
591
    as_tuple = StaticTuple_as_tuple(self);
 
592
    if (as_tuple == NULL) {
 
593
        Py_DECREF(result);
 
594
        return NULL;
 
595
    }
 
596
    Py_INCREF(&StaticTuple_Type);
 
597
    PyTuple_SET_ITEM(result, 0, (PyObject *)&StaticTuple_Type);
 
598
    PyTuple_SET_ITEM(result, 1, as_tuple);
 
599
    return result;
 
600
}
 
601
 
 
602
static char StaticTuple_reduce_doc[] = "__reduce__() => tuple\n";
 
603
 
 
604
 
 
605
static PyObject *
577
606
StaticTuple_add(PyObject *v, PyObject *w)
578
607
{
579
608
    Py_ssize_t i, len_v, len_w;
688
717
     METH_STATIC | METH_VARARGS,
689
718
     "Create a StaticTuple from a given sequence. This functions"
690
719
     " the same as the tuple() constructor."},
 
720
    {"__reduce__", (PyCFunction)StaticTuple_reduce, METH_NOARGS, StaticTuple_reduce_doc},
691
721
    {NULL, NULL} /* sentinel */
692
722
};
693
723
 
735
765
PyTypeObject StaticTuple_Type = {
736
766
    PyObject_HEAD_INIT(NULL)
737
767
    0,                                           /* ob_size */
738
 
    "StaticTuple",                               /* tp_name */
 
768
    "bzrlib._static_tuple_c.StaticTuple",        /* tp_name */
739
769
    sizeof(StaticTuple),                         /* tp_basicsize */
740
770
    sizeof(PyObject *),                          /* tp_itemsize */
741
771
    (destructor)StaticTuple_dealloc,             /* tp_dealloc */