From b8393da8f845ff4018781d926f157bdb7bff7c1c Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 4 Jun 1991 19:35:24 +0000 Subject: Finally implement tuple*number. From now on all sequence types must (pretend to) support all operations except assignments; if you don't want to support an operation you have to provide a dummy function that raises an exception... --- Objects/tupleobject.c | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index 02d77a2..de242b1 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -259,10 +259,42 @@ tupleconcat(a, bb) #undef b } +static object * +tuplerepeat(a, n) + tupleobject *a; + int n; +{ + int i, j; + int size; + tupleobject *np; + object **p; + if (n < 0) + n = 0; + if (a->ob_size*n == a->ob_size) { + /* Since tuples are immutable, we can return a shared + copy in this case */ + INCREF(a); + return (object *)a; + } + size = a->ob_size * n; + np = (tupleobject *) newtupleobject(size); + if (np == NULL) + return NULL; + p = np->ob_item; + for (i = 0; i < n; i++) { + for (j = 0; j < a->ob_size; j++) { + *p = a->ob_item[j]; + INCREF(*p); + p++; + } + } + return (object *) np; +} + static sequence_methods tuple_as_sequence = { tuplelength, /*sq_length*/ tupleconcat, /*sq_concat*/ - 0, /*sq_repeat*/ + tuplerepeat, /*sq_repeat*/ tupleitem, /*sq_item*/ tupleslice, /*sq_slice*/ 0, /*sq_ass_item*/ -- cgit v0.12