~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/_static_tuple_c.c

  • Committer: John Arbash Meinel
  • Date: 2010-02-17 17:11:16 UTC
  • mfrom: (4797.2.17 2.1)
  • mto: (4797.2.18 2.1)
  • mto: This revision was merged to the branch mainline in revision 5055.
  • Revision ID: john@arbash-meinel.com-20100217171116-h7t9223ystbnx5h8
merge bzr.2.1 in preparation for NEWS entry.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* Copyright (C) 2009 Canonical Ltd
 
1
/* Copyright (C) 2009, 2010 Canonical Ltd
2
2
 * 
3
3
 * This program is free software; you can redistribute it and/or modify
4
4
 * it under the terms of the GNU General Public License as published by
179
179
static StaticTuple *
180
180
StaticTuple_FromSequence(PyObject *sequence)
181
181
{
182
 
    StaticTuple *new;
 
182
    StaticTuple *new = NULL;
 
183
    PyObject *as_tuple = NULL;
183
184
    PyObject *item;
184
185
    Py_ssize_t i, size;
185
186
 
188
189
        return (StaticTuple *)sequence;
189
190
    }
190
191
    if (!PySequence_Check(sequence)) {
191
 
        PyErr_Format(PyExc_TypeError, "Type %s is not a sequence type",
192
 
                     Py_TYPE(sequence)->tp_name);
193
 
        return NULL;
 
192
        as_tuple = PySequence_Tuple(sequence);
 
193
        if (as_tuple == NULL)
 
194
            goto done;
 
195
        sequence = as_tuple;
194
196
    }
195
197
    size = PySequence_Size(sequence);
196
 
    if (size == -1)
197
 
        return NULL;
 
198
    if (size == -1) {
 
199
        goto done;
 
200
    }
198
201
    new = StaticTuple_New(size);
199
202
    if (new == NULL) {
200
 
        return NULL;
 
203
        goto done;
201
204
    }
202
205
    for (i = 0; i < size; ++i) {
203
206
        // This returns a new reference, which we then 'steal' with 
205
208
        item = PySequence_GetItem(sequence, i);
206
209
        if (item == NULL) {
207
210
            Py_DECREF(new);
208
 
            return NULL;
 
211
            new = NULL;
 
212
            goto done;
209
213
        }
210
214
        StaticTuple_SET_ITEM(new, i, item);
211
215
    }
 
216
done:
 
217
    Py_XDECREF(as_tuple);
212
218
    return (StaticTuple *)new;
213
219
}
214
220
 
308
314
    if (tuple_repr == NULL) {
309
315
        return NULL;
310
316
    }
311
 
    result = PyString_FromFormat("%s%s", Py_TYPE(self)->tp_name,
312
 
                                         PyString_AsString(tuple_repr));
 
317
    result = PyString_FromFormat("StaticTuple%s",
 
318
                                 PyString_AsString(tuple_repr));
313
319
    return result;
314
320
}
315
321
 
578
584
 
579
585
 
580
586
static PyObject *
 
587
StaticTuple_reduce(StaticTuple *self)
 
588
{
 
589
    PyObject *result = NULL, *as_tuple = NULL;
 
590
 
 
591
    result = PyTuple_New(2);
 
592
    if (!result) {
 
593
        return NULL;
 
594
    }
 
595
    as_tuple = StaticTuple_as_tuple(self);
 
596
    if (as_tuple == NULL) {
 
597
        Py_DECREF(result);
 
598
        return NULL;
 
599
    }
 
600
    Py_INCREF(&StaticTuple_Type);
 
601
    PyTuple_SET_ITEM(result, 0, (PyObject *)&StaticTuple_Type);
 
602
    PyTuple_SET_ITEM(result, 1, as_tuple);
 
603
    return result;
 
604
}
 
605
 
 
606
static char StaticTuple_reduce_doc[] = "__reduce__() => tuple\n";
 
607
 
 
608
 
 
609
static PyObject *
581
610
StaticTuple_add(PyObject *v, PyObject *w)
582
611
{
583
612
    Py_ssize_t i, len_v, len_w;
692
721
     METH_STATIC | METH_VARARGS,
693
722
     "Create a StaticTuple from a given sequence. This functions"
694
723
     " the same as the tuple() constructor."},
 
724
    {"__reduce__", (PyCFunction)StaticTuple_reduce, METH_NOARGS, StaticTuple_reduce_doc},
695
725
    {NULL, NULL} /* sentinel */
696
726
};
697
727
 
739
769
PyTypeObject StaticTuple_Type = {
740
770
    PyObject_HEAD_INIT(NULL)
741
771
    0,                                           /* ob_size */
742
 
    "StaticTuple",                               /* tp_name */
 
772
    "bzrlib._static_tuple_c.StaticTuple",        /* tp_name */
743
773
    sizeof(StaticTuple),                         /* tp_basicsize */
744
774
    sizeof(PyObject *),                          /* tp_itemsize */
745
775
    (destructor)StaticTuple_dealloc,             /* tp_dealloc */