Changeset 391 for python/trunk/Objects/listobject.c
- Timestamp:
- Mar 19, 2014, 11:31:01 PM (11 years ago)
- Location:
- python/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
python/trunk
-
Property svn:mergeinfo
set to
/python/vendor/Python-2.7.6 merged eligible /python/vendor/current merged eligible
-
Property svn:mergeinfo
set to
-
python/trunk/Objects/listobject.c
r2 r391 6 6 #include <stddef.h> 7 7 #else 8 #include <sys/types.h> 8 #include <sys/types.h> /* For size_t */ 9 9 #endif 10 10 … … 12 12 * ob_size to newsize. If newsize > ob_size on entry, the content 13 13 * of the new slots at exit is undefined heap trash; it's the caller's 14 * responsib lity to overwrite them with sane values.14 * responsibility to overwrite them with sane values. 15 15 * The number of allocated elements may grow, shrink, or stay the same. 16 16 * Failure is impossible if newsize <= self.allocated on entry, although … … 25 25 list_resize(PyListObject *self, Py_ssize_t newsize) 26 26 { 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 if (new_allocated <= ((~(size_t)0)/ sizeof(PyObject *)))62 63 64 65 66 67 68 69 70 71 72 27 PyObject **items; 28 size_t new_allocated; 29 Py_ssize_t allocated = self->allocated; 30 31 /* Bypass realloc() when a previous overallocation is large enough 32 to accommodate the newsize. If the newsize falls lower than half 33 the allocated size, then proceed with the realloc() to shrink the list. 34 */ 35 if (allocated >= newsize && newsize >= (allocated >> 1)) { 36 assert(self->ob_item != NULL || newsize == 0); 37 Py_SIZE(self) = newsize; 38 return 0; 39 } 40 41 /* This over-allocates proportional to the list size, making room 42 * for additional growth. The over-allocation is mild, but is 43 * enough to give linear-time amortized behavior over a long 44 * sequence of appends() in the presence of a poorly-performing 45 * system realloc(). 46 * The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ... 47 */ 48 new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6); 49 50 /* check for integer overflow */ 51 if (new_allocated > PY_SIZE_MAX - newsize) { 52 PyErr_NoMemory(); 53 return -1; 54 } else { 55 new_allocated += newsize; 56 } 57 58 if (newsize == 0) 59 new_allocated = 0; 60 items = self->ob_item; 61 if (new_allocated <= (PY_SIZE_MAX / sizeof(PyObject *))) 62 PyMem_RESIZE(items, PyObject *, new_allocated); 63 else 64 items = NULL; 65 if (items == NULL) { 66 PyErr_NoMemory(); 67 return -1; 68 } 69 self->ob_item = items; 70 Py_SIZE(self) = newsize; 71 self->allocated = new_allocated; 72 return 0; 73 73 } 74 74 … … 82 82 show_alloc(void) 83 83 { 84 85 86 87 88 89 84 fprintf(stderr, "List allocations: %" PY_FORMAT_SIZE_T "d\n", 85 count_alloc); 86 fprintf(stderr, "List reuse through freelist: %" PY_FORMAT_SIZE_T 87 "d\n", count_reuse); 88 fprintf(stderr, "%.2f%% reuse rate\n\n", 89 (100.0*count_reuse/(count_alloc+count_reuse))); 90 90 } 91 91 #endif … … 101 101 PyList_Fini(void) 102 102 { 103 104 105 106 107 108 109 103 PyListObject *op; 104 105 while (numfree) { 106 op = free_list[--numfree]; 107 assert(PyList_CheckExact(op)); 108 PyObject_GC_Del(op); 109 } 110 110 } 111 111 … … 113 113 PyList_New(Py_ssize_t size) 114 114 { 115 116 115 PyListObject *op; 116 size_t nbytes; 117 117 #ifdef SHOW_ALLOC_COUNT 118 119 120 121 122 118 static int initialized = 0; 119 if (!initialized) { 120 Py_AtExit(show_alloc); 121 initialized = 1; 122 } 123 123 #endif 124 124 125 126 127 128 129 130 131 132 133 134 135 136 137 125 if (size < 0) { 126 PyErr_BadInternalCall(); 127 return NULL; 128 } 129 /* Check for overflow without an actual overflow, 130 * which can cause compiler to optimise out */ 131 if ((size_t)size > PY_SIZE_MAX / sizeof(PyObject *)) 132 return PyErr_NoMemory(); 133 nbytes = size * sizeof(PyObject *); 134 if (numfree) { 135 numfree--; 136 op = free_list[numfree]; 137 _Py_NewReference((PyObject *)op); 138 138 #ifdef SHOW_ALLOC_COUNT 139 139 count_reuse++; 140 140 #endif 141 142 143 144 141 } else { 142 op = PyObject_GC_New(PyListObject, &PyList_Type); 143 if (op == NULL) 144 return NULL; 145 145 #ifdef SHOW_ALLOC_COUNT 146 146 count_alloc++; 147 147 #endif 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 148 } 149 if (size <= 0) 150 op->ob_item = NULL; 151 else { 152 op->ob_item = (PyObject **) PyMem_MALLOC(nbytes); 153 if (op->ob_item == NULL) { 154 Py_DECREF(op); 155 return PyErr_NoMemory(); 156 } 157 memset(op->ob_item, 0, nbytes); 158 } 159 Py_SIZE(op) = size; 160 op->allocated = size; 161 _PyObject_GC_TRACK(op); 162 return (PyObject *) op; 163 163 } 164 164 … … 166 166 PyList_Size(PyObject *op) 167 167 { 168 169 170 171 172 173 168 if (!PyList_Check(op)) { 169 PyErr_BadInternalCall(); 170 return -1; 171 } 172 else 173 return Py_SIZE(op); 174 174 } 175 175 … … 179 179 PyList_GetItem(PyObject *op, Py_ssize_t i) 180 180 { 181 if (!PyList_Check(op)) { 182 PyErr_BadInternalCall(); 183 return NULL; 184 } 185 if (i < 0 || i >= Py_SIZE(op)) { 186 if (indexerr == NULL) 187 indexerr = PyString_FromString( 188 "list index out of range"); 189 PyErr_SetObject(PyExc_IndexError, indexerr); 190 return NULL; 191 } 192 return ((PyListObject *)op) -> ob_item[i]; 181 if (!PyList_Check(op)) { 182 PyErr_BadInternalCall(); 183 return NULL; 184 } 185 if (i < 0 || i >= Py_SIZE(op)) { 186 if (indexerr == NULL) { 187 indexerr = PyString_FromString( 188 "list index out of range"); 189 if (indexerr == NULL) 190 return NULL; 191 } 192 PyErr_SetObject(PyExc_IndexError, indexerr); 193 return NULL; 194 } 195 return ((PyListObject *)op) -> ob_item[i]; 193 196 } 194 197 … … 197 200 register PyObject *newitem) 198 201 { 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 202 register PyObject *olditem; 203 register PyObject **p; 204 if (!PyList_Check(op)) { 205 Py_XDECREF(newitem); 206 PyErr_BadInternalCall(); 207 return -1; 208 } 209 if (i < 0 || i >= Py_SIZE(op)) { 210 Py_XDECREF(newitem); 211 PyErr_SetString(PyExc_IndexError, 212 "list assignment index out of range"); 213 return -1; 214 } 215 p = ((PyListObject *)op) -> ob_item + i; 216 olditem = *p; 217 *p = newitem; 218 Py_XDECREF(olditem); 219 return 0; 217 220 } 218 221 … … 220 223 ins1(PyListObject *self, Py_ssize_t where, PyObject *v) 221 224 { 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 225 Py_ssize_t i, n = Py_SIZE(self); 226 PyObject **items; 227 if (v == NULL) { 228 PyErr_BadInternalCall(); 229 return -1; 230 } 231 if (n == PY_SSIZE_T_MAX) { 232 PyErr_SetString(PyExc_OverflowError, 233 "cannot add more objects to list"); 234 return -1; 235 } 236 237 if (list_resize(self, n+1) == -1) 238 return -1; 239 240 if (where < 0) { 241 where += n; 242 if (where < 0) 243 where = 0; 244 } 245 if (where > n) 246 where = n; 247 items = self->ob_item; 248 for (i = n; --i >= where; ) 249 items[i+1] = items[i]; 250 Py_INCREF(v); 251 items[where] = v; 252 return 0; 250 253 } 251 254 … … 253 256 PyList_Insert(PyObject *op, Py_ssize_t where, PyObject *newitem) 254 257 { 255 256 257 258 259 258 if (!PyList_Check(op)) { 259 PyErr_BadInternalCall(); 260 return -1; 261 } 262 return ins1((PyListObject *)op, where, newitem); 260 263 } 261 264 … … 263 266 app1(PyListObject *self, PyObject *v) 264 267 { 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 268 Py_ssize_t n = PyList_GET_SIZE(self); 269 270 assert (v != NULL); 271 if (n == PY_SSIZE_T_MAX) { 272 PyErr_SetString(PyExc_OverflowError, 273 "cannot add more objects to list"); 274 return -1; 275 } 276 277 if (list_resize(self, n+1) == -1) 278 return -1; 279 280 Py_INCREF(v); 281 PyList_SET_ITEM(self, n, v); 282 return 0; 280 283 } 281 284 … … 283 286 PyList_Append(PyObject *op, PyObject *newitem) 284 287 { 285 286 287 288 288 if (PyList_Check(op) && (newitem != NULL)) 289 return app1((PyListObject *)op, newitem); 290 PyErr_BadInternalCall(); 291 return -1; 289 292 } 290 293 … … 294 297 list_dealloc(PyListObject *op) 295 298 { 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 299 Py_ssize_t i; 300 PyObject_GC_UnTrack(op); 301 Py_TRASHCAN_SAFE_BEGIN(op) 302 if (op->ob_item != NULL) { 303 /* Do it backwards, for Christian Tismer. 304 There's a simple test case where somehow this reduces 305 thrashing when a *very* large list is created and 306 immediately deleted. */ 307 i = Py_SIZE(op); 308 while (--i >= 0) { 309 Py_XDECREF(op->ob_item[i]); 310 } 311 PyMem_FREE(op->ob_item); 312 } 313 if (numfree < PyList_MAXFREELIST && PyList_CheckExact(op)) 314 free_list[numfree++] = op; 315 else 316 Py_TYPE(op)->tp_free((PyObject *)op); 317 Py_TRASHCAN_SAFE_END(op) 315 318 } 316 319 … … 318 321 list_print(PyListObject *op, FILE *fp, int flags) 319 322 { 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 323 int rc; 324 Py_ssize_t i; 325 PyObject *item; 326 327 rc = Py_ReprEnter((PyObject*)op); 328 if (rc != 0) { 329 if (rc < 0) 330 return rc; 331 Py_BEGIN_ALLOW_THREADS 332 fprintf(fp, "[...]"); 333 Py_END_ALLOW_THREADS 334 return 0; 335 } 336 Py_BEGIN_ALLOW_THREADS 337 fprintf(fp, "["); 338 Py_END_ALLOW_THREADS 339 for (i = 0; i < Py_SIZE(op); i++) { 340 item = op->ob_item[i]; 341 Py_INCREF(item); 342 if (i > 0) { 343 Py_BEGIN_ALLOW_THREADS 344 fprintf(fp, ", "); 345 Py_END_ALLOW_THREADS 346 } 347 if (PyObject_Print(item, fp, 0) != 0) { 348 Py_DECREF(item); 349 Py_ReprLeave((PyObject *)op); 350 return -1; 351 } 352 Py_DECREF(item); 353 } 354 Py_BEGIN_ALLOW_THREADS 355 fprintf(fp, "]"); 356 Py_END_ALLOW_THREADS 357 Py_ReprLeave((PyObject *)op); 358 return 0; 356 359 } 357 360 … … 359 362 list_repr(PyListObject *v) 360 363 { 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 364 Py_ssize_t i; 365 PyObject *s, *temp; 366 PyObject *pieces = NULL, *result = NULL; 367 368 i = Py_ReprEnter((PyObject*)v); 369 if (i != 0) { 370 return i > 0 ? PyString_FromString("[...]") : NULL; 371 } 372 373 if (Py_SIZE(v) == 0) { 374 result = PyString_FromString("[]"); 375 goto Done; 376 } 377 378 pieces = PyList_New(0); 379 if (pieces == NULL) 380 goto Done; 381 382 /* Do repr() on each element. Note that this may mutate the list, 383 so must refetch the list size on each iteration. */ 384 for (i = 0; i < Py_SIZE(v); ++i) { 385 int status; 386 if (Py_EnterRecursiveCall(" while getting the repr of a list")) 387 goto Done; 388 s = PyObject_Repr(v->ob_item[i]); 389 Py_LeaveRecursiveCall(); 390 if (s == NULL) 391 goto Done; 392 status = PyList_Append(pieces, s); 393 Py_DECREF(s); /* append created a new ref */ 394 if (status < 0) 395 goto Done; 396 } 397 398 /* Add "[]" decorations to the first and last items. */ 399 assert(PyList_GET_SIZE(pieces) > 0); 400 s = PyString_FromString("["); 401 if (s == NULL) 402 goto Done; 403 temp = PyList_GET_ITEM(pieces, 0); 404 PyString_ConcatAndDel(&s, temp); 405 PyList_SET_ITEM(pieces, 0, s); 406 if (s == NULL) 407 goto Done; 408 409 s = PyString_FromString("]"); 410 if (s == NULL) 411 goto Done; 412 temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1); 413 PyString_ConcatAndDel(&temp, s); 414 PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp); 415 if (temp == NULL) 416 goto Done; 417 418 /* Paste them all together with ", " between. */ 419 s = PyString_FromString(", "); 420 if (s == NULL) 421 goto Done; 422 result = _PyString_Join(s, pieces); 423 Py_DECREF(s); 421 424 422 425 Done: 423 424 425 426 Py_XDECREF(pieces); 427 Py_ReprLeave((PyObject *)v); 428 return result; 426 429 } 427 430 … … 429 432 list_length(PyListObject *a) 430 433 { 431 434 return Py_SIZE(a); 432 435 } 433 436 … … 435 438 list_contains(PyListObject *a, PyObject *el) 436 439 { 437 438 439 440 441 442 443 440 Py_ssize_t i; 441 int cmp; 442 443 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i) 444 cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i), 445 Py_EQ); 446 return cmp; 444 447 } 445 448 … … 447 450 list_item(PyListObject *a, Py_ssize_t i) 448 451 { 449 if (i < 0 || i >= Py_SIZE(a)) { 450 if (indexerr == NULL) 451 indexerr = PyString_FromString( 452 "list index out of range"); 453 PyErr_SetObject(PyExc_IndexError, indexerr); 454 return NULL; 455 } 456 Py_INCREF(a->ob_item[i]); 457 return a->ob_item[i]; 452 if (i < 0 || i >= Py_SIZE(a)) { 453 if (indexerr == NULL) { 454 indexerr = PyString_FromString( 455 "list index out of range"); 456 if (indexerr == NULL) 457 return NULL; 458 } 459 PyErr_SetObject(PyExc_IndexError, indexerr); 460 return NULL; 461 } 462 Py_INCREF(a->ob_item[i]); 463 return a->ob_item[i]; 458 464 } 459 465 … … 461 467 list_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh) 462 468 { 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 469 PyListObject *np; 470 PyObject **src, **dest; 471 Py_ssize_t i, len; 472 if (ilow < 0) 473 ilow = 0; 474 else if (ilow > Py_SIZE(a)) 475 ilow = Py_SIZE(a); 476 if (ihigh < ilow) 477 ihigh = ilow; 478 else if (ihigh > Py_SIZE(a)) 479 ihigh = Py_SIZE(a); 480 len = ihigh - ilow; 481 np = (PyListObject *) PyList_New(len); 482 if (np == NULL) 483 return NULL; 484 485 src = a->ob_item + ilow; 486 dest = np->ob_item; 487 for (i = 0; i < len; i++) { 488 PyObject *v = src[i]; 489 Py_INCREF(v); 490 dest[i] = v; 491 } 492 return (PyObject *)np; 487 493 } 488 494 … … 490 496 PyList_GetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh) 491 497 { 492 493 494 495 496 498 if (!PyList_Check(a)) { 499 PyErr_BadInternalCall(); 500 return NULL; 501 } 502 return list_slice((PyListObject *)a, ilow, ihigh); 497 503 } 498 504 … … 500 506 list_concat(PyListObject *a, PyObject *bb) 501 507 { 502 503 504 505 506 507 508 509 510 511 508 Py_ssize_t size; 509 Py_ssize_t i; 510 PyObject **src, **dest; 511 PyListObject *np; 512 if (!PyList_Check(bb)) { 513 PyErr_Format(PyExc_TypeError, 514 "can only concatenate list (not \"%.200s\") to list", 515 bb->ob_type->tp_name); 516 return NULL; 517 } 512 518 #define b ((PyListObject *)bb) 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 519 size = Py_SIZE(a) + Py_SIZE(b); 520 if (size < 0) 521 return PyErr_NoMemory(); 522 np = (PyListObject *) PyList_New(size); 523 if (np == NULL) { 524 return NULL; 525 } 526 src = a->ob_item; 527 dest = np->ob_item; 528 for (i = 0; i < Py_SIZE(a); i++) { 529 PyObject *v = src[i]; 530 Py_INCREF(v); 531 dest[i] = v; 532 } 533 src = b->ob_item; 534 dest = np->ob_item + Py_SIZE(a); 535 for (i = 0; i < Py_SIZE(b); i++) { 536 PyObject *v = src[i]; 537 Py_INCREF(v); 538 dest[i] = v; 539 } 540 return (PyObject *)np; 535 541 #undef b 536 542 } … … 539 545 list_repeat(PyListObject *a, Py_ssize_t n) 540 546 { 541 542 543 544 545 546 547 548 size = Py_SIZE(a) * n; 549 if (n && size/n != Py_SIZE(a)) 550 return PyErr_NoMemory();551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 547 Py_ssize_t i, j; 548 Py_ssize_t size; 549 PyListObject *np; 550 PyObject **p, **items; 551 PyObject *elem; 552 if (n < 0) 553 n = 0; 554 if (n > 0 && Py_SIZE(a) > PY_SSIZE_T_MAX / n) 555 return PyErr_NoMemory(); 556 size = Py_SIZE(a) * n; 557 if (size == 0) 558 return PyList_New(0); 559 np = (PyListObject *) PyList_New(size); 560 if (np == NULL) 561 return NULL; 562 563 items = np->ob_item; 564 if (Py_SIZE(a) == 1) { 565 elem = a->ob_item[0]; 566 for (i = 0; i < n; i++) { 567 items[i] = elem; 568 Py_INCREF(elem); 569 } 570 return (PyObject *) np; 571 } 572 p = np->ob_item; 573 items = a->ob_item; 574 for (i = 0; i < n; i++) { 575 for (j = 0; j < Py_SIZE(a); j++) { 576 *p = items[j]; 577 Py_INCREF(*p); 578 p++; 579 } 580 } 581 return (PyObject *) np; 576 582 } 577 583 … … 579 585 list_clear(PyListObject *a) 580 586 { 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 587 Py_ssize_t i; 588 PyObject **item = a->ob_item; 589 if (item != NULL) { 590 /* Because XDECREF can recursively invoke operations on 591 this list, we make it empty first. */ 592 i = Py_SIZE(a); 593 Py_SIZE(a) = 0; 594 a->ob_item = NULL; 595 a->allocated = 0; 596 while (--i >= 0) { 597 Py_XDECREF(item[i]); 598 } 599 PyMem_FREE(item); 600 } 601 /* Never fails; the return value can be ignored. 602 Note that there is no guarantee that the list is actually empty 603 at this point, because XDECREF may have populated it again! */ 604 return 0; 599 605 } 600 606 … … 608 614 list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v) 609 615 { 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 int result = -1;/* guilty until proved innocent */616 /* Because [X]DECREF can recursively invoke list operations on 617 this list, we must postpone all [X]DECREF activity until 618 after the list is back in its canonical shape. Therefore 619 we must allocate an additional array, 'recycle', into which 620 we temporarily copy the items that are deleted from the 621 list. :-( */ 622 PyObject *recycle_on_stack[8]; 623 PyObject **recycle = recycle_on_stack; /* will allocate more if needed */ 624 PyObject **item; 625 PyObject **vitem = NULL; 626 PyObject *v_as_SF = NULL; /* PySequence_Fast(v) */ 627 Py_ssize_t n; /* # of elements in replacement list */ 628 Py_ssize_t norig; /* # of elements in list getting replaced */ 629 Py_ssize_t d; /* Change in size */ 630 Py_ssize_t k; 631 size_t s; 632 int result = -1; /* guilty until proved innocent */ 627 633 #define b ((PyListObject *)v) 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 634 if (v == NULL) 635 n = 0; 636 else { 637 if (a == b) { 638 /* Special case "a[i:j] = a" -- copy b first */ 639 v = list_slice(b, 0, Py_SIZE(b)); 640 if (v == NULL) 641 return result; 642 result = list_ass_slice(a, ilow, ihigh, v); 643 Py_DECREF(v); 644 return result; 645 } 646 v_as_SF = PySequence_Fast(v, "can only assign an iterable"); 647 if(v_as_SF == NULL) 648 goto Error; 649 n = PySequence_Fast_GET_SIZE(v_as_SF); 650 vitem = PySequence_Fast_ITEMS(v_as_SF); 651 } 652 if (ilow < 0) 653 ilow = 0; 654 else if (ilow > Py_SIZE(a)) 655 ilow = Py_SIZE(a); 656 657 if (ihigh < ilow) 658 ihigh = ilow; 659 else if (ihigh > Py_SIZE(a)) 660 ihigh = Py_SIZE(a); 661 662 norig = ihigh - ilow; 663 assert(norig >= 0); 664 d = n - norig; 665 if (Py_SIZE(a) + d == 0) { 666 Py_XDECREF(v_as_SF); 667 return list_clear(a); 668 } 669 item = a->ob_item; 670 /* recycle the items that we are about to remove */ 671 s = norig * sizeof(PyObject *); 672 if (s > sizeof(recycle_on_stack)) { 673 recycle = (PyObject **)PyMem_MALLOC(s); 674 if (recycle == NULL) { 675 PyErr_NoMemory(); 676 goto Error; 677 } 678 } 679 memcpy(recycle, &item[ilow], s); 680 681 if (d < 0) { /* Delete -d items */ 682 memmove(&item[ihigh+d], &item[ihigh], 683 (Py_SIZE(a) - ihigh)*sizeof(PyObject *)); 684 list_resize(a, Py_SIZE(a) + d); 685 item = a->ob_item; 686 } 687 else if (d > 0) { /* Insert d items */ 688 k = Py_SIZE(a); 689 if (list_resize(a, k+d) < 0) 690 goto Error; 691 item = a->ob_item; 692 memmove(&item[ihigh+d], &item[ihigh], 693 (k - ihigh)*sizeof(PyObject *)); 694 } 695 for (k = 0; k < n; k++, ilow++) { 696 PyObject *w = vitem[k]; 697 Py_XINCREF(w); 698 item[ilow] = w; 699 } 700 for (k = norig - 1; k >= 0; --k) 701 Py_XDECREF(recycle[k]); 702 result = 0; 697 703 Error: 698 699 700 701 704 if (recycle != recycle_on_stack) 705 PyMem_FREE(recycle); 706 Py_XDECREF(v_as_SF); 707 return result; 702 708 #undef b 703 709 } … … 706 712 PyList_SetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v) 707 713 { 708 709 710 711 712 714 if (!PyList_Check(a)) { 715 PyErr_BadInternalCall(); 716 return -1; 717 } 718 return list_ass_slice((PyListObject *)a, ilow, ihigh, v); 713 719 } 714 720 … … 716 722 list_inplace_repeat(PyListObject *self, Py_ssize_t n) 717 723 { 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 724 PyObject **items; 725 Py_ssize_t size, i, j, p; 726 727 728 size = PyList_GET_SIZE(self); 729 if (size == 0 || n == 1) { 730 Py_INCREF(self); 731 return (PyObject *)self; 732 } 733 734 if (n < 1) { 735 (void)list_clear(self); 736 Py_INCREF(self); 737 return (PyObject *)self; 738 } 739 740 if (size > PY_SSIZE_T_MAX / n) { 741 return PyErr_NoMemory(); 742 } 743 744 if (list_resize(self, size*n) == -1) 745 return NULL; 746 747 p = size; 748 items = self->ob_item; 749 for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */ 750 for (j = 0; j < size; j++) { 751 PyObject *o = items[j]; 752 Py_INCREF(o); 753 items[p++] = o; 754 } 755 } 756 Py_INCREF(self); 757 return (PyObject *)self; 752 758 } 753 759 … … 755 761 list_ass_item(PyListObject *a, Py_ssize_t i, PyObject *v) 756 762 { 757 758 759 760 761 762 763 764 765 766 767 768 769 763 PyObject *old_value; 764 if (i < 0 || i >= Py_SIZE(a)) { 765 PyErr_SetString(PyExc_IndexError, 766 "list assignment index out of range"); 767 return -1; 768 } 769 if (v == NULL) 770 return list_ass_slice(a, i, i+1, v); 771 Py_INCREF(v); 772 old_value = a->ob_item[i]; 773 a->ob_item[i] = v; 774 Py_DECREF(old_value); 775 return 0; 770 776 } 771 777 … … 773 779 listinsert(PyListObject *self, PyObject *args) 774 780 { 775 776 777 778 779 780 781 781 Py_ssize_t i; 782 PyObject *v; 783 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v)) 784 return NULL; 785 if (ins1(self, i, v) == 0) 786 Py_RETURN_NONE; 787 return NULL; 782 788 } 783 789 … … 785 791 listappend(PyListObject *self, PyObject *v) 786 792 { 787 788 789 793 if (app1(self, v) == 0) 794 Py_RETURN_NONE; 795 return NULL; 790 796 } 791 797 … … 793 799 listextend(PyListObject *self, PyObject *b) 794 800 { 795 796 Py_ssize_t m;/* size of self */797 Py_ssize_t n;/* guess for size of b */798 Py_ssize_t mn;/* m + n */799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 801 PyObject *it; /* iter(v) */ 802 Py_ssize_t m; /* size of self */ 803 Py_ssize_t n; /* guess for size of b */ 804 Py_ssize_t mn; /* m + n */ 805 Py_ssize_t i; 806 PyObject *(*iternext)(PyObject *); 807 808 /* Special cases: 809 1) lists and tuples which can use PySequence_Fast ops 810 2) extending self to self requires making a copy first 811 */ 812 if (PyList_CheckExact(b) || PyTuple_CheckExact(b) || (PyObject *)self == b) { 813 PyObject **src, **dest; 814 b = PySequence_Fast(b, "argument must be iterable"); 815 if (!b) 816 return NULL; 817 n = PySequence_Fast_GET_SIZE(b); 818 if (n == 0) { 819 /* short circuit when b is empty */ 820 Py_DECREF(b); 821 Py_RETURN_NONE; 822 } 823 m = Py_SIZE(self); 824 if (list_resize(self, m + n) == -1) { 825 Py_DECREF(b); 826 return NULL; 827 } 828 /* note that we may still have self == b here for the 829 * situation a.extend(a), but the following code works 830 * in that case too. Just make sure to resize self 831 * before calling PySequence_Fast_ITEMS. 832 */ 833 /* populate the end of self with b's items */ 834 src = PySequence_Fast_ITEMS(b); 835 dest = self->ob_item + m; 836 for (i = 0; i < n; i++) { 837 PyObject *o = src[i]; 838 Py_INCREF(o); 839 dest[i] = o; 840 } 841 Py_DECREF(b); 842 Py_RETURN_NONE; 843 } 844 845 it = PyObject_GetIter(b); 846 if (it == NULL) 847 return NULL; 848 iternext = *it->ob_type->tp_iternext; 849 850 /* Guess a result list size. */ 851 n = _PyObject_LengthHint(b, 8); 852 if (n == -1) { 853 Py_DECREF(it); 854 return NULL; 855 } 856 m = Py_SIZE(self); 857 mn = m + n; 858 if (mn >= m) { 859 /* Make room. */ 860 if (list_resize(self, mn) == -1) 861 goto error; 862 /* Make the list sane again. */ 863 Py_SIZE(self) = m; 864 } 865 /* Else m + n overflowed; on the chance that n lied, and there really 866 * is enough room, ignore it. If n was telling the truth, we'll 867 * eventually run out of memory during the loop. 868 */ 869 870 /* Run iterator to exhaustion. */ 871 for (;;) { 872 PyObject *item = iternext(it); 873 if (item == NULL) { 874 if (PyErr_Occurred()) { 875 if (PyErr_ExceptionMatches(PyExc_StopIteration)) 876 PyErr_Clear(); 877 else 878 goto error; 879 } 880 break; 881 } 882 if (Py_SIZE(self) < self->allocated) { 883 /* steals ref */ 884 PyList_SET_ITEM(self, Py_SIZE(self), item); 885 ++Py_SIZE(self); 886 } 887 else { 888 int status = app1(self, item); 889 Py_DECREF(item); /* append creates a new ref */ 890 if (status < 0) 891 goto error; 892 } 893 } 894 895 /* Cut back result list if initial guess was too large. */ 896 if (Py_SIZE(self) < self->allocated) 897 list_resize(self, Py_SIZE(self)); /* shrinking can't fail */ 898 899 Py_DECREF(it); 900 Py_RETURN_NONE; 895 901 896 902 error: 897 898 903 Py_DECREF(it); 904 return NULL; 899 905 } 900 906 … … 902 908 _PyList_Extend(PyListObject *self, PyObject *b) 903 909 { 904 910 return listextend(self, b); 905 911 } 906 912 … … 908 914 list_inplace_concat(PyListObject *self, PyObject *other) 909 915 { 910 911 912 913 914 915 916 917 916 PyObject *result; 917 918 result = listextend(self, other); 919 if (result == NULL) 920 return result; 921 Py_DECREF(result); 922 Py_INCREF(self); 923 return (PyObject *)self; 918 924 } 919 925 … … 921 927 listpop(PyListObject *self, PyObject *args) 922 928 { 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 929 Py_ssize_t i = -1; 930 PyObject *v; 931 int status; 932 933 if (!PyArg_ParseTuple(args, "|n:pop", &i)) 934 return NULL; 935 936 if (Py_SIZE(self) == 0) { 937 /* Special-case most common failure cause */ 938 PyErr_SetString(PyExc_IndexError, "pop from empty list"); 939 return NULL; 940 } 941 if (i < 0) 942 i += Py_SIZE(self); 943 if (i < 0 || i >= Py_SIZE(self)) { 944 PyErr_SetString(PyExc_IndexError, "pop index out of range"); 945 return NULL; 946 } 947 v = self->ob_item[i]; 948 if (i == Py_SIZE(self) - 1) { 949 status = list_resize(self, Py_SIZE(self) - 1); 950 assert(status >= 0); 951 return v; /* and v now owns the reference the list had */ 952 } 953 Py_INCREF(v); 954 status = list_ass_slice(self, i, i+1, (PyObject *)NULL); 955 assert(status >= 0); 956 /* Use status, so that in a release build compilers don't 957 * complain about the unused name. 958 */ 959 (void) status; 960 961 return v; 956 962 } 957 963 … … 960 966 reverse_slice(PyObject **lo, PyObject **hi) 961 967 { 962 963 964 965 966 967 968 969 970 971 968 assert(lo && hi); 969 970 --hi; 971 while (lo < hi) { 972 PyObject *t = *lo; 973 *lo = *hi; 974 *hi = t; 975 ++lo; 976 --hi; 977 } 972 978 } 973 979 … … 985 991 islt(PyObject *x, PyObject *y, PyObject *compare) 986 992 { 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 993 PyObject *res; 994 PyObject *args; 995 Py_ssize_t i; 996 997 assert(compare != NULL); 998 /* Call the user's comparison function and translate the 3-way 999 * result into true or false (or error). 1000 */ 1001 args = PyTuple_New(2); 1002 if (args == NULL) 1003 return -1; 1004 Py_INCREF(x); 1005 Py_INCREF(y); 1006 PyTuple_SET_ITEM(args, 0, x); 1007 PyTuple_SET_ITEM(args, 1, y); 1008 res = PyObject_Call(compare, args, NULL); 1009 Py_DECREF(args); 1010 if (res == NULL) 1011 return -1; 1012 if (!PyInt_Check(res)) { 1013 PyErr_Format(PyExc_TypeError, 1014 "comparison function must return int, not %.200s", 1015 res->ob_type->tp_name); 1016 Py_DECREF(res); 1017 return -1; 1018 } 1019 i = PyInt_AsLong(res); 1020 Py_DECREF(res); 1021 return i < 0; 1016 1022 } 1017 1023 … … 1021 1027 * Returns -1 on error, 1 if x < y, 0 if x >= y. 1022 1028 */ 1023 #define ISLT(X, Y, COMPARE) ((COMPARE) == NULL ? 1024 PyObject_RichCompareBool(X, Y, Py_LT) :\1025 1029 #define ISLT(X, Y, COMPARE) ((COMPARE) == NULL ? \ 1030 PyObject_RichCompareBool(X, Y, Py_LT) : \ 1031 islt(X, Y, COMPARE)) 1026 1032 1027 1033 /* Compare X to Y via "<". Goto "fail" if the comparison raises an … … 1030 1036 */ 1031 1037 #define IFLT(X, Y) if ((k = ISLT(X, Y, compare)) < 0) goto fail; \ 1032 1038 if (k) 1033 1039 1034 1040 /* binarysort is the best method for sorting small arrays: it does … … 1047 1053 /* compare -- comparison function object, or NULL for default */ 1048 1054 { 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1055 register Py_ssize_t k; 1056 register PyObject **l, **p, **r; 1057 register PyObject *pivot; 1058 1059 assert(lo <= start && start <= hi); 1060 /* assert [lo, start) is sorted */ 1061 if (lo == start) 1062 ++start; 1063 for (; start < hi; ++start) { 1064 /* set l to where *start belongs */ 1065 l = lo; 1066 r = start; 1067 pivot = *r; 1068 /* Invariants: 1069 * pivot >= all in [lo, l). 1070 * pivot < all in [r, start). 1071 * The second is vacuously true at the start. 1072 */ 1073 assert(l < r); 1074 do { 1075 p = l + ((r - l) >> 1); 1076 IFLT(pivot, *p) 1077 r = p; 1078 else 1079 l = p+1; 1080 } while (l < r); 1081 assert(l == r); 1082 /* The invariants still hold, so pivot >= all in [lo, l) and 1083 pivot < all in [l, start), so pivot belongs at l. Note 1084 that if there are elements equal to pivot, l points to the 1085 first slot after them -- that's why this sort is stable. 1086 Slide over to make room. 1087 Caution: using memmove is much slower under MSVC 5; 1088 we're not usually moving many slots. */ 1089 for (p = start; p > l; --p) 1090 *p = *(p-1); 1091 *l = pivot; 1092 } 1093 return 0; 1088 1094 1089 1095 fail: 1090 1096 return -1; 1091 1097 } 1092 1098 … … 1112 1118 count_run(PyObject **lo, PyObject **hi, PyObject *compare, int *descending) 1113 1119 { 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1120 Py_ssize_t k; 1121 Py_ssize_t n; 1122 1123 assert(lo < hi); 1124 *descending = 0; 1125 ++lo; 1126 if (lo == hi) 1127 return 1; 1128 1129 n = 2; 1130 IFLT(*lo, *(lo-1)) { 1131 *descending = 1; 1132 for (lo = lo+1; lo < hi; ++lo, ++n) { 1133 IFLT(*lo, *(lo-1)) 1134 ; 1135 else 1136 break; 1137 } 1138 } 1139 else { 1140 for (lo = lo+1; lo < hi; ++lo, ++n) { 1141 IFLT(*lo, *(lo-1)) 1142 break; 1143 } 1144 } 1145 1146 return n; 1141 1147 fail: 1142 1148 return -1; 1143 1149 } 1144 1150 … … 1167 1173 gallop_left(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare) 1168 1174 { 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 const Py_ssize_t maxofs = n - hint;/* &a[n-1] is highest */1183 1184 1185 1186 1187 if (ofs <= 0)/* int overflow */1188 1189 1190 else/* key <= a[hint + ofs] */1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 const Py_ssize_t maxofs = hint + 1;/* &a[0] is lowest */1204 1205 1206 1207 1208 1209 1210 if (ofs <= 0)/* int overflow */1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 lastofs = m+1;/* a[m] < key */1233 1234 ofs = m;/* key <= a[m] */1235 1236 assert(lastofs == ofs);/* so a[ofs-1] < key <= a[ofs] */1237 1175 Py_ssize_t ofs; 1176 Py_ssize_t lastofs; 1177 Py_ssize_t k; 1178 1179 assert(key && a && n > 0 && hint >= 0 && hint < n); 1180 1181 a += hint; 1182 lastofs = 0; 1183 ofs = 1; 1184 IFLT(*a, key) { 1185 /* a[hint] < key -- gallop right, until 1186 * a[hint + lastofs] < key <= a[hint + ofs] 1187 */ 1188 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */ 1189 while (ofs < maxofs) { 1190 IFLT(a[ofs], key) { 1191 lastofs = ofs; 1192 ofs = (ofs << 1) + 1; 1193 if (ofs <= 0) /* int overflow */ 1194 ofs = maxofs; 1195 } 1196 else /* key <= a[hint + ofs] */ 1197 break; 1198 } 1199 if (ofs > maxofs) 1200 ofs = maxofs; 1201 /* Translate back to offsets relative to &a[0]. */ 1202 lastofs += hint; 1203 ofs += hint; 1204 } 1205 else { 1206 /* key <= a[hint] -- gallop left, until 1207 * a[hint - ofs] < key <= a[hint - lastofs] 1208 */ 1209 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */ 1210 while (ofs < maxofs) { 1211 IFLT(*(a-ofs), key) 1212 break; 1213 /* key <= a[hint - ofs] */ 1214 lastofs = ofs; 1215 ofs = (ofs << 1) + 1; 1216 if (ofs <= 0) /* int overflow */ 1217 ofs = maxofs; 1218 } 1219 if (ofs > maxofs) 1220 ofs = maxofs; 1221 /* Translate back to positive offsets relative to &a[0]. */ 1222 k = lastofs; 1223 lastofs = hint - ofs; 1224 ofs = hint - k; 1225 } 1226 a -= hint; 1227 1228 assert(-1 <= lastofs && lastofs < ofs && ofs <= n); 1229 /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the 1230 * right of lastofs but no farther right than ofs. Do a binary 1231 * search, with invariant a[lastofs-1] < key <= a[ofs]. 1232 */ 1233 ++lastofs; 1234 while (lastofs < ofs) { 1235 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1); 1236 1237 IFLT(a[m], key) 1238 lastofs = m+1; /* a[m] < key */ 1239 else 1240 ofs = m; /* key <= a[m] */ 1241 } 1242 assert(lastofs == ofs); /* so a[ofs-1] < key <= a[ofs] */ 1243 return ofs; 1238 1244 1239 1245 fail: 1240 1246 return -1; 1241 1247 } 1242 1248 … … 1258 1264 gallop_right(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare) 1259 1265 { 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 const Py_ssize_t maxofs = hint + 1;/* &a[0] is lowest */1274 1275 1276 1277 1278 if (ofs <= 0)/* int overflow */1279 1280 1281 else/* a[hint - ofs] <= key */1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 const Py_ssize_t maxofs = n - hint;/* &a[n-1] is highest */1296 1297 1298 1299 1300 1301 1302 if (ofs <= 0)/* int overflow */1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 ofs = m;/* key < a[m] */1324 1325 lastofs = m+1;/* a[m] <= key */1326 1327 assert(lastofs == ofs);/* so a[ofs-1] <= key < a[ofs] */1328 1266 Py_ssize_t ofs; 1267 Py_ssize_t lastofs; 1268 Py_ssize_t k; 1269 1270 assert(key && a && n > 0 && hint >= 0 && hint < n); 1271 1272 a += hint; 1273 lastofs = 0; 1274 ofs = 1; 1275 IFLT(key, *a) { 1276 /* key < a[hint] -- gallop left, until 1277 * a[hint - ofs] <= key < a[hint - lastofs] 1278 */ 1279 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */ 1280 while (ofs < maxofs) { 1281 IFLT(key, *(a-ofs)) { 1282 lastofs = ofs; 1283 ofs = (ofs << 1) + 1; 1284 if (ofs <= 0) /* int overflow */ 1285 ofs = maxofs; 1286 } 1287 else /* a[hint - ofs] <= key */ 1288 break; 1289 } 1290 if (ofs > maxofs) 1291 ofs = maxofs; 1292 /* Translate back to positive offsets relative to &a[0]. */ 1293 k = lastofs; 1294 lastofs = hint - ofs; 1295 ofs = hint - k; 1296 } 1297 else { 1298 /* a[hint] <= key -- gallop right, until 1299 * a[hint + lastofs] <= key < a[hint + ofs] 1300 */ 1301 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */ 1302 while (ofs < maxofs) { 1303 IFLT(key, a[ofs]) 1304 break; 1305 /* a[hint + ofs] <= key */ 1306 lastofs = ofs; 1307 ofs = (ofs << 1) + 1; 1308 if (ofs <= 0) /* int overflow */ 1309 ofs = maxofs; 1310 } 1311 if (ofs > maxofs) 1312 ofs = maxofs; 1313 /* Translate back to offsets relative to &a[0]. */ 1314 lastofs += hint; 1315 ofs += hint; 1316 } 1317 a -= hint; 1318 1319 assert(-1 <= lastofs && lastofs < ofs && ofs <= n); 1320 /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the 1321 * right of lastofs but no farther right than ofs. Do a binary 1322 * search, with invariant a[lastofs-1] <= key < a[ofs]. 1323 */ 1324 ++lastofs; 1325 while (lastofs < ofs) { 1326 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1); 1327 1328 IFLT(key, a[m]) 1329 ofs = m; /* key < a[m] */ 1330 else 1331 lastofs = m+1; /* a[m] <= key */ 1332 } 1333 assert(lastofs == ofs); /* so a[ofs-1] <= key < a[ofs] */ 1334 return ofs; 1329 1335 1330 1336 fail: 1331 1337 return -1; 1332 1338 } 1333 1339 … … 1352 1358 */ 1353 1359 struct s_slice { 1354 1355 1360 PyObject **base; 1361 Py_ssize_t len; 1356 1362 }; 1357 1363 1358 1364 typedef struct s_MergeState { 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 PyObject **a;/* may point to temparray below */1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1365 /* The user-supplied comparison function. or NULL if none given. */ 1366 PyObject *compare; 1367 1368 /* This controls when we get *into* galloping mode. It's initialized 1369 * to MIN_GALLOP. merge_lo and merge_hi tend to nudge it higher for 1370 * random data, and lower for highly structured data. 1371 */ 1372 Py_ssize_t min_gallop; 1373 1374 /* 'a' is temp storage to help with merges. It contains room for 1375 * alloced entries. 1376 */ 1377 PyObject **a; /* may point to temparray below */ 1378 Py_ssize_t alloced; 1379 1380 /* A stack of n pending runs yet to be merged. Run #i starts at 1381 * address base[i] and extends for len[i] elements. It's always 1382 * true (so long as the indices are in bounds) that 1383 * 1384 * pending[i].base + pending[i].len == pending[i+1].base 1385 * 1386 * so we could cut the storage for this, but it's a minor amount, 1387 * and keeping all the info explicit simplifies the code. 1388 */ 1389 int n; 1390 struct s_slice pending[MAX_MERGE_PENDING]; 1391 1392 /* 'a' points to this when possible, rather than muck with malloc. */ 1393 PyObject *temparray[MERGESTATE_TEMP_SIZE]; 1388 1394 } MergeState; 1389 1395 … … 1392 1398 merge_init(MergeState *ms, PyObject *compare) 1393 1399 { 1394 1395 1396 1397 1398 1399 1400 assert(ms != NULL); 1401 ms->compare = compare; 1402 ms->a = ms->temparray; 1403 ms->alloced = MERGESTATE_TEMP_SIZE; 1404 ms->n = 0; 1405 ms->min_gallop = MIN_GALLOP; 1400 1406 } 1401 1407 … … 1407 1413 merge_freemem(MergeState *ms) 1408 1414 { 1409 1410 1411 1412 1413 1415 assert(ms != NULL); 1416 if (ms->a != ms->temparray) 1417 PyMem_Free(ms->a); 1418 ms->a = ms->temparray; 1419 ms->alloced = MERGESTATE_TEMP_SIZE; 1414 1420 } 1415 1421 … … 1420 1426 merge_getmem(MergeState *ms, Py_ssize_t need) 1421 1427 { 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 merge_freemem(ms);/* reset to sane state */1440 1441 } 1442 #define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : 1443 1428 assert(ms != NULL); 1429 if (need <= ms->alloced) 1430 return 0; 1431 /* Don't realloc! That can cost cycles to copy the old data, but 1432 * we don't care what's in the block. 1433 */ 1434 merge_freemem(ms); 1435 if ((size_t)need > PY_SSIZE_T_MAX / sizeof(PyObject*)) { 1436 PyErr_NoMemory(); 1437 return -1; 1438 } 1439 ms->a = (PyObject **)PyMem_Malloc(need * sizeof(PyObject*)); 1440 if (ms->a) { 1441 ms->alloced = need; 1442 return 0; 1443 } 1444 PyErr_NoMemory(); 1445 merge_freemem(ms); /* reset to sane state */ 1446 return -1; 1447 } 1448 #define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : \ 1449 merge_getmem(MS, NEED)) 1444 1450 1445 1451 /* Merge the na elements starting at pa with the nb elements starting at pb … … 1453 1459 PyObject **pb, Py_ssize_t nb) 1454 1460 { 1455 1456 1457 1458 int result = -1;/* guilty until proved innocent */1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 Py_ssize_t acount = 0;/* # of times A won in a row */1479 Py_ssize_t bcount = 0;/* # of times B won in a row */1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 ++min_gallop;/* penalize it for leaving galloping mode */1562 1563 1461 Py_ssize_t k; 1462 PyObject *compare; 1463 PyObject **dest; 1464 int result = -1; /* guilty until proved innocent */ 1465 Py_ssize_t min_gallop; 1466 1467 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb); 1468 if (MERGE_GETMEM(ms, na) < 0) 1469 return -1; 1470 memcpy(ms->a, pa, na * sizeof(PyObject*)); 1471 dest = pa; 1472 pa = ms->a; 1473 1474 *dest++ = *pb++; 1475 --nb; 1476 if (nb == 0) 1477 goto Succeed; 1478 if (na == 1) 1479 goto CopyB; 1480 1481 min_gallop = ms->min_gallop; 1482 compare = ms->compare; 1483 for (;;) { 1484 Py_ssize_t acount = 0; /* # of times A won in a row */ 1485 Py_ssize_t bcount = 0; /* # of times B won in a row */ 1486 1487 /* Do the straightforward thing until (if ever) one run 1488 * appears to win consistently. 1489 */ 1490 for (;;) { 1491 assert(na > 1 && nb > 0); 1492 k = ISLT(*pb, *pa, compare); 1493 if (k) { 1494 if (k < 0) 1495 goto Fail; 1496 *dest++ = *pb++; 1497 ++bcount; 1498 acount = 0; 1499 --nb; 1500 if (nb == 0) 1501 goto Succeed; 1502 if (bcount >= min_gallop) 1503 break; 1504 } 1505 else { 1506 *dest++ = *pa++; 1507 ++acount; 1508 bcount = 0; 1509 --na; 1510 if (na == 1) 1511 goto CopyB; 1512 if (acount >= min_gallop) 1513 break; 1514 } 1515 } 1516 1517 /* One run is winning so consistently that galloping may 1518 * be a huge win. So try that, and continue galloping until 1519 * (if ever) neither run appears to be winning consistently 1520 * anymore. 1521 */ 1522 ++min_gallop; 1523 do { 1524 assert(na > 1 && nb > 0); 1525 min_gallop -= min_gallop > 1; 1526 ms->min_gallop = min_gallop; 1527 k = gallop_right(*pb, pa, na, 0, compare); 1528 acount = k; 1529 if (k) { 1530 if (k < 0) 1531 goto Fail; 1532 memcpy(dest, pa, k * sizeof(PyObject *)); 1533 dest += k; 1534 pa += k; 1535 na -= k; 1536 if (na == 1) 1537 goto CopyB; 1538 /* na==0 is impossible now if the comparison 1539 * function is consistent, but we can't assume 1540 * that it is. 1541 */ 1542 if (na == 0) 1543 goto Succeed; 1544 } 1545 *dest++ = *pb++; 1546 --nb; 1547 if (nb == 0) 1548 goto Succeed; 1549 1550 k = gallop_left(*pa, pb, nb, 0, compare); 1551 bcount = k; 1552 if (k) { 1553 if (k < 0) 1554 goto Fail; 1555 memmove(dest, pb, k * sizeof(PyObject *)); 1556 dest += k; 1557 pb += k; 1558 nb -= k; 1559 if (nb == 0) 1560 goto Succeed; 1561 } 1562 *dest++ = *pa++; 1563 --na; 1564 if (na == 1) 1565 goto CopyB; 1566 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP); 1567 ++min_gallop; /* penalize it for leaving galloping mode */ 1568 ms->min_gallop = min_gallop; 1569 } 1564 1570 Succeed: 1565 1571 result = 0; 1566 1572 Fail: 1567 1568 1569 1573 if (na) 1574 memcpy(dest, pa, na * sizeof(PyObject*)); 1575 return result; 1570 1576 CopyB: 1571 1572 1573 1574 1575 1577 assert(na == 1 && nb > 0); 1578 /* The last element of pa belongs at the end of the merge. */ 1579 memmove(dest, pb, nb * sizeof(PyObject *)); 1580 dest[nb] = *pa; 1581 return 0; 1576 1582 } 1577 1583 … … 1585 1591 merge_hi(MergeState *ms, PyObject **pa, Py_ssize_t na, PyObject **pb, Py_ssize_t nb) 1586 1592 { 1587 1588 1589 1590 int result = -1;/* guilty until proved innocent */1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 Py_ssize_t acount = 0;/* # of times A won in a row */1616 Py_ssize_t bcount = 0;/* # of times B won in a row */1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 ++min_gallop;/* penalize it for leaving galloping mode */1701 1702 1593 Py_ssize_t k; 1594 PyObject *compare; 1595 PyObject **dest; 1596 int result = -1; /* guilty until proved innocent */ 1597 PyObject **basea; 1598 PyObject **baseb; 1599 Py_ssize_t min_gallop; 1600 1601 assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb); 1602 if (MERGE_GETMEM(ms, nb) < 0) 1603 return -1; 1604 dest = pb + nb - 1; 1605 memcpy(ms->a, pb, nb * sizeof(PyObject*)); 1606 basea = pa; 1607 baseb = ms->a; 1608 pb = ms->a + nb - 1; 1609 pa += na - 1; 1610 1611 *dest-- = *pa--; 1612 --na; 1613 if (na == 0) 1614 goto Succeed; 1615 if (nb == 1) 1616 goto CopyA; 1617 1618 min_gallop = ms->min_gallop; 1619 compare = ms->compare; 1620 for (;;) { 1621 Py_ssize_t acount = 0; /* # of times A won in a row */ 1622 Py_ssize_t bcount = 0; /* # of times B won in a row */ 1623 1624 /* Do the straightforward thing until (if ever) one run 1625 * appears to win consistently. 1626 */ 1627 for (;;) { 1628 assert(na > 0 && nb > 1); 1629 k = ISLT(*pb, *pa, compare); 1630 if (k) { 1631 if (k < 0) 1632 goto Fail; 1633 *dest-- = *pa--; 1634 ++acount; 1635 bcount = 0; 1636 --na; 1637 if (na == 0) 1638 goto Succeed; 1639 if (acount >= min_gallop) 1640 break; 1641 } 1642 else { 1643 *dest-- = *pb--; 1644 ++bcount; 1645 acount = 0; 1646 --nb; 1647 if (nb == 1) 1648 goto CopyA; 1649 if (bcount >= min_gallop) 1650 break; 1651 } 1652 } 1653 1654 /* One run is winning so consistently that galloping may 1655 * be a huge win. So try that, and continue galloping until 1656 * (if ever) neither run appears to be winning consistently 1657 * anymore. 1658 */ 1659 ++min_gallop; 1660 do { 1661 assert(na > 0 && nb > 1); 1662 min_gallop -= min_gallop > 1; 1663 ms->min_gallop = min_gallop; 1664 k = gallop_right(*pb, basea, na, na-1, compare); 1665 if (k < 0) 1666 goto Fail; 1667 k = na - k; 1668 acount = k; 1669 if (k) { 1670 dest -= k; 1671 pa -= k; 1672 memmove(dest+1, pa+1, k * sizeof(PyObject *)); 1673 na -= k; 1674 if (na == 0) 1675 goto Succeed; 1676 } 1677 *dest-- = *pb--; 1678 --nb; 1679 if (nb == 1) 1680 goto CopyA; 1681 1682 k = gallop_left(*pa, baseb, nb, nb-1, compare); 1683 if (k < 0) 1684 goto Fail; 1685 k = nb - k; 1686 bcount = k; 1687 if (k) { 1688 dest -= k; 1689 pb -= k; 1690 memcpy(dest+1, pb+1, k * sizeof(PyObject *)); 1691 nb -= k; 1692 if (nb == 1) 1693 goto CopyA; 1694 /* nb==0 is impossible now if the comparison 1695 * function is consistent, but we can't assume 1696 * that it is. 1697 */ 1698 if (nb == 0) 1699 goto Succeed; 1700 } 1701 *dest-- = *pa--; 1702 --na; 1703 if (na == 0) 1704 goto Succeed; 1705 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP); 1706 ++min_gallop; /* penalize it for leaving galloping mode */ 1707 ms->min_gallop = min_gallop; 1708 } 1703 1709 Succeed: 1704 1710 result = 0; 1705 1711 Fail: 1706 1707 1708 1712 if (nb) 1713 memcpy(dest-(nb-1), baseb, nb * sizeof(PyObject*)); 1714 return result; 1709 1715 CopyA: 1710 1711 1712 1713 1714 1715 1716 1716 assert(nb == 1 && na > 0); 1717 /* The first element of pb belongs at the front of the merge. */ 1718 dest -= na; 1719 pa -= na; 1720 memmove(dest+1, pa+1, na * sizeof(PyObject *)); 1721 *dest = *pb; 1722 return 0; 1717 1723 } 1718 1724 … … 1723 1729 merge_at(MergeState *ms, Py_ssize_t i) 1724 1730 { 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1731 PyObject **pa, **pb; 1732 Py_ssize_t na, nb; 1733 Py_ssize_t k; 1734 PyObject *compare; 1735 1736 assert(ms != NULL); 1737 assert(ms->n >= 2); 1738 assert(i >= 0); 1739 assert(i == ms->n - 2 || i == ms->n - 3); 1740 1741 pa = ms->pending[i].base; 1742 na = ms->pending[i].len; 1743 pb = ms->pending[i+1].base; 1744 nb = ms->pending[i+1].len; 1745 assert(na > 0 && nb > 0); 1746 assert(pa + na == pb); 1747 1748 /* Record the length of the combined runs; if i is the 3rd-last 1749 * run now, also slide over the last run (which isn't involved 1750 * in this merge). The current run i+1 goes away in any case. 1751 */ 1752 ms->pending[i].len = na + nb; 1753 if (i == ms->n - 3) 1754 ms->pending[i+1] = ms->pending[i+2]; 1755 --ms->n; 1756 1757 /* Where does b start in a? Elements in a before that can be 1758 * ignored (already in place). 1759 */ 1760 compare = ms->compare; 1761 k = gallop_right(*pb, pa, na, 0, compare); 1762 if (k < 0) 1763 return -1; 1764 pa += k; 1765 na -= k; 1766 if (na == 0) 1767 return 0; 1768 1769 /* Where does a end in b? Elements in b after that can be 1770 * ignored (already in place). 1771 */ 1772 nb = gallop_left(pa[na-1], pb, nb, nb-1, compare); 1773 if (nb <= 0) 1774 return nb; 1775 1776 /* Merge what remains of the runs, using a temp array with 1777 * min(na, nb) elements. 1778 */ 1779 if (na <= nb) 1780 return merge_lo(ms, pa, na, pb, nb); 1781 else 1782 return merge_hi(ms, pa, na, pb, nb); 1777 1783 } 1778 1784 … … 1790 1796 merge_collapse(MergeState *ms) 1791 1797 { 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1798 struct s_slice *p = ms->pending; 1799 1800 assert(ms); 1801 while (ms->n > 1) { 1802 Py_ssize_t n = ms->n - 2; 1803 if (n > 0 && p[n-1].len <= p[n].len + p[n+1].len) { 1804 if (p[n-1].len < p[n+1].len) 1805 --n; 1806 if (merge_at(ms, n) < 0) 1807 return -1; 1808 } 1809 else if (p[n].len <= p[n+1].len) { 1810 if (merge_at(ms, n) < 0) 1811 return -1; 1812 } 1813 else 1814 break; 1815 } 1816 return 0; 1811 1817 } 1812 1818 … … 1819 1825 merge_force_collapse(MergeState *ms) 1820 1826 { 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1827 struct s_slice *p = ms->pending; 1828 1829 assert(ms); 1830 while (ms->n > 1) { 1831 Py_ssize_t n = ms->n - 2; 1832 if (n > 0 && p[n-1].len < p[n+1].len) 1833 --n; 1834 if (merge_at(ms, n) < 0) 1835 return -1; 1836 } 1837 return 0; 1832 1838 } 1833 1839 … … 1845 1851 merge_compute_minrun(Py_ssize_t n) 1846 1852 { 1847 Py_ssize_t r = 0;/* becomes 1 if any 1 bits are shifted off */1848 1849 1850 1851 1852 1853 1854 1853 Py_ssize_t r = 0; /* becomes 1 if any 1 bits are shifted off */ 1854 1855 assert(n >= 0); 1856 while (n >= 64) { 1857 r |= n & 1; 1858 n >>= 1; 1859 } 1860 return n + r; 1855 1861 } 1856 1862 … … 1863 1869 1864 1870 typedef struct { 1865 1866 1867 1871 PyObject_HEAD 1872 PyObject *key; 1873 PyObject *value; 1868 1874 } sortwrapperobject; 1869 1875 … … 1875 1881 1876 1882 static PyTypeObject sortwrapper_type = { 1877 1878 "sortwrapper",/* tp_name */1879 sizeof(sortwrapperobject),/* tp_basicsize */1880 0,/* tp_itemsize */1881 1882 (destructor)sortwrapper_dealloc,/* tp_dealloc */1883 0,/* tp_print */1884 0,/* tp_getattr */1885 0,/* tp_setattr */1886 0,/* tp_compare */1887 0,/* tp_repr */1888 0,/* tp_as_number */1889 0,/* tp_as_sequence */1890 0,/* tp_as_mapping */1891 0,/* tp_hash */1892 0,/* tp_call */1893 0,/* tp_str */1894 PyObject_GenericGetAttr,/* tp_getattro */1895 0,/* tp_setattro */1896 0,/* tp_as_buffer */1897 1898 Py_TPFLAGS_HAVE_RICHCOMPARE,/* tp_flags */1899 sortwrapper_doc,/* tp_doc */1900 0,/* tp_traverse */1901 0,/* tp_clear */1902 (richcmpfunc)sortwrapper_richcompare,/* tp_richcompare */1883 PyVarObject_HEAD_INIT(&PyType_Type, 0) 1884 "sortwrapper", /* tp_name */ 1885 sizeof(sortwrapperobject), /* tp_basicsize */ 1886 0, /* tp_itemsize */ 1887 /* methods */ 1888 (destructor)sortwrapper_dealloc, /* tp_dealloc */ 1889 0, /* tp_print */ 1890 0, /* tp_getattr */ 1891 0, /* tp_setattr */ 1892 0, /* tp_compare */ 1893 0, /* tp_repr */ 1894 0, /* tp_as_number */ 1895 0, /* tp_as_sequence */ 1896 0, /* tp_as_mapping */ 1897 0, /* tp_hash */ 1898 0, /* tp_call */ 1899 0, /* tp_str */ 1900 PyObject_GenericGetAttr, /* tp_getattro */ 1901 0, /* tp_setattro */ 1902 0, /* tp_as_buffer */ 1903 Py_TPFLAGS_DEFAULT | 1904 Py_TPFLAGS_HAVE_RICHCOMPARE, /* tp_flags */ 1905 sortwrapper_doc, /* tp_doc */ 1906 0, /* tp_traverse */ 1907 0, /* tp_clear */ 1908 (richcmpfunc)sortwrapper_richcompare, /* tp_richcompare */ 1903 1909 }; 1904 1910 … … 1907 1913 sortwrapper_richcompare(sortwrapperobject *a, sortwrapperobject *b, int op) 1908 1914 { 1909 1910 1911 1912 1913 1914 1915 if (!PyObject_TypeCheck(b, &sortwrapper_type)) { 1916 PyErr_SetString(PyExc_TypeError, 1917 "expected a sortwrapperobject"); 1918 return NULL; 1919 } 1920 return PyObject_RichCompare(a->key, b->key, op); 1915 1921 } 1916 1922 … … 1918 1924 sortwrapper_dealloc(sortwrapperobject *so) 1919 1925 { 1920 1921 1922 1926 Py_XDECREF(so->key); 1927 Py_XDECREF(so->value); 1928 PyObject_Del(so); 1923 1929 } 1924 1930 … … 1929 1935 build_sortwrapper(PyObject *key, PyObject *value) 1930 1936 { 1931 1932 1933 1934 1935 1936 1937 1938 1937 sortwrapperobject *so; 1938 1939 so = PyObject_New(sortwrapperobject, &sortwrapper_type); 1940 if (so == NULL) 1941 return NULL; 1942 so->key = key; 1943 so->value = value; 1944 return (PyObject *)so; 1939 1945 } 1940 1946 … … 1943 1949 sortwrapper_getvalue(PyObject *so) 1944 1950 { 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1951 PyObject *value; 1952 1953 if (!PyObject_TypeCheck(so, &sortwrapper_type)) { 1954 PyErr_SetString(PyExc_TypeError, 1955 "expected a sortwrapperobject"); 1956 return NULL; 1957 } 1958 value = ((sortwrapperobject *)so)->value; 1959 Py_INCREF(value); 1960 return value; 1955 1961 } 1956 1962 … … 1960 1966 1961 1967 typedef struct { 1962 1963 1968 PyObject_HEAD 1969 PyObject *func; 1964 1970 } cmpwrapperobject; 1965 1971 … … 1967 1973 cmpwrapper_dealloc(cmpwrapperobject *co) 1968 1974 { 1969 1970 1975 Py_XDECREF(co->func); 1976 PyObject_Del(co); 1971 1977 } 1972 1978 … … 1974 1980 cmpwrapper_call(cmpwrapperobject *co, PyObject *args, PyObject *kwds) 1975 1981 { 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1982 PyObject *x, *y, *xx, *yy; 1983 1984 if (!PyArg_UnpackTuple(args, "", 2, 2, &x, &y)) 1985 return NULL; 1986 if (!PyObject_TypeCheck(x, &sortwrapper_type) || 1987 !PyObject_TypeCheck(y, &sortwrapper_type)) { 1988 PyErr_SetString(PyExc_TypeError, 1989 "expected a sortwrapperobject"); 1990 return NULL; 1991 } 1992 xx = ((sortwrapperobject *)x)->key; 1993 yy = ((sortwrapperobject *)y)->key; 1994 return PyObject_CallFunctionObjArgs(co->func, xx, yy, NULL); 1989 1995 } 1990 1996 … … 1992 1998 1993 1999 static PyTypeObject cmpwrapper_type = { 1994 1995 "cmpwrapper",/* tp_name */1996 sizeof(cmpwrapperobject),/* tp_basicsize */1997 0,/* tp_itemsize */1998 1999 (destructor)cmpwrapper_dealloc,/* tp_dealloc */2000 0,/* tp_print */2001 0,/* tp_getattr */2002 0,/* tp_setattr */2003 0,/* tp_compare */2004 0,/* tp_repr */2005 0,/* tp_as_number */2006 0,/* tp_as_sequence */2007 0,/* tp_as_mapping */2008 0,/* tp_hash */2009 (ternaryfunc)cmpwrapper_call,/* tp_call */2010 0,/* tp_str */2011 PyObject_GenericGetAttr,/* tp_getattro */2012 0,/* tp_setattro */2013 0,/* tp_as_buffer */2014 Py_TPFLAGS_DEFAULT,/* tp_flags */2015 cmpwrapper_doc,/* tp_doc */2000 PyVarObject_HEAD_INIT(&PyType_Type, 0) 2001 "cmpwrapper", /* tp_name */ 2002 sizeof(cmpwrapperobject), /* tp_basicsize */ 2003 0, /* tp_itemsize */ 2004 /* methods */ 2005 (destructor)cmpwrapper_dealloc, /* tp_dealloc */ 2006 0, /* tp_print */ 2007 0, /* tp_getattr */ 2008 0, /* tp_setattr */ 2009 0, /* tp_compare */ 2010 0, /* tp_repr */ 2011 0, /* tp_as_number */ 2012 0, /* tp_as_sequence */ 2013 0, /* tp_as_mapping */ 2014 0, /* tp_hash */ 2015 (ternaryfunc)cmpwrapper_call, /* tp_call */ 2016 0, /* tp_str */ 2017 PyObject_GenericGetAttr, /* tp_getattro */ 2018 0, /* tp_setattro */ 2019 0, /* tp_as_buffer */ 2020 Py_TPFLAGS_DEFAULT, /* tp_flags */ 2021 cmpwrapper_doc, /* tp_doc */ 2016 2022 }; 2017 2023 … … 2019 2025 build_cmpwrapper(PyObject *cmpfunc) 2020 2026 { 2021 2022 2023 2024 2025 2026 2027 2028 2027 cmpwrapperobject *co; 2028 2029 co = PyObject_New(cmpwrapperobject, &cmpwrapper_type); 2030 if (co == NULL) 2031 return NULL; 2032 Py_INCREF(cmpfunc); 2033 co->func = cmpfunc; 2034 return (PyObject *)co; 2029 2035 } 2030 2036 … … 2037 2043 listsort(PyListObject *self, PyObject *args, PyObject *kwds) 2038 2044 { 2039 2040 2041 2042 2043 2044 2045 2046 2047 PyObject *result = NULL;/* guilty until proved innocent */2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 if (compare != NULL && 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2045 MergeState ms; 2046 PyObject **lo, **hi; 2047 Py_ssize_t nremaining; 2048 Py_ssize_t minrun; 2049 Py_ssize_t saved_ob_size, saved_allocated; 2050 PyObject **saved_ob_item; 2051 PyObject **final_ob_item; 2052 PyObject *compare = NULL; 2053 PyObject *result = NULL; /* guilty until proved innocent */ 2054 int reverse = 0; 2055 PyObject *keyfunc = NULL; 2056 Py_ssize_t i; 2057 PyObject *key, *value, *kvpair; 2058 static char *kwlist[] = {"cmp", "key", "reverse", 0}; 2059 2060 assert(self != NULL); 2061 assert (PyList_Check(self)); 2062 if (args != NULL) { 2063 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOi:sort", 2064 kwlist, &compare, &keyfunc, &reverse)) 2065 return NULL; 2066 } 2067 if (compare == Py_None) 2068 compare = NULL; 2069 if (compare != NULL && 2070 PyErr_WarnPy3k("the cmp argument is not supported in 3.x", 1) < 0) 2071 return NULL; 2072 if (keyfunc == Py_None) 2073 keyfunc = NULL; 2074 if (compare != NULL && keyfunc != NULL) { 2075 compare = build_cmpwrapper(compare); 2076 if (compare == NULL) 2077 return NULL; 2078 } else 2079 Py_XINCREF(compare); 2080 2081 /* The list is temporarily made empty, so that mutations performed 2082 * by comparison functions can't affect the slice of memory we're 2083 * sorting (allowing mutations during sorting is a core-dump 2084 * factory, since ob_item may change). 2085 */ 2086 saved_ob_size = Py_SIZE(self); 2087 saved_ob_item = self->ob_item; 2088 saved_allocated = self->allocated; 2089 Py_SIZE(self) = 0; 2090 self->ob_item = NULL; 2091 self->allocated = -1; /* any operation will reset it to >= 0 */ 2092 2093 if (keyfunc != NULL) { 2094 for (i=0 ; i < saved_ob_size ; i++) { 2095 value = saved_ob_item[i]; 2096 key = PyObject_CallFunctionObjArgs(keyfunc, value, 2097 NULL); 2098 if (key == NULL) { 2099 for (i=i-1 ; i>=0 ; i--) { 2100 kvpair = saved_ob_item[i]; 2101 value = sortwrapper_getvalue(kvpair); 2102 saved_ob_item[i] = value; 2103 Py_DECREF(kvpair); 2104 } 2105 goto dsu_fail; 2106 } 2107 kvpair = build_sortwrapper(key, value); 2108 if (kvpair == NULL) 2109 goto dsu_fail; 2110 saved_ob_item[i] = kvpair; 2111 } 2112 } 2113 2114 /* Reverse sort stability achieved by initially reversing the list, 2115 applying a stable forward sort, then reversing the final result. */ 2116 if (reverse && saved_ob_size > 1) 2117 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size); 2118 2119 merge_init(&ms, compare); 2120 2121 nremaining = saved_ob_size; 2122 if (nremaining < 2) 2123 goto succeed; 2124 2125 /* March over the array once, left to right, finding natural runs, 2126 * and extending short natural runs to minrun elements. 2127 */ 2128 lo = saved_ob_item; 2129 hi = lo + nremaining; 2130 minrun = merge_compute_minrun(nremaining); 2131 do { 2132 int descending; 2133 Py_ssize_t n; 2134 2135 /* Identify next run. */ 2136 n = count_run(lo, hi, compare, &descending); 2137 if (n < 0) 2138 goto fail; 2139 if (descending) 2140 reverse_slice(lo, lo + n); 2141 /* If short, extend to min(minrun, nremaining). */ 2142 if (n < minrun) { 2143 const Py_ssize_t force = nremaining <= minrun ? 2144 nremaining : minrun; 2145 if (binarysort(lo, lo + force, lo + n, compare) < 0) 2146 goto fail; 2147 n = force; 2148 } 2149 /* Push run onto pending-runs stack, and maybe merge. */ 2150 assert(ms.n < MAX_MERGE_PENDING); 2151 ms.pending[ms.n].base = lo; 2152 ms.pending[ms.n].len = n; 2153 ++ms.n; 2154 if (merge_collapse(&ms) < 0) 2155 goto fail; 2156 /* Advance to find next run. */ 2157 lo += n; 2158 nremaining -= n; 2159 } while (nremaining); 2160 assert(lo == hi); 2161 2162 if (merge_force_collapse(&ms) < 0) 2163 goto fail; 2164 assert(ms.n == 1); 2165 assert(ms.pending[0].base == saved_ob_item); 2166 assert(ms.pending[0].len == saved_ob_size); 2161 2167 2162 2168 succeed: 2163 2169 result = Py_None; 2164 2170 fail: 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2171 if (keyfunc != NULL) { 2172 for (i=0 ; i < saved_ob_size ; i++) { 2173 kvpair = saved_ob_item[i]; 2174 value = sortwrapper_getvalue(kvpair); 2175 saved_ob_item[i] = value; 2176 Py_DECREF(kvpair); 2177 } 2178 } 2179 2180 if (self->allocated != -1 && result != NULL) { 2181 /* The user mucked with the list during the sort, 2182 * and we don't already have another error to report. 2183 */ 2184 PyErr_SetString(PyExc_ValueError, "list modified during sort"); 2185 result = NULL; 2186 } 2187 2188 if (reverse && saved_ob_size > 1) 2189 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size); 2190 2191 merge_freemem(&ms); 2186 2192 2187 2193 dsu_fail: 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2194 final_ob_item = self->ob_item; 2195 i = Py_SIZE(self); 2196 Py_SIZE(self) = saved_ob_size; 2197 self->ob_item = saved_ob_item; 2198 self->allocated = saved_allocated; 2199 if (final_ob_item != NULL) { 2200 /* we cannot use list_clear() for this because it does not 2201 guarantee that the list is really empty when it returns */ 2202 while (--i >= 0) { 2203 Py_XDECREF(final_ob_item[i]); 2204 } 2205 PyMem_FREE(final_ob_item); 2206 } 2207 Py_XDECREF(compare); 2208 Py_XINCREF(result); 2209 return result; 2204 2210 } 2205 2211 #undef IFLT … … 2209 2215 PyList_Sort(PyObject *v) 2210 2216 { 2211 2212 2213 2214 2215 2216 2217 2218 2219 2217 if (v == NULL || !PyList_Check(v)) { 2218 PyErr_BadInternalCall(); 2219 return -1; 2220 } 2221 v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL); 2222 if (v == NULL) 2223 return -1; 2224 Py_DECREF(v); 2225 return 0; 2220 2226 } 2221 2227 … … 2223 2229 listreverse(PyListObject *self) 2224 2230 { 2225 2226 2227 2231 if (Py_SIZE(self) > 1) 2232 reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self)); 2233 Py_RETURN_NONE; 2228 2234 } 2229 2235 … … 2231 2237 PyList_Reverse(PyObject *v) 2232 2238 { 2233 2234 2235 2236 2237 2238 2239 2240 2241 2239 PyListObject *self = (PyListObject *)v; 2240 2241 if (v == NULL || !PyList_Check(v)) { 2242 PyErr_BadInternalCall(); 2243 return -1; 2244 } 2245 if (Py_SIZE(self) > 1) 2246 reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self)); 2247 return 0; 2242 2248 } 2243 2249 … … 2245 2251 PyList_AsTuple(PyObject *v) 2246 2252 { 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2253 PyObject *w; 2254 PyObject **p, **q; 2255 Py_ssize_t n; 2256 if (v == NULL || !PyList_Check(v)) { 2257 PyErr_BadInternalCall(); 2258 return NULL; 2259 } 2260 n = Py_SIZE(v); 2261 w = PyTuple_New(n); 2262 if (w == NULL) 2263 return NULL; 2264 p = ((PyTupleObject *)w)->ob_item; 2265 q = ((PyListObject *)v)->ob_item; 2266 while (--n >= 0) { 2267 Py_INCREF(*q); 2268 *p = *q; 2269 p++; 2270 q++; 2271 } 2272 return w; 2267 2273 } 2268 2274 … … 2270 2276 listindex(PyListObject *self, PyObject *args) 2271 2277 { 2272 Py_ssize_t i, start=0, stop=Py_SIZE(self); 2273 PyObject *v; 2274 2275 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v, 2276 _PyEval_SliceIndex, &start, 2277 _PyEval_SliceIndex, &stop)) 2278 return NULL; 2279 if (start < 0) { 2280 start += Py_SIZE(self); 2281 if (start < 0) 2282 start = 0; 2283 } 2284 if (stop < 0) { 2285 stop += Py_SIZE(self); 2286 if (stop < 0) 2287 stop = 0; 2288 } 2289 for (i = start; i < stop && i < Py_SIZE(self); i++) { 2290 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ); 2291 if (cmp > 0) 2292 return PyInt_FromSsize_t(i); 2293 else if (cmp < 0) 2294 return NULL; 2295 } 2296 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list"); 2297 return NULL; 2278 Py_ssize_t i, start=0, stop=Py_SIZE(self); 2279 PyObject *v, *format_tuple, *err_string; 2280 static PyObject *err_format = NULL; 2281 2282 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v, 2283 _PyEval_SliceIndex, &start, 2284 _PyEval_SliceIndex, &stop)) 2285 return NULL; 2286 if (start < 0) { 2287 start += Py_SIZE(self); 2288 if (start < 0) 2289 start = 0; 2290 } 2291 if (stop < 0) { 2292 stop += Py_SIZE(self); 2293 if (stop < 0) 2294 stop = 0; 2295 } 2296 for (i = start; i < stop && i < Py_SIZE(self); i++) { 2297 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ); 2298 if (cmp > 0) 2299 return PyInt_FromSsize_t(i); 2300 else if (cmp < 0) 2301 return NULL; 2302 } 2303 if (err_format == NULL) { 2304 err_format = PyString_FromString("%r is not in list"); 2305 if (err_format == NULL) 2306 return NULL; 2307 } 2308 format_tuple = PyTuple_Pack(1, v); 2309 if (format_tuple == NULL) 2310 return NULL; 2311 err_string = PyString_Format(err_format, format_tuple); 2312 Py_DECREF(format_tuple); 2313 if (err_string == NULL) 2314 return NULL; 2315 PyErr_SetObject(PyExc_ValueError, err_string); 2316 Py_DECREF(err_string); 2317 return NULL; 2298 2318 } 2299 2319 … … 2301 2321 listcount(PyListObject *self, PyObject *v) 2302 2322 { 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2323 Py_ssize_t count = 0; 2324 Py_ssize_t i; 2325 2326 for (i = 0; i < Py_SIZE(self); i++) { 2327 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ); 2328 if (cmp > 0) 2329 count++; 2330 else if (cmp < 0) 2331 return NULL; 2332 } 2333 return PyInt_FromSsize_t(count); 2314 2334 } 2315 2335 … … 2317 2337 listremove(PyListObject *self, PyObject *v) 2318 2338 { 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2339 Py_ssize_t i; 2340 2341 for (i = 0; i < Py_SIZE(self); i++) { 2342 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ); 2343 if (cmp > 0) { 2344 if (list_ass_slice(self, i, i+1, 2345 (PyObject *)NULL) == 0) 2346 Py_RETURN_NONE; 2347 return NULL; 2348 } 2349 else if (cmp < 0) 2350 return NULL; 2351 } 2352 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list"); 2353 return NULL; 2334 2354 } 2335 2355 … … 2337 2357 list_traverse(PyListObject *o, visitproc visit, void *arg) 2338 2358 { 2339 2340 2341 2342 2343 2359 Py_ssize_t i; 2360 2361 for (i = Py_SIZE(o); --i >= 0; ) 2362 Py_VISIT(o->ob_item[i]); 2363 return 0; 2344 2364 } 2345 2365 … … 2347 2367 list_richcompare(PyObject *v, PyObject *w, int op) 2348 2368 { 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2369 PyListObject *vl, *wl; 2370 Py_ssize_t i; 2371 2372 if (!PyList_Check(v) || !PyList_Check(w)) { 2373 Py_INCREF(Py_NotImplemented); 2374 return Py_NotImplemented; 2375 } 2376 2377 vl = (PyListObject *)v; 2378 wl = (PyListObject *)w; 2379 2380 if (Py_SIZE(vl) != Py_SIZE(wl) && (op == Py_EQ || op == Py_NE)) { 2381 /* Shortcut: if the lengths differ, the lists differ */ 2382 PyObject *res; 2383 if (op == Py_EQ) 2384 res = Py_False; 2385 else 2386 res = Py_True; 2387 Py_INCREF(res); 2388 return res; 2389 } 2390 2391 /* Search for the first index where items are different */ 2392 for (i = 0; i < Py_SIZE(vl) && i < Py_SIZE(wl); i++) { 2393 int k = PyObject_RichCompareBool(vl->ob_item[i], 2394 wl->ob_item[i], Py_EQ); 2395 if (k < 0) 2396 return NULL; 2397 if (!k) 2398 break; 2399 } 2400 2401 if (i >= Py_SIZE(vl) || i >= Py_SIZE(wl)) { 2402 /* No more items to compare -- compare sizes */ 2403 Py_ssize_t vs = Py_SIZE(vl); 2404 Py_ssize_t ws = Py_SIZE(wl); 2405 int cmp; 2406 PyObject *res; 2407 switch (op) { 2408 case Py_LT: cmp = vs < ws; break; 2409 case Py_LE: cmp = vs <= ws; break; 2410 case Py_EQ: cmp = vs == ws; break; 2411 case Py_NE: cmp = vs != ws; break; 2412 case Py_GT: cmp = vs > ws; break; 2413 case Py_GE: cmp = vs >= ws; break; 2414 default: return NULL; /* cannot happen */ 2415 } 2416 if (cmp) 2417 res = Py_True; 2418 else 2419 res = Py_False; 2420 Py_INCREF(res); 2421 return res; 2422 } 2423 2424 /* We have an item that differs -- shortcuts for EQ/NE */ 2425 if (op == Py_EQ) { 2426 Py_INCREF(Py_False); 2427 return Py_False; 2428 } 2429 if (op == Py_NE) { 2430 Py_INCREF(Py_True); 2431 return Py_True; 2432 } 2433 2434 /* Compare the final item again using the proper operator */ 2435 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op); 2416 2436 } 2417 2437 … … 2419 2439 list_init(PyListObject *self, PyObject *args, PyObject *kw) 2420 2440 { 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2441 PyObject *arg = NULL; 2442 static char *kwlist[] = {"sequence", 0}; 2443 2444 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg)) 2445 return -1; 2446 2447 /* Verify list invariants established by PyType_GenericAlloc() */ 2448 assert(0 <= Py_SIZE(self)); 2449 assert(Py_SIZE(self) <= self->allocated || self->allocated == -1); 2450 assert(self->ob_item != NULL || 2451 self->allocated == 0 || self->allocated == -1); 2452 2453 /* Empty previous contents */ 2454 if (self->ob_item != NULL) { 2455 (void)list_clear(self); 2456 } 2457 if (arg != NULL) { 2458 PyObject *rv = listextend(self, arg); 2459 if (rv == NULL) 2460 return -1; 2461 Py_DECREF(rv); 2462 } 2463 return 0; 2444 2464 } 2445 2465 … … 2447 2467 list_sizeof(PyListObject *self) 2448 2468 { 2449 2450 2451 2452 2469 Py_ssize_t res; 2470 2471 res = sizeof(PyListObject) + self->allocated * sizeof(void*); 2472 return PyInt_FromSsize_t(res); 2453 2473 } 2454 2474 … … 2488 2508 2489 2509 static PyMethodDef list_methods[] = { 2490 2491 2492 2493 {"append",(PyCFunction)listappend, METH_O, append_doc},2494 {"insert",(PyCFunction)listinsert, METH_VARARGS, insert_doc},2495 2496 {"pop", (PyCFunction)listpop,METH_VARARGS, pop_doc},2497 {"remove",(PyCFunction)listremove, METH_O, remove_doc},2498 {"index",(PyCFunction)listindex, METH_VARARGS, index_doc},2499 {"count",(PyCFunction)listcount, METH_O, count_doc},2500 {"reverse",(PyCFunction)listreverse, METH_NOARGS, reverse_doc},2501 {"sort", (PyCFunction)listsort,METH_VARARGS | METH_KEYWORDS, sort_doc},2502 {NULL, NULL}/* sentinel */2510 {"__getitem__", (PyCFunction)list_subscript, METH_O|METH_COEXIST, getitem_doc}, 2511 {"__reversed__",(PyCFunction)list_reversed, METH_NOARGS, reversed_doc}, 2512 {"__sizeof__", (PyCFunction)list_sizeof, METH_NOARGS, sizeof_doc}, 2513 {"append", (PyCFunction)listappend, METH_O, append_doc}, 2514 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc}, 2515 {"extend", (PyCFunction)listextend, METH_O, extend_doc}, 2516 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc}, 2517 {"remove", (PyCFunction)listremove, METH_O, remove_doc}, 2518 {"index", (PyCFunction)listindex, METH_VARARGS, index_doc}, 2519 {"count", (PyCFunction)listcount, METH_O, count_doc}, 2520 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc}, 2521 {"sort", (PyCFunction)listsort, METH_VARARGS | METH_KEYWORDS, sort_doc}, 2522 {NULL, NULL} /* sentinel */ 2503 2523 }; 2504 2524 2505 2525 static PySequenceMethods list_as_sequence = { 2506 (lenfunc)list_length,/* sq_length */2507 (binaryfunc)list_concat,/* sq_concat */2508 (ssizeargfunc)list_repeat,/* sq_repeat */2509 (ssizeargfunc)list_item,/* sq_item */2510 (ssizessizeargfunc)list_slice,/* sq_slice */2511 (ssizeobjargproc)list_ass_item,/* sq_ass_item */2512 (ssizessizeobjargproc)list_ass_slice,/* sq_ass_slice */2513 (objobjproc)list_contains,/* sq_contains */2514 (binaryfunc)list_inplace_concat,/* sq_inplace_concat */2515 (ssizeargfunc)list_inplace_repeat,/* sq_inplace_repeat */2526 (lenfunc)list_length, /* sq_length */ 2527 (binaryfunc)list_concat, /* sq_concat */ 2528 (ssizeargfunc)list_repeat, /* sq_repeat */ 2529 (ssizeargfunc)list_item, /* sq_item */ 2530 (ssizessizeargfunc)list_slice, /* sq_slice */ 2531 (ssizeobjargproc)list_ass_item, /* sq_ass_item */ 2532 (ssizessizeobjargproc)list_ass_slice, /* sq_ass_slice */ 2533 (objobjproc)list_contains, /* sq_contains */ 2534 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */ 2535 (ssizeargfunc)list_inplace_repeat, /* sq_inplace_repeat */ 2516 2536 }; 2517 2537 … … 2524 2544 list_subscript(PyListObject* self, PyObject* item) 2525 2545 { 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2546 if (PyIndex_Check(item)) { 2547 Py_ssize_t i; 2548 i = PyNumber_AsSsize_t(item, PyExc_IndexError); 2549 if (i == -1 && PyErr_Occurred()) 2550 return NULL; 2551 if (i < 0) 2552 i += PyList_GET_SIZE(self); 2553 return list_item(self, i); 2554 } 2555 else if (PySlice_Check(item)) { 2556 Py_ssize_t start, stop, step, slicelength, cur, i; 2557 PyObject* result; 2558 PyObject* it; 2559 PyObject **src, **dest; 2560 2561 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self), 2562 &start, &stop, &step, &slicelength) < 0) { 2563 return NULL; 2564 } 2565 2566 if (slicelength <= 0) { 2567 return PyList_New(0); 2568 } 2569 else if (step == 1) { 2570 return list_slice(self, start, stop); 2571 } 2572 else { 2573 result = PyList_New(slicelength); 2574 if (!result) return NULL; 2575 2576 src = self->ob_item; 2577 dest = ((PyListObject *)result)->ob_item; 2578 for (cur = start, i = 0; i < slicelength; 2579 cur += step, i++) { 2580 it = src[cur]; 2581 Py_INCREF(it); 2582 dest[i] = it; 2583 } 2584 2585 return result; 2586 } 2587 } 2588 else { 2589 PyErr_Format(PyExc_TypeError, 2590 "list indices must be integers, not %.200s", 2591 item->ob_type->tp_name); 2592 return NULL; 2593 } 2574 2594 } 2575 2595 … … 2577 2597 list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value) 2578 2598 { 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 (Py_SIZE(self) - cur) * 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2599 if (PyIndex_Check(item)) { 2600 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); 2601 if (i == -1 && PyErr_Occurred()) 2602 return -1; 2603 if (i < 0) 2604 i += PyList_GET_SIZE(self); 2605 return list_ass_item(self, i, value); 2606 } 2607 else if (PySlice_Check(item)) { 2608 Py_ssize_t start, stop, step, slicelength; 2609 2610 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self), 2611 &start, &stop, &step, &slicelength) < 0) { 2612 return -1; 2613 } 2614 2615 if (step == 1) 2616 return list_ass_slice(self, start, stop, value); 2617 2618 /* Make sure s[5:2] = [..] inserts at the right place: 2619 before 5, not before 2. */ 2620 if ((step < 0 && start < stop) || 2621 (step > 0 && start > stop)) 2622 stop = start; 2623 2624 if (value == NULL) { 2625 /* delete slice */ 2626 PyObject **garbage; 2627 size_t cur; 2628 Py_ssize_t i; 2629 2630 if (slicelength <= 0) 2631 return 0; 2632 2633 if (step < 0) { 2634 stop = start + 1; 2635 start = stop + step*(slicelength - 1) - 1; 2636 step = -step; 2637 } 2638 2639 assert((size_t)slicelength <= 2640 PY_SIZE_MAX / sizeof(PyObject*)); 2641 2642 garbage = (PyObject**) 2643 PyMem_MALLOC(slicelength*sizeof(PyObject*)); 2644 if (!garbage) { 2645 PyErr_NoMemory(); 2646 return -1; 2647 } 2648 2649 /* drawing pictures might help understand these for 2650 loops. Basically, we memmove the parts of the 2651 list that are *not* part of the slice: step-1 2652 items for each item that is part of the slice, 2653 and then tail end of the list that was not 2654 covered by the slice */ 2655 for (cur = start, i = 0; 2656 cur < (size_t)stop; 2657 cur += step, i++) { 2658 Py_ssize_t lim = step - 1; 2659 2660 garbage[i] = PyList_GET_ITEM(self, cur); 2661 2662 if (cur + step >= (size_t)Py_SIZE(self)) { 2663 lim = Py_SIZE(self) - cur - 1; 2664 } 2665 2666 memmove(self->ob_item + cur - i, 2667 self->ob_item + cur + 1, 2668 lim * sizeof(PyObject *)); 2669 } 2670 cur = start + slicelength*step; 2671 if (cur < (size_t)Py_SIZE(self)) { 2672 memmove(self->ob_item + cur - slicelength, 2673 self->ob_item + cur, 2674 (Py_SIZE(self) - cur) * 2675 sizeof(PyObject *)); 2676 } 2677 2678 Py_SIZE(self) -= slicelength; 2679 list_resize(self, Py_SIZE(self)); 2680 2681 for (i = 0; i < slicelength; i++) { 2682 Py_DECREF(garbage[i]); 2683 } 2684 PyMem_FREE(garbage); 2685 2686 return 0; 2687 } 2688 else { 2689 /* assign slice */ 2690 PyObject *ins, *seq; 2691 PyObject **garbage, **seqitems, **selfitems; 2692 Py_ssize_t cur, i; 2693 2694 /* protect against a[::-1] = a */ 2695 if (self == (PyListObject*)value) { 2696 seq = list_slice((PyListObject*)value, 0, 2697 PyList_GET_SIZE(value)); 2698 } 2699 else { 2700 seq = PySequence_Fast(value, 2701 "must assign iterable " 2702 "to extended slice"); 2703 } 2704 if (!seq) 2705 return -1; 2706 2707 if (PySequence_Fast_GET_SIZE(seq) != slicelength) { 2708 PyErr_Format(PyExc_ValueError, 2709 "attempt to assign sequence of " 2710 "size %zd to extended slice of " 2711 "size %zd", 2712 PySequence_Fast_GET_SIZE(seq), 2713 slicelength); 2714 Py_DECREF(seq); 2715 return -1; 2716 } 2717 2718 if (!slicelength) { 2719 Py_DECREF(seq); 2720 return 0; 2721 } 2722 2723 garbage = (PyObject**) 2724 PyMem_MALLOC(slicelength*sizeof(PyObject*)); 2725 if (!garbage) { 2726 Py_DECREF(seq); 2727 PyErr_NoMemory(); 2728 return -1; 2729 } 2730 2731 selfitems = self->ob_item; 2732 seqitems = PySequence_Fast_ITEMS(seq); 2733 for (cur = start, i = 0; i < slicelength; 2734 cur += step, i++) { 2735 garbage[i] = selfitems[cur]; 2736 ins = seqitems[i]; 2737 Py_INCREF(ins); 2738 selfitems[cur] = ins; 2739 } 2740 2741 for (i = 0; i < slicelength; i++) { 2742 Py_DECREF(garbage[i]); 2743 } 2744 2745 PyMem_FREE(garbage); 2746 Py_DECREF(seq); 2747 2748 return 0; 2749 } 2750 } 2751 else { 2752 PyErr_Format(PyExc_TypeError, 2753 "list indices must be integers, not %.200s", 2754 item->ob_type->tp_name); 2755 return -1; 2756 } 2737 2757 } 2738 2758 2739 2759 static PyMappingMethods list_as_mapping = { 2740 2741 2742 2760 (lenfunc)list_length, 2761 (binaryfunc)list_subscript, 2762 (objobjargproc)list_ass_subscript 2743 2763 }; 2744 2764 2745 2765 PyTypeObject PyList_Type = { 2746 2747 2748 2749 2750 (destructor)list_dealloc,/* tp_dealloc */2751 (printfunc)list_print,/* tp_print */2752 0,/* tp_getattr */2753 0,/* tp_setattr */2754 0,/* tp_compare */2755 (reprfunc)list_repr,/* tp_repr */2756 0,/* tp_as_number */2757 &list_as_sequence,/* tp_as_sequence */2758 &list_as_mapping,/* tp_as_mapping */2759 (hashfunc)PyObject_HashNotImplemented,/* tp_hash */2760 0,/* tp_call */2761 0,/* tp_str */2762 PyObject_GenericGetAttr,/* tp_getattro */2763 0,/* tp_setattro */2764 0,/* tp_as_buffer */2765 2766 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS,/* tp_flags */2767 list_doc,/* tp_doc */2768 (traverseproc)list_traverse,/* tp_traverse */2769 (inquiry)list_clear,/* tp_clear */2770 list_richcompare,/* tp_richcompare */2771 0,/* tp_weaklistoffset */2772 list_iter,/* tp_iter */2773 0,/* tp_iternext */2774 list_methods,/* tp_methods */2775 0,/* tp_members */2776 0,/* tp_getset */2777 0,/* tp_base */2778 0,/* tp_dict */2779 0,/* tp_descr_get */2780 0,/* tp_descr_set */2781 0,/* tp_dictoffset */2782 (initproc)list_init,/* tp_init */2783 PyType_GenericAlloc,/* tp_alloc */2784 PyType_GenericNew,/* tp_new */2785 PyObject_GC_Del,/* tp_free */2766 PyVarObject_HEAD_INIT(&PyType_Type, 0) 2767 "list", 2768 sizeof(PyListObject), 2769 0, 2770 (destructor)list_dealloc, /* tp_dealloc */ 2771 (printfunc)list_print, /* tp_print */ 2772 0, /* tp_getattr */ 2773 0, /* tp_setattr */ 2774 0, /* tp_compare */ 2775 (reprfunc)list_repr, /* tp_repr */ 2776 0, /* tp_as_number */ 2777 &list_as_sequence, /* tp_as_sequence */ 2778 &list_as_mapping, /* tp_as_mapping */ 2779 (hashfunc)PyObject_HashNotImplemented, /* tp_hash */ 2780 0, /* tp_call */ 2781 0, /* tp_str */ 2782 PyObject_GenericGetAttr, /* tp_getattro */ 2783 0, /* tp_setattro */ 2784 0, /* tp_as_buffer */ 2785 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | 2786 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS, /* tp_flags */ 2787 list_doc, /* tp_doc */ 2788 (traverseproc)list_traverse, /* tp_traverse */ 2789 (inquiry)list_clear, /* tp_clear */ 2790 list_richcompare, /* tp_richcompare */ 2791 0, /* tp_weaklistoffset */ 2792 list_iter, /* tp_iter */ 2793 0, /* tp_iternext */ 2794 list_methods, /* tp_methods */ 2795 0, /* tp_members */ 2796 0, /* tp_getset */ 2797 0, /* tp_base */ 2798 0, /* tp_dict */ 2799 0, /* tp_descr_get */ 2800 0, /* tp_descr_set */ 2801 0, /* tp_dictoffset */ 2802 (initproc)list_init, /* tp_init */ 2803 PyType_GenericAlloc, /* tp_alloc */ 2804 PyType_GenericNew, /* tp_new */ 2805 PyObject_GC_Del, /* tp_free */ 2786 2806 }; 2787 2807 … … 2790 2810 2791 2811 typedef struct { 2792 2793 2794 2812 PyObject_HEAD 2813 long it_index; 2814 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */ 2795 2815 } listiterobject; 2796 2816 … … 2804 2824 2805 2825 static PyMethodDef listiter_methods[] = { 2806 2807 {NULL, NULL}/* sentinel */2826 {"__length_hint__", (PyCFunction)listiter_len, METH_NOARGS, length_hint_doc}, 2827 {NULL, NULL} /* sentinel */ 2808 2828 }; 2809 2829 2810 2830 PyTypeObject PyListIter_Type = { 2811 2812 "listiterator",/* tp_name */2813 sizeof(listiterobject),/* tp_basicsize */2814 0,/* tp_itemsize */2815 2816 (destructor)listiter_dealloc,/* tp_dealloc */2817 0,/* tp_print */2818 0,/* tp_getattr */2819 0,/* tp_setattr */2820 0,/* tp_compare */2821 0,/* tp_repr */2822 0,/* tp_as_number */2823 0,/* tp_as_sequence */2824 0,/* tp_as_mapping */2825 0,/* tp_hash */2826 0,/* tp_call */2827 0,/* tp_str */2828 PyObject_GenericGetAttr,/* tp_getattro */2829 0,/* tp_setattro */2830 0,/* tp_as_buffer */2831 2832 0,/* tp_doc */2833 (traverseproc)listiter_traverse,/* tp_traverse */2834 0,/* tp_clear */2835 0,/* tp_richcompare */2836 0,/* tp_weaklistoffset */2837 PyObject_SelfIter,/* tp_iter */2838 (iternextfunc)listiter_next,/* tp_iternext */2839 listiter_methods,/* tp_methods */2840 0,/* tp_members */2831 PyVarObject_HEAD_INIT(&PyType_Type, 0) 2832 "listiterator", /* tp_name */ 2833 sizeof(listiterobject), /* tp_basicsize */ 2834 0, /* tp_itemsize */ 2835 /* methods */ 2836 (destructor)listiter_dealloc, /* tp_dealloc */ 2837 0, /* tp_print */ 2838 0, /* tp_getattr */ 2839 0, /* tp_setattr */ 2840 0, /* tp_compare */ 2841 0, /* tp_repr */ 2842 0, /* tp_as_number */ 2843 0, /* tp_as_sequence */ 2844 0, /* tp_as_mapping */ 2845 0, /* tp_hash */ 2846 0, /* tp_call */ 2847 0, /* tp_str */ 2848 PyObject_GenericGetAttr, /* tp_getattro */ 2849 0, /* tp_setattro */ 2850 0, /* tp_as_buffer */ 2851 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ 2852 0, /* tp_doc */ 2853 (traverseproc)listiter_traverse, /* tp_traverse */ 2854 0, /* tp_clear */ 2855 0, /* tp_richcompare */ 2856 0, /* tp_weaklistoffset */ 2857 PyObject_SelfIter, /* tp_iter */ 2858 (iternextfunc)listiter_next, /* tp_iternext */ 2859 listiter_methods, /* tp_methods */ 2860 0, /* tp_members */ 2841 2861 }; 2842 2862 … … 2845 2865 list_iter(PyObject *seq) 2846 2866 { 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2867 listiterobject *it; 2868 2869 if (!PyList_Check(seq)) { 2870 PyErr_BadInternalCall(); 2871 return NULL; 2872 } 2873 it = PyObject_GC_New(listiterobject, &PyListIter_Type); 2874 if (it == NULL) 2875 return NULL; 2876 it->it_index = 0; 2877 Py_INCREF(seq); 2878 it->it_seq = (PyListObject *)seq; 2879 _PyObject_GC_TRACK(it); 2880 return (PyObject *)it; 2861 2881 } 2862 2882 … … 2864 2884 listiter_dealloc(listiterobject *it) 2865 2885 { 2866 2867 2868 2886 _PyObject_GC_UNTRACK(it); 2887 Py_XDECREF(it->it_seq); 2888 PyObject_GC_Del(it); 2869 2889 } 2870 2890 … … 2872 2892 listiter_traverse(listiterobject *it, visitproc visit, void *arg) 2873 2893 { 2874 2875 2894 Py_VISIT(it->it_seq); 2895 return 0; 2876 2896 } 2877 2897 … … 2879 2899 listiter_next(listiterobject *it) 2880 2900 { 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2901 PyListObject *seq; 2902 PyObject *item; 2903 2904 assert(it != NULL); 2905 seq = it->it_seq; 2906 if (seq == NULL) 2907 return NULL; 2908 assert(PyList_Check(seq)); 2909 2910 if (it->it_index < PyList_GET_SIZE(seq)) { 2911 item = PyList_GET_ITEM(seq, it->it_index); 2912 ++it->it_index; 2913 Py_INCREF(item); 2914 return item; 2915 } 2916 2917 Py_DECREF(seq); 2918 it->it_seq = NULL; 2919 return NULL; 2900 2920 } 2901 2921 … … 2903 2923 listiter_len(listiterobject *it) 2904 2924 { 2905 2906 2907 2908 2909 2910 2911 2925 Py_ssize_t len; 2926 if (it->it_seq) { 2927 len = PyList_GET_SIZE(it->it_seq) - it->it_index; 2928 if (len >= 0) 2929 return PyInt_FromSsize_t(len); 2930 } 2931 return PyInt_FromLong(0); 2912 2932 } 2913 2933 /*********************** List Reverse Iterator **************************/ 2914 2934 2915 2935 typedef struct { 2916 2917 2918 2936 PyObject_HEAD 2937 Py_ssize_t it_index; 2938 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */ 2919 2939 } listreviterobject; 2920 2940 … … 2926 2946 2927 2947 static PyMethodDef listreviter_methods[] = { 2928 2929 {NULL, NULL}/* sentinel */2948 {"__length_hint__", (PyCFunction)listreviter_len, METH_NOARGS, length_hint_doc}, 2949 {NULL, NULL} /* sentinel */ 2930 2950 }; 2931 2951 2932 2952 PyTypeObject PyListRevIter_Type = { 2933 2934 "listreverseiterator",/* tp_name */2935 sizeof(listreviterobject),/* tp_basicsize */2936 0,/* tp_itemsize */2937 2938 (destructor)listreviter_dealloc,/* tp_dealloc */2939 0,/* tp_print */2940 0,/* tp_getattr */2941 0,/* tp_setattr */2942 0,/* tp_compare */2943 0,/* tp_repr */2944 0,/* tp_as_number */2945 0,/* tp_as_sequence */2946 0,/* tp_as_mapping */2947 0,/* tp_hash */2948 0,/* tp_call */2949 0,/* tp_str */2950 PyObject_GenericGetAttr,/* tp_getattro */2951 0,/* tp_setattro */2952 0,/* tp_as_buffer */2953 2954 0,/* tp_doc */2955 (traverseproc)listreviter_traverse,/* tp_traverse */2956 0,/* tp_clear */2957 0,/* tp_richcompare */2958 0,/* tp_weaklistoffset */2959 PyObject_SelfIter,/* tp_iter */2960 (iternextfunc)listreviter_next,/* tp_iternext */2961 listreviter_methods,/* tp_methods */2962 2953 PyVarObject_HEAD_INIT(&PyType_Type, 0) 2954 "listreverseiterator", /* tp_name */ 2955 sizeof(listreviterobject), /* tp_basicsize */ 2956 0, /* tp_itemsize */ 2957 /* methods */ 2958 (destructor)listreviter_dealloc, /* tp_dealloc */ 2959 0, /* tp_print */ 2960 0, /* tp_getattr */ 2961 0, /* tp_setattr */ 2962 0, /* tp_compare */ 2963 0, /* tp_repr */ 2964 0, /* tp_as_number */ 2965 0, /* tp_as_sequence */ 2966 0, /* tp_as_mapping */ 2967 0, /* tp_hash */ 2968 0, /* tp_call */ 2969 0, /* tp_str */ 2970 PyObject_GenericGetAttr, /* tp_getattro */ 2971 0, /* tp_setattro */ 2972 0, /* tp_as_buffer */ 2973 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ 2974 0, /* tp_doc */ 2975 (traverseproc)listreviter_traverse, /* tp_traverse */ 2976 0, /* tp_clear */ 2977 0, /* tp_richcompare */ 2978 0, /* tp_weaklistoffset */ 2979 PyObject_SelfIter, /* tp_iter */ 2980 (iternextfunc)listreviter_next, /* tp_iternext */ 2981 listreviter_methods, /* tp_methods */ 2982 0, 2963 2983 }; 2964 2984 … … 2966 2986 list_reversed(PyListObject *seq, PyObject *unused) 2967 2987 { 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2988 listreviterobject *it; 2989 2990 it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type); 2991 if (it == NULL) 2992 return NULL; 2993 assert(PyList_Check(seq)); 2994 it->it_index = PyList_GET_SIZE(seq) - 1; 2995 Py_INCREF(seq); 2996 it->it_seq = seq; 2997 PyObject_GC_Track(it); 2998 return (PyObject *)it; 2979 2999 } 2980 3000 … … 2982 3002 listreviter_dealloc(listreviterobject *it) 2983 3003 { 2984 2985 2986 3004 PyObject_GC_UnTrack(it); 3005 Py_XDECREF(it->it_seq); 3006 PyObject_GC_Del(it); 2987 3007 } 2988 3008 … … 2990 3010 listreviter_traverse(listreviterobject *it, visitproc visit, void *arg) 2991 3011 { 2992 2993 3012 Py_VISIT(it->it_seq); 3013 return 0; 2994 3014 } 2995 3015 … … 2997 3017 listreviter_next(listreviterobject *it) 2998 3018 { 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3019 PyObject *item; 3020 Py_ssize_t index = it->it_index; 3021 PyListObject *seq = it->it_seq; 3022 3023 if (index>=0 && index < PyList_GET_SIZE(seq)) { 3024 item = PyList_GET_ITEM(seq, index); 3025 it->it_index--; 3026 Py_INCREF(item); 3027 return item; 3028 } 3029 it->it_index = -1; 3030 if (seq != NULL) { 3031 it->it_seq = NULL; 3032 Py_DECREF(seq); 3033 } 3034 return NULL; 3015 3035 } 3016 3036 … … 3018 3038 listreviter_len(listreviterobject *it) 3019 3039 { 3020 3021 3022 3023 3024 } 3040 Py_ssize_t len = it->it_index + 1; 3041 if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len) 3042 len = 0; 3043 return PyLong_FromSsize_t(len); 3044 }
Note:
See TracChangeset
for help on using the changeset viewer.