blob: d7d140f51314b773026e67148ccdeeaaf8e769f0 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumbab9d031992-04-05 14:26:55 +00002Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
Guido van Rossumf70e43a1991-02-19 12:39:46 +00003Netherlands.
4
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000025/* List object implementation */
26
Guido van Rossum3f5da241990-12-20 15:06:42 +000027#include "allobjects.h"
Guido van Rossumfa3da8a1992-01-27 16:53:23 +000028#include "modsupport.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000029#include "ceval.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000030
31object *
32newlistobject(size)
33 int size;
34{
35 int i;
36 listobject *op;
Guido van Rossum1e28e5e1992-08-19 16:46:30 +000037 MALLARG nbytes;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000038 if (size < 0) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +000039 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000040 return NULL;
41 }
Guido van Rossum1e28e5e1992-08-19 16:46:30 +000042 nbytes = size * sizeof(object *);
43 /* Check for overflow */
44 if (nbytes / sizeof(object *) != size) {
45 return err_nomem();
46 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000047 op = (listobject *) malloc(sizeof(listobject));
48 if (op == NULL) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +000049 return err_nomem();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000050 }
51 if (size <= 0) {
52 op->ob_item = NULL;
53 }
54 else {
Guido van Rossum1e28e5e1992-08-19 16:46:30 +000055 op->ob_item = (object **) malloc(nbytes);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000056 if (op->ob_item == NULL) {
57 free((ANY *)op);
Guido van Rossum2a9096b1990-10-21 22:15:08 +000058 return err_nomem();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000059 }
60 }
61 NEWREF(op);
62 op->ob_type = &Listtype;
63 op->ob_size = size;
64 for (i = 0; i < size; i++)
65 op->ob_item[i] = NULL;
66 return (object *) op;
67}
68
69int
70getlistsize(op)
71 object *op;
72{
73 if (!is_listobject(op)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +000074 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000075 return -1;
76 }
77 else
78 return ((listobject *)op) -> ob_size;
79}
80
81object *
82getlistitem(op, i)
83 object *op;
84 int i;
85{
86 if (!is_listobject(op)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +000087 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000088 return NULL;
89 }
90 if (i < 0 || i >= ((listobject *)op) -> ob_size) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +000091 err_setstr(IndexError, "list index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000092 return NULL;
93 }
94 return ((listobject *)op) -> ob_item[i];
95}
96
97int
98setlistitem(op, i, newitem)
99 register object *op;
100 register int i;
101 register object *newitem;
102{
103 register object *olditem;
104 if (!is_listobject(op)) {
Guido van Rossume6f7d181991-10-20 20:20:40 +0000105 XDECREF(newitem);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000106 err_badcall();
107 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000108 }
109 if (i < 0 || i >= ((listobject *)op) -> ob_size) {
Guido van Rossume6f7d181991-10-20 20:20:40 +0000110 XDECREF(newitem);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000111 err_setstr(IndexError, "list assignment index out of range");
112 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000113 }
114 olditem = ((listobject *)op) -> ob_item[i];
115 ((listobject *)op) -> ob_item[i] = newitem;
Guido van Rossume6f7d181991-10-20 20:20:40 +0000116 XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000117 return 0;
118}
119
120static int
121ins1(self, where, v)
122 listobject *self;
123 int where;
124 object *v;
125{
126 int i;
127 object **items;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000128 if (v == NULL) {
129 err_badcall();
130 return -1;
131 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000132 items = self->ob_item;
133 RESIZE(items, object *, self->ob_size+1);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000134 if (items == NULL) {
135 err_nomem();
136 return -1;
137 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000138 if (where < 0)
139 where = 0;
140 if (where > self->ob_size)
141 where = self->ob_size;
142 for (i = self->ob_size; --i >= where; )
143 items[i+1] = items[i];
144 INCREF(v);
145 items[where] = v;
146 self->ob_item = items;
147 self->ob_size++;
148 return 0;
149}
150
151int
152inslistitem(op, where, newitem)
153 object *op;
154 int where;
155 object *newitem;
156{
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000157 if (!is_listobject(op)) {
158 err_badcall();
159 return -1;
160 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000161 return ins1((listobject *)op, where, newitem);
162}
163
164int
165addlistitem(op, newitem)
166 object *op;
167 object *newitem;
168{
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000169 if (!is_listobject(op)) {
170 err_badcall();
171 return -1;
172 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000173 return ins1((listobject *)op,
174 (int) ((listobject *)op)->ob_size, newitem);
175}
176
177/* Methods */
178
179static void
180list_dealloc(op)
181 listobject *op;
182{
183 int i;
184 for (i = 0; i < op->ob_size; i++) {
Guido van Rossume6f7d181991-10-20 20:20:40 +0000185 XDECREF(op->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000186 }
187 if (op->ob_item != NULL)
188 free((ANY *)op->ob_item);
189 free((ANY *)op);
190}
191
Guido van Rossum90933611991-06-07 16:10:43 +0000192static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000193list_print(op, fp, flags)
194 listobject *op;
195 FILE *fp;
196 int flags;
197{
198 int i;
199 fprintf(fp, "[");
Guido van Rossum90933611991-06-07 16:10:43 +0000200 for (i = 0; i < op->ob_size; i++) {
201 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000202 fprintf(fp, ", ");
Guido van Rossum90933611991-06-07 16:10:43 +0000203 if (printobject(op->ob_item[i], fp, flags) != 0)
204 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000205 }
206 fprintf(fp, "]");
Guido van Rossum90933611991-06-07 16:10:43 +0000207 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000208}
209
210object *
211list_repr(v)
212 listobject *v;
213{
214 object *s, *t, *comma;
215 int i;
216 s = newstringobject("[");
217 comma = newstringobject(", ");
218 for (i = 0; i < v->ob_size && s != NULL; i++) {
219 if (i > 0)
220 joinstring(&s, comma);
221 t = reprobject(v->ob_item[i]);
222 joinstring(&s, t);
223 DECREF(t);
224 }
225 DECREF(comma);
226 t = newstringobject("]");
227 joinstring(&s, t);
228 DECREF(t);
229 return s;
230}
231
232static int
233list_compare(v, w)
234 listobject *v, *w;
235{
236 int len = (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
237 int i;
238 for (i = 0; i < len; i++) {
239 int cmp = cmpobject(v->ob_item[i], w->ob_item[i]);
240 if (cmp != 0)
241 return cmp;
242 }
243 return v->ob_size - w->ob_size;
244}
245
246static int
247list_length(a)
248 listobject *a;
249{
250 return a->ob_size;
251}
252
253static object *
254list_item(a, i)
255 listobject *a;
256 int i;
257{
258 if (i < 0 || i >= a->ob_size) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000259 err_setstr(IndexError, "list index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000260 return NULL;
261 }
262 INCREF(a->ob_item[i]);
263 return a->ob_item[i];
264}
265
266static object *
267list_slice(a, ilow, ihigh)
268 listobject *a;
269 int ilow, ihigh;
270{
271 listobject *np;
272 int i;
273 if (ilow < 0)
274 ilow = 0;
275 else if (ilow > a->ob_size)
276 ilow = a->ob_size;
277 if (ihigh < 0)
278 ihigh = 0;
279 if (ihigh < ilow)
280 ihigh = ilow;
281 else if (ihigh > a->ob_size)
282 ihigh = a->ob_size;
283 np = (listobject *) newlistobject(ihigh - ilow);
284 if (np == NULL)
285 return NULL;
286 for (i = ilow; i < ihigh; i++) {
287 object *v = a->ob_item[i];
288 INCREF(v);
289 np->ob_item[i - ilow] = v;
290 }
291 return (object *)np;
292}
293
294static object *
295list_concat(a, bb)
296 listobject *a;
297 object *bb;
298{
299 int size;
300 int i;
301 listobject *np;
302 if (!is_listobject(bb)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000303 err_badarg();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000304 return NULL;
305 }
306#define b ((listobject *)bb)
307 size = a->ob_size + b->ob_size;
308 np = (listobject *) newlistobject(size);
309 if (np == NULL) {
Guido van Rossum90933611991-06-07 16:10:43 +0000310 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000311 }
312 for (i = 0; i < a->ob_size; i++) {
313 object *v = a->ob_item[i];
314 INCREF(v);
315 np->ob_item[i] = v;
316 }
317 for (i = 0; i < b->ob_size; i++) {
318 object *v = b->ob_item[i];
319 INCREF(v);
320 np->ob_item[i + a->ob_size] = v;
321 }
322 return (object *)np;
323#undef b
324}
325
Guido van Rossumed98d481991-03-06 13:07:53 +0000326static object *
327list_repeat(a, n)
328 listobject *a;
329 int n;
330{
331 int i, j;
332 int size;
333 listobject *np;
334 object **p;
335 if (n < 0)
336 n = 0;
337 size = a->ob_size * n;
338 np = (listobject *) newlistobject(size);
339 if (np == NULL)
340 return NULL;
341 p = np->ob_item;
342 for (i = 0; i < n; i++) {
343 for (j = 0; j < a->ob_size; j++) {
344 *p = a->ob_item[j];
345 INCREF(*p);
346 p++;
347 }
348 }
349 return (object *) np;
350}
351
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000352static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000353list_ass_slice(a, ilow, ihigh, v)
354 listobject *a;
355 int ilow, ihigh;
356 object *v;
357{
358 object **item;
359 int n; /* Size of replacement list */
360 int d; /* Change in size */
361 int k; /* Loop index */
362#define b ((listobject *)v)
363 if (v == NULL)
364 n = 0;
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000365 else if (is_listobject(v)) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000366 n = b->ob_size;
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000367 if (a == b) {
368 /* Special case "a[i:j] = a" -- copy b first */
369 int ret;
370 v = list_slice(b, 0, n);
371 ret = list_ass_slice(a, ilow, ihigh, v);
372 DECREF(v);
373 return ret;
374 }
375 }
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000376 else {
377 err_badarg();
378 return -1;
379 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000380 if (ilow < 0)
381 ilow = 0;
382 else if (ilow > a->ob_size)
383 ilow = a->ob_size;
384 if (ihigh < 0)
385 ihigh = 0;
386 if (ihigh < ilow)
387 ihigh = ilow;
388 else if (ihigh > a->ob_size)
389 ihigh = a->ob_size;
390 item = a->ob_item;
391 d = n - (ihigh-ilow);
392 if (d <= 0) { /* Delete -d items; DECREF ihigh-ilow items */
393 for (k = ilow; k < ihigh; k++)
394 DECREF(item[k]);
395 if (d < 0) {
396 for (/*k = ihigh*/; k < a->ob_size; k++)
397 item[k+d] = item[k];
398 a->ob_size += d;
399 RESIZE(item, object *, a->ob_size); /* Can't fail */
400 a->ob_item = item;
401 }
402 }
403 else { /* Insert d items; DECREF ihigh-ilow items */
404 RESIZE(item, object *, a->ob_size + d);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000405 if (item == NULL) {
406 err_nomem();
407 return -1;
408 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000409 for (k = a->ob_size; --k >= ihigh; )
410 item[k+d] = item[k];
411 for (/*k = ihigh-1*/; k >= ilow; --k)
412 DECREF(item[k]);
413 a->ob_item = item;
414 a->ob_size += d;
415 }
416 for (k = 0; k < n; k++, ilow++) {
417 object *w = b->ob_item[k];
418 INCREF(w);
419 item[ilow] = w;
420 }
421 return 0;
422#undef b
423}
424
Guido van Rossum4a450d01991-04-03 19:05:18 +0000425static int
426list_ass_item(a, i, v)
427 listobject *a;
428 int i;
429 object *v;
430{
431 if (i < 0 || i >= a->ob_size) {
432 err_setstr(IndexError, "list assignment index out of range");
433 return -1;
434 }
435 if (v == NULL)
436 return list_ass_slice(a, i, i+1, v);
437 INCREF(v);
438 DECREF(a->ob_item[i]);
439 a->ob_item[i] = v;
440 return 0;
441}
442
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000443static object *
444ins(self, where, v)
445 listobject *self;
446 int where;
447 object *v;
448{
449 if (ins1(self, where, v) != 0)
450 return NULL;
451 INCREF(None);
452 return None;
453}
454
455static object *
456listinsert(self, args)
457 listobject *self;
458 object *args;
459{
460 int i;
461 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000462 err_badarg();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000463 return NULL;
464 }
465 if (!getintarg(gettupleitem(args, 0), &i))
466 return NULL;
467 return ins(self, i, gettupleitem(args, 1));
468}
469
470static object *
471listappend(self, args)
472 listobject *self;
473 object *args;
474{
475 return ins(self, (int) self->ob_size, args);
476}
477
Guido van Rossume10a19e1992-08-03 19:05:37 +0000478static object *cmpfunc;
479
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000480static int
481cmp(v, w)
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000482#ifdef __STDC__
483 void *v, *w;
484#else
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000485 char *v, *w;
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000486#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000487{
Guido van Rossume10a19e1992-08-03 19:05:37 +0000488 object *t, *res;
489 long i;
490
491 if (err_occurred())
492 return 0;
493
494 if (cmpfunc == NULL)
495 return cmpobject(* (object **) v, * (object **) w);
496
497 /* Call the user-supplied comparison function */
498 t = newtupleobject(2);
499 if (t == NULL)
500 return 0;
501 INCREF(* (object **) v);
502 settupleitem(t, 0, * (object **) v);
503 INCREF(* (object **) w);
504 settupleitem(t, 1, * (object **) w);
505 res = call_object(cmpfunc, t);
506 DECREF(t);
507 if (res == NULL)
508 return 0;
509 if (!is_intobject(res)) {
510 err_setstr(TypeError, "comparison function should return int");
511 i = 0;
512 }
513 else {
514 i = getintvalue(res);
515 if (i < 0)
516 i = -1;
517 else if (i > 0)
518 i = 1;
519 }
520 DECREF(res);
521 return (int) i;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000522}
523
524static object *
525listsort(self, args)
526 listobject *self;
527 object *args;
528{
Guido van Rossume10a19e1992-08-03 19:05:37 +0000529 object *save_cmpfunc;
530 if (self->ob_size <= 1) {
531 INCREF(None);
532 return None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000533 }
Guido van Rossume10a19e1992-08-03 19:05:37 +0000534 save_cmpfunc = cmpfunc;
535 cmpfunc = args;
536 if (cmpfunc != NULL) {
537 /* Test the comparison function for obvious errors */
538 (void) cmp(&self->ob_item[0], &self->ob_item[1]);
539 if (err_occurred()) {
540 cmpfunc = save_cmpfunc;
541 return NULL;
542 }
543 }
544 qsort((char *)self->ob_item,
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000545 (int) self->ob_size, sizeof(object *), cmp);
Guido van Rossume10a19e1992-08-03 19:05:37 +0000546 cmpfunc = save_cmpfunc;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000547 if (err_occurred())
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000548 return NULL;
549 INCREF(None);
550 return None;
551}
552
Guido van Rossumed98d481991-03-06 13:07:53 +0000553static object *
554listreverse(self, args)
555 listobject *self;
556 object *args;
557{
558 register object **p, **q;
559 register object *tmp;
560
561 if (args != NULL) {
562 err_badarg();
563 return NULL;
564 }
565
566 if (self->ob_size > 1) {
567 for (p = self->ob_item, q = self->ob_item + self->ob_size - 1;
568 p < q; p++, q--) {
569 tmp = *p;
570 *p = *q;
571 *q = tmp;
572 }
573 }
574
575 INCREF(None);
576 return None;
577}
578
Guido van Rossum84c76f51990-10-30 13:32:20 +0000579int
580sortlist(v)
581 object *v;
582{
583 if (v == NULL || !is_listobject(v)) {
584 err_badcall();
585 return -1;
586 }
587 v = listsort((listobject *)v, (object *)NULL);
588 if (v == NULL)
589 return -1;
590 DECREF(v);
591 return 0;
592}
593
Guido van Rossumed98d481991-03-06 13:07:53 +0000594static object *
595listindex(self, args)
596 listobject *self;
597 object *args;
598{
599 int i;
600
601 if (args == NULL) {
602 err_badarg();
603 return NULL;
604 }
605 for (i = 0; i < self->ob_size; i++) {
606 if (cmpobject(self->ob_item[i], args) == 0)
Guido van Rossum7066dd71992-09-17 17:54:56 +0000607 return newintobject((long)i);
Guido van Rossumed98d481991-03-06 13:07:53 +0000608 }
Guido van Rossum87e7ea71991-12-10 14:00:03 +0000609 err_setstr(ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +0000610 return NULL;
611}
612
613static object *
Guido van Rossume6f7d181991-10-20 20:20:40 +0000614listcount(self, args)
615 listobject *self;
616 object *args;
617{
618 int count = 0;
619 int i;
620
621 if (args == NULL) {
622 err_badarg();
623 return NULL;
624 }
625 for (i = 0; i < self->ob_size; i++) {
626 if (cmpobject(self->ob_item[i], args) == 0)
627 count++;
628 }
629 return newintobject((long)count);
630}
631
632static object *
Guido van Rossumed98d481991-03-06 13:07:53 +0000633listremove(self, args)
634 listobject *self;
635 object *args;
636{
637 int i;
638
639 if (args == NULL) {
640 err_badarg();
641 return NULL;
642 }
643 for (i = 0; i < self->ob_size; i++) {
644 if (cmpobject(self->ob_item[i], args) == 0) {
645 if (list_ass_slice(self, i, i+1, (object *)NULL) != 0)
646 return NULL;
647 INCREF(None);
648 return None;
649 }
650
651 }
Guido van Rossum87e7ea71991-12-10 14:00:03 +0000652 err_setstr(ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +0000653 return NULL;
654}
655
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000656static struct methodlist list_methods[] = {
657 {"append", listappend},
Guido van Rossume6f7d181991-10-20 20:20:40 +0000658 {"count", listcount},
Guido van Rossumed98d481991-03-06 13:07:53 +0000659 {"index", listindex},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000660 {"insert", listinsert},
661 {"sort", listsort},
Guido van Rossumed98d481991-03-06 13:07:53 +0000662 {"remove", listremove},
663 {"reverse", listreverse},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000664 {NULL, NULL} /* sentinel */
665};
666
667static object *
668list_getattr(f, name)
669 listobject *f;
670 char *name;
671{
672 return findmethod(list_methods, (object *)f, name);
673}
674
675static sequence_methods list_as_sequence = {
676 list_length, /*sq_length*/
677 list_concat, /*sq_concat*/
Guido van Rossumed98d481991-03-06 13:07:53 +0000678 list_repeat, /*sq_repeat*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000679 list_item, /*sq_item*/
680 list_slice, /*sq_slice*/
681 list_ass_item, /*sq_ass_item*/
682 list_ass_slice, /*sq_ass_slice*/
683};
684
685typeobject Listtype = {
686 OB_HEAD_INIT(&Typetype)
687 0,
688 "list",
689 sizeof(listobject),
690 0,
691 list_dealloc, /*tp_dealloc*/
692 list_print, /*tp_print*/
693 list_getattr, /*tp_getattr*/
694 0, /*tp_setattr*/
695 list_compare, /*tp_compare*/
696 list_repr, /*tp_repr*/
697 0, /*tp_as_number*/
698 &list_as_sequence, /*tp_as_sequence*/
699 0, /*tp_as_mapping*/
700};