2 /* Tuple object implementation */
6 /* Speed optimization to avoid frequent malloc/free of small tuples */
8 #define MAXSAVESIZE 20 /* Largest tuple to save on free list */
10 #ifndef MAXSAVEDTUPLES
11 #define MAXSAVEDTUPLES 2000 /* Maximum number of tuples of each size to save */
15 /* Entries 1 up to MAXSAVESIZE are free lists, entry 0 is the empty
16 tuple () of which at most one instance will be allocated.
18 static PyTupleObject
*free_tuples
[MAXSAVESIZE
];
19 static int num_free_tuples
[MAXSAVESIZE
];
22 int fast_tuple_allocs
;
23 int tuple_zero_allocs
;
27 PyTuple_New(register int size
)
29 register PyTupleObject
*op
;
31 PyErr_BadInternalCall();
35 if (size
== 0 && free_tuples
[0]) {
41 return (PyObject
*) op
;
43 if (0 < size
&& size
< MAXSAVESIZE
&&
44 (op
= free_tuples
[size
]) != NULL
)
46 free_tuples
[size
] = (PyTupleObject
*) op
->ob_item
[0];
47 num_free_tuples
[size
]--;
51 /* PyObject_InitVar is inlined */
54 op
->ob_type
= &PyTuple_Type
;
56 _Py_NewReference((PyObject
*)op
);
61 int nbytes
= size
* sizeof(PyObject
*);
62 /* Check for overflow */
63 if (nbytes
/ sizeof(PyObject
*) != (size_t)size
||
64 (nbytes
+= sizeof(PyTupleObject
) - sizeof(PyObject
*))
67 return PyErr_NoMemory();
69 op
= PyObject_GC_NewVar(PyTupleObject
, &PyTuple_Type
, size
);
73 memset(op
->ob_item
, 0, sizeof(*op
->ob_item
) * size
);
78 Py_INCREF(op
); /* extra INCREF so that this is never freed */
81 _PyObject_GC_TRACK(op
);
82 return (PyObject
*) op
;
86 PyTuple_Size(register PyObject
*op
)
88 if (!PyTuple_Check(op
)) {
89 PyErr_BadInternalCall();
93 return ((PyTupleObject
*)op
)->ob_size
;
97 PyTuple_GetItem(register PyObject
*op
, register int i
)
99 if (!PyTuple_Check(op
)) {
100 PyErr_BadInternalCall();
103 if (i
< 0 || i
>= ((PyTupleObject
*)op
) -> ob_size
) {
104 PyErr_SetString(PyExc_IndexError
, "tuple index out of range");
107 return ((PyTupleObject
*)op
) -> ob_item
[i
];
111 PyTuple_SetItem(register PyObject
*op
, register int i
, PyObject
*newitem
)
113 register PyObject
*olditem
;
114 register PyObject
**p
;
115 if (!PyTuple_Check(op
) || op
->ob_refcnt
!= 1) {
117 PyErr_BadInternalCall();
120 if (i
< 0 || i
>= ((PyTupleObject
*)op
) -> ob_size
) {
122 PyErr_SetString(PyExc_IndexError
,
123 "tuple assignment index out of range");
126 p
= ((PyTupleObject
*)op
) -> ob_item
+ i
;
136 tupledealloc(register PyTupleObject
*op
)
139 register int len
= op
->ob_size
;
140 PyObject_GC_UnTrack(op
);
141 Py_TRASHCAN_SAFE_BEGIN(op
)
145 Py_XDECREF(op
->ob_item
[i
]);
147 if (len
< MAXSAVESIZE
&&
148 num_free_tuples
[len
] < MAXSAVEDTUPLES
&&
149 op
->ob_type
== &PyTuple_Type
)
151 op
->ob_item
[0] = (PyObject
*) free_tuples
[len
];
152 num_free_tuples
[len
]++;
153 free_tuples
[len
] = op
;
154 goto done
; /* return */
158 op
->ob_type
->tp_free((PyObject
*)op
);
160 Py_TRASHCAN_SAFE_END(op
)
164 tupleprint(PyTupleObject
*op
, FILE *fp
, int flags
)
168 for (i
= 0; i
< op
->ob_size
; i
++) {
171 if (PyObject_Print(op
->ob_item
[i
], fp
, 0) != 0)
174 if (op
->ob_size
== 1)
181 tuplerepr(PyTupleObject
*v
)
185 PyObject
*pieces
, *result
= NULL
;
189 return PyString_FromString("()");
191 pieces
= PyTuple_New(n
);
195 /* Do repr() on each element. */
196 for (i
= 0; i
< n
; ++i
) {
197 s
= PyObject_Repr(v
->ob_item
[i
]);
200 PyTuple_SET_ITEM(pieces
, i
, s
);
203 /* Add "()" decorations to the first and last items. */
205 s
= PyString_FromString("(");
208 temp
= PyTuple_GET_ITEM(pieces
, 0);
209 PyString_ConcatAndDel(&s
, temp
);
210 PyTuple_SET_ITEM(pieces
, 0, s
);
214 s
= PyString_FromString(n
== 1 ? ",)" : ")");
217 temp
= PyTuple_GET_ITEM(pieces
, n
-1);
218 PyString_ConcatAndDel(&temp
, s
);
219 PyTuple_SET_ITEM(pieces
, n
-1, temp
);
223 /* Paste them all together with ", " between. */
224 s
= PyString_FromString(", ");
227 result
= _PyString_Join(s
, pieces
);
236 tuplehash(PyTupleObject
*v
)
239 register int len
= v
->ob_size
;
240 register PyObject
**p
;
244 y
= PyObject_Hash(*p
++);
256 tuplelength(PyTupleObject
*a
)
262 tuplecontains(PyTupleObject
*a
, PyObject
*el
)
266 for (i
= 0; i
< a
->ob_size
; ++i
) {
267 cmp
= PyObject_RichCompareBool(el
, PyTuple_GET_ITEM(a
, i
),
278 tupleitem(register PyTupleObject
*a
, register int i
)
280 if (i
< 0 || i
>= a
->ob_size
) {
281 PyErr_SetString(PyExc_IndexError
, "tuple index out of range");
284 Py_INCREF(a
->ob_item
[i
]);
285 return a
->ob_item
[i
];
289 tupleslice(register PyTupleObject
*a
, register int ilow
, register int ihigh
)
291 register PyTupleObject
*np
;
295 if (ihigh
> a
->ob_size
)
299 if (ilow
== 0 && ihigh
== a
->ob_size
&& PyTuple_CheckExact(a
)) {
301 return (PyObject
*)a
;
303 np
= (PyTupleObject
*)PyTuple_New(ihigh
- ilow
);
306 for (i
= ilow
; i
< ihigh
; i
++) {
307 PyObject
*v
= a
->ob_item
[i
];
309 np
->ob_item
[i
- ilow
] = v
;
311 return (PyObject
*)np
;
315 PyTuple_GetSlice(PyObject
*op
, int i
, int j
)
317 if (op
== NULL
|| !PyTuple_Check(op
)) {
318 PyErr_BadInternalCall();
321 return tupleslice((PyTupleObject
*)op
, i
, j
);
325 tupleconcat(register PyTupleObject
*a
, register PyObject
*bb
)
330 if (!PyTuple_Check(bb
)) {
331 PyErr_Format(PyExc_TypeError
,
332 "can only concatenate tuple (not \"%.200s\") to tuple",
333 bb
->ob_type
->tp_name
);
336 #define b ((PyTupleObject *)bb)
337 size
= a
->ob_size
+ b
->ob_size
;
338 np
= (PyTupleObject
*) PyTuple_New(size
);
342 for (i
= 0; i
< a
->ob_size
; i
++) {
343 PyObject
*v
= a
->ob_item
[i
];
347 for (i
= 0; i
< b
->ob_size
; i
++) {
348 PyObject
*v
= b
->ob_item
[i
];
350 np
->ob_item
[i
+ a
->ob_size
] = v
;
352 return (PyObject
*)np
;
357 tuplerepeat(PyTupleObject
*a
, int n
)
365 if (a
->ob_size
== 0 || n
== 1) {
366 if (PyTuple_CheckExact(a
)) {
367 /* Since tuples are immutable, we can return a shared
370 return (PyObject
*)a
;
373 return PyTuple_New(0);
375 size
= a
->ob_size
* n
;
376 if (size
/a
->ob_size
!= n
)
377 return PyErr_NoMemory();
378 np
= (PyTupleObject
*) PyTuple_New(size
);
382 for (i
= 0; i
< n
; i
++) {
383 for (j
= 0; j
< a
->ob_size
; j
++) {
389 return (PyObject
*) np
;
393 tupletraverse(PyTupleObject
*o
, visitproc visit
, void *arg
)
398 for (i
= o
->ob_size
; --i
>= 0; ) {
410 tuplerichcompare(PyObject
*v
, PyObject
*w
, int op
)
412 PyTupleObject
*vt
, *wt
;
416 if (!PyTuple_Check(v
) || !PyTuple_Check(w
)) {
417 Py_INCREF(Py_NotImplemented
);
418 return Py_NotImplemented
;
421 vt
= (PyTupleObject
*)v
;
422 wt
= (PyTupleObject
*)w
;
427 /* Note: the corresponding code for lists has an "early out" test
428 * here when op is EQ or NE and the lengths differ. That pays there,
429 * but Tim was unable to find any real code where EQ/NE tuple
430 * compares don't have the same length, so testing for it here would
431 * have cost without benefit.
434 /* Search for the first index where items are different.
435 * Note that because tuples are immutable, it's safe to reuse
436 * vlen and wlen across the comparison calls.
438 for (i
= 0; i
< vlen
&& i
< wlen
; i
++) {
439 int k
= PyObject_RichCompareBool(vt
->ob_item
[i
],
440 wt
->ob_item
[i
], Py_EQ
);
447 if (i
>= vlen
|| i
>= wlen
) {
448 /* No more items to compare -- compare sizes */
452 case Py_LT
: cmp
= vlen
< wlen
; break;
453 case Py_LE
: cmp
= vlen
<= wlen
; break;
454 case Py_EQ
: cmp
= vlen
== wlen
; break;
455 case Py_NE
: cmp
= vlen
!= wlen
; break;
456 case Py_GT
: cmp
= vlen
> wlen
; break;
457 case Py_GE
: cmp
= vlen
>= wlen
; break;
458 default: return NULL
; /* cannot happen */
468 /* We have an item that differs -- shortcuts for EQ/NE */
478 /* Compare the final item again using the proper operator */
479 return PyObject_RichCompare(vt
->ob_item
[i
], wt
->ob_item
[i
], op
);
483 tuple_subtype_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
);
486 tuple_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
488 PyObject
*arg
= NULL
;
489 static char *kwlist
[] = {"sequence", 0};
491 if (type
!= &PyTuple_Type
)
492 return tuple_subtype_new(type
, args
, kwds
);
493 if (!PyArg_ParseTupleAndKeywords(args
, kwds
, "|O:tuple", kwlist
, &arg
))
497 return PyTuple_New(0);
499 return PySequence_Tuple(arg
);
503 tuple_subtype_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
505 PyObject
*tmp
, *new, *item
;
508 assert(PyType_IsSubtype(type
, &PyTuple_Type
));
509 tmp
= tuple_new(&PyTuple_Type
, args
, kwds
);
512 assert(PyTuple_Check(tmp
));
513 new = type
->tp_alloc(type
, n
= PyTuple_GET_SIZE(tmp
));
516 for (i
= 0; i
< n
; i
++) {
517 item
= PyTuple_GET_ITEM(tmp
, i
);
519 PyTuple_SET_ITEM(new, i
, item
);
525 PyDoc_STRVAR(tuple_doc
,
526 "tuple() -> an empty tuple\n"
527 "tuple(sequence) -> tuple initialized from sequence's items\n"
529 "If the argument is a tuple, the return value is the same object.");
531 static PySequenceMethods tuple_as_sequence
= {
532 (inquiry
)tuplelength
, /* sq_length */
533 (binaryfunc
)tupleconcat
, /* sq_concat */
534 (intargfunc
)tuplerepeat
, /* sq_repeat */
535 (intargfunc
)tupleitem
, /* sq_item */
536 (intintargfunc
)tupleslice
, /* sq_slice */
538 0, /* sq_ass_slice */
539 (objobjproc
)tuplecontains
, /* sq_contains */
543 tuplesubscript(PyTupleObject
* self
, PyObject
* item
)
545 if (PyInt_Check(item
)) {
546 long i
= PyInt_AS_LONG(item
);
548 i
+= PyTuple_GET_SIZE(self
);
549 return tupleitem(self
, i
);
551 else if (PyLong_Check(item
)) {
552 long i
= PyLong_AsLong(item
);
553 if (i
== -1 && PyErr_Occurred())
556 i
+= PyTuple_GET_SIZE(self
);
557 return tupleitem(self
, i
);
559 else if (PySlice_Check(item
)) {
560 int start
, stop
, step
, slicelength
, cur
, i
;
564 if (PySlice_GetIndicesEx((PySliceObject
*)item
,
565 PyTuple_GET_SIZE(self
),
566 &start
, &stop
, &step
, &slicelength
) < 0) {
570 if (slicelength
<= 0) {
571 return PyTuple_New(0);
574 result
= PyTuple_New(slicelength
);
576 for (cur
= start
, i
= 0; i
< slicelength
;
578 it
= PyTuple_GET_ITEM(self
, cur
);
580 PyTuple_SET_ITEM(result
, i
, it
);
587 PyErr_SetString(PyExc_TypeError
,
588 "tuple indices must be integers");
593 static PyMappingMethods tuple_as_mapping
= {
594 (inquiry
)tuplelength
,
595 (binaryfunc
)tuplesubscript
,
599 PyTypeObject PyTuple_Type
= {
600 PyObject_HEAD_INIT(&PyType_Type
)
603 sizeof(PyTupleObject
) - sizeof(PyObject
*),
605 (destructor
)tupledealloc
, /* tp_dealloc */
606 (printfunc
)tupleprint
, /* tp_print */
610 (reprfunc
)tuplerepr
, /* tp_repr */
611 0, /* tp_as_number */
612 &tuple_as_sequence
, /* tp_as_sequence */
613 &tuple_as_mapping
, /* tp_as_mapping */
614 (hashfunc
)tuplehash
, /* tp_hash */
617 PyObject_GenericGetAttr
, /* tp_getattro */
619 0, /* tp_as_buffer */
620 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
|
621 Py_TPFLAGS_BASETYPE
, /* tp_flags */
622 tuple_doc
, /* tp_doc */
623 (traverseproc
)tupletraverse
, /* tp_traverse */
625 tuplerichcompare
, /* tp_richcompare */
626 0, /* tp_weaklistoffset */
634 0, /* tp_descr_get */
635 0, /* tp_descr_set */
636 0, /* tp_dictoffset */
639 tuple_new
, /* tp_new */
640 PyObject_GC_Del
, /* tp_free */
643 /* The following function breaks the notion that tuples are immutable:
644 it changes the size of a tuple. We get away with this only if there
645 is only one module referencing the object. You can also think of it
646 as creating a new tuple object and destroying the old one, only more
647 efficiently. In any case, don't use this if the tuple may already be
648 known to some other part of the code. */
651 _PyTuple_Resize(PyObject
**pv
, int newsize
)
653 register PyTupleObject
*v
;
654 register PyTupleObject
*sv
;
658 v
= (PyTupleObject
*) *pv
;
659 if (v
== NULL
|| v
->ob_type
!= &PyTuple_Type
||
660 (v
->ob_size
!= 0 && v
->ob_refcnt
!= 1)) {
663 PyErr_BadInternalCall();
666 oldsize
= v
->ob_size
;
667 if (oldsize
== newsize
)
671 /* Empty tuples are often shared, so we should never
672 resize them in-place even if we do own the only
673 (current) reference */
675 *pv
= PyTuple_New(newsize
);
676 return *pv
== NULL
? -1 : 0;
679 /* XXX UNREF/NEWREF interface should be more symmetrical */
681 _PyObject_GC_UNTRACK(v
);
682 _Py_ForgetReference((PyObject
*) v
);
683 /* DECREF items deleted by shrinkage */
684 for (i
= newsize
; i
< oldsize
; i
++) {
685 Py_XDECREF(v
->ob_item
[i
]);
686 v
->ob_item
[i
] = NULL
;
688 sv
= PyObject_GC_Resize(PyTupleObject
, v
, newsize
);
694 _Py_NewReference((PyObject
*) sv
);
695 /* Zero out items added by growing */
696 if (newsize
> oldsize
)
697 memset(&sv
->ob_item
[oldsize
], 0,
698 sizeof(*sv
->ob_item
) * (newsize
- oldsize
));
699 *pv
= (PyObject
*) sv
;
700 _PyObject_GC_TRACK(sv
);
710 Py_XDECREF(free_tuples
[0]);
711 free_tuples
[0] = NULL
;
713 for (i
= 1; i
< MAXSAVESIZE
; i
++) {
714 PyTupleObject
*p
, *q
;
716 free_tuples
[i
] = NULL
;
719 p
= (PyTupleObject
*)(p
->ob_item
[0]);