Changeset 388 for python/vendor/current/Objects/abstract.c
- Timestamp:
- Mar 19, 2014, 11:11:30 AM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
python/vendor/current/Objects/abstract.c
r2 r388 7 7 8 8 #define NEW_STYLE_NUMBER(o) PyType_HasFeature((o)->ob_type, \ 9 9 Py_TPFLAGS_CHECKTYPES) 10 10 11 11 … … 15 15 type_error(const char *msg, PyObject *obj) 16 16 { 17 18 17 PyErr_Format(PyExc_TypeError, msg, obj->ob_type->tp_name); 18 return NULL; 19 19 } 20 20 … … 22 22 null_error(void) 23 23 { 24 25 26 27 24 if (!PyErr_Occurred()) 25 PyErr_SetString(PyExc_SystemError, 26 "null argument to internal routine"); 27 return NULL; 28 28 } 29 29 … … 33 33 PyObject_Cmp(PyObject *o1, PyObject *o2, int *result) 34 34 { 35 36 37 38 39 40 41 42 43 44 45 35 int r; 36 37 if (o1 == NULL || o2 == NULL) { 38 null_error(); 39 return -1; 40 } 41 r = PyObject_Compare(o1, o2); 42 if (PyErr_Occurred()) 43 return -1; 44 *result = r; 45 return 0; 46 46 } 47 47 … … 49 49 PyObject_Type(PyObject *o) 50 50 { 51 52 53 54 55 56 57 51 PyObject *v; 52 53 if (o == NULL) 54 return null_error(); 55 v = (PyObject *)o->ob_type; 56 Py_INCREF(v); 57 return v; 58 58 } 59 59 … … 61 61 PyObject_Size(PyObject *o) 62 62 { 63 64 65 66 67 68 69 70 71 72 73 74 63 PySequenceMethods *m; 64 65 if (o == NULL) { 66 null_error(); 67 return -1; 68 } 69 70 m = o->ob_type->tp_as_sequence; 71 if (m && m->sq_length) 72 return m->sq_length(o); 73 74 return PyMapping_Size(o); 75 75 } 76 76 … … 79 79 PyObject_Length(PyObject *o) 80 80 { 81 81 return PyObject_Size(o); 82 82 } 83 83 #define PyObject_Length PyObject_Size … … 93 93 _PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue) 94 94 { 95 static PyObject *hintstrobj = NULL; 96 PyObject *ro; 97 Py_ssize_t rv; 98 99 /* try o.__len__() */ 100 rv = PyObject_Size(o); 101 if (rv >= 0) 102 return rv; 103 if (PyErr_Occurred()) { 104 if (!PyErr_ExceptionMatches(PyExc_TypeError) && 105 !PyErr_ExceptionMatches(PyExc_AttributeError)) 106 return -1; 107 PyErr_Clear(); 108 } 109 110 /* cache a hashed version of the attribute string */ 111 if (hintstrobj == NULL) { 112 hintstrobj = PyString_InternFromString("__length_hint__"); 113 if (hintstrobj == NULL) 114 return -1; 115 } 116 117 /* try o.__length_hint__() */ 118 ro = PyObject_CallMethodObjArgs(o, hintstrobj, NULL); 119 if (ro == NULL) { 120 if (!PyErr_ExceptionMatches(PyExc_TypeError) && 121 !PyErr_ExceptionMatches(PyExc_AttributeError)) 122 return -1; 123 PyErr_Clear(); 124 return defaultvalue; 125 } 126 rv = PyLong_Check(ro) ? PyLong_AsSsize_t(ro) : defaultvalue; 127 Py_DECREF(ro); 128 return rv; 95 static PyObject *hintstrobj = NULL; 96 PyObject *ro, *hintmeth; 97 Py_ssize_t rv; 98 99 /* try o.__len__() */ 100 rv = PyObject_Size(o); 101 if (rv >= 0) 102 return rv; 103 if (PyErr_Occurred()) { 104 if (!PyErr_ExceptionMatches(PyExc_TypeError) && 105 !PyErr_ExceptionMatches(PyExc_AttributeError)) 106 return -1; 107 PyErr_Clear(); 108 } 109 110 if (PyInstance_Check(o)) 111 return defaultvalue; 112 /* try o.__length_hint__() */ 113 hintmeth = _PyObject_LookupSpecial(o, "__length_hint__", &hintstrobj); 114 if (hintmeth == NULL) { 115 if (PyErr_Occurred()) 116 return -1; 117 else 118 return defaultvalue; 119 } 120 ro = PyObject_CallFunctionObjArgs(hintmeth, NULL); 121 Py_DECREF(hintmeth); 122 if (ro == NULL) { 123 if (!PyErr_ExceptionMatches(PyExc_TypeError) && 124 !PyErr_ExceptionMatches(PyExc_AttributeError)) 125 return -1; 126 PyErr_Clear(); 127 return defaultvalue; 128 } 129 rv = PyNumber_Check(ro) ? PyInt_AsSsize_t(ro) : defaultvalue; 130 Py_DECREF(ro); 131 return rv; 129 132 } 130 133 … … 132 135 PyObject_GetItem(PyObject *o, PyObject *key) 133 136 { 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 return type_error("'%.200s' object is unsubscriptable", o);137 PyMappingMethods *m; 138 139 if (o == NULL || key == NULL) 140 return null_error(); 141 142 m = o->ob_type->tp_as_mapping; 143 if (m && m->mp_subscript) 144 return m->mp_subscript(o, key); 145 146 if (o->ob_type->tp_as_sequence) { 147 if (PyIndex_Check(key)) { 148 Py_ssize_t key_value; 149 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError); 150 if (key_value == -1 && PyErr_Occurred()) 151 return NULL; 152 return PySequence_GetItem(o, key_value); 153 } 154 else if (o->ob_type->tp_as_sequence->sq_item) 155 return type_error("sequence index must " 156 "be integer, not '%.200s'", key); 157 } 158 159 return type_error("'%.200s' object has no attribute '__getitem__'", o); 157 160 } 158 161 … … 160 163 PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value) 161 164 { 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 165 PyMappingMethods *m; 166 167 if (o == NULL || key == NULL || value == NULL) { 168 null_error(); 169 return -1; 170 } 171 m = o->ob_type->tp_as_mapping; 172 if (m && m->mp_ass_subscript) 173 return m->mp_ass_subscript(o, key, value); 174 175 if (o->ob_type->tp_as_sequence) { 176 if (PyIndex_Check(key)) { 177 Py_ssize_t key_value; 178 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError); 179 if (key_value == -1 && PyErr_Occurred()) 180 return -1; 181 return PySequence_SetItem(o, key_value, value); 182 } 183 else if (o->ob_type->tp_as_sequence->sq_ass_item) { 184 type_error("sequence index must be " 185 "integer, not '%.200s'", key); 186 return -1; 187 } 188 } 189 190 type_error("'%.200s' object does not support item assignment", o); 191 return -1; 189 192 } 190 193 … … 192 195 PyObject_DelItem(PyObject *o, PyObject *key) 193 196 { 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 197 PyMappingMethods *m; 198 199 if (o == NULL || key == NULL) { 200 null_error(); 201 return -1; 202 } 203 m = o->ob_type->tp_as_mapping; 204 if (m && m->mp_ass_subscript) 205 return m->mp_ass_subscript(o, key, (PyObject*)NULL); 206 207 if (o->ob_type->tp_as_sequence) { 208 if (PyIndex_Check(key)) { 209 Py_ssize_t key_value; 210 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError); 211 if (key_value == -1 && PyErr_Occurred()) 212 return -1; 213 return PySequence_DelItem(o, key_value); 214 } 215 else if (o->ob_type->tp_as_sequence->sq_ass_item) { 216 type_error("sequence index must be " 217 "integer, not '%.200s'", key); 218 return -1; 219 } 220 } 221 222 type_error("'%.200s' object does not support item deletion", o); 223 return -1; 221 224 } 222 225 … … 224 227 PyObject_DelItemString(PyObject *o, char *key) 225 228 { 226 227 228 229 230 231 232 233 234 235 236 237 238 229 PyObject *okey; 230 int ret; 231 232 if (o == NULL || key == NULL) { 233 null_error(); 234 return -1; 235 } 236 okey = PyString_FromString(key); 237 if (okey == NULL) 238 return -1; 239 ret = PyObject_DelItem(o, okey); 240 Py_DECREF(okey); 241 return ret; 239 242 } 240 243 241 244 int 242 245 PyObject_AsCharBuffer(PyObject *obj, 243 244 245 { 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 246 const char **buffer, 247 Py_ssize_t *buffer_len) 248 { 249 PyBufferProcs *pb; 250 char *pp; 251 Py_ssize_t len; 252 253 if (obj == NULL || buffer == NULL || buffer_len == NULL) { 254 null_error(); 255 return -1; 256 } 257 pb = obj->ob_type->tp_as_buffer; 258 if (pb == NULL || 259 pb->bf_getcharbuffer == NULL || 260 pb->bf_getsegcount == NULL) { 261 PyErr_SetString(PyExc_TypeError, 262 "expected a character buffer object"); 263 return -1; 264 } 265 if ((*pb->bf_getsegcount)(obj,NULL) != 1) { 266 PyErr_SetString(PyExc_TypeError, 267 "expected a single-segment buffer object"); 268 return -1; 269 } 270 len = (*pb->bf_getcharbuffer)(obj, 0, &pp); 271 if (len < 0) 272 return -1; 273 *buffer = pp; 274 *buffer_len = len; 275 return 0; 273 276 } 274 277 … … 276 279 PyObject_CheckReadBuffer(PyObject *obj) 277 280 { 278 279 280 281 282 283 284 285 281 PyBufferProcs *pb = obj->ob_type->tp_as_buffer; 282 283 if (pb == NULL || 284 pb->bf_getreadbuffer == NULL || 285 pb->bf_getsegcount == NULL || 286 (*pb->bf_getsegcount)(obj, NULL) != 1) 287 return 0; 288 return 1; 286 289 } 287 290 288 291 int PyObject_AsReadBuffer(PyObject *obj, 289 290 291 { 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 292 const void **buffer, 293 Py_ssize_t *buffer_len) 294 { 295 PyBufferProcs *pb; 296 void *pp; 297 Py_ssize_t len; 298 299 if (obj == NULL || buffer == NULL || buffer_len == NULL) { 300 null_error(); 301 return -1; 302 } 303 pb = obj->ob_type->tp_as_buffer; 304 if (pb == NULL || 305 pb->bf_getreadbuffer == NULL || 306 pb->bf_getsegcount == NULL) { 307 PyErr_SetString(PyExc_TypeError, 308 "expected a readable buffer object"); 309 return -1; 310 } 311 if ((*pb->bf_getsegcount)(obj, NULL) != 1) { 312 PyErr_SetString(PyExc_TypeError, 313 "expected a single-segment buffer object"); 314 return -1; 315 } 316 len = (*pb->bf_getreadbuffer)(obj, 0, &pp); 317 if (len < 0) 318 return -1; 319 *buffer = pp; 320 *buffer_len = len; 321 return 0; 319 322 } 320 323 321 324 int PyObject_AsWriteBuffer(PyObject *obj, 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 325 void **buffer, 326 Py_ssize_t *buffer_len) 327 { 328 PyBufferProcs *pb; 329 void*pp; 330 Py_ssize_t len; 331 332 if (obj == NULL || buffer == NULL || buffer_len == NULL) { 333 null_error(); 334 return -1; 335 } 336 pb = obj->ob_type->tp_as_buffer; 337 if (pb == NULL || 338 pb->bf_getwritebuffer == NULL || 339 pb->bf_getsegcount == NULL) { 340 PyErr_SetString(PyExc_TypeError, 341 "expected a writeable buffer object"); 342 return -1; 343 } 344 if ((*pb->bf_getsegcount)(obj, NULL) != 1) { 345 PyErr_SetString(PyExc_TypeError, 346 "expected a single-segment buffer object"); 347 return -1; 348 } 349 len = (*pb->bf_getwritebuffer)(obj,0,&pp); 350 if (len < 0) 351 return -1; 352 *buffer = pp; 353 *buffer_len = len; 354 return 0; 352 355 } 353 356 … … 357 360 PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags) 358 361 { 359 360 361 362 363 364 365 362 if (!PyObject_CheckBuffer(obj)) { 363 PyErr_Format(PyExc_TypeError, 364 "'%100s' does not have the buffer interface", 365 Py_TYPE(obj)->tp_name); 366 return -1; 367 } 368 return (*(obj->ob_type->tp_as_buffer->bf_getbuffer))(obj, view, flags); 366 369 } 367 370 … … 369 372 _IsFortranContiguous(Py_buffer *view) 370 373 { 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 374 Py_ssize_t sd, dim; 375 int i; 376 377 if (view->ndim == 0) return 1; 378 if (view->strides == NULL) return (view->ndim == 1); 379 380 sd = view->itemsize; 381 if (view->ndim == 1) return (view->shape[0] == 1 || 382 sd == view->strides[0]); 383 for (i=0; i<view->ndim; i++) { 384 dim = view->shape[i]; 385 if (dim == 0) return 1; 386 if (view->strides[i] != sd) return 0; 387 sd *= dim; 388 } 389 return 1; 387 390 } 388 391 … … 390 393 _IsCContiguous(Py_buffer *view) 391 394 { 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 395 Py_ssize_t sd, dim; 396 int i; 397 398 if (view->ndim == 0) return 1; 399 if (view->strides == NULL) return 1; 400 401 sd = view->itemsize; 402 if (view->ndim == 1) return (view->shape[0] == 1 || 403 sd == view->strides[0]); 404 for (i=view->ndim-1; i>=0; i--) { 405 dim = view->shape[i]; 406 if (dim == 0) return 1; 407 if (view->strides[i] != sd) return 0; 408 sd *= dim; 409 } 410 return 1; 408 411 } 409 412 … … 412 415 { 413 416 414 415 416 417 418 419 420 421 422 417 if (view->suboffsets != NULL) return 0; 418 419 if (fort == 'C') 420 return _IsCContiguous(view); 421 else if (fort == 'F') 422 return _IsFortranContiguous(view); 423 else if (fort == 'A') 424 return (_IsCContiguous(view) || _IsFortranContiguous(view)); 425 return 0; 423 426 } 424 427 … … 427 430 PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices) 428 431 { 429 430 431 432 433 434 435 436 437 438 439 } 440 441 442 staticvoid443 _ add_one_to_index_F(int nd, Py_ssize_t *index,Py_ssize_t *shape)444 { 445 446 447 448 449 450 451 452 453 454 455 456 } 457 458 staticvoid459 _ add_one_to_index_C(int nd, Py_ssize_t *index,Py_ssize_t *shape)460 { 461 462 463 464 465 466 467 468 469 470 471 432 char* pointer; 433 int i; 434 pointer = (char *)view->buf; 435 for (i = 0; i < view->ndim; i++) { 436 pointer += view->strides[i]*indices[i]; 437 if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) { 438 pointer = *((char**)pointer) + view->suboffsets[i]; 439 } 440 } 441 return (void*)pointer; 442 } 443 444 445 void 446 _Py_add_one_to_index_F(int nd, Py_ssize_t *index, const Py_ssize_t *shape) 447 { 448 int k; 449 450 for (k=0; k<nd; k++) { 451 if (index[k] < shape[k]-1) { 452 index[k]++; 453 break; 454 } 455 else { 456 index[k] = 0; 457 } 458 } 459 } 460 461 void 462 _Py_add_one_to_index_C(int nd, Py_ssize_t *index, const Py_ssize_t *shape) 463 { 464 int k; 465 466 for (k=nd-1; k>=0; k--) { 467 if (index[k] < shape[k]-1) { 468 index[k]++; 469 break; 470 } 471 else { 472 index[k] = 0; 473 } 474 } 472 475 } 473 476 … … 480 483 PyBuffer_ToContiguous(void *buf, Py_buffer *view, Py_ssize_t len, char fort) 481 484 { 482 483 void (*addone)(int, Py_ssize_t *,Py_ssize_t *);484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 addone =_add_one_to_index_F;511 512 513 addone =_add_one_to_index_C;514 515 516 517 518 519 520 521 522 523 524 525 526 527 485 int k; 486 void (*addone)(int, Py_ssize_t *, const Py_ssize_t *); 487 Py_ssize_t *indices, elements; 488 char *dest, *ptr; 489 490 if (len > view->len) { 491 len = view->len; 492 } 493 494 if (PyBuffer_IsContiguous(view, fort)) { 495 /* simplest copy is all that is needed */ 496 memcpy(buf, view->buf, len); 497 return 0; 498 } 499 500 /* Otherwise a more elaborate scheme is needed */ 501 502 /* XXX(nnorwitz): need to check for overflow! */ 503 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim)); 504 if (indices == NULL) { 505 PyErr_NoMemory(); 506 return -1; 507 } 508 for (k=0; k<view->ndim;k++) { 509 indices[k] = 0; 510 } 511 512 if (fort == 'F') { 513 addone = _Py_add_one_to_index_F; 514 } 515 else { 516 addone = _Py_add_one_to_index_C; 517 } 518 dest = buf; 519 /* XXX : This is not going to be the fastest code in the world 520 several optimizations are possible. 521 */ 522 elements = len / view->itemsize; 523 while (elements--) { 524 addone(view->ndim, indices, view->shape); 525 ptr = PyBuffer_GetPointer(view, indices); 526 memcpy(dest, ptr, view->itemsize); 527 dest += view->itemsize; 528 } 529 PyMem_Free(indices); 530 return 0; 528 531 } 529 532 … … 531 534 PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort) 532 535 { 533 534 void (*addone)(int, Py_ssize_t *,Py_ssize_t *);535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 addone =_add_one_to_index_F;562 563 564 addone =_add_one_to_index_C;565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 536 int k; 537 void (*addone)(int, Py_ssize_t *, const Py_ssize_t *); 538 Py_ssize_t *indices, elements; 539 char *src, *ptr; 540 541 if (len > view->len) { 542 len = view->len; 543 } 544 545 if (PyBuffer_IsContiguous(view, fort)) { 546 /* simplest copy is all that is needed */ 547 memcpy(view->buf, buf, len); 548 return 0; 549 } 550 551 /* Otherwise a more elaborate scheme is needed */ 552 553 /* XXX(nnorwitz): need to check for overflow! */ 554 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim)); 555 if (indices == NULL) { 556 PyErr_NoMemory(); 557 return -1; 558 } 559 for (k=0; k<view->ndim;k++) { 560 indices[k] = 0; 561 } 562 563 if (fort == 'F') { 564 addone = _Py_add_one_to_index_F; 565 } 566 else { 567 addone = _Py_add_one_to_index_C; 568 } 569 src = buf; 570 /* XXX : This is not going to be the fastest code in the world 571 several optimizations are possible. 572 */ 573 elements = len / view->itemsize; 574 while (elements--) { 575 addone(view->ndim, indices, view->shape); 576 ptr = PyBuffer_GetPointer(view, indices); 577 memcpy(ptr, src, view->itemsize); 578 src += view->itemsize; 579 } 580 581 PyMem_Free(indices); 582 return 0; 580 583 } 581 584 582 585 int PyObject_CopyData(PyObject *dest, PyObject *src) 583 586 { 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 587 Py_buffer view_dest, view_src; 588 int k; 589 Py_ssize_t *indices, elements; 590 char *dptr, *sptr; 591 592 if (!PyObject_CheckBuffer(dest) || 593 !PyObject_CheckBuffer(src)) { 594 PyErr_SetString(PyExc_TypeError, 595 "both destination and source must have the "\ 596 "buffer interface"); 597 return -1; 598 } 599 600 if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1; 601 if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) { 602 PyBuffer_Release(&view_dest); 603 return -1; 604 } 605 606 if (view_dest.len < view_src.len) { 607 PyErr_SetString(PyExc_BufferError, 608 "destination is too small to receive data from source"); 609 PyBuffer_Release(&view_dest); 610 PyBuffer_Release(&view_src); 611 return -1; 612 } 613 614 if ((PyBuffer_IsContiguous(&view_dest, 'C') && 615 PyBuffer_IsContiguous(&view_src, 'C')) || 616 (PyBuffer_IsContiguous(&view_dest, 'F') && 617 PyBuffer_IsContiguous(&view_src, 'F'))) { 618 /* simplest copy is all that is needed */ 619 memcpy(view_dest.buf, view_src.buf, view_src.len); 620 PyBuffer_Release(&view_dest); 621 PyBuffer_Release(&view_src); 622 return 0; 623 } 624 625 /* Otherwise a more elaborate copy scheme is needed */ 626 627 /* XXX(nnorwitz): need to check for overflow! */ 628 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim); 629 if (indices == NULL) { 630 PyErr_NoMemory(); 631 PyBuffer_Release(&view_dest); 632 PyBuffer_Release(&view_src); 633 return -1; 634 } 635 for (k=0; k<view_src.ndim;k++) { 636 indices[k] = 0; 637 } 638 elements = 1; 639 for (k=0; k<view_src.ndim; k++) { 640 /* XXX(nnorwitz): can this overflow? */ 641 elements *= view_src.shape[k]; 642 } 643 while (elements--) { 644 _Py_add_one_to_index_C(view_src.ndim, indices, view_src.shape); 645 dptr = PyBuffer_GetPointer(&view_dest, indices); 646 sptr = PyBuffer_GetPointer(&view_src, indices); 647 memcpy(dptr, sptr, view_src.itemsize); 648 } 649 PyMem_Free(indices); 650 PyBuffer_Release(&view_dest); 651 PyBuffer_Release(&view_src); 652 return 0; 650 653 } 651 654 652 655 void 653 656 PyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape, 654 655 656 { 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 657 Py_ssize_t *strides, int itemsize, 658 char fort) 659 { 660 int k; 661 Py_ssize_t sd; 662 663 sd = itemsize; 664 if (fort == 'F') { 665 for (k=0; k<nd; k++) { 666 strides[k] = sd; 667 sd *= shape[k]; 668 } 669 } 670 else { 671 for (k=nd-1; k>=0; k--) { 672 strides[k] = sd; 673 sd *= shape[k]; 674 } 675 } 676 return; 674 677 } 675 678 676 679 int 677 680 PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len, 678 679 { 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 681 int readonly, int flags) 682 { 683 if (view == NULL) return 0; 684 if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) && 685 (readonly == 1)) { 686 PyErr_SetString(PyExc_BufferError, 687 "Object is not writable."); 688 return -1; 689 } 690 691 view->obj = obj; 692 if (obj) 693 Py_INCREF(obj); 694 view->buf = buf; 695 view->len = len; 696 view->readonly = readonly; 697 view->itemsize = 1; 698 view->format = NULL; 699 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT) 700 view->format = "B"; 701 view->ndim = 1; 702 view->shape = NULL; 703 if ((flags & PyBUF_ND) == PyBUF_ND) 704 view->shape = &(view->len); 705 view->strides = NULL; 706 if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES) 707 view->strides = &(view->itemsize); 708 view->suboffsets = NULL; 709 view->internal = NULL; 710 return 0; 708 711 } 709 712 … … 711 714 PyBuffer_Release(Py_buffer *view) 712 715 { 713 714 715 716 717 716 PyObject *obj = view->obj; 717 if (obj && Py_TYPE(obj)->tp_as_buffer && Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer) 718 Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer(obj, view); 719 Py_XDECREF(obj); 720 view->obj = NULL; 718 721 } 719 722 … … 721 724 PyObject_Format(PyObject* obj, PyObject *format_spec) 722 725 { 723 static PyObject * str__format__ = NULL; 724 PyObject *empty = NULL; 725 PyObject *result = NULL; 726 int spec_is_unicode; 727 int result_is_unicode; 728 729 /* Initialize cached value */ 730 if (str__format__ == NULL) { 731 /* Initialize static variable needed by _PyType_Lookup */ 732 str__format__ = PyString_InternFromString("__format__"); 733 if (str__format__ == NULL) 734 goto done; 735 } 736 737 /* If no format_spec is provided, use an empty string */ 738 if (format_spec == NULL) { 739 empty = PyString_FromStringAndSize(NULL, 0); 740 format_spec = empty; 741 } 742 743 /* Check the format_spec type, and make sure it's str or unicode */ 744 if (PyUnicode_Check(format_spec)) 745 spec_is_unicode = 1; 746 else if (PyString_Check(format_spec)) 747 spec_is_unicode = 0; 748 else { 749 PyErr_Format(PyExc_TypeError, 750 "format expects arg 2 to be string " 751 "or unicode, not %.100s", Py_TYPE(format_spec)->tp_name); 752 goto done; 753 } 754 755 /* Make sure the type is initialized. float gets initialized late */ 756 if (Py_TYPE(obj)->tp_dict == NULL) 757 if (PyType_Ready(Py_TYPE(obj)) < 0) 758 goto done; 759 760 /* Check for a __format__ method and call it. */ 761 if (PyInstance_Check(obj)) { 762 /* We're an instance of a classic class */ 763 PyObject *bound_method = PyObject_GetAttr(obj, 764 str__format__); 765 if (bound_method != NULL) { 766 result = PyObject_CallFunctionObjArgs(bound_method, 767 format_spec, 768 NULL); 769 Py_DECREF(bound_method); 770 } else { 771 PyObject *self_as_str; 772 PyObject *format_method; 773 774 PyErr_Clear(); 775 /* Per the PEP, convert to str (or unicode, 776 depending on the type of the format 777 specifier). For new-style classes, this 778 logic is done by object.__format__(). */ 779 if (spec_is_unicode) 780 self_as_str = PyObject_Unicode(obj); 781 else 782 self_as_str = PyObject_Str(obj); 783 if (self_as_str == NULL) 784 goto done; 785 786 /* Then call str.__format__ on that result */ 787 format_method = PyObject_GetAttr(self_as_str, 788 str__format__); 789 if (format_method == NULL) { 790 Py_DECREF(self_as_str); 791 goto done; 792 } 793 result = PyObject_CallFunctionObjArgs(format_method, 794 format_spec, 795 NULL); 796 Py_DECREF(self_as_str); 797 Py_DECREF(format_method); 798 if (result == NULL) 799 goto done; 726 PyObject *empty = NULL; 727 PyObject *result = NULL; 728 #ifdef Py_USING_UNICODE 729 int spec_is_unicode; 730 int result_is_unicode; 731 #endif 732 733 /* If no format_spec is provided, use an empty string */ 734 if (format_spec == NULL) { 735 empty = PyString_FromStringAndSize(NULL, 0); 736 format_spec = empty; 737 } 738 739 /* Check the format_spec type, and make sure it's str or unicode */ 740 #ifdef Py_USING_UNICODE 741 if (PyUnicode_Check(format_spec)) 742 spec_is_unicode = 1; 743 else if (PyString_Check(format_spec)) 744 spec_is_unicode = 0; 745 else { 746 #else 747 if (!PyString_Check(format_spec)) { 748 #endif 749 PyErr_Format(PyExc_TypeError, 750 "format expects arg 2 to be string " 751 "or unicode, not %.100s", Py_TYPE(format_spec)->tp_name); 752 goto done; 753 } 754 755 /* Check for a __format__ method and call it. */ 756 if (PyInstance_Check(obj)) { 757 /* We're an instance of a classic class */ 758 PyObject *bound_method = PyObject_GetAttrString(obj, "__format__"); 759 if (bound_method != NULL) { 760 result = PyObject_CallFunctionObjArgs(bound_method, 761 format_spec, 762 NULL); 763 Py_DECREF(bound_method); 764 } else { 765 PyObject *self_as_str = NULL; 766 PyObject *format_method = NULL; 767 Py_ssize_t format_len; 768 769 PyErr_Clear(); 770 /* Per the PEP, convert to str (or unicode, 771 depending on the type of the format 772 specifier). For new-style classes, this 773 logic is done by object.__format__(). */ 774 #ifdef Py_USING_UNICODE 775 if (spec_is_unicode) { 776 format_len = PyUnicode_GET_SIZE(format_spec); 777 self_as_str = PyObject_Unicode(obj); 778 } else 779 #endif 780 { 781 format_len = PyString_GET_SIZE(format_spec); 782 self_as_str = PyObject_Str(obj); 783 } 784 if (self_as_str == NULL) 785 goto done1; 786 787 if (format_len > 0) { 788 /* See the almost identical code in 789 typeobject.c for new-style 790 classes. */ 791 if (PyErr_WarnEx( 792 PyExc_PendingDeprecationWarning, 793 "object.__format__ with a non-empty " 794 "format string is deprecated", 1) 795 < 0) { 796 goto done1; 800 797 } 801 } else { 802 /* Not an instance of a classic class, use the code 803 from py3k */ 804 805 /* Find the (unbound!) __format__ method (a borrowed 806 reference) */ 807 PyObject *method = _PyType_Lookup(Py_TYPE(obj), 808 str__format__); 809 if (method == NULL) { 810 PyErr_Format(PyExc_TypeError, 811 "Type %.100s doesn't define __format__", 812 Py_TYPE(obj)->tp_name); 813 goto done; 814 } 815 /* And call it, binding it to the value */ 816 result = PyObject_CallFunctionObjArgs(method, obj, 817 format_spec, NULL); 818 } 819 820 if (result == NULL) 821 goto done; 822 823 /* Check the result type, and make sure it's str or unicode */ 824 if (PyUnicode_Check(result)) 825 result_is_unicode = 1; 826 else if (PyString_Check(result)) 827 result_is_unicode = 0; 828 else { 829 PyErr_Format(PyExc_TypeError, 830 "%.100s.__format__ must return string or " 831 "unicode, not %.100s", Py_TYPE(obj)->tp_name, 832 Py_TYPE(result)->tp_name); 833 Py_DECREF(result); 834 result = NULL; 835 goto done; 836 } 837 838 /* Convert to unicode, if needed. Required if spec is unicode 839 and result is str */ 840 if (spec_is_unicode && !result_is_unicode) { 841 PyObject *tmp = PyObject_Unicode(result); 842 /* This logic works whether or not tmp is NULL */ 843 Py_DECREF(result); 844 result = tmp; 845 } 798 /* Eventually this will become an 799 error: 800 PyErr_Format(PyExc_TypeError, 801 "non-empty format string passed to " 802 "object.__format__"); 803 goto done1; 804 */ 805 } 806 807 /* Then call str.__format__ on that result */ 808 format_method = PyObject_GetAttrString(self_as_str, "__format__"); 809 if (format_method == NULL) { 810 goto done1; 811 } 812 result = PyObject_CallFunctionObjArgs(format_method, 813 format_spec, 814 NULL); 815 done1: 816 Py_XDECREF(self_as_str); 817 Py_XDECREF(format_method); 818 if (result == NULL) 819 goto done; 820 } 821 } else { 822 /* Not an instance of a classic class, use the code 823 from py3k */ 824 static PyObject *format_cache = NULL; 825 826 /* Find the (unbound!) __format__ method (a borrowed 827 reference) */ 828 PyObject *method = _PyObject_LookupSpecial(obj, "__format__", 829 &format_cache); 830 if (method == NULL) { 831 if (!PyErr_Occurred()) 832 PyErr_Format(PyExc_TypeError, 833 "Type %.100s doesn't define __format__", 834 Py_TYPE(obj)->tp_name); 835 goto done; 836 } 837 /* And call it. */ 838 result = PyObject_CallFunctionObjArgs(method, format_spec, NULL); 839 Py_DECREF(method); 840 } 841 842 if (result == NULL) 843 goto done; 844 845 /* Check the result type, and make sure it's str or unicode */ 846 #ifdef Py_USING_UNICODE 847 if (PyUnicode_Check(result)) 848 result_is_unicode = 1; 849 else if (PyString_Check(result)) 850 result_is_unicode = 0; 851 else { 852 #else 853 if (!PyString_Check(result)) { 854 #endif 855 PyErr_Format(PyExc_TypeError, 856 "%.100s.__format__ must return string or " 857 "unicode, not %.100s", Py_TYPE(obj)->tp_name, 858 Py_TYPE(result)->tp_name); 859 Py_DECREF(result); 860 result = NULL; 861 goto done; 862 } 863 864 /* Convert to unicode, if needed. Required if spec is unicode 865 and result is str */ 866 #ifdef Py_USING_UNICODE 867 if (spec_is_unicode && !result_is_unicode) { 868 PyObject *tmp = PyObject_Unicode(result); 869 /* This logic works whether or not tmp is NULL */ 870 Py_DECREF(result); 871 result = tmp; 872 } 873 #endif 846 874 847 875 done: 848 849 876 Py_XDECREF(empty); 877 return result; 850 878 } 851 879 … … 855 883 PyNumber_Check(PyObject *o) 856 884 { 857 858 859 885 return o && o->ob_type->tp_as_number && 886 (o->ob_type->tp_as_number->nb_int || 887 o->ob_type->tp_as_number->nb_float); 860 888 } 861 889 … … 866 894 #define NB_SLOT(x) offsetof(PyNumberMethods, x) 867 895 #define NB_BINOP(nb_methods, slot) \ 868 896 (*(binaryfunc*)(& ((char*)nb_methods)[slot])) 869 897 #define NB_TERNOP(nb_methods, slot) \ 870 898 (*(ternaryfunc*)(& ((char*)nb_methods)[slot])) 871 899 872 900 /* 873 901 Calling scheme used for binary operations: 874 902 875 v wAction903 v w Action 876 904 ------------------------------------------------------------------- 877 new neww.op(v,w)[*], v.op(v,w), w.op(v,w)878 new oldv.op(v,w), coerce(v,w), v.op(v,w)879 old neww.op(v,w), coerce(v,w), v.op(v,w)880 old oldcoerce(v,w), v.op(v,w)905 new new w.op(v,w)[*], v.op(v,w), w.op(v,w) 906 new old v.op(v,w), coerce(v,w), v.op(v,w) 907 old new w.op(v,w), coerce(v,w), v.op(v,w) 908 old old coerce(v,w), v.op(v,w) 881 909 882 910 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of … … 895 923 binary_op1(PyObject *v, PyObject *w, const int op_slot) 896 924 { 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 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 925 PyObject *x; 926 binaryfunc slotv = NULL; 927 binaryfunc slotw = NULL; 928 929 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v)) 930 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot); 931 if (w->ob_type != v->ob_type && 932 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) { 933 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot); 934 if (slotw == slotv) 935 slotw = NULL; 936 } 937 if (slotv) { 938 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) { 939 x = slotw(v, w); 940 if (x != Py_NotImplemented) 941 return x; 942 Py_DECREF(x); /* can't do it */ 943 slotw = NULL; 944 } 945 x = slotv(v, w); 946 if (x != Py_NotImplemented) 947 return x; 948 Py_DECREF(x); /* can't do it */ 949 } 950 if (slotw) { 951 x = slotw(v, w); 952 if (x != Py_NotImplemented) 953 return x; 954 Py_DECREF(x); /* can't do it */ 955 } 956 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) { 957 int err = PyNumber_CoerceEx(&v, &w); 958 if (err < 0) { 959 return NULL; 960 } 961 if (err == 0) { 962 PyNumberMethods *mv = v->ob_type->tp_as_number; 963 if (mv) { 964 binaryfunc slot; 965 slot = NB_BINOP(mv, op_slot); 966 if (slot) { 967 x = slot(v, w); 968 Py_DECREF(v); 969 Py_DECREF(w); 970 return x; 971 } 972 } 973 /* CoerceEx incremented the reference counts */ 974 Py_DECREF(v); 975 Py_DECREF(w); 976 } 977 } 978 Py_INCREF(Py_NotImplemented); 979 return Py_NotImplemented; 952 980 } 953 981 … … 955 983 binop_type_error(PyObject *v, PyObject *w, const char *op_name) 956 984 { 957 958 959 960 961 962 963 985 PyErr_Format(PyExc_TypeError, 986 "unsupported operand type(s) for %.100s: " 987 "'%.100s' and '%.100s'", 988 op_name, 989 v->ob_type->tp_name, 990 w->ob_type->tp_name); 991 return NULL; 964 992 } 965 993 … … 967 995 binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name) 968 996 { 969 970 971 972 973 974 997 PyObject *result = binary_op1(v, w, op_slot); 998 if (result == Py_NotImplemented) { 999 Py_DECREF(result); 1000 return binop_type_error(v, w, op_name); 1001 } 1002 return result; 975 1003 } 976 1004 … … 981 1009 *** In some cases, w.op is called before v.op; see binary_op1. *** 982 1010 983 v w zAction1011 v w z Action 984 1012 ------------------------------------------------------------------- 985 new new newv.op(v,w,z), w.op(v,w,z), z.op(v,w,z)986 new old newv.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)987 old new neww.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)988 old old newz.op(v,w,z), coerce(v,w,z), v.op(v,w,z)989 new new oldv.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)990 new old oldv.op(v,w,z), coerce(v,w,z), v.op(v,w,z)991 old new oldw.op(v,w,z), coerce(v,w,z), v.op(v,w,z)992 old old oldcoerce(v,w,z), v.op(v,w,z)1013 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z) 1014 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z) 1015 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z) 1016 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z) 1017 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z) 1018 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z) 1019 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z) 1020 old old old coerce(v,w,z), v.op(v,w,z) 993 1021 994 1022 Legend: … … 1006 1034 static PyObject * 1007 1035 ternary_op(PyObject *v, 1008 1009 1010 1011 1012 { 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 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 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1036 PyObject *w, 1037 PyObject *z, 1038 const int op_slot, 1039 const char *op_name) 1040 { 1041 PyNumberMethods *mv, *mw, *mz; 1042 PyObject *x = NULL; 1043 ternaryfunc slotv = NULL; 1044 ternaryfunc slotw = NULL; 1045 ternaryfunc slotz = NULL; 1046 1047 mv = v->ob_type->tp_as_number; 1048 mw = w->ob_type->tp_as_number; 1049 if (mv != NULL && NEW_STYLE_NUMBER(v)) 1050 slotv = NB_TERNOP(mv, op_slot); 1051 if (w->ob_type != v->ob_type && 1052 mw != NULL && NEW_STYLE_NUMBER(w)) { 1053 slotw = NB_TERNOP(mw, op_slot); 1054 if (slotw == slotv) 1055 slotw = NULL; 1056 } 1057 if (slotv) { 1058 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) { 1059 x = slotw(v, w, z); 1060 if (x != Py_NotImplemented) 1061 return x; 1062 Py_DECREF(x); /* can't do it */ 1063 slotw = NULL; 1064 } 1065 x = slotv(v, w, z); 1066 if (x != Py_NotImplemented) 1067 return x; 1068 Py_DECREF(x); /* can't do it */ 1069 } 1070 if (slotw) { 1071 x = slotw(v, w, z); 1072 if (x != Py_NotImplemented) 1073 return x; 1074 Py_DECREF(x); /* can't do it */ 1075 } 1076 mz = z->ob_type->tp_as_number; 1077 if (mz != NULL && NEW_STYLE_NUMBER(z)) { 1078 slotz = NB_TERNOP(mz, op_slot); 1079 if (slotz == slotv || slotz == slotw) 1080 slotz = NULL; 1081 if (slotz) { 1082 x = slotz(v, w, z); 1083 if (x != Py_NotImplemented) 1084 return x; 1085 Py_DECREF(x); /* can't do it */ 1086 } 1087 } 1088 1089 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) || 1090 (z != Py_None && !NEW_STYLE_NUMBER(z))) { 1091 /* we have an old style operand, coerce */ 1092 PyObject *v1, *z1, *w2, *z2; 1093 int c; 1094 1095 c = PyNumber_Coerce(&v, &w); 1096 if (c != 0) 1097 goto error3; 1098 1099 /* Special case: if the third argument is None, it is 1100 treated as absent argument and not coerced. */ 1101 if (z == Py_None) { 1102 if (v->ob_type->tp_as_number) { 1103 slotz = NB_TERNOP(v->ob_type->tp_as_number, 1104 op_slot); 1105 if (slotz) 1106 x = slotz(v, w, z); 1107 else 1108 c = -1; 1109 } 1110 else 1111 c = -1; 1112 goto error2; 1113 } 1114 v1 = v; 1115 z1 = z; 1116 c = PyNumber_Coerce(&v1, &z1); 1117 if (c != 0) 1118 goto error2; 1119 w2 = w; 1120 z2 = z1; 1121 c = PyNumber_Coerce(&w2, &z2); 1122 if (c != 0) 1123 goto error1; 1124 1125 if (v1->ob_type->tp_as_number != NULL) { 1126 slotv = NB_TERNOP(v1->ob_type->tp_as_number, 1127 op_slot); 1128 if (slotv) 1129 x = slotv(v1, w2, z2); 1130 else 1131 c = -1; 1132 } 1133 else 1134 c = -1; 1135 1136 Py_DECREF(w2); 1137 Py_DECREF(z2); 1138 error1: 1139 Py_DECREF(v1); 1140 Py_DECREF(z1); 1141 error2: 1142 Py_DECREF(v); 1143 Py_DECREF(w); 1144 error3: 1145 if (c >= 0) 1146 return x; 1147 } 1148 1149 if (z == Py_None) 1150 PyErr_Format( 1151 PyExc_TypeError, 1152 "unsupported operand type(s) for ** or pow(): " 1153 "'%.100s' and '%.100s'", 1154 v->ob_type->tp_name, 1155 w->ob_type->tp_name); 1156 else 1157 PyErr_Format( 1158 PyExc_TypeError, 1159 "unsupported operand type(s) for pow(): " 1160 "'%.100s', '%.100s', '%.100s'", 1161 v->ob_type->tp_name, 1162 w->ob_type->tp_name, 1163 z->ob_type->tp_name); 1164 return NULL; 1137 1165 } 1138 1166 … … 1140 1168 PyObject * \ 1141 1169 func(PyObject *v, PyObject *w) { \ 1142 1170 return binary_op(v, w, NB_SLOT(op), op_name); \ 1143 1171 } 1144 1172 … … 1155 1183 PyNumber_Add(PyObject *v, PyObject *w) 1156 1184 { 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1185 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add)); 1186 if (result == Py_NotImplemented) { 1187 PySequenceMethods *m = v->ob_type->tp_as_sequence; 1188 Py_DECREF(result); 1189 if (m && m->sq_concat) { 1190 return (*m->sq_concat)(v, w); 1191 } 1192 result = binop_type_error(v, w, "+"); 1193 } 1194 return result; 1167 1195 } 1168 1196 … … 1170 1198 sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n) 1171 1199 { 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1200 Py_ssize_t count; 1201 if (PyIndex_Check(n)) { 1202 count = PyNumber_AsSsize_t(n, PyExc_OverflowError); 1203 if (count == -1 && PyErr_Occurred()) 1204 return NULL; 1205 } 1206 else { 1207 return type_error("can't multiply sequence by " 1208 "non-int of type '%.200s'", n); 1209 } 1210 return (*repeatfunc)(seq, count); 1183 1211 } 1184 1212 … … 1186 1214 PyNumber_Multiply(PyObject *v, PyObject *w) 1187 1215 { 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1216 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply)); 1217 if (result == Py_NotImplemented) { 1218 PySequenceMethods *mv = v->ob_type->tp_as_sequence; 1219 PySequenceMethods *mw = w->ob_type->tp_as_sequence; 1220 Py_DECREF(result); 1221 if (mv && mv->sq_repeat) { 1222 return sequence_repeat(mv->sq_repeat, v, w); 1223 } 1224 else if (mw && mw->sq_repeat) { 1225 return sequence_repeat(mw->sq_repeat, w, v); 1226 } 1227 result = binop_type_error(v, w, "*"); 1228 } 1229 return result; 1202 1230 } 1203 1231 … … 1205 1233 PyNumber_FloorDivide(PyObject *v, PyObject *w) 1206 1234 { 1207 1208 1235 /* XXX tp_flags test */ 1236 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//"); 1209 1237 } 1210 1238 … … 1212 1240 PyNumber_TrueDivide(PyObject *v, PyObject *w) 1213 1241 { 1214 1215 1242 /* XXX tp_flags test */ 1243 return binary_op(v, w, NB_SLOT(nb_true_divide), "/"); 1216 1244 } 1217 1245 … … 1219 1247 PyNumber_Remainder(PyObject *v, PyObject *w) 1220 1248 { 1221 1249 return binary_op(v, w, NB_SLOT(nb_remainder), "%"); 1222 1250 } 1223 1251 … … 1225 1253 PyNumber_Power(PyObject *v, PyObject *w, PyObject *z) 1226 1254 { 1227 1255 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()"); 1228 1256 } 1229 1257 … … 1245 1273 1246 1274 #define HASINPLACE(t) \ 1247 1275 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS) 1248 1276 1249 1277 static PyObject * 1250 1278 binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot) 1251 1279 { 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1280 PyNumberMethods *mv = v->ob_type->tp_as_number; 1281 if (mv != NULL && HASINPLACE(v)) { 1282 binaryfunc slot = NB_BINOP(mv, iop_slot); 1283 if (slot) { 1284 PyObject *x = (slot)(v, w); 1285 if (x != Py_NotImplemented) { 1286 return x; 1287 } 1288 Py_DECREF(x); 1289 } 1290 } 1291 return binary_op1(v, w, op_slot); 1264 1292 } 1265 1293 1266 1294 static PyObject * 1267 1295 binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot, 1268 1269 { 1270 1271 1272 1273 1274 1275 1296 const char *op_name) 1297 { 1298 PyObject *result = binary_iop1(v, w, iop_slot, op_slot); 1299 if (result == Py_NotImplemented) { 1300 Py_DECREF(result); 1301 return binop_type_error(v, w, op_name); 1302 } 1303 return result; 1276 1304 } 1277 1305 1278 1306 #define INPLACE_BINOP(func, iop, op, op_name) \ 1279 1280 1281 1282 1307 PyObject * \ 1308 func(PyObject *v, PyObject *w) { \ 1309 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \ 1310 } 1283 1311 1284 1312 INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=") … … 1293 1321 PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w) 1294 1322 { 1295 1296 1297 1323 /* XXX tp_flags test */ 1324 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide), 1325 NB_SLOT(nb_floor_divide), "//="); 1298 1326 } 1299 1327 … … 1301 1329 PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w) 1302 1330 { 1303 1304 1305 1331 /* XXX tp_flags test */ 1332 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide), 1333 NB_SLOT(nb_true_divide), "/="); 1306 1334 } 1307 1335 … … 1309 1337 PyNumber_InPlaceAdd(PyObject *v, PyObject *w) 1310 1338 { 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1339 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add), 1340 NB_SLOT(nb_add)); 1341 if (result == Py_NotImplemented) { 1342 PySequenceMethods *m = v->ob_type->tp_as_sequence; 1343 Py_DECREF(result); 1344 if (m != NULL) { 1345 binaryfunc f = NULL; 1346 if (HASINPLACE(v)) 1347 f = m->sq_inplace_concat; 1348 if (f == NULL) 1349 f = m->sq_concat; 1350 if (f != NULL) 1351 return (*f)(v, w); 1352 } 1353 result = binop_type_error(v, w, "+="); 1354 } 1355 return result; 1328 1356 } 1329 1357 … … 1331 1359 PyNumber_InPlaceMultiply(PyObject *v, PyObject *w) 1332 1360 { 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1361 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply), 1362 NB_SLOT(nb_multiply)); 1363 if (result == Py_NotImplemented) { 1364 ssizeargfunc f = NULL; 1365 PySequenceMethods *mv = v->ob_type->tp_as_sequence; 1366 PySequenceMethods *mw = w->ob_type->tp_as_sequence; 1367 Py_DECREF(result); 1368 if (mv != NULL) { 1369 if (HASINPLACE(v)) 1370 f = mv->sq_inplace_repeat; 1371 if (f == NULL) 1372 f = mv->sq_repeat; 1373 if (f != NULL) 1374 return sequence_repeat(f, v, w); 1375 } 1376 else if (mw != NULL) { 1377 /* Note that the right hand operand should not be 1378 * mutated in this case so sq_inplace_repeat is not 1379 * used. */ 1380 if (mw->sq_repeat) 1381 return sequence_repeat(mw->sq_repeat, w, v); 1382 } 1383 result = binop_type_error(v, w, "*="); 1384 } 1385 return result; 1358 1386 } 1359 1387 … … 1361 1389 PyNumber_InPlaceRemainder(PyObject *v, PyObject *w) 1362 1390 { 1363 1364 1391 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder), 1392 NB_SLOT(nb_remainder), "%="); 1365 1393 } 1366 1394 … … 1368 1396 PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z) 1369 1397 { 1370 1371 1372 1373 1374 1375 1376 1398 if (HASINPLACE(v) && v->ob_type->tp_as_number && 1399 v->ob_type->tp_as_number->nb_inplace_power != NULL) { 1400 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**="); 1401 } 1402 else { 1403 return ternary_op(v, w, z, NB_SLOT(nb_power), "**="); 1404 } 1377 1405 } 1378 1406 … … 1383 1411 PyNumber_Negative(PyObject *o) 1384 1412 { 1385 1386 1387 1388 1389 1390 1391 1392 1393 1413 PyNumberMethods *m; 1414 1415 if (o == NULL) 1416 return null_error(); 1417 m = o->ob_type->tp_as_number; 1418 if (m && m->nb_negative) 1419 return (*m->nb_negative)(o); 1420 1421 return type_error("bad operand type for unary -: '%.200s'", o); 1394 1422 } 1395 1423 … … 1397 1425 PyNumber_Positive(PyObject *o) 1398 1426 { 1399 1400 1401 1402 1403 1404 1405 1406 1407 1427 PyNumberMethods *m; 1428 1429 if (o == NULL) 1430 return null_error(); 1431 m = o->ob_type->tp_as_number; 1432 if (m && m->nb_positive) 1433 return (*m->nb_positive)(o); 1434 1435 return type_error("bad operand type for unary +: '%.200s'", o); 1408 1436 } 1409 1437 … … 1411 1439 PyNumber_Invert(PyObject *o) 1412 1440 { 1413 1414 1415 1416 1417 1418 1419 1420 1421 1441 PyNumberMethods *m; 1442 1443 if (o == NULL) 1444 return null_error(); 1445 m = o->ob_type->tp_as_number; 1446 if (m && m->nb_invert) 1447 return (*m->nb_invert)(o); 1448 1449 return type_error("bad operand type for unary ~: '%.200s'", o); 1422 1450 } 1423 1451 … … 1425 1453 PyNumber_Absolute(PyObject *o) 1426 1454 { 1427 1428 1429 1430 1431 1432 1433 1434 1435 1455 PyNumberMethods *m; 1456 1457 if (o == NULL) 1458 return null_error(); 1459 m = o->ob_type->tp_as_number; 1460 if (m && m->nb_absolute) 1461 return m->nb_absolute(o); 1462 1463 return type_error("bad operand type for abs(): '%.200s'", o); 1436 1464 } 1437 1465 … … 1440 1468 int_from_string(const char *s, Py_ssize_t len) 1441 1469 { 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 } 1456 1457 /* Return a Python Int or Long from the object item 1470 char *end; 1471 PyObject *x; 1472 1473 x = PyInt_FromString((char*)s, &end, 10); 1474 if (x == NULL) 1475 return NULL; 1476 if (end != s + len) { 1477 PyErr_SetString(PyExc_ValueError, 1478 "null byte in argument for int()"); 1479 Py_DECREF(x); 1480 return NULL; 1481 } 1482 return x; 1483 } 1484 1485 /* Return a Python Int or Long from the object item 1458 1486 Raise TypeError if the result is not an int-or-long 1459 or if the object cannot be interpreted as an index. 1487 or if the object cannot be interpreted as an index. 1460 1488 */ 1461 1489 PyObject * 1462 1490 PyNumber_Index(PyObject *item) 1463 1491 { 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1492 PyObject *result = NULL; 1493 if (item == NULL) 1494 return null_error(); 1495 if (PyInt_Check(item) || PyLong_Check(item)) { 1496 Py_INCREF(item); 1497 return item; 1498 } 1499 if (PyIndex_Check(item)) { 1500 result = item->ob_type->tp_as_number->nb_index(item); 1501 if (result && 1502 !PyInt_Check(result) && !PyLong_Check(result)) { 1503 PyErr_Format(PyExc_TypeError, 1504 "__index__ returned non-(int,long) " \ 1505 "(type %.200s)", 1506 result->ob_type->tp_name); 1507 Py_DECREF(result); 1508 return NULL; 1509 } 1510 } 1511 else { 1512 PyErr_Format(PyExc_TypeError, 1513 "'%.200s' object cannot be interpreted " 1514 "as an index", item->ob_type->tp_name); 1515 } 1516 return result; 1489 1517 } 1490 1518 … … 1494 1522 PyNumber_AsSsize_t(PyObject *item, PyObject *err) 1495 1523 { 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) 1509 1510 1511 1512 /* If no error-handling desired then the default clipping 1513 1514 1515 1516 1517 /* Whether or not it is less than or equal to 1518 1519 1520 if (_PyLong_Sign(value) < 0) 1521 1522 1523 1524 1525 1526 1527 1528 "cannot fit '%.200s' into an index-sized integer", 1529 item->ob_type->tp_name); 1530 1531 1524 Py_ssize_t result; 1525 PyObject *runerr; 1526 PyObject *value = PyNumber_Index(item); 1527 if (value == NULL) 1528 return -1; 1529 1530 /* We're done if PyInt_AsSsize_t() returns without error. */ 1531 result = PyInt_AsSsize_t(value); 1532 if (result != -1 || !(runerr = PyErr_Occurred())) 1533 goto finish; 1534 1535 /* Error handling code -- only manage OverflowError differently */ 1536 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) 1537 goto finish; 1538 1539 PyErr_Clear(); 1540 /* If no error-handling desired then the default clipping 1541 is sufficient. 1542 */ 1543 if (!err) { 1544 assert(PyLong_Check(value)); 1545 /* Whether or not it is less than or equal to 1546 zero is determined by the sign of ob_size 1547 */ 1548 if (_PyLong_Sign(value) < 0) 1549 result = PY_SSIZE_T_MIN; 1550 else 1551 result = PY_SSIZE_T_MAX; 1552 } 1553 else { 1554 /* Otherwise replace the error with caller's error object. */ 1555 PyErr_Format(err, 1556 "cannot fit '%.200s' into an index-sized integer", 1557 item->ob_type->tp_name); 1558 } 1559 1532 1560 finish: 1533 1534 1561 Py_DECREF(value); 1562 return result; 1535 1563 } 1536 1564 … … 1539 1567 _PyNumber_ConvertIntegralToInt(PyObject *integral, const char* error_format) 1540 1568 { 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1569 const char *type_name; 1570 static PyObject *int_name = NULL; 1571 if (int_name == NULL) { 1572 int_name = PyString_InternFromString("__int__"); 1573 if (int_name == NULL) 1574 return NULL; 1575 } 1576 1577 if (integral && (!PyInt_Check(integral) && 1578 !PyLong_Check(integral))) { 1579 /* Don't go through tp_as_number->nb_int to avoid 1580 hitting the classic class fallback to __trunc__. */ 1581 PyObject *int_func = PyObject_GetAttr(integral, int_name); 1582 if (int_func == NULL) { 1583 PyErr_Clear(); /* Raise a different error. */ 1584 goto non_integral_error; 1585 } 1586 Py_DECREF(integral); 1587 integral = PyEval_CallObject(int_func, NULL); 1588 Py_DECREF(int_func); 1589 if (integral && (!PyInt_Check(integral) && 1590 !PyLong_Check(integral))) { 1591 goto non_integral_error; 1592 } 1593 } 1594 return integral; 1567 1595 1568 1596 non_integral_error: 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1597 if (PyInstance_Check(integral)) { 1598 type_name = PyString_AS_STRING(((PyInstanceObject *)integral) 1599 ->in_class->cl_name); 1600 } 1601 else { 1602 type_name = integral->ob_type->tp_name; 1603 } 1604 PyErr_Format(PyExc_TypeError, error_format, type_name); 1605 Py_DECREF(integral); 1606 return NULL; 1579 1607 } 1580 1608 … … 1583 1611 PyNumber_Int(PyObject *o) 1584 1612 { 1585 1586 1587 1588 1589 1590 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 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1613 PyNumberMethods *m; 1614 static PyObject *trunc_name = NULL; 1615 PyObject *trunc_func; 1616 const char *buffer; 1617 Py_ssize_t buffer_len; 1618 1619 if (trunc_name == NULL) { 1620 trunc_name = PyString_InternFromString("__trunc__"); 1621 if (trunc_name == NULL) 1622 return NULL; 1623 } 1624 1625 if (o == NULL) 1626 return null_error(); 1627 if (PyInt_CheckExact(o)) { 1628 Py_INCREF(o); 1629 return o; 1630 } 1631 m = o->ob_type->tp_as_number; 1632 if (m && m->nb_int) { /* This should include subclasses of int */ 1633 /* Classic classes always take this branch. */ 1634 PyObject *res = m->nb_int(o); 1635 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) { 1636 PyErr_Format(PyExc_TypeError, 1637 "__int__ returned non-int (type %.200s)", 1638 res->ob_type->tp_name); 1639 Py_DECREF(res); 1640 return NULL; 1641 } 1642 return res; 1643 } 1644 if (PyInt_Check(o)) { /* A int subclass without nb_int */ 1645 PyIntObject *io = (PyIntObject*)o; 1646 return PyInt_FromLong(io->ob_ival); 1647 } 1648 trunc_func = PyObject_GetAttr(o, trunc_name); 1649 if (trunc_func) { 1650 PyObject *truncated = PyEval_CallObject(trunc_func, NULL); 1651 Py_DECREF(trunc_func); 1652 /* __trunc__ is specified to return an Integral type, but 1653 int() needs to return an int. */ 1654 return _PyNumber_ConvertIntegralToInt( 1655 truncated, 1656 "__trunc__ returned non-Integral (type %.200s)"); 1657 } 1658 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */ 1659 1660 if (PyString_Check(o)) 1661 return int_from_string(PyString_AS_STRING(o), 1662 PyString_GET_SIZE(o)); 1635 1663 #ifdef Py_USING_UNICODE 1636 1637 1638 1639 1664 if (PyUnicode_Check(o)) 1665 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o), 1666 PyUnicode_GET_SIZE(o), 1667 10); 1640 1668 #endif 1641 1642 1643 1644 1645 1669 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len)) 1670 return int_from_string((char*)buffer, buffer_len); 1671 1672 return type_error("int() argument must be a string or a " 1673 "number, not '%.200s'", o); 1646 1674 } 1647 1675 … … 1650 1678 long_from_string(const char *s, Py_ssize_t len) 1651 1679 { 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1680 char *end; 1681 PyObject *x; 1682 1683 x = PyLong_FromString((char*)s, &end, 10); 1684 if (x == NULL) 1685 return NULL; 1686 if (end != s + len) { 1687 PyErr_SetString(PyExc_ValueError, 1688 "null byte in argument for long()"); 1689 Py_DECREF(x); 1690 return NULL; 1691 } 1692 return x; 1665 1693 } 1666 1694 … … 1668 1696 PyNumber_Long(PyObject *o) 1669 1697 { 1670 PyNumberMethods *m; 1671 static PyObject *trunc_name = NULL; 1672 PyObject *trunc_func; 1673 const char *buffer; 1674 Py_ssize_t buffer_len; 1675 1676 if (trunc_name == NULL) { 1677 trunc_name = PyString_InternFromString("__trunc__"); 1678 if (trunc_name == NULL) 1679 return NULL; 1680 } 1681 1682 if (o == NULL) 1683 return null_error(); 1684 m = o->ob_type->tp_as_number; 1685 if (m && m->nb_long) { /* This should include subclasses of long */ 1686 /* Classic classes always take this branch. */ 1687 PyObject *res = m->nb_long(o); 1688 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) { 1689 PyErr_Format(PyExc_TypeError, 1690 "__long__ returned non-long (type %.200s)", 1691 res->ob_type->tp_name); 1692 Py_DECREF(res); 1693 return NULL; 1694 } 1695 return res; 1696 } 1697 if (PyLong_Check(o)) /* A long subclass without nb_long */ 1698 return _PyLong_Copy((PyLongObject *)o); 1699 trunc_func = PyObject_GetAttr(o, trunc_name); 1700 if (trunc_func) { 1701 PyObject *truncated = PyEval_CallObject(trunc_func, NULL); 1702 PyObject *int_instance; 1703 Py_DECREF(trunc_func); 1704 /* __trunc__ is specified to return an Integral type, 1705 but long() needs to return a long. */ 1706 int_instance = _PyNumber_ConvertIntegralToInt( 1707 truncated, 1708 "__trunc__ returned non-Integral (type %.200s)"); 1709 if (int_instance && PyInt_Check(int_instance)) { 1710 /* Make sure that long() returns a long instance. */ 1711 long value = PyInt_AS_LONG(int_instance); 1712 Py_DECREF(int_instance); 1713 return PyLong_FromLong(value); 1714 } 1715 return int_instance; 1716 } 1717 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */ 1718 1719 if (PyString_Check(o)) 1720 /* need to do extra error checking that PyLong_FromString() 1721 * doesn't do. In particular long('9.5') must raise an 1722 * exception, not truncate the float. 1723 */ 1724 return long_from_string(PyString_AS_STRING(o), 1725 PyString_GET_SIZE(o)); 1698 PyNumberMethods *m; 1699 static PyObject *trunc_name = NULL; 1700 PyObject *trunc_func; 1701 const char *buffer; 1702 Py_ssize_t buffer_len; 1703 1704 if (trunc_name == NULL) { 1705 trunc_name = PyString_InternFromString("__trunc__"); 1706 if (trunc_name == NULL) 1707 return NULL; 1708 } 1709 1710 if (o == NULL) 1711 return null_error(); 1712 m = o->ob_type->tp_as_number; 1713 if (m && m->nb_long) { /* This should include subclasses of long */ 1714 /* Classic classes always take this branch. */ 1715 PyObject *res = m->nb_long(o); 1716 if (res == NULL) 1717 return NULL; 1718 if (PyInt_Check(res)) { 1719 long value = PyInt_AS_LONG(res); 1720 Py_DECREF(res); 1721 return PyLong_FromLong(value); 1722 } 1723 else if (!PyLong_Check(res)) { 1724 PyErr_Format(PyExc_TypeError, 1725 "__long__ returned non-long (type %.200s)", 1726 res->ob_type->tp_name); 1727 Py_DECREF(res); 1728 return NULL; 1729 } 1730 return res; 1731 } 1732 if (PyLong_Check(o)) /* A long subclass without nb_long */ 1733 return _PyLong_Copy((PyLongObject *)o); 1734 trunc_func = PyObject_GetAttr(o, trunc_name); 1735 if (trunc_func) { 1736 PyObject *truncated = PyEval_CallObject(trunc_func, NULL); 1737 PyObject *int_instance; 1738 Py_DECREF(trunc_func); 1739 /* __trunc__ is specified to return an Integral type, 1740 but long() needs to return a long. */ 1741 int_instance = _PyNumber_ConvertIntegralToInt( 1742 truncated, 1743 "__trunc__ returned non-Integral (type %.200s)"); 1744 if (int_instance && PyInt_Check(int_instance)) { 1745 /* Make sure that long() returns a long instance. */ 1746 long value = PyInt_AS_LONG(int_instance); 1747 Py_DECREF(int_instance); 1748 return PyLong_FromLong(value); 1749 } 1750 return int_instance; 1751 } 1752 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */ 1753 1754 if (PyString_Check(o)) 1755 /* need to do extra error checking that PyLong_FromString() 1756 * doesn't do. In particular long('9.5') must raise an 1757 * exception, not truncate the float. 1758 */ 1759 return long_from_string(PyString_AS_STRING(o), 1760 PyString_GET_SIZE(o)); 1726 1761 #ifdef Py_USING_UNICODE 1727 1728 1729 1730 1731 1762 if (PyUnicode_Check(o)) 1763 /* The above check is done in PyLong_FromUnicode(). */ 1764 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o), 1765 PyUnicode_GET_SIZE(o), 1766 10); 1732 1767 #endif 1733 1734 1735 1736 1737 1768 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len)) 1769 return long_from_string(buffer, buffer_len); 1770 1771 return type_error("long() argument must be a string or a " 1772 "number, not '%.200s'", o); 1738 1773 } 1739 1774 … … 1741 1776 PyNumber_Float(PyObject *o) 1742 1777 { 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1778 PyNumberMethods *m; 1779 1780 if (o == NULL) 1781 return null_error(); 1782 m = o->ob_type->tp_as_number; 1783 if (m && m->nb_float) { /* This should include subclasses of float */ 1784 PyObject *res = m->nb_float(o); 1785 if (res && !PyFloat_Check(res)) { 1786 PyErr_Format(PyExc_TypeError, 1787 "__float__ returned non-float (type %.200s)", 1788 res->ob_type->tp_name); 1789 Py_DECREF(res); 1790 return NULL; 1791 } 1792 return res; 1793 } 1794 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */ 1795 PyFloatObject *po = (PyFloatObject *)o; 1796 return PyFloat_FromDouble(po->ob_fval); 1797 } 1798 return PyFloat_FromString(o, NULL); 1764 1799 } 1765 1800 … … 1767 1802 PyNumber_ToBase(PyObject *n, int base) 1768 1803 { 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1804 PyObject *res = NULL; 1805 PyObject *index = PyNumber_Index(n); 1806 1807 if (!index) 1808 return NULL; 1809 if (PyLong_Check(index)) 1810 res = _PyLong_Format(index, base, 0, 1); 1811 else if (PyInt_Check(index)) 1812 res = _PyInt_Format((PyIntObject*)index, base, 1); 1813 else 1814 /* It should not be possible to get here, as 1815 PyNumber_Index already has a check for the same 1816 condition */ 1817 PyErr_SetString(PyExc_ValueError, "PyNumber_ToBase: index not " 1818 "int or long"); 1819 Py_DECREF(index); 1820 return res; 1786 1821 } 1787 1822 … … 1792 1827 PySequence_Check(PyObject *s) 1793 1828 { 1794 if (s && PyInstance_Check(s)) 1795 return PyObject_HasAttrString(s, "__getitem__"); 1796 if (PyObject_IsInstance(s, (PyObject *)&PyDict_Type)) 1797 return 0; 1798 return s != NULL && s->ob_type->tp_as_sequence && 1799 s->ob_type->tp_as_sequence->sq_item != NULL; 1829 if (s == NULL) 1830 return 0; 1831 if (PyInstance_Check(s)) 1832 return PyObject_HasAttrString(s, "__getitem__"); 1833 if (PyDict_Check(s)) 1834 return 0; 1835 return s->ob_type->tp_as_sequence && 1836 s->ob_type->tp_as_sequence->sq_item != NULL; 1800 1837 } 1801 1838 … … 1803 1840 PySequence_Size(PyObject *s) 1804 1841 { 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1842 PySequenceMethods *m; 1843 1844 if (s == NULL) { 1845 null_error(); 1846 return -1; 1847 } 1848 1849 m = s->ob_type->tp_as_sequence; 1850 if (m && m->sq_length) 1851 return m->sq_length(s); 1852 1853 type_error("object of type '%.200s' has no len()", s); 1854 return -1; 1818 1855 } 1819 1856 … … 1822 1859 PySequence_Length(PyObject *s) 1823 1860 { 1824 1861 return PySequence_Size(s); 1825 1862 } 1826 1863 #define PySequence_Length PySequence_Size … … 1829 1866 PySequence_Concat(PyObject *s, PyObject *o) 1830 1867 { 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1868 PySequenceMethods *m; 1869 1870 if (s == NULL || o == NULL) 1871 return null_error(); 1872 1873 m = s->ob_type->tp_as_sequence; 1874 if (m && m->sq_concat) 1875 return m->sq_concat(s, o); 1876 1877 /* Instances of user classes defining an __add__() method only 1878 have an nb_add slot, not an sq_concat slot. So we fall back 1879 to nb_add if both arguments appear to be sequences. */ 1880 if (PySequence_Check(s) && PySequence_Check(o)) { 1881 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add)); 1882 if (result != Py_NotImplemented) 1883 return result; 1884 Py_DECREF(result); 1885 } 1886 return type_error("'%.200s' object can't be concatenated", s); 1850 1887 } 1851 1888 … … 1853 1890 PySequence_Repeat(PyObject *o, Py_ssize_t count) 1854 1891 { 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1892 PySequenceMethods *m; 1893 1894 if (o == NULL) 1895 return null_error(); 1896 1897 m = o->ob_type->tp_as_sequence; 1898 if (m && m->sq_repeat) 1899 return m->sq_repeat(o, count); 1900 1901 /* Instances of user classes defining a __mul__() method only 1902 have an nb_multiply slot, not an sq_repeat slot. so we fall back 1903 to nb_multiply if o appears to be a sequence. */ 1904 if (PySequence_Check(o)) { 1905 PyObject *n, *result; 1906 n = PyInt_FromSsize_t(count); 1907 if (n == NULL) 1908 return NULL; 1909 result = binary_op1(o, n, NB_SLOT(nb_multiply)); 1910 Py_DECREF(n); 1911 if (result != Py_NotImplemented) 1912 return result; 1913 Py_DECREF(result); 1914 } 1915 return type_error("'%.200s' object can't be repeated", o); 1879 1916 } 1880 1917 … … 1882 1919 PySequence_InPlaceConcat(PyObject *s, PyObject *o) 1883 1920 { 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1921 PySequenceMethods *m; 1922 1923 if (s == NULL || o == NULL) 1924 return null_error(); 1925 1926 m = s->ob_type->tp_as_sequence; 1927 if (m && HASINPLACE(s) && m->sq_inplace_concat) 1928 return m->sq_inplace_concat(s, o); 1929 if (m && m->sq_concat) 1930 return m->sq_concat(s, o); 1931 1932 if (PySequence_Check(s) && PySequence_Check(o)) { 1933 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add), 1934 NB_SLOT(nb_add)); 1935 if (result != Py_NotImplemented) 1936 return result; 1937 Py_DECREF(result); 1938 } 1939 return type_error("'%.200s' object can't be concatenated", s); 1903 1940 } 1904 1941 … … 1906 1943 PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count) 1907 1944 { 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1945 PySequenceMethods *m; 1946 1947 if (o == NULL) 1948 return null_error(); 1949 1950 m = o->ob_type->tp_as_sequence; 1951 if (m && HASINPLACE(o) && m->sq_inplace_repeat) 1952 return m->sq_inplace_repeat(o, count); 1953 if (m && m->sq_repeat) 1954 return m->sq_repeat(o, count); 1955 1956 if (PySequence_Check(o)) { 1957 PyObject *n, *result; 1958 n = PyInt_FromSsize_t(count); 1959 if (n == NULL) 1960 return NULL; 1961 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply), 1962 NB_SLOT(nb_multiply)); 1963 Py_DECREF(n); 1964 if (result != Py_NotImplemented) 1965 return result; 1966 Py_DECREF(result); 1967 } 1968 return type_error("'%.200s' object can't be repeated", o); 1932 1969 } 1933 1970 … … 1935 1972 PySequence_GetItem(PyObject *s, Py_ssize_t i) 1936 1973 { 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1974 PySequenceMethods *m; 1975 1976 if (s == NULL) 1977 return null_error(); 1978 1979 m = s->ob_type->tp_as_sequence; 1980 if (m && m->sq_item) { 1981 if (i < 0) { 1982 if (m->sq_length) { 1983 Py_ssize_t l = (*m->sq_length)(s); 1984 if (l < 0) 1985 return NULL; 1986 i += l; 1987 } 1988 } 1989 return m->sq_item(s, i); 1990 } 1991 1992 return type_error("'%.200s' object does not support indexing", s); 1956 1993 } 1957 1994 … … 1959 1996 PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2) 1960 1997 { 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1998 PySequenceMethods *m; 1999 PyMappingMethods *mp; 2000 2001 if (!s) return null_error(); 2002 2003 m = s->ob_type->tp_as_sequence; 2004 if (m && m->sq_slice) { 2005 if (i1 < 0 || i2 < 0) { 2006 if (m->sq_length) { 2007 Py_ssize_t l = (*m->sq_length)(s); 2008 if (l < 0) 2009 return NULL; 2010 if (i1 < 0) 2011 i1 += l; 2012 if (i2 < 0) 2013 i2 += l; 2014 } 2015 } 2016 return m->sq_slice(s, i1, i2); 2017 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) { 2018 PyObject *res; 2019 PyObject *slice = _PySlice_FromIndices(i1, i2); 2020 if (!slice) 2021 return NULL; 2022 res = mp->mp_subscript(s, slice); 2023 Py_DECREF(slice); 2024 return res; 2025 } 2026 2027 return type_error("'%.200s' object is unsliceable", s); 1991 2028 } 1992 2029 … … 1994 2031 PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o) 1995 2032 { 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2033 PySequenceMethods *m; 2034 2035 if (s == NULL) { 2036 null_error(); 2037 return -1; 2038 } 2039 2040 m = s->ob_type->tp_as_sequence; 2041 if (m && m->sq_ass_item) { 2042 if (i < 0) { 2043 if (m->sq_length) { 2044 Py_ssize_t l = (*m->sq_length)(s); 2045 if (l < 0) 2046 return -1; 2047 i += l; 2048 } 2049 } 2050 return m->sq_ass_item(s, i, o); 2051 } 2052 2053 type_error("'%.200s' object does not support item assignment", s); 2054 return -1; 2018 2055 } 2019 2056 … … 2021 2058 PySequence_DelItem(PyObject *s, Py_ssize_t i) 2022 2059 { 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2060 PySequenceMethods *m; 2061 2062 if (s == NULL) { 2063 null_error(); 2064 return -1; 2065 } 2066 2067 m = s->ob_type->tp_as_sequence; 2068 if (m && m->sq_ass_item) { 2069 if (i < 0) { 2070 if (m->sq_length) { 2071 Py_ssize_t l = (*m->sq_length)(s); 2072 if (l < 0) 2073 return -1; 2074 i += l; 2075 } 2076 } 2077 return m->sq_ass_item(s, i, (PyObject *)NULL); 2078 } 2079 2080 type_error("'%.200s' object doesn't support item deletion", s); 2081 return -1; 2045 2082 } 2046 2083 … … 2048 2085 PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o) 2049 2086 { 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2087 PySequenceMethods *m; 2088 PyMappingMethods *mp; 2089 2090 if (s == NULL) { 2091 null_error(); 2092 return -1; 2093 } 2094 2095 m = s->ob_type->tp_as_sequence; 2096 if (m && m->sq_ass_slice) { 2097 if (i1 < 0 || i2 < 0) { 2098 if (m->sq_length) { 2099 Py_ssize_t l = (*m->sq_length)(s); 2100 if (l < 0) 2101 return -1; 2102 if (i1 < 0) 2103 i1 += l; 2104 if (i2 < 0) 2105 i2 += l; 2106 } 2107 } 2108 return m->sq_ass_slice(s, i1, i2, o); 2109 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) { 2110 int res; 2111 PyObject *slice = _PySlice_FromIndices(i1, i2); 2112 if (!slice) 2113 return -1; 2114 res = mp->mp_ass_subscript(s, slice, o); 2115 Py_DECREF(slice); 2116 return res; 2117 } 2118 2119 type_error("'%.200s' object doesn't support slice assignment", s); 2120 return -1; 2084 2121 } 2085 2122 … … 2087 2124 PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2) 2088 2125 { 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2126 PySequenceMethods *m; 2127 2128 if (s == NULL) { 2129 null_error(); 2130 return -1; 2131 } 2132 2133 m = s->ob_type->tp_as_sequence; 2134 if (m && m->sq_ass_slice) { 2135 if (i1 < 0 || i2 < 0) { 2136 if (m->sq_length) { 2137 Py_ssize_t l = (*m->sq_length)(s); 2138 if (l < 0) 2139 return -1; 2140 if (i1 < 0) 2141 i1 += l; 2142 if (i2 < 0) 2143 i2 += l; 2144 } 2145 } 2146 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL); 2147 } 2148 type_error("'%.200s' object doesn't support slice deletion", s); 2149 return -1; 2113 2150 } 2114 2151 … … 2116 2153 PySequence_Tuple(PyObject *v) 2117 2154 { 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 2161 2162 than for lists because unlike lists the 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 goto Fail; 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2155 PyObject *it; /* iter(v) */ 2156 Py_ssize_t n; /* guess for result tuple size */ 2157 PyObject *result = NULL; 2158 Py_ssize_t j; 2159 2160 if (v == NULL) 2161 return null_error(); 2162 2163 /* Special-case the common tuple and list cases, for efficiency. */ 2164 if (PyTuple_CheckExact(v)) { 2165 /* Note that we can't know whether it's safe to return 2166 a tuple *subclass* instance as-is, hence the restriction 2167 to exact tuples here. In contrast, lists always make 2168 a copy, so there's no need for exactness below. */ 2169 Py_INCREF(v); 2170 return v; 2171 } 2172 if (PyList_Check(v)) 2173 return PyList_AsTuple(v); 2174 2175 /* Get iterator. */ 2176 it = PyObject_GetIter(v); 2177 if (it == NULL) 2178 return NULL; 2179 2180 /* Guess result size and allocate space. */ 2181 n = _PyObject_LengthHint(v, 10); 2182 if (n == -1) 2183 goto Fail; 2184 result = PyTuple_New(n); 2185 if (result == NULL) 2186 goto Fail; 2187 2188 /* Fill the tuple. */ 2189 for (j = 0; ; ++j) { 2190 PyObject *item = PyIter_Next(it); 2191 if (item == NULL) { 2192 if (PyErr_Occurred()) 2193 goto Fail; 2194 break; 2195 } 2196 if (j >= n) { 2197 Py_ssize_t oldn = n; 2198 /* The over-allocation strategy can grow a bit faster 2199 than for lists because unlike lists the 2200 over-allocation isn't permanent -- we reclaim 2201 the excess before the end of this routine. 2202 So, grow by ten and then add 25%. 2203 */ 2204 n += 10; 2205 n += n >> 2; 2206 if (n < oldn) { 2207 /* Check for overflow */ 2208 PyErr_NoMemory(); 2209 Py_DECREF(item); 2210 goto Fail; 2211 } 2212 if (_PyTuple_Resize(&result, n) != 0) { 2213 Py_DECREF(item); 2214 goto Fail; 2215 } 2216 } 2217 PyTuple_SET_ITEM(result, j, item); 2218 } 2219 2220 /* Cut tuple back if guess was too large. */ 2221 if (j < n && 2222 _PyTuple_Resize(&result, j) != 0) 2223 goto Fail; 2224 2225 Py_DECREF(it); 2226 return result; 2190 2227 2191 2228 Fail: 2192 2193 2194 2229 Py_XDECREF(result); 2230 Py_DECREF(it); 2231 return NULL; 2195 2232 } 2196 2233 … … 2198 2235 PySequence_List(PyObject *v) 2199 2236 { 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2237 PyObject *result; /* result list */ 2238 PyObject *rv; /* return value from PyList_Extend */ 2239 2240 if (v == NULL) 2241 return null_error(); 2242 2243 result = PyList_New(0); 2244 if (result == NULL) 2245 return NULL; 2246 2247 rv = _PyList_Extend((PyListObject *)result, v); 2248 if (rv == NULL) { 2249 Py_DECREF(result); 2250 return NULL; 2251 } 2252 Py_DECREF(rv); 2253 return result; 2217 2254 } 2218 2255 … … 2220 2257 PySequence_Fast(PyObject *v, const char *m) 2221 2258 { 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2259 PyObject *it; 2260 2261 if (v == NULL) 2262 return null_error(); 2263 2264 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) { 2265 Py_INCREF(v); 2266 return v; 2267 } 2268 2269 it = PyObject_GetIter(v); 2270 if (it == NULL) { 2271 if (PyErr_ExceptionMatches(PyExc_TypeError)) 2272 PyErr_SetString(PyExc_TypeError, m); 2273 return NULL; 2274 } 2275 2276 v = PySequence_List(it); 2277 Py_DECREF(it); 2278 2279 return v; 2243 2280 } 2244 2281 … … 2246 2283 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq. 2247 2284 PY_ITERSEARCH_INDEX: 0-based index of first occurrence of obj in seq; 2248 2285 set ValueError and return -1 if none found; also return -1 on error. 2249 2286 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error. 2250 2287 */ … … 2252 2289 _PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation) 2253 2290 { 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2291 Py_ssize_t n; 2292 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */ 2293 PyObject *it; /* iter(seq) */ 2294 2295 if (seq == NULL || obj == NULL) { 2296 null_error(); 2297 return -1; 2298 } 2299 2300 it = PyObject_GetIter(seq); 2301 if (it == NULL) { 2302 type_error("argument of type '%.200s' is not iterable", seq); 2303 return -1; 2304 } 2305 2306 n = wrapped = 0; 2307 for (;;) { 2308 int cmp; 2309 PyObject *item = PyIter_Next(it); 2310 if (item == NULL) { 2311 if (PyErr_Occurred()) 2312 goto Fail; 2313 break; 2314 } 2315 2316 cmp = PyObject_RichCompareBool(obj, item, Py_EQ); 2317 Py_DECREF(item); 2318 if (cmp < 0) 2319 goto Fail; 2320 if (cmp > 0) { 2321 switch (operation) { 2322 case PY_ITERSEARCH_COUNT: 2323 if (n == PY_SSIZE_T_MAX) { 2324 PyErr_SetString(PyExc_OverflowError, 2325 "count exceeds C integer size"); 2326 goto Fail; 2327 } 2328 ++n; 2329 break; 2330 2331 case PY_ITERSEARCH_INDEX: 2332 if (wrapped) { 2333 PyErr_SetString(PyExc_OverflowError, 2334 "index exceeds C integer size"); 2335 goto Fail; 2336 } 2337 goto Done; 2338 2339 case PY_ITERSEARCH_CONTAINS: 2340 n = 1; 2341 goto Done; 2342 2343 default: 2344 assert(!"unknown operation"); 2345 } 2346 } 2347 2348 if (operation == PY_ITERSEARCH_INDEX) { 2349 if (n == PY_SSIZE_T_MAX) 2350 wrapped = 1; 2351 ++n; 2352 } 2353 } 2354 2355 if (operation != PY_ITERSEARCH_INDEX) 2356 goto Done; 2357 2358 PyErr_SetString(PyExc_ValueError, 2359 "sequence.index(x): x not in sequence"); 2360 /* fall into failure code */ 2324 2361 Fail: 2325 2326 2362 n = -1; 2363 /* fall through */ 2327 2364 Done: 2328 2329 2365 Py_DECREF(it); 2366 return n; 2330 2367 2331 2368 } … … 2335 2372 PySequence_Count(PyObject *s, PyObject *o) 2336 2373 { 2337 2374 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT); 2338 2375 } 2339 2376 … … 2344 2381 PySequence_Contains(PyObject *seq, PyObject *ob) 2345 2382 { 2346 2347 2348 2349 2350 2351 2352 2353 2383 Py_ssize_t result; 2384 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) { 2385 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence; 2386 if (sqm != NULL && sqm->sq_contains != NULL) 2387 return (*sqm->sq_contains)(seq, ob); 2388 } 2389 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS); 2390 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int); 2354 2391 } 2355 2392 … … 2359 2396 PySequence_In(PyObject *w, PyObject *v) 2360 2397 { 2361 2398 return PySequence_Contains(w, v); 2362 2399 } 2363 2400 … … 2365 2402 PySequence_Index(PyObject *s, PyObject *o) 2366 2403 { 2367 2404 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX); 2368 2405 } 2369 2406 … … 2373 2410 PyMapping_Check(PyObject *o) 2374 2411 { 2375 2376 2377 2378 2379 2380 !(o->ob_type->tp_as_sequence && 2381 2412 if (o && PyInstance_Check(o)) 2413 return PyObject_HasAttrString(o, "__getitem__"); 2414 2415 return o && o->ob_type->tp_as_mapping && 2416 o->ob_type->tp_as_mapping->mp_subscript && 2417 !(o->ob_type->tp_as_sequence && 2418 o->ob_type->tp_as_sequence->sq_slice); 2382 2419 } 2383 2420 … … 2385 2422 PyMapping_Size(PyObject *o) 2386 2423 { 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2424 PyMappingMethods *m; 2425 2426 if (o == NULL) { 2427 null_error(); 2428 return -1; 2429 } 2430 2431 m = o->ob_type->tp_as_mapping; 2432 if (m && m->mp_length) 2433 return m->mp_length(o); 2434 2435 type_error("object of type '%.200s' has no len()", o); 2436 return -1; 2400 2437 } 2401 2438 … … 2404 2441 PyMapping_Length(PyObject *o) 2405 2442 { 2406 2443 return PyMapping_Size(o); 2407 2444 } 2408 2445 #define PyMapping_Length PyMapping_Size … … 2411 2448 PyMapping_GetItemString(PyObject *o, char *key) 2412 2449 { 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2450 PyObject *okey, *r; 2451 2452 if (key == NULL) 2453 return null_error(); 2454 2455 okey = PyString_FromString(key); 2456 if (okey == NULL) 2457 return NULL; 2458 r = PyObject_GetItem(o, okey); 2459 Py_DECREF(okey); 2460 return r; 2424 2461 } 2425 2462 … … 2427 2464 PyMapping_SetItemString(PyObject *o, char *key, PyObject *value) 2428 2465 { 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2466 PyObject *okey; 2467 int r; 2468 2469 if (key == NULL) { 2470 null_error(); 2471 return -1; 2472 } 2473 2474 okey = PyString_FromString(key); 2475 if (okey == NULL) 2476 return -1; 2477 r = PyObject_SetItem(o, okey, value); 2478 Py_DECREF(okey); 2479 return r; 2443 2480 } 2444 2481 … … 2446 2483 PyMapping_HasKeyString(PyObject *o, char *key) 2447 2484 { 2448 2449 2450 2451 2452 2453 2454 2455 2456 2485 PyObject *v; 2486 2487 v = PyMapping_GetItemString(o, key); 2488 if (v) { 2489 Py_DECREF(v); 2490 return 1; 2491 } 2492 PyErr_Clear(); 2493 return 0; 2457 2494 } 2458 2495 … … 2460 2497 PyMapping_HasKey(PyObject *o, PyObject *key) 2461 2498 { 2462 2463 2464 2465 2466 2467 2468 2469 2470 2499 PyObject *v; 2500 2501 v = PyObject_GetItem(o, key); 2502 if (v) { 2503 Py_DECREF(v); 2504 return 1; 2505 } 2506 PyErr_Clear(); 2507 return 0; 2471 2508 } 2472 2509 … … 2478 2515 PyObject_CallObject(PyObject *o, PyObject *a) 2479 2516 { 2480 2517 return PyEval_CallObjectWithKeywords(o, a, NULL); 2481 2518 } 2482 2519 … … 2484 2521 PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) 2485 2522 { 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2523 ternaryfunc call; 2524 2525 if ((call = func->ob_type->tp_call) != NULL) { 2526 PyObject *result; 2527 if (Py_EnterRecursiveCall(" while calling a Python object")) 2528 return NULL; 2529 result = (*call)(func, arg, kw); 2530 Py_LeaveRecursiveCall(); 2531 if (result == NULL && !PyErr_Occurred()) 2532 PyErr_SetString( 2533 PyExc_SystemError, 2534 "NULL result without error in PyObject_Call"); 2535 return result; 2536 } 2537 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable", 2538 func->ob_type->tp_name); 2539 return NULL; 2503 2540 } 2504 2541 … … 2506 2543 call_function_tail(PyObject *callable, PyObject *args) 2507 2544 { 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2545 PyObject *retval; 2546 2547 if (args == NULL) 2548 return NULL; 2549 2550 if (!PyTuple_Check(args)) { 2551 PyObject *a; 2552 2553 a = PyTuple_New(1); 2554 if (a == NULL) { 2555 Py_DECREF(args); 2556 return NULL; 2557 } 2558 PyTuple_SET_ITEM(a, 0, args); 2559 args = a; 2560 } 2561 retval = PyObject_Call(callable, args, NULL); 2562 2563 Py_DECREF(args); 2564 2565 return retval; 2529 2566 } 2530 2567 … … 2532 2569 PyObject_CallFunction(PyObject *callable, char *format, ...) 2533 2570 { 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2571 va_list va; 2572 PyObject *args; 2573 2574 if (callable == NULL) 2575 return null_error(); 2576 2577 if (format && *format) { 2578 va_start(va, format); 2579 args = Py_VaBuildValue(format, va); 2580 va_end(va); 2581 } 2582 else 2583 args = PyTuple_New(0); 2584 2585 return call_function_tail(callable, args); 2549 2586 } 2550 2587 … … 2552 2589 _PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...) 2553 2590 { 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2591 va_list va; 2592 PyObject *args; 2593 2594 if (callable == NULL) 2595 return null_error(); 2596 2597 if (format && *format) { 2598 va_start(va, format); 2599 args = _Py_VaBuildValue_SizeT(format, va); 2600 va_end(va); 2601 } 2602 else 2603 args = PyTuple_New(0); 2604 2605 return call_function_tail(callable, args); 2569 2606 } 2570 2607 … … 2572 2609 PyObject_CallMethod(PyObject *o, char *name, char *format, ...) 2573 2610 { 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 type_error("attribute of type '%.200s' is not callable", func); 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2611 va_list va; 2612 PyObject *args; 2613 PyObject *func = NULL; 2614 PyObject *retval = NULL; 2615 2616 if (o == NULL || name == NULL) 2617 return null_error(); 2618 2619 func = PyObject_GetAttrString(o, name); 2620 if (func == NULL) { 2621 PyErr_SetString(PyExc_AttributeError, name); 2622 return 0; 2623 } 2624 2625 if (!PyCallable_Check(func)) { 2626 type_error("attribute of type '%.200s' is not callable", func); 2627 goto exit; 2628 } 2629 2630 if (format && *format) { 2631 va_start(va, format); 2632 args = Py_VaBuildValue(format, va); 2633 va_end(va); 2634 } 2635 else 2636 args = PyTuple_New(0); 2637 2638 retval = call_function_tail(func, args); 2602 2639 2603 2640 exit: 2604 2605 2606 2607 2641 /* args gets consumed in call_function_tail */ 2642 Py_XDECREF(func); 2643 2644 return retval; 2608 2645 } 2609 2646 … … 2611 2648 _PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...) 2612 2649 { 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 type_error("attribute of type '%.200s' is not callable", func); 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2650 va_list va; 2651 PyObject *args; 2652 PyObject *func = NULL; 2653 PyObject *retval = NULL; 2654 2655 if (o == NULL || name == NULL) 2656 return null_error(); 2657 2658 func = PyObject_GetAttrString(o, name); 2659 if (func == NULL) { 2660 PyErr_SetString(PyExc_AttributeError, name); 2661 return 0; 2662 } 2663 2664 if (!PyCallable_Check(func)) { 2665 type_error("attribute of type '%.200s' is not callable", func); 2666 goto exit; 2667 } 2668 2669 if (format && *format) { 2670 va_start(va, format); 2671 args = _Py_VaBuildValue_SizeT(format, va); 2672 va_end(va); 2673 } 2674 else 2675 args = PyTuple_New(0); 2676 2677 retval = call_function_tail(func, args); 2641 2678 2642 2679 exit: 2643 2644 2645 2646 2680 /* args gets consumed in call_function_tail */ 2681 Py_XDECREF(func); 2682 2683 return retval; 2647 2684 } 2648 2685 … … 2651 2688 objargs_mktuple(va_list va) 2652 2689 { 2653 2654 2655 2690 int i, n = 0; 2691 va_list countva; 2692 PyObject *result, *tmp; 2656 2693 2657 2694 #ifdef VA_LIST_IS_ARRAY 2658 2695 memcpy(countva, va, sizeof(va_list)); 2659 2696 #else 2660 2697 #ifdef __va_copy 2661 2698 __va_copy(countva, va); 2662 2699 #else 2663 2700 countva = va; 2664 2701 #endif 2665 2702 #endif 2666 2703 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2704 while (((PyObject *)va_arg(countva, PyObject *)) != NULL) 2705 ++n; 2706 result = PyTuple_New(n); 2707 if (result != NULL && n > 0) { 2708 for (i = 0; i < n; ++i) { 2709 tmp = (PyObject *)va_arg(va, PyObject *); 2710 PyTuple_SET_ITEM(result, i, tmp); 2711 Py_INCREF(tmp); 2712 } 2713 } 2714 return result; 2678 2715 } 2679 2716 … … 2681 2718 PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...) 2682 2719 { 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2720 PyObject *args, *tmp; 2721 va_list vargs; 2722 2723 if (callable == NULL || name == NULL) 2724 return null_error(); 2725 2726 callable = PyObject_GetAttr(callable, name); 2727 if (callable == NULL) 2728 return NULL; 2729 2730 /* count the args */ 2731 va_start(vargs, name); 2732 args = objargs_mktuple(vargs); 2733 va_end(vargs); 2734 if (args == NULL) { 2735 Py_DECREF(callable); 2736 return NULL; 2737 } 2738 tmp = PyObject_Call(callable, args, NULL); 2739 Py_DECREF(args); 2740 Py_DECREF(callable); 2741 2742 return tmp; 2706 2743 } 2707 2744 … … 2709 2746 PyObject_CallFunctionObjArgs(PyObject *callable, ...) 2710 2747 { 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2748 PyObject *args, *tmp; 2749 va_list vargs; 2750 2751 if (callable == NULL) 2752 return null_error(); 2753 2754 /* count the args */ 2755 va_start(vargs, callable); 2756 args = objargs_mktuple(vargs); 2757 va_end(vargs); 2758 if (args == NULL) 2759 return NULL; 2760 tmp = PyObject_Call(callable, args, NULL); 2761 Py_DECREF(args); 2762 2763 return tmp; 2727 2764 } 2728 2765 … … 2759 2796 abstract_get_bases(PyObject *cls) 2760 2797 { 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2798 static PyObject *__bases__ = NULL; 2799 PyObject *bases; 2800 2801 if (__bases__ == NULL) { 2802 __bases__ = PyString_InternFromString("__bases__"); 2803 if (__bases__ == NULL) 2804 return NULL; 2805 } 2806 bases = PyObject_GetAttr(cls, __bases__); 2807 if (bases == NULL) { 2808 if (PyErr_ExceptionMatches(PyExc_AttributeError)) 2809 PyErr_Clear(); 2810 return NULL; 2811 } 2812 if (!PyTuple_Check(bases)) { 2813 Py_DECREF(bases); 2814 return NULL; 2815 } 2816 return bases; 2780 2817 } 2781 2818 … … 2784 2821 abstract_issubclass(PyObject *derived, PyObject *cls) 2785 2822 { 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2823 PyObject *bases = NULL; 2824 Py_ssize_t i, n; 2825 int r = 0; 2826 2827 while (1) { 2828 if (derived == cls) 2829 return 1; 2830 bases = abstract_get_bases(derived); 2831 if (bases == NULL) { 2832 if (PyErr_Occurred()) 2833 return -1; 2834 return 0; 2835 } 2836 n = PyTuple_GET_SIZE(bases); 2837 if (n == 0) { 2838 Py_DECREF(bases); 2839 return 0; 2840 } 2841 /* Avoid recursivity in the single inheritance case */ 2842 if (n == 1) { 2843 derived = PyTuple_GET_ITEM(bases, 0); 2844 Py_DECREF(bases); 2845 continue; 2846 } 2847 for (i = 0; i < n; i++) { 2848 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls); 2849 if (r != 0) 2850 break; 2851 } 2852 Py_DECREF(bases); 2853 return r; 2854 } 2818 2855 } 2819 2856 … … 2821 2858 check_class(PyObject *cls, const char *error) 2822 2859 { 2823 2824 2825 2826 2827 2828 2829 2830 2831 2860 PyObject *bases = abstract_get_bases(cls); 2861 if (bases == NULL) { 2862 /* Do not mask errors. */ 2863 if (!PyErr_Occurred()) 2864 PyErr_SetString(PyExc_TypeError, error); 2865 return 0; 2866 } 2867 Py_DECREF(bases); 2868 return -1; 2832 2869 } 2833 2870 … … 2835 2872 recursive_isinstance(PyObject *inst, PyObject *cls) 2836 2873 { 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2874 PyObject *icls; 2875 static PyObject *__class__ = NULL; 2876 int retval = 0; 2877 2878 if (__class__ == NULL) { 2879 __class__ = PyString_InternFromString("__class__"); 2880 if (__class__ == NULL) 2881 return -1; 2882 } 2883 2884 if (PyClass_Check(cls) && PyInstance_Check(inst)) { 2885 PyObject *inclass = 2886 (PyObject*)((PyInstanceObject*)inst)->in_class; 2887 retval = PyClass_IsSubclass(inclass, cls); 2888 } 2889 else if (PyType_Check(cls)) { 2890 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls); 2891 if (retval == 0) { 2892 PyObject *c = PyObject_GetAttr(inst, __class__); 2893 if (c == NULL) { 2894 PyErr_Clear(); 2895 } 2896 else { 2897 if (c != (PyObject *)(inst->ob_type) && 2898 PyType_Check(c)) 2899 retval = PyType_IsSubtype( 2900 (PyTypeObject *)c, 2901 (PyTypeObject *)cls); 2902 Py_DECREF(c); 2903 } 2904 } 2905 } 2906 else { 2907 if (!check_class(cls, 2908 "isinstance() arg 2 must be a class, type," 2909 " or tuple of classes and types")) 2910 return -1; 2911 icls = PyObject_GetAttr(inst, __class__); 2912 if (icls == NULL) { 2913 PyErr_Clear(); 2914 retval = 0; 2915 } 2916 else { 2917 retval = abstract_issubclass(icls, cls); 2918 Py_DECREF(icls); 2919 } 2920 } 2921 2922 return retval; 2886 2923 } 2887 2924 … … 2889 2926 PyObject_IsInstance(PyObject *inst, PyObject *cls) 2890 2927 { 2891 static PyObject *name = NULL; 2892 PyObject *checker; 2893 2894 /* Quick test for an exact match */ 2895 if (Py_TYPE(inst) == (PyTypeObject *)cls) 2896 return 1; 2897 2898 if (PyTuple_Check(cls)) { 2899 Py_ssize_t i; 2900 Py_ssize_t n; 2901 int r = 0; 2902 2903 if (Py_EnterRecursiveCall(" in __instancecheck__")) 2904 return -1; 2905 n = PyTuple_GET_SIZE(cls); 2906 for (i = 0; i < n; ++i) { 2907 PyObject *item = PyTuple_GET_ITEM(cls, i); 2908 r = PyObject_IsInstance(inst, item); 2909 if (r != 0) 2910 /* either found it, or got an error */ 2911 break; 2912 } 2913 Py_LeaveRecursiveCall(); 2914 return r; 2915 } 2916 if (name == NULL) { 2917 name = PyString_InternFromString("__instancecheck__"); 2918 if (name == NULL) 2919 return -1; 2920 } 2921 checker = PyObject_GetAttr(cls, name); 2922 if (checker == NULL && PyErr_Occurred()) 2923 PyErr_Clear(); 2924 if (checker != NULL) { 2925 PyObject *res; 2926 int ok = -1; 2927 if (Py_EnterRecursiveCall(" in __instancecheck__")) { 2928 Py_DECREF(checker); 2929 return ok; 2930 } 2931 res = PyObject_CallFunctionObjArgs(checker, inst, NULL); 2932 Py_LeaveRecursiveCall(); 2933 Py_DECREF(checker); 2934 if (res != NULL) { 2935 ok = PyObject_IsTrue(res); 2936 Py_DECREF(res); 2937 } 2938 return ok; 2939 } 2940 return recursive_isinstance(inst, cls); 2928 static PyObject *name = NULL; 2929 2930 /* Quick test for an exact match */ 2931 if (Py_TYPE(inst) == (PyTypeObject *)cls) 2932 return 1; 2933 2934 if (PyTuple_Check(cls)) { 2935 Py_ssize_t i; 2936 Py_ssize_t n; 2937 int r = 0; 2938 2939 if (Py_EnterRecursiveCall(" in __instancecheck__")) 2940 return -1; 2941 n = PyTuple_GET_SIZE(cls); 2942 for (i = 0; i < n; ++i) { 2943 PyObject *item = PyTuple_GET_ITEM(cls, i); 2944 r = PyObject_IsInstance(inst, item); 2945 if (r != 0) 2946 /* either found it, or got an error */ 2947 break; 2948 } 2949 Py_LeaveRecursiveCall(); 2950 return r; 2951 } 2952 2953 if (!(PyClass_Check(cls) || PyInstance_Check(cls))) { 2954 PyObject *checker; 2955 checker = _PyObject_LookupSpecial(cls, "__instancecheck__", &name); 2956 if (checker != NULL) { 2957 PyObject *res; 2958 int ok = -1; 2959 if (Py_EnterRecursiveCall(" in __instancecheck__")) { 2960 Py_DECREF(checker); 2961 return ok; 2962 } 2963 res = PyObject_CallFunctionObjArgs(checker, inst, NULL); 2964 Py_LeaveRecursiveCall(); 2965 Py_DECREF(checker); 2966 if (res != NULL) { 2967 ok = PyObject_IsTrue(res); 2968 Py_DECREF(res); 2969 } 2970 return ok; 2971 } 2972 else if (PyErr_Occurred()) 2973 return -1; 2974 } 2975 return recursive_isinstance(inst, cls); 2941 2976 } 2942 2977 … … 2944 2979 recursive_issubclass(PyObject *derived, PyObject *cls) 2945 2980 { 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2981 int retval; 2982 2983 if (PyType_Check(cls) && PyType_Check(derived)) { 2984 /* Fast path (non-recursive) */ 2985 return PyType_IsSubtype( 2986 (PyTypeObject *)derived, (PyTypeObject *)cls); 2987 } 2988 if (!PyClass_Check(derived) || !PyClass_Check(cls)) { 2989 if (!check_class(derived, 2990 "issubclass() arg 1 must be a class")) 2991 return -1; 2992 2993 if (!check_class(cls, 2994 "issubclass() arg 2 must be a class" 2995 " or tuple of classes")) 2996 return -1; 2997 retval = abstract_issubclass(derived, cls); 2998 } 2999 else { 3000 /* shortcut */ 3001 if (!(retval = (derived == cls))) 3002 retval = PyClass_IsSubclass(derived, cls); 3003 } 3004 3005 return retval; 2971 3006 } 2972 3007 … … 2974 3009 PyObject_IsSubclass(PyObject *derived, PyObject *cls) 2975 3010 { 2976 static PyObject *name = NULL; 2977 PyObject *t, *v, *tb; 2978 PyObject *checker; 2979 2980 if (PyTuple_Check(cls)) { 2981 Py_ssize_t i; 2982 Py_ssize_t n; 2983 int r = 0; 2984 2985 if (Py_EnterRecursiveCall(" in __subclasscheck__")) 2986 return -1; 2987 n = PyTuple_GET_SIZE(cls); 2988 for (i = 0; i < n; ++i) { 2989 PyObject *item = PyTuple_GET_ITEM(cls, i); 2990 r = PyObject_IsSubclass(derived, item); 2991 if (r != 0) 2992 /* either found it, or got an error */ 2993 break; 2994 } 2995 Py_LeaveRecursiveCall(); 2996 return r; 2997 } 2998 if (name == NULL) { 2999 name = PyString_InternFromString("__subclasscheck__"); 3000 if (name == NULL) 3001 return -1; 3002 } 3003 PyErr_Fetch(&t, &v, &tb); 3004 checker = PyObject_GetAttr(cls, name); 3005 PyErr_Restore(t, v, tb); 3006 if (checker != NULL) { 3007 PyObject *res; 3008 int ok = -1; 3009 if (Py_EnterRecursiveCall(" in __subclasscheck__")) { 3010 Py_DECREF(checker); 3011 return ok; 3012 } 3013 res = PyObject_CallFunctionObjArgs(checker, derived, NULL); 3014 Py_LeaveRecursiveCall(); 3015 Py_DECREF(checker); 3016 if (res != NULL) { 3017 ok = PyObject_IsTrue(res); 3018 Py_DECREF(res); 3019 } 3020 return ok; 3021 } 3022 return recursive_issubclass(derived, cls); 3011 static PyObject *name = NULL; 3012 3013 if (PyTuple_Check(cls)) { 3014 Py_ssize_t i; 3015 Py_ssize_t n; 3016 int r = 0; 3017 3018 if (Py_EnterRecursiveCall(" in __subclasscheck__")) 3019 return -1; 3020 n = PyTuple_GET_SIZE(cls); 3021 for (i = 0; i < n; ++i) { 3022 PyObject *item = PyTuple_GET_ITEM(cls, i); 3023 r = PyObject_IsSubclass(derived, item); 3024 if (r != 0) 3025 /* either found it, or got an error */ 3026 break; 3027 } 3028 Py_LeaveRecursiveCall(); 3029 return r; 3030 } 3031 if (!(PyClass_Check(cls) || PyInstance_Check(cls))) { 3032 PyObject *checker; 3033 checker = _PyObject_LookupSpecial(cls, "__subclasscheck__", &name); 3034 if (checker != NULL) { 3035 PyObject *res; 3036 int ok = -1; 3037 if (Py_EnterRecursiveCall(" in __subclasscheck__")) { 3038 Py_DECREF(checker); 3039 return ok; 3040 } 3041 res = PyObject_CallFunctionObjArgs(checker, derived, NULL); 3042 Py_LeaveRecursiveCall(); 3043 Py_DECREF(checker); 3044 if (res != NULL) { 3045 ok = PyObject_IsTrue(res); 3046 Py_DECREF(res); 3047 } 3048 return ok; 3049 } 3050 else if (PyErr_Occurred()) { 3051 return -1; 3052 } 3053 } 3054 return recursive_issubclass(derived, cls); 3023 3055 } 3024 3056 … … 3026 3058 _PyObject_RealIsInstance(PyObject *inst, PyObject *cls) 3027 3059 { 3028 3060 return recursive_isinstance(inst, cls); 3029 3061 } 3030 3062 … … 3032 3064 _PyObject_RealIsSubclass(PyObject *derived, PyObject *cls) 3033 3065 { 3034 3066 return recursive_issubclass(derived, cls); 3035 3067 } 3036 3068 … … 3039 3071 PyObject_GetIter(PyObject *o) 3040 3072 { 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3073 PyTypeObject *t = o->ob_type; 3074 getiterfunc f = NULL; 3075 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER)) 3076 f = t->tp_iter; 3077 if (f == NULL) { 3078 if (PySequence_Check(o)) 3079 return PySeqIter_New(o); 3080 return type_error("'%.200s' object is not iterable", o); 3081 } 3082 else { 3083 PyObject *res = (*f)(o); 3084 if (res != NULL && !PyIter_Check(res)) { 3085 PyErr_Format(PyExc_TypeError, 3086 "iter() returned non-iterator " 3087 "of type '%.100s'", 3088 res->ob_type->tp_name); 3089 Py_DECREF(res); 3090 res = NULL; 3091 } 3092 return res; 3093 } 3062 3094 } 3063 3095 … … 3072 3104 PyIter_Next(PyObject *iter) 3073 3105 { 3074 PyObject *result; 3075 assert(PyIter_Check(iter)); 3076 result = (*iter->ob_type->tp_iternext)(iter); 3077 if (result == NULL && 3078 PyErr_Occurred() && 3079 PyErr_ExceptionMatches(PyExc_StopIteration)) 3080 PyErr_Clear(); 3081 return result; 3082 } 3106 PyObject *result; 3107 result = (*iter->ob_type->tp_iternext)(iter); 3108 if (result == NULL && 3109 PyErr_Occurred() && 3110 PyErr_ExceptionMatches(PyExc_StopIteration)) 3111 PyErr_Clear(); 3112 return result; 3113 }
Note:
See TracChangeset
for help on using the changeset viewer.