Changeset 388 for python/vendor/current/Modules/cPickle.c
- Timestamp:
- Mar 19, 2014, 11:11:30 AM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
python/vendor/current/Modules/cPickle.c
r2 r388 73 73 74 74 /* Protocol 2. */ 75 #define PROTO 75 #define PROTO '\x80' /* identify pickle protocol */ 76 76 #define NEWOBJ '\x81' /* build object by applying cls.__new__ to argtuple */ 77 77 #define EXT1 '\x82' /* push object from extension registry; 1-byte index */ … … 132 132 *__reduce_ex___str, 133 133 *write_str, *append_str, 134 *read_str, *readline_str, *__main___str, 134 *read_str, *readline_str, *__main___str, 135 135 *dispatch_table_str; 136 136 … … 139 139 140 140 typedef struct { 141 142 int length;/* number of initial slots in data currently used */143 int size;/* number of slots in data allocated */144 141 PyObject_HEAD 142 Py_ssize_t length; /* number of initial slots in data currently used */ 143 Py_ssize_t size; /* number of slots in data allocated */ 144 PyObject **data; 145 145 } Pdata; 146 146 … … 148 148 Pdata_dealloc(Pdata *self) 149 149 { 150 int i;151 152 153 154 155 156 157 158 150 Py_ssize_t i; 151 PyObject **p; 152 153 for (i = self->length, p = self->data; --i >= 0; p++) { 154 Py_DECREF(*p); 155 } 156 if (self->data) 157 free(self->data); 158 PyObject_Del(self); 159 159 } 160 160 161 161 static PyTypeObject PdataType = { 162 163 164 162 PyVarObject_HEAD_INIT(NULL, 0) "cPickle.Pdata", sizeof(Pdata), 0, 163 (destructor)Pdata_dealloc, 164 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, "" 165 165 }; 166 166 … … 170 170 Pdata_New(void) 171 171 { 172 173 174 175 176 177 178 179 180 181 182 172 Pdata *self; 173 174 if (!(self = PyObject_New(Pdata, &PdataType))) 175 return NULL; 176 self->size = 8; 177 self->length = 0; 178 self->data = malloc(self->size * sizeof(PyObject*)); 179 if (self->data) 180 return (PyObject*)self; 181 Py_DECREF(self); 182 return PyErr_NoMemory(); 183 183 } 184 184 … … 186 186 stackUnderflow(void) 187 187 { 188 189 188 PyErr_SetString(UnpicklingError, "unpickling stack underflow"); 189 return -1; 190 190 } 191 191 … … 194 194 */ 195 195 static int 196 Pdata_clear(Pdata *self, int clearto)197 { 198 int i;199 200 201 202 203 204 205 206 207 208 209 210 211 196 Pdata_clear(Pdata *self, Py_ssize_t clearto) 197 { 198 Py_ssize_t i; 199 PyObject **p; 200 201 if (clearto < 0) return stackUnderflow(); 202 if (clearto >= self->length) return 0; 203 204 for (i = self->length, p = self->data + clearto; 205 --i >= clearto; 206 p++) { 207 Py_CLEAR(*p); 208 } 209 self->length = clearto; 210 211 return 0; 212 212 } 213 213 … … 215 215 Pdata_grow(Pdata *self) 216 216 { 217 int bigger; 218 size_t nbytes; 219 PyObject **tmp; 220 221 bigger = self->size << 1; 222 if (bigger <= 0) /* was 0, or new value overflows */ 223 goto nomemory; 224 if ((int)(size_t)bigger != bigger) 225 goto nomemory; 226 nbytes = (size_t)bigger * sizeof(PyObject *); 227 if (nbytes / sizeof(PyObject *) != (size_t)bigger) 228 goto nomemory; 229 tmp = realloc(self->data, nbytes); 230 if (tmp == NULL) 231 goto nomemory; 232 self->data = tmp; 233 self->size = bigger; 234 return 0; 217 Py_ssize_t bigger; 218 Py_ssize_t nbytes; 219 220 PyObject **tmp; 221 222 if (self->size > (PY_SSIZE_T_MAX >> 1)) 223 goto nomemory; 224 bigger = self->size << 1; 225 if (bigger > (PY_SSIZE_T_MAX / sizeof(PyObject *))) 226 goto nomemory; 227 nbytes = bigger * sizeof(PyObject *); 228 tmp = realloc(self->data, nbytes); 229 if (tmp == NULL) 230 goto nomemory; 231 self->data = tmp; 232 self->size = bigger; 233 return 0; 235 234 236 235 nomemory: 237 238 236 PyErr_NoMemory(); 237 return -1; 239 238 } 240 239 … … 243 242 * is raised and V is set to NULL. D and V may be evaluated several times. 244 243 */ 245 #define PDATA_POP(D, V) { 246 if ((D)->length)\247 (V) = (D)->data[--((D)->length)];\248 else {\249 PyErr_SetString(UnpicklingError, "bad pickle data");\250 (V) = NULL;\251 }\244 #define PDATA_POP(D, V) { \ 245 if ((D)->length) \ 246 (V) = (D)->data[--((D)->length)]; \ 247 else { \ 248 PyErr_SetString(UnpicklingError, "bad pickle data"); \ 249 (V) = NULL; \ 250 } \ 252 251 } 253 252 … … 261 260 262 261 /* Push O on stack D, giving ownership of O to the stack. */ 263 #define PDATA_PUSH(D, O, ER) { 264 if (((Pdata*)(D))->length == ((Pdata*)(D))->size &&\265 Pdata_grow((Pdata*)(D)) < 0) {\266 Py_DECREF(O);\267 return ER;\268 }\269 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O);\262 #define PDATA_PUSH(D, O, ER) { \ 263 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \ 264 Pdata_grow((Pdata*)(D)) < 0) { \ 265 Py_DECREF(O); \ 266 return ER; \ 267 } \ 268 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \ 270 269 } 271 270 272 271 /* Push O on stack D, pushing a new reference. */ 273 #define PDATA_APPEND(D, O, ER) { 274 if (((Pdata*)(D))->length == ((Pdata*)(D))->size &&\275 Pdata_grow((Pdata*)(D)) < 0)\276 return ER;\277 Py_INCREF(O);\278 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O);\272 #define PDATA_APPEND(D, O, ER) { \ 273 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \ 274 Pdata_grow((Pdata*)(D)) < 0) \ 275 return ER; \ 276 Py_INCREF(O); \ 277 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \ 279 278 } 280 279 281 280 282 281 static PyObject * 283 Pdata_popTuple(Pdata *self, int start)284 { 285 286 int i, j, l;287 288 289 290 291 292 293 294 295 296 282 Pdata_popTuple(Pdata *self, Py_ssize_t start) 283 { 284 PyObject *r; 285 Py_ssize_t i, j, l; 286 287 l = self->length-start; 288 r = PyTuple_New(l); 289 if (r == NULL) 290 return NULL; 291 for (i = start, j = 0 ; j < l; i++, j++) 292 PyTuple_SET_ITEM(r, j, self->data[i]); 293 294 self->length = start; 295 return r; 297 296 } 298 297 299 298 static PyObject * 300 Pdata_popList(Pdata *self, int start)301 { 302 303 int i, j, l;304 305 306 307 308 309 310 311 299 Pdata_popList(Pdata *self, Py_ssize_t start) 300 { 301 PyObject *r; 302 Py_ssize_t i, j, l; 303 304 l=self->length-start; 305 if (!( r=PyList_New(l))) return NULL; 306 for (i=start, j=0 ; j < l; i++, j++) 307 PyList_SET_ITEM(r, j, self->data[i]); 308 309 self->length=start; 310 return r; 312 311 } 313 312 … … 332 331 333 332 typedef struct Picklerobject { 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 int (*write_func)(struct Picklerobject *, const char *, Py_ssize_t);351 352 int buf_size;353 354 355 333 PyObject_HEAD 334 FILE *fp; 335 PyObject *write; 336 PyObject *file; 337 PyObject *memo; 338 PyObject *arg; 339 PyObject *pers_func; 340 PyObject *inst_pers_func; 341 342 /* pickle protocol number, >= 0 */ 343 int proto; 344 345 /* bool, true if proto > 0 */ 346 int bin; 347 348 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */ 349 Py_ssize_t (*write_func)(struct Picklerobject *, const char *, Py_ssize_t); 350 char *write_buf; 351 Py_ssize_t buf_size; 352 PyObject *dispatch_table; 353 int fast_container; /* count nested container dumps */ 354 PyObject *fast_memo; 356 355 } Picklerobject; 357 356 … … 363 362 364 363 typedef struct Unpicklerobject { 365 366 367 368 369 370 371 372 373 374 375 376 int *marks;377 int num_marks;378 int marks_size;379 380 381 int buf_size;382 383 364 PyObject_HEAD 365 FILE *fp; 366 PyObject *file; 367 PyObject *readline; 368 PyObject *read; 369 PyObject *memo; 370 PyObject *arg; 371 Pdata *stack; 372 PyObject *mark; 373 PyObject *pers_func; 374 PyObject *last_string; 375 Py_ssize_t *marks; 376 Py_ssize_t num_marks; 377 Py_ssize_t marks_size; 378 Py_ssize_t (*read_func)(struct Unpicklerobject *, char **, Py_ssize_t); 379 Py_ssize_t (*readline_func)(struct Unpicklerobject *, char **); 380 Py_ssize_t buf_size; 381 char *buf; 382 PyObject *find_class; 384 383 } Unpicklerobject; 385 384 … … 394 393 cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...) 395 394 { 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 } 426 427 static int395 va_list va; 396 PyObject *args=0, *retval=0; 397 va_start(va, format); 398 399 if (format) args = Py_VaBuildValue(format, va); 400 va_end(va); 401 if (format && ! args) return NULL; 402 if (stringformat && !(retval=PyString_FromString(stringformat))) 403 return NULL; 404 405 if (retval) { 406 if (args) { 407 PyObject *v; 408 v=PyString_Format(retval, args); 409 Py_DECREF(retval); 410 Py_DECREF(args); 411 if (! v) return NULL; 412 retval=v; 413 } 414 } 415 else 416 if (args) retval=args; 417 else { 418 PyErr_SetObject(ErrType,Py_None); 419 return NULL; 420 } 421 PyErr_SetObject(ErrType,retval); 422 Py_DECREF(retval); 423 return NULL; 424 } 425 426 static Py_ssize_t 428 427 write_file(Picklerobject *self, const char *s, Py_ssize_t n) 429 428 { 430 size_t nbyteswritten; 431 432 if (s == NULL) { 433 return 0; 434 } 435 436 if (n > INT_MAX) { 437 /* String too large */ 438 return -1; 439 } 440 441 PyFile_IncUseCount((PyFileObject *)self->file); 442 Py_BEGIN_ALLOW_THREADS 443 nbyteswritten = fwrite(s, sizeof(char), n, self->fp); 444 Py_END_ALLOW_THREADS 445 PyFile_DecUseCount((PyFileObject *)self->file); 446 if (nbyteswritten != (size_t)n) { 447 PyErr_SetFromErrno(PyExc_IOError); 448 return -1; 449 } 450 451 return (int)n; 452 } 453 454 static int 429 size_t nbyteswritten; 430 431 if (s == NULL) { 432 return 0; 433 } 434 435 PyFile_IncUseCount((PyFileObject *)self->file); 436 Py_BEGIN_ALLOW_THREADS 437 nbyteswritten = fwrite(s, sizeof(char), n, self->fp); 438 Py_END_ALLOW_THREADS 439 PyFile_DecUseCount((PyFileObject *)self->file); 440 if (nbyteswritten != (size_t)n) { 441 PyErr_SetFromErrno(PyExc_IOError); 442 return -1; 443 } 444 445 return n; 446 } 447 448 static Py_ssize_t 455 449 write_cStringIO(Picklerobject *self, const char *s, Py_ssize_t n) 456 450 { 457 if (s == NULL) { 458 return 0; 459 } 460 461 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) { 462 return -1; 463 } 464 465 return (int)n; 466 } 467 468 static int 451 Py_ssize_t len = n; 452 453 if (s == NULL) { 454 return 0; 455 } 456 457 while (n > INT_MAX) { 458 if (PycStringIO->cwrite((PyObject *)self->file, s, INT_MAX) != INT_MAX) { 459 return -1; 460 } 461 n -= INT_MAX; 462 } 463 464 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) { 465 return -1; 466 } 467 468 return len; 469 } 470 471 static Py_ssize_t 469 472 write_none(Picklerobject *self, const char *s, Py_ssize_t n) 470 473 { 471 if (s == NULL) return 0; 472 if (n > INT_MAX) return -1; 473 return (int)n; 474 } 475 476 static int 477 write_other(Picklerobject *self, const char *s, Py_ssize_t _n) 478 { 479 PyObject *py_str = 0, *junk = 0; 480 int n; 481 482 if (_n > INT_MAX) 483 return -1; 484 n = (int)_n; 485 if (s == NULL) { 486 if (!( self->buf_size )) return 0; 487 py_str = PyString_FromStringAndSize(self->write_buf, 488 self->buf_size); 489 if (!py_str) 490 return -1; 491 } 492 else { 493 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) { 494 if (write_other(self, NULL, 0) < 0) 495 return -1; 496 } 497 498 if (n > WRITE_BUF_SIZE) { 499 if (!( py_str = 500 PyString_FromStringAndSize(s, n))) 501 return -1; 502 } 503 else { 504 memcpy(self->write_buf + self->buf_size, s, n); 505 self->buf_size += n; 506 return n; 507 } 508 } 509 510 if (self->write) { 511 /* object with write method */ 512 ARG_TUP(self, py_str); 513 if (self->arg) { 514 junk = PyObject_Call(self->write, self->arg, NULL); 515 FREE_ARG_TUP(self); 516 } 517 if (junk) Py_DECREF(junk); 518 else return -1; 519 } 520 else 521 PDATA_PUSH(self->file, py_str, -1); 522 523 self->buf_size = 0; 524 return n; 474 if (s == NULL) return 0; 475 return n; 476 } 477 478 static Py_ssize_t 479 write_other(Picklerobject *self, const char *s, Py_ssize_t n) 480 { 481 PyObject *py_str = 0, *junk = 0; 482 483 if (s == NULL) { 484 if (!( self->buf_size )) return 0; 485 py_str = PyString_FromStringAndSize(self->write_buf, 486 self->buf_size); 487 if (!py_str) 488 return -1; 489 } 490 else { 491 if (self->buf_size && n > WRITE_BUF_SIZE - self->buf_size) { 492 if (write_other(self, NULL, 0) < 0) 493 return -1; 494 } 495 496 if (n > WRITE_BUF_SIZE) { 497 if (!( py_str = 498 PyString_FromStringAndSize(s, n))) 499 return -1; 500 } 501 else { 502 memcpy(self->write_buf + self->buf_size, s, n); 503 self->buf_size += n; 504 return n; 505 } 506 } 507 508 if (self->write) { 509 /* object with write method */ 510 ARG_TUP(self, py_str); 511 if (self->arg) { 512 junk = PyObject_Call(self->write, self->arg, NULL); 513 FREE_ARG_TUP(self); 514 } 515 if (junk) Py_DECREF(junk); 516 else return -1; 517 } 518 else 519 PDATA_PUSH(self->file, py_str, -1); 520 521 self->buf_size = 0; 522 return n; 525 523 } 526 524 … … 529 527 read_file(Unpicklerobject *self, char **s, Py_ssize_t n) 530 528 { 531 532 533 534 int size;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 562 563 564 565 566 567 568 569 570 571 529 size_t nbytesread; 530 531 if (self->buf_size == 0) { 532 Py_ssize_t size; 533 534 size = ((n < 32) ? 32 : n); 535 if (!( self->buf = (char *)malloc(size))) { 536 PyErr_NoMemory(); 537 return -1; 538 } 539 540 self->buf_size = size; 541 } 542 else if (n > self->buf_size) { 543 char *newbuf = (char *)realloc(self->buf, n); 544 if (!newbuf) { 545 PyErr_NoMemory(); 546 return -1; 547 } 548 self->buf = newbuf; 549 self->buf_size = n; 550 } 551 552 PyFile_IncUseCount((PyFileObject *)self->file); 553 Py_BEGIN_ALLOW_THREADS 554 nbytesread = fread(self->buf, sizeof(char), n, self->fp); 555 Py_END_ALLOW_THREADS 556 PyFile_DecUseCount((PyFileObject *)self->file); 557 if (nbytesread != (size_t)n) { 558 if (feof(self->fp)) { 559 PyErr_SetNone(PyExc_EOFError); 560 return -1; 561 } 562 563 PyErr_SetFromErrno(PyExc_IOError); 564 return -1; 565 } 566 567 *s = self->buf; 568 569 return n; 572 570 } 573 571 … … 576 574 readline_file(Unpicklerobject *self, char **s) 577 575 { 578 int i;579 580 581 582 583 584 585 586 587 588 589 590 int bigger;591 592 593 594 595 596 597 598 599 600 bigger = self->buf_size << 1; 601 if (bigger <= 0) { /* overflow */ 602 PyErr_NoMemory();603 return -1; 604 } 605 606 if (!newbuf) {607 608 609 610 611 612 576 Py_ssize_t i; 577 578 if (self->buf_size == 0) { 579 if (!( self->buf = (char *)malloc(40))) { 580 PyErr_NoMemory(); 581 return -1; 582 } 583 self->buf_size = 40; 584 } 585 586 i = 0; 587 while (1) { 588 Py_ssize_t bigger; 589 char *newbuf; 590 for (; i < (self->buf_size - 1); i++) { 591 if (feof(self->fp) || 592 (self->buf[i] = getc(self->fp)) == '\n') { 593 self->buf[i + 1] = '\0'; 594 *s = self->buf; 595 return i + 1; 596 } 597 } 598 if (self->buf_size > (PY_SSIZE_T_MAX >> 1)) { 599 PyErr_NoMemory(); 600 return -1; 601 } 602 bigger = self->buf_size << 1; 603 newbuf = (char *)realloc(self->buf, bigger); 604 if (newbuf == NULL) { 605 PyErr_NoMemory(); 606 return -1; 607 } 608 self->buf = newbuf; 609 self->buf_size = bigger; 610 } 613 611 } 614 612 … … 617 615 read_cStringIO(Unpicklerobject *self, char **s, Py_ssize_t n) 618 616 { 619 char *ptr; 620 621 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) { 622 PyErr_SetNone(PyExc_EOFError); 623 return -1; 624 } 625 626 *s = ptr; 627 628 return n; 617 Py_ssize_t len = n; 618 char *start, *end = NULL; 619 620 while (1) { 621 int k; 622 char *ptr; 623 if (n > INT_MAX) 624 k = INT_MAX; 625 else 626 k = (int)n; 627 if (PycStringIO->cread((PyObject *)self->file, &ptr, k) != k) { 628 PyErr_SetNone(PyExc_EOFError); 629 return -1; 630 } 631 if (end == NULL) 632 start = ptr; 633 else if (ptr != end) { 634 /* non-continuous area */ 635 return -1; 636 } 637 if (n <= INT_MAX) 638 break; 639 end = ptr + INT_MAX; 640 n -= INT_MAX; 641 } 642 643 *s = start; 644 645 return len; 629 646 } 630 647 … … 633 650 readline_cStringIO(Unpicklerobject *self, char **s) 634 651 { 635 Py_ssize_t n; 636 char *ptr; 637 638 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) { 639 return -1; 640 } 641 642 *s = ptr; 643 644 return n; 652 Py_ssize_t n = 0; 653 char *start = NULL, *end = NULL; 654 655 while (1) { 656 int k; 657 char *ptr; 658 if ((k = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) { 659 return -1; 660 } 661 n += k; 662 if (end == NULL) 663 start = ptr; 664 else if (ptr != end) { 665 /* non-continuous area */ 666 return -1; 667 } 668 if (k == 0 || ptr[k - 1] == '\n') 669 break; 670 end = ptr + k; 671 } 672 673 *s = start; 674 675 return n; 645 676 } 646 677 … … 649 680 read_other(Unpicklerobject *self, char **s, Py_ssize_t n) 650 681 { 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 682 PyObject *bytes, *str=0; 683 684 if (!( bytes = PyInt_FromSsize_t(n))) return -1; 685 686 ARG_TUP(self, bytes); 687 if (self->arg) { 688 str = PyObject_Call(self->read, self->arg, NULL); 689 FREE_ARG_TUP(self); 690 } 691 if (! str) return -1; 692 693 Py_XDECREF(self->last_string); 694 self->last_string = str; 695 696 if (! (*s = PyString_AsString(str))) return -1; 697 698 if (PyString_GET_SIZE(str) != n) { 699 PyErr_SetNone(PyExc_EOFError); 700 return -1; 701 } 702 703 return n; 673 704 } 674 705 … … 677 708 readline_other(Unpicklerobject *self, char **s) 678 709 { 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 710 PyObject *str; 711 Py_ssize_t str_size; 712 713 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) { 714 return -1; 715 } 716 717 if ((str_size = PyString_Size(str)) < 0) 718 return -1; 719 720 Py_XDECREF(self->last_string); 721 self->last_string = str; 722 723 if (! (*s = PyString_AsString(str))) 724 return -1; 725 726 return str_size; 696 727 } 697 728 … … 701 732 */ 702 733 static char * 703 pystrndup(const char *s, int n)704 { 705 706 707 708 709 710 734 pystrndup(const char *s, Py_ssize_t n) 735 { 736 char *r = (char *)malloc(n+1); 737 if (r == NULL) 738 return (char*)PyErr_NoMemory(); 739 memcpy(r, s, n); 740 r[n] = 0; 741 return r; 711 742 } 712 743 … … 715 746 get(Picklerobject *self, PyObject *id) 716 747 { 717 PyObject *value, *mv; 718 long c_value; 719 char s[30]; 720 size_t len; 721 722 if (!( mv = PyDict_GetItem(self->memo, id))) { 723 PyErr_SetObject(PyExc_KeyError, id); 724 return -1; 725 } 726 727 if (!( value = PyTuple_GetItem(mv, 0))) 728 return -1; 729 730 if (!( PyInt_Check(value))) { 731 PyErr_SetString(PicklingError, "no int where int expected in memo"); 732 return -1; 733 } 734 c_value = PyInt_AS_LONG((PyIntObject*)value); 735 736 if (!self->bin) { 737 s[0] = GET; 738 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value); 739 len = strlen(s); 740 } 741 else if (Pdata_Check(self->file)) { 742 if (write_other(self, NULL, 0) < 0) return -1; 743 PDATA_APPEND(self->file, mv, -1); 744 return 0; 745 } 746 else { 747 if (c_value < 256) { 748 s[0] = BINGET; 749 s[1] = (int)(c_value & 0xff); 750 len = 2; 751 } 752 else { 753 s[0] = LONG_BINGET; 754 s[1] = (int)(c_value & 0xff); 755 s[2] = (int)((c_value >> 8) & 0xff); 756 s[3] = (int)((c_value >> 16) & 0xff); 757 s[4] = (int)((c_value >> 24) & 0xff); 758 len = 5; 759 } 760 } 761 762 if (self->write_func(self, s, len) < 0) 763 return -1; 764 765 return 0; 748 PyObject *value, *mv; 749 Py_ssize_t c_value; 750 char s[30]; 751 size_t len; 752 753 if (!( mv = PyDict_GetItem(self->memo, id))) { 754 PyErr_SetObject(PyExc_KeyError, id); 755 return -1; 756 } 757 758 if (!( value = PyTuple_GetItem(mv, 0))) 759 return -1; 760 761 if (!( PyInt_Check(value))) { 762 PyErr_SetString(PicklingError, "no int where int expected in memo"); 763 return -1; 764 } 765 c_value = PyInt_AS_LONG((PyIntObject*)value); 766 767 if (!self->bin) { 768 s[0] = GET; 769 PyOS_snprintf(s + 1, sizeof(s) - 1, 770 "%" PY_FORMAT_SIZE_T "d\n", c_value); 771 len = strlen(s); 772 } 773 else if (Pdata_Check(self->file)) { 774 if (write_other(self, NULL, 0) < 0) return -1; 775 PDATA_APPEND(self->file, mv, -1); 776 return 0; 777 } 778 else { 779 if (c_value < 256) { 780 s[0] = BINGET; 781 s[1] = (int)(c_value & 0xff); 782 len = 2; 783 } 784 else { 785 s[0] = LONG_BINGET; 786 s[1] = (int)(c_value & 0xff); 787 s[2] = (int)((c_value >> 8) & 0xff); 788 s[3] = (int)((c_value >> 16) & 0xff); 789 s[4] = (int)((c_value >> 24) & 0xff); 790 len = 5; 791 } 792 } 793 794 if (self->write_func(self, s, len) < 0) 795 return -1; 796 797 return 0; 766 798 } 767 799 … … 770 802 put(Picklerobject *self, PyObject *ob) 771 803 { 772 773 774 775 804 if (Py_REFCNT(ob) < 2 || self->fast) 805 return 0; 806 807 return put2(self, ob); 776 808 } 777 809 … … 780 812 put2(Picklerobject *self, PyObject *ob) 781 813 { 782 783 intp;784 size_t len;785 int res = -1;786 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0; 787 788 if (self->fast) 789 return 0; 790 791 if ((p = PyDict_Size(self->memo)) < 0) 792 goto finally; 793 794 /* Make sure memo keys are positive! */ 795 /* XXX Why?796 * XXX And does "positive" really mean non-negative? 797 * XXX pickle.py starts with PUT index 0, not 1. This makes for 798 * XXX gratuitous differences between the pickling modules. 799 */ 800 p++; 801 802 if (!( py_ob_id = PyLong_FromVoidPtr(ob))) 803 goto finally; 804 805 if (!( memo_len = PyInt_FromLong(p))) 806 goto finally; 807 808 if (!( t = PyTuple_New(2))) 809 goto finally; 810 811 PyTuple_SET_ITEM(t, 0,memo_len);812 Py_INCREF(memo_len);813 PyTuple_SET_ITEM(t, 1,ob);814 Py_INCREF(ob); 815 816 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0) 817 goto finally; 818 819 if (!self->bin) { 820 c_str[0] = PUT; 821 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 814 char c_str[30]; 815 Py_ssize_t len, p; 816 int res = -1; 817 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0; 818 819 if (self->fast) 820 return 0; 821 822 if ((p = PyDict_Size(self->memo)) < 0) 823 goto finally; 824 825 /* Make sure memo keys are positive! */ 826 /* XXX Why? 827 * XXX And does "positive" really mean non-negative? 828 * XXX pickle.py starts with PUT index 0, not 1. This makes for 829 * XXX gratuitous differences between the pickling modules. 830 */ 831 p++; 832 833 if (!( py_ob_id = PyLong_FromVoidPtr(ob))) 834 goto finally; 835 836 if (!( memo_len = PyInt_FromLong(p))) 837 goto finally; 838 839 if (!( t = PyTuple_New(2))) 840 goto finally; 841 842 PyTuple_SET_ITEM(t, 0, memo_len); 843 Py_INCREF(memo_len); 844 PyTuple_SET_ITEM(t, 1, ob); 845 Py_INCREF(ob); 846 847 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0) 848 goto finally; 849 850 if (!self->bin) { 851 c_str[0] = PUT; 852 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, 853 "%" PY_FORMAT_SIZE_T "d\n", p); 854 len = strlen(c_str); 855 } 856 else if (Pdata_Check(self->file)) { 857 if (write_other(self, NULL, 0) < 0) return -1; 858 PDATA_APPEND(self->file, memo_len, -1); 859 res=0; /* Job well done ;) */ 860 goto finally; 861 } 862 else { 863 if (p >= 256) { 864 c_str[0] = LONG_BINPUT; 865 c_str[1] = (int)(p & 0xff); 866 c_str[2] = (int)((p >> 8) & 0xff); 867 c_str[3] = (int)((p >> 16) & 0xff); 868 c_str[4] = (int)((p >> 24) & 0xff); 869 len = 5; 870 } 871 else { 872 c_str[0] = BINPUT; 873 c_str[1] = p; 874 len = 2; 875 } 876 } 877 878 if (self->write_func(self, c_str, len) < 0) 879 goto finally; 880 881 res = 0; 850 882 851 883 finally: 852 853 854 855 856 884 Py_XDECREF(py_ob_id); 885 Py_XDECREF(memo_len); 886 Py_XDECREF(t); 887 888 return res; 857 889 } 858 890 … … 860 892 whichmodule(PyObject *global, PyObject *global_name) 861 893 { 862 Py_ssize_t i, j; 863 PyObject *module = 0, *modules_dict = 0, 864 *global_name_attr = 0, *name = 0; 865 866 module = PyObject_GetAttrString(global, "__module__"); 867 if (module) 868 return module; 869 if (PyErr_ExceptionMatches(PyExc_AttributeError)) 870 PyErr_Clear(); 871 else 872 return NULL; 873 874 if (!( modules_dict = PySys_GetObject("modules"))) 875 return NULL; 876 877 i = 0; 878 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) { 879 880 if (PyObject_Compare(name, __main___str)==0) continue; 881 882 global_name_attr = PyObject_GetAttr(module, global_name); 883 if (!global_name_attr) { 884 if (PyErr_ExceptionMatches(PyExc_AttributeError)) 885 PyErr_Clear(); 886 else 887 return NULL; 888 continue; 889 } 890 891 if (global_name_attr != global) { 892 Py_DECREF(global_name_attr); 893 continue; 894 } 895 896 Py_DECREF(global_name_attr); 897 898 break; 899 } 900 901 /* The following implements the rule in pickle.py added in 1.5 902 that used __main__ if no module is found. I don't actually 903 like this rule. jlf 904 */ 905 if (!j) { 906 j=1; 907 name=__main___str; 908 } 909 910 Py_INCREF(name); 911 return name; 894 Py_ssize_t i, j; 895 PyObject *module = 0, *modules_dict = 0, 896 *global_name_attr = 0, *name = 0; 897 898 module = PyObject_GetAttrString(global, "__module__"); 899 if (module) 900 return module; 901 if (PyErr_ExceptionMatches(PyExc_AttributeError)) 902 PyErr_Clear(); 903 else 904 return NULL; 905 906 if (!( modules_dict = PySys_GetObject("modules"))) 907 return NULL; 908 909 i = 0; 910 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) { 911 912 if (PyObject_Compare(name, __main___str)==0) continue; 913 914 global_name_attr = PyObject_GetAttr(module, global_name); 915 if (!global_name_attr) { 916 if (PyErr_ExceptionMatches(PyExc_AttributeError)) 917 PyErr_Clear(); 918 else 919 return NULL; 920 continue; 921 } 922 923 if (global_name_attr != global) { 924 Py_DECREF(global_name_attr); 925 continue; 926 } 927 928 Py_DECREF(global_name_attr); 929 930 break; 931 } 932 933 /* The following implements the rule in pickle.py added in 1.5 934 that used __main__ if no module is found. I don't actually 935 like this rule. jlf 936 */ 937 if (!j) { 938 name=__main___str; 939 } 940 941 Py_INCREF(name); 942 return name; 912 943 } 913 944 … … 916 947 fast_save_enter(Picklerobject *self, PyObject *obj) 917 948 { 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 949 /* if fast_container < 0, we're doing an error exit. */ 950 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) { 951 PyObject *key = NULL; 952 if (self->fast_memo == NULL) { 953 self->fast_memo = PyDict_New(); 954 if (self->fast_memo == NULL) { 955 self->fast_container = -1; 956 return 0; 957 } 958 } 959 key = PyLong_FromVoidPtr(obj); 960 if (key == NULL) 961 return 0; 962 if (PyDict_GetItem(self->fast_memo, key)) { 963 Py_DECREF(key); 964 PyErr_Format(PyExc_ValueError, 965 "fast mode: can't pickle cyclic objects " 966 "including object type %s at %p", 967 Py_TYPE(obj)->tp_name, obj); 968 self->fast_container = -1; 969 return 0; 970 } 971 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) { 972 Py_DECREF(key); 973 self->fast_container = -1; 974 return 0; 975 } 976 Py_DECREF(key); 977 } 978 return 1; 948 979 } 949 980 … … 951 982 fast_save_leave(Picklerobject *self, PyObject *obj) 952 983 { 953 954 955 956 957 958 959 960 961 962 963 984 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) { 985 PyObject *key = PyLong_FromVoidPtr(obj); 986 if (key == NULL) 987 return 0; 988 if (PyDict_DelItem(self->fast_memo, key) < 0) { 989 Py_DECREF(key); 990 return 0; 991 } 992 Py_DECREF(key); 993 } 994 return 1; 964 995 } 965 996 … … 967 998 save_none(Picklerobject *self, PyObject *args) 968 999 { 969 970 971 972 973 1000 static char none = NONE; 1001 if (self->write_func(self, &none, 1) < 0) 1002 return -1; 1003 1004 return 0; 974 1005 } 975 1006 … … 977 1008 save_bool(Picklerobject *self, PyObject *args) 978 1009 { 979 980 981 982 983 984 985 986 987 988 989 990 1010 static const char *buf[2] = {FALSE, TRUE}; 1011 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1}; 1012 long l = PyInt_AS_LONG((PyIntObject *)args); 1013 1014 if (self->proto >= 2) { 1015 char opcode = l ? NEWTRUE : NEWFALSE; 1016 if (self->write_func(self, &opcode, 1) < 0) 1017 return -1; 1018 } 1019 else if (self->write_func(self, buf[l], len[l]) < 0) 1020 return -1; 1021 return 0; 991 1022 } 992 1023 … … 994 1025 save_int(Picklerobject *self, PyObject *args) 995 1026 { 996 997 998 int len = 0;999 1000 1027 char c_str[32]; 1028 long l = PyInt_AS_LONG((PyIntObject *)args); 1029 Py_ssize_t len = 0; 1030 1031 if (!self->bin 1001 1032 #if SIZEOF_LONG > 4 1002 1003 1033 || l > 0x7fffffffL 1034 || l < -0x80000000L 1004 1035 #endif 1005 1006 1007 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 1036 ) { 1037 /* Text-mode pickle, or long too big to fit in the 4-byte 1038 * signed BININT format: store as a string. 1039 */ 1040 c_str[0] = INT; 1041 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l); 1042 if (self->write_func(self, c_str, strlen(c_str)) < 0) 1043 return -1; 1044 } 1045 else { 1046 /* Binary pickle and l fits in a signed 4-byte int. */ 1047 c_str[1] = (int)( l & 0xff); 1048 c_str[2] = (int)((l >> 8) & 0xff); 1049 c_str[3] = (int)((l >> 16) & 0xff); 1050 c_str[4] = (int)((l >> 24) & 0xff); 1051 1052 if ((c_str[4] == 0) && (c_str[3] == 0)) { 1053 if (c_str[2] == 0) { 1054 c_str[0] = BININT1; 1055 len = 2; 1056 } 1057 else { 1058 c_str[0] = BININT2; 1059 len = 3; 1060 } 1061 } 1062 else { 1063 c_str[0] = BININT; 1064 len = 5; 1065 } 1066 1067 if (self->write_func(self, c_str, len) < 0) 1068 return -1; 1069 } 1070 1071 return 0; 1041 1072 } 1042 1073 … … 1045 1076 save_long(Picklerobject *self, PyObject *args) 1046 1077 { 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 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1078 Py_ssize_t size; 1079 int res = -1; 1080 PyObject *repr = NULL; 1081 1082 static char l = LONG; 1083 1084 if (self->proto >= 2) { 1085 /* Linear-time pickling. */ 1086 size_t nbits; 1087 size_t nbytes; 1088 unsigned char *pdata; 1089 char c_str[5]; 1090 int i; 1091 int sign = _PyLong_Sign(args); 1092 1093 if (sign == 0) { 1094 /* It's 0 -- an empty bytestring. */ 1095 c_str[0] = LONG1; 1096 c_str[1] = 0; 1097 i = self->write_func(self, c_str, 2); 1098 if (i < 0) goto finally; 1099 res = 0; 1100 goto finally; 1101 } 1102 nbits = _PyLong_NumBits(args); 1103 if (nbits == (size_t)-1 && PyErr_Occurred()) 1104 goto finally; 1105 /* How many bytes do we need? There are nbits >> 3 full 1106 * bytes of data, and nbits & 7 leftover bits. If there 1107 * are any leftover bits, then we clearly need another 1108 * byte. Wnat's not so obvious is that we *probably* 1109 * need another byte even if there aren't any leftovers: 1110 * the most-significant bit of the most-significant byte 1111 * acts like a sign bit, and it's usually got a sense 1112 * opposite of the one we need. The exception is longs 1113 * of the form -(2**(8*j-1)) for j > 0. Such a long is 1114 * its own 256's-complement, so has the right sign bit 1115 * even without the extra byte. That's a pain to check 1116 * for in advance, though, so we always grab an extra 1117 * byte at the start, and cut it back later if possible. 1118 */ 1119 nbytes = (nbits >> 3) + 1; 1120 if (nbytes > INT_MAX) { 1121 PyErr_SetString(PyExc_OverflowError, "long too large " 1122 "to pickle"); 1123 goto finally; 1124 } 1125 repr = PyString_FromStringAndSize(NULL, (int)nbytes); 1126 if (repr == NULL) goto finally; 1127 pdata = (unsigned char *)PyString_AS_STRING(repr); 1128 i = _PyLong_AsByteArray((PyLongObject *)args, 1129 pdata, nbytes, 1130 1 /* little endian */, 1 /* signed */); 1131 if (i < 0) goto finally; 1132 /* If the long is negative, this may be a byte more than 1133 * needed. This is so iff the MSB is all redundant sign 1134 * bits. 1135 */ 1136 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff && 1137 (pdata[nbytes - 2] & 0x80) != 0) 1138 --nbytes; 1139 1140 if (nbytes < 256) { 1141 c_str[0] = LONG1; 1142 c_str[1] = (char)nbytes; 1143 size = 2; 1144 } 1145 else { 1146 c_str[0] = LONG4; 1147 size = (int)nbytes; 1148 for (i = 1; i < 5; i++) { 1149 c_str[i] = (char)(size & 0xff); 1150 size >>= 8; 1151 } 1152 size = 5; 1153 } 1154 i = self->write_func(self, c_str, size); 1155 if (i < 0) goto finally; 1156 i = self->write_func(self, (char *)pdata, (int)nbytes); 1157 if (i < 0) goto finally; 1158 res = 0; 1159 goto finally; 1160 } 1161 1162 /* proto < 2: write the repr and newline. This is quadratic-time 1163 * (in the number of digits), in both directions. 1164 */ 1165 if (!( repr = PyObject_Repr(args))) 1166 goto finally; 1167 1168 if ((size = PyString_Size(repr)) < 0) 1169 goto finally; 1170 1171 if (self->write_func(self, &l, 1) < 0) 1172 goto finally; 1173 1174 if (self->write_func(self, 1175 PyString_AS_STRING((PyStringObject *)repr), 1176 size) < 0) 1177 goto finally; 1178 1179 if (self->write_func(self, "\n", 1) < 0) 1180 goto finally; 1181 1182 res = 0; 1152 1183 1153 1184 finally: 1154 1155 1185 Py_XDECREF(repr); 1186 return res; 1156 1187 } 1157 1188 … … 1160 1191 save_float(Picklerobject *self, PyObject *args) 1161 1192 { 1162 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args); 1163 1164 if (self->bin) { 1165 char str[9]; 1166 str[0] = BINFLOAT; 1167 if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0) 1168 return -1; 1169 if (self->write_func(self, str, 9) < 0) 1170 return -1; 1171 } 1172 else { 1173 char c_str[250]; 1174 c_str[0] = FLOAT; 1175 PyOS_ascii_formatd(c_str + 1, sizeof(c_str) - 2, "%.17g", x); 1176 /* Extend the formatted string with a newline character */ 1177 strcat(c_str, "\n"); 1178 1179 if (self->write_func(self, c_str, strlen(c_str)) < 0) 1180 return -1; 1181 } 1182 1183 return 0; 1193 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args); 1194 1195 if (self->bin) { 1196 char str[9]; 1197 str[0] = BINFLOAT; 1198 if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0) 1199 return -1; 1200 if (self->write_func(self, str, 9) < 0) 1201 return -1; 1202 } 1203 else { 1204 int result = -1; 1205 char *buf = NULL; 1206 char op = FLOAT; 1207 1208 if (self->write_func(self, &op, 1) < 0) 1209 goto done; 1210 1211 buf = PyOS_double_to_string(x, 'g', 17, 0, NULL); 1212 if (!buf) { 1213 PyErr_NoMemory(); 1214 goto done; 1215 } 1216 1217 if (self->write_func(self, buf, strlen(buf)) < 0) 1218 goto done; 1219 1220 if (self->write_func(self, "\n", 1) < 0) 1221 goto done; 1222 1223 result = 0; 1224 done: 1225 PyMem_Free(buf); 1226 return result; 1227 } 1228 1229 return 0; 1184 1230 } 1185 1231 … … 1188 1234 save_string(Picklerobject *self, PyObject *args, int doput) 1189 1235 { 1190 int size, len; 1191 PyObject *repr=0; 1192 1193 if ((size = PyString_Size(args)) < 0) 1194 return -1; 1195 1196 if (!self->bin) { 1197 char *repr_str; 1198 1199 static char string = STRING; 1200 1201 if (!( repr = PyObject_Repr(args))) 1202 return -1; 1203 1204 if ((len = PyString_Size(repr)) < 0) 1205 goto err; 1206 repr_str = PyString_AS_STRING((PyStringObject *)repr); 1207 1208 if (self->write_func(self, &string, 1) < 0) 1209 goto err; 1210 1211 if (self->write_func(self, repr_str, len) < 0) 1212 goto err; 1213 1214 if (self->write_func(self, "\n", 1) < 0) 1215 goto err; 1216 1217 Py_XDECREF(repr); 1218 } 1219 else { 1220 int i; 1221 char c_str[5]; 1222 1223 if ((size = PyString_Size(args)) < 0) 1224 return -1; 1225 1226 if (size < 256) { 1227 c_str[0] = SHORT_BINSTRING; 1228 c_str[1] = size; 1229 len = 2; 1230 } 1231 else if (size <= INT_MAX) { 1232 c_str[0] = BINSTRING; 1233 for (i = 1; i < 5; i++) 1234 c_str[i] = (int)(size >> ((i - 1) * 8)); 1235 len = 5; 1236 } 1237 else 1238 return -1; /* string too large */ 1239 1240 if (self->write_func(self, c_str, len) < 0) 1241 return -1; 1242 1243 if (size > 128 && Pdata_Check(self->file)) { 1244 if (write_other(self, NULL, 0) < 0) return -1; 1245 PDATA_APPEND(self->file, args, -1); 1246 } 1247 else { 1248 if (self->write_func(self, 1249 PyString_AS_STRING( 1250 (PyStringObject *)args), 1251 size) < 0) 1252 return -1; 1253 } 1254 } 1255 1256 if (doput) 1257 if (put(self, args) < 0) 1258 return -1; 1259 1260 return 0; 1236 Py_ssize_t size, len; 1237 PyObject *repr=0; 1238 1239 if ((size = PyString_Size(args)) < 0) 1240 return -1; 1241 1242 if (!self->bin) { 1243 char *repr_str; 1244 1245 static char string = STRING; 1246 1247 if (!( repr = PyObject_Repr(args))) 1248 return -1; 1249 1250 if ((len = PyString_Size(repr)) < 0) 1251 goto err; 1252 repr_str = PyString_AS_STRING((PyStringObject *)repr); 1253 1254 if (self->write_func(self, &string, 1) < 0) 1255 goto err; 1256 1257 if (self->write_func(self, repr_str, len) < 0) 1258 goto err; 1259 1260 if (self->write_func(self, "\n", 1) < 0) 1261 goto err; 1262 1263 Py_XDECREF(repr); 1264 } 1265 else { 1266 int i; 1267 char c_str[5]; 1268 1269 if (size < 256) { 1270 c_str[0] = SHORT_BINSTRING; 1271 c_str[1] = size; 1272 len = 2; 1273 } 1274 else if (size <= INT_MAX) { 1275 c_str[0] = BINSTRING; 1276 for (i = 1; i < 5; i++) 1277 c_str[i] = (int)(size >> ((i - 1) * 8)); 1278 len = 5; 1279 } 1280 else 1281 return -1; /* string too large */ 1282 1283 if (self->write_func(self, c_str, len) < 0) 1284 return -1; 1285 1286 if (size > 128 && Pdata_Check(self->file)) { 1287 if (write_other(self, NULL, 0) < 0) return -1; 1288 PDATA_APPEND(self->file, args, -1); 1289 } 1290 else { 1291 if (self->write_func(self, 1292 PyString_AS_STRING( 1293 (PyStringObject *)args), 1294 size) < 0) 1295 return -1; 1296 } 1297 } 1298 1299 if (doput) 1300 if (put(self, args) < 0) 1301 return -1; 1302 1303 return 0; 1261 1304 1262 1305 err: 1263 1264 1306 Py_XDECREF(repr); 1307 return -1; 1265 1308 } 1266 1309 … … 1284 1327 1285 1328 if (size > PY_SSIZE_T_MAX / expandsize) 1286 1329 return PyErr_NoMemory(); 1287 1330 1288 1331 repr = PyString_FromStringAndSize(NULL, expandsize * size); 1289 1332 if (repr == NULL) 1290 1333 return NULL; 1291 1334 if (size == 0) 1292 1335 return repr; 1293 1336 1294 1337 p = q = PyString_AS_STRING(repr); 1295 1338 while (size-- > 0) { 1296 1339 Py_UNICODE ch = *s++; 1297 1340 #ifdef Py_UNICODE_WIDE 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1341 /* Map 32-bit characters to '\Uxxxxxxxx' */ 1342 if (ch >= 0x10000) { 1343 *p++ = '\\'; 1344 *p++ = 'U'; 1345 *p++ = hexdigit[(ch >> 28) & 0xf]; 1346 *p++ = hexdigit[(ch >> 24) & 0xf]; 1347 *p++ = hexdigit[(ch >> 20) & 0xf]; 1348 *p++ = hexdigit[(ch >> 16) & 0xf]; 1349 *p++ = hexdigit[(ch >> 12) & 0xf]; 1350 *p++ = hexdigit[(ch >> 8) & 0xf]; 1351 *p++ = hexdigit[(ch >> 4) & 0xf]; 1352 *p++ = hexdigit[ch & 15]; 1353 } 1354 else 1312 1355 #else 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1356 /* Map UTF-16 surrogate pairs to '\U00xxxxxx' */ 1357 if (ch >= 0xD800 && ch < 0xDC00) { 1358 Py_UNICODE ch2; 1359 Py_UCS4 ucs; 1360 1361 ch2 = *s++; 1362 size--; 1363 if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) { 1364 ucs = (((ch & 0x03FF) << 10) | (ch2 & 0x03FF)) + 0x00010000; 1365 *p++ = '\\'; 1366 *p++ = 'U'; 1367 *p++ = hexdigit[(ucs >> 28) & 0xf]; 1368 *p++ = hexdigit[(ucs >> 24) & 0xf]; 1369 *p++ = hexdigit[(ucs >> 20) & 0xf]; 1370 *p++ = hexdigit[(ucs >> 16) & 0xf]; 1371 *p++ = hexdigit[(ucs >> 12) & 0xf]; 1372 *p++ = hexdigit[(ucs >> 8) & 0xf]; 1373 *p++ = hexdigit[(ucs >> 4) & 0xf]; 1374 *p++ = hexdigit[ucs & 0xf]; 1375 continue; 1376 } 1377 /* Fall through: isolated surrogates are copied as-is */ 1378 s--; 1379 size++; 1380 } 1338 1381 #endif 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1382 /* Map 16-bit characters to '\uxxxx' */ 1383 if (ch >= 256 || ch == '\\' || ch == '\n') { 1384 *p++ = '\\'; 1385 *p++ = 'u'; 1386 *p++ = hexdigit[(ch >> 12) & 0xf]; 1387 *p++ = hexdigit[(ch >> 8) & 0xf]; 1388 *p++ = hexdigit[(ch >> 4) & 0xf]; 1389 *p++ = hexdigit[ch & 15]; 1390 } 1391 /* Copy everything else as-is */ 1392 else 1393 *p++ = (char) ch; 1351 1394 } 1352 1395 *p = '\0'; … … 1358 1401 save_unicode(Picklerobject *self, PyObject *args, int doput) 1359 1402 { 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1403 Py_ssize_t size, len; 1404 PyObject *repr=0; 1405 1406 if (!PyUnicode_Check(args)) 1407 return -1; 1408 1409 if (!self->bin) { 1410 char *repr_str; 1411 static char string = UNICODE; 1412 1413 repr = modified_EncodeRawUnicodeEscape( 1414 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args)); 1415 if (!repr) 1416 return -1; 1417 1418 if ((len = PyString_Size(repr)) < 0) 1419 goto err; 1420 repr_str = PyString_AS_STRING((PyStringObject *)repr); 1421 1422 if (self->write_func(self, &string, 1) < 0) 1423 goto err; 1424 1425 if (self->write_func(self, repr_str, len) < 0) 1426 goto err; 1427 1428 if (self->write_func(self, "\n", 1) < 0) 1429 goto err; 1430 1431 Py_XDECREF(repr); 1432 } 1433 else { 1434 int i; 1435 char c_str[5]; 1436 1437 if (!( repr = PyUnicode_AsUTF8String(args))) 1438 return -1; 1439 1440 if ((size = PyString_Size(repr)) < 0) 1441 goto err; 1442 if (size > INT_MAX) 1443 return -1; /* string too large */ 1444 1445 c_str[0] = BINUNICODE; 1446 for (i = 1; i < 5; i++) 1447 c_str[i] = (int)(size >> ((i - 1) * 8)); 1448 len = 5; 1449 1450 if (self->write_func(self, c_str, len) < 0) 1451 goto err; 1452 1453 if (size > 128 && Pdata_Check(self->file)) { 1454 if (write_other(self, NULL, 0) < 0) 1455 goto err; 1456 PDATA_APPEND(self->file, repr, -1); 1457 } 1458 else { 1459 if (self->write_func(self, PyString_AS_STRING(repr), 1460 size) < 0) 1461 goto err; 1462 } 1463 1464 Py_DECREF(repr); 1465 } 1466 1467 if (doput) 1468 if (put(self, args) < 0) 1469 return -1; 1470 1471 return 0; 1429 1472 1430 1473 err: 1431 1432 1474 Py_XDECREF(repr); 1475 return -1; 1433 1476 } 1434 1477 #endif … … 1438 1481 store_tuple_elements(Picklerobject *self, PyObject *t, int len) 1439 1482 { 1440 int i;1441 int res = -1;/* guilty until proved innocent */1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1483 Py_ssize_t i; 1484 int res = -1; /* guilty until proved innocent */ 1485 1486 assert(PyTuple_Size(t) == len); 1487 1488 for (i = 0; i < len; i++) { 1489 PyObject *element = PyTuple_GET_ITEM(t, i); 1490 1491 if (element == NULL) 1492 goto finally; 1493 if (save(self, element, 0) < 0) 1494 goto finally; 1495 } 1496 res = 0; 1454 1497 1455 1498 finally: 1456 1499 return res; 1457 1500 } 1458 1501 … … 1466 1509 save_tuple(Picklerobject *self, PyObject *args) 1467 1510 { 1468 1469 int len, i;1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1511 PyObject *py_tuple_id = NULL; 1512 Py_ssize_t len, i; 1513 int res = -1; 1514 1515 static char tuple = TUPLE; 1516 static char pop = POP; 1517 static char pop_mark = POP_MARK; 1518 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3}; 1519 1520 if ((len = PyTuple_Size(args)) < 0) 1521 goto finally; 1522 1523 if (len == 0) { 1524 char c_str[2]; 1525 1526 if (self->proto) { 1527 c_str[0] = EMPTY_TUPLE; 1528 len = 1; 1529 } 1530 else { 1531 c_str[0] = MARK; 1532 c_str[1] = TUPLE; 1533 len = 2; 1534 } 1535 if (self->write_func(self, c_str, len) >= 0) 1536 res = 0; 1537 /* Don't memoize an empty tuple. */ 1538 goto finally; 1539 } 1540 1541 /* A non-empty tuple. */ 1542 1543 /* id(tuple) isn't in the memo now. If it shows up there after 1544 * saving the tuple elements, the tuple must be recursive, in 1545 * which case we'll pop everything we put on the stack, and fetch 1546 * its value from the memo. 1547 */ 1548 py_tuple_id = PyLong_FromVoidPtr(args); 1549 if (py_tuple_id == NULL) 1550 goto finally; 1551 1552 if (len <= 3 && self->proto >= 2) { 1553 /* Use TUPLE{1,2,3} opcodes. */ 1554 if (store_tuple_elements(self, args, len) < 0) 1555 goto finally; 1556 if (PyDict_GetItem(self->memo, py_tuple_id)) { 1557 /* pop the len elements */ 1558 for (i = 0; i < len; ++i) 1559 if (self->write_func(self, &pop, 1) < 0) 1560 goto finally; 1561 /* fetch from memo */ 1562 if (get(self, py_tuple_id) < 0) 1563 goto finally; 1564 res = 0; 1565 goto finally; 1566 } 1567 /* Not recursive. */ 1568 if (self->write_func(self, len2opcode + len, 1) < 0) 1569 goto finally; 1570 goto memoize; 1571 } 1572 1573 /* proto < 2 and len > 0, or proto >= 2 and len > 3. 1574 * Generate MARK elt1 elt2 ... TUPLE 1575 */ 1576 if (self->write_func(self, &MARKv, 1) < 0) 1577 goto finally; 1578 1579 if (store_tuple_elements(self, args, len) < 0) 1580 goto finally; 1581 1582 if (PyDict_GetItem(self->memo, py_tuple_id)) { 1583 /* pop the stack stuff we pushed */ 1584 if (self->bin) { 1585 if (self->write_func(self, &pop_mark, 1) < 0) 1586 goto finally; 1587 } 1588 else { 1589 /* Note that we pop one more than len, to remove 1590 * the MARK too. 1591 */ 1592 for (i = 0; i <= len; i++) 1593 if (self->write_func(self, &pop, 1) < 0) 1594 goto finally; 1595 } 1596 /* fetch from memo */ 1597 if (get(self, py_tuple_id) >= 0) 1598 res = 0; 1599 goto finally; 1600 } 1601 1602 /* Not recursive. */ 1603 if (self->write_func(self, &tuple, 1) < 0) 1604 goto finally; 1562 1605 1563 1606 memoize: 1564 1565 1607 if (put(self, args) >= 0) 1608 res = 0; 1566 1609 1567 1610 finally: 1568 1569 1611 Py_XDECREF(py_tuple_id); 1612 return res; 1570 1613 } 1571 1614 … … 1579 1622 batch_list(Picklerobject *self, PyObject *iter) 1580 1623 { 1581 1582 1583 1584 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 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1624 PyObject *obj = NULL; 1625 PyObject *firstitem = NULL; 1626 int i, n; 1627 1628 static char append = APPEND; 1629 static char appends = APPENDS; 1630 1631 assert(iter != NULL); 1632 1633 if (self->proto == 0) { 1634 /* APPENDS isn't available; do one at a time. */ 1635 for (;;) { 1636 obj = PyIter_Next(iter); 1637 if (obj == NULL) { 1638 if (PyErr_Occurred()) 1639 return -1; 1640 break; 1641 } 1642 i = save(self, obj, 0); 1643 Py_DECREF(obj); 1644 if (i < 0) 1645 return -1; 1646 if (self->write_func(self, &append, 1) < 0) 1647 return -1; 1648 } 1649 return 0; 1650 } 1651 1652 /* proto > 0: write in batches of BATCHSIZE. */ 1653 do { 1654 /* Get first item */ 1655 firstitem = PyIter_Next(iter); 1656 if (firstitem == NULL) { 1657 if (PyErr_Occurred()) 1658 goto BatchFailed; 1659 1660 /* nothing more to add */ 1661 break; 1662 } 1663 1664 /* Try to get a second item */ 1665 obj = PyIter_Next(iter); 1666 if (obj == NULL) { 1667 if (PyErr_Occurred()) 1668 goto BatchFailed; 1669 1670 /* Only one item to write */ 1671 if (save(self, firstitem, 0) < 0) 1672 goto BatchFailed; 1673 if (self->write_func(self, &append, 1) < 0) 1674 goto BatchFailed; 1675 Py_CLEAR(firstitem); 1676 break; 1677 } 1678 1679 /* More than one item to write */ 1680 1681 /* Pump out MARK, items, APPENDS. */ 1682 if (self->write_func(self, &MARKv, 1) < 0) 1683 goto BatchFailed; 1684 1685 if (save(self, firstitem, 0) < 0) 1686 goto BatchFailed; 1687 Py_CLEAR(firstitem); 1688 n = 1; 1689 1690 /* Fetch and save up to BATCHSIZE items */ 1691 while (obj) { 1692 if (save(self, obj, 0) < 0) 1693 goto BatchFailed; 1694 Py_CLEAR(obj); 1695 n += 1; 1696 1697 if (n == BATCHSIZE) 1698 break; 1699 1700 obj = PyIter_Next(iter); 1701 if (obj == NULL) { 1702 if (PyErr_Occurred()) 1703 goto BatchFailed; 1704 break; 1705 } 1706 } 1707 1708 if (self->write_func(self, &appends, 1) < 0) 1709 goto BatchFailed; 1710 1711 } while (n == BATCHSIZE); 1712 return 0; 1670 1713 1671 1714 BatchFailed: 1672 1673 1674 1715 Py_XDECREF(firstitem); 1716 Py_XDECREF(obj); 1717 return -1; 1675 1718 } 1676 1719 … … 1678 1721 save_list(Picklerobject *self, PyObject *args) 1679 1722 { 1680 1681 1682 int len;1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1723 int res = -1; 1724 char s[3]; 1725 Py_ssize_t len; 1726 PyObject *iter; 1727 1728 if (self->fast && !fast_save_enter(self, args)) 1729 goto finally; 1730 1731 /* Create an empty list. */ 1732 if (self->bin) { 1733 s[0] = EMPTY_LIST; 1734 len = 1; 1735 } 1736 else { 1737 s[0] = MARK; 1738 s[1] = LIST; 1739 len = 2; 1740 } 1741 1742 if (self->write_func(self, s, len) < 0) 1743 goto finally; 1744 1745 /* Get list length, and bow out early if empty. */ 1746 if ((len = PyList_Size(args)) < 0) 1747 goto finally; 1748 1749 /* Memoize. */ 1750 if (len == 0) { 1751 if (put(self, args) >= 0) 1752 res = 0; 1753 goto finally; 1754 } 1755 if (put2(self, args) < 0) 1756 goto finally; 1757 1758 /* Materialize the list elements. */ 1759 iter = PyObject_GetIter(args); 1760 if (iter == NULL) 1761 goto finally; 1762 1763 if (Py_EnterRecursiveCall(" while pickling an object") == 0) 1764 { 1765 res = batch_list(self, iter); 1766 Py_LeaveRecursiveCall(); 1767 } 1768 Py_DECREF(iter); 1726 1769 1727 1770 finally: 1728 1729 1730 1731 1771 if (self->fast && !fast_save_leave(self, args)) 1772 res = -1; 1773 1774 return res; 1732 1775 } 1733 1776 … … 1747 1790 batch_dict(Picklerobject *self, PyObject *iter) 1748 1791 { 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1792 PyObject *p = NULL; 1793 PyObject *firstitem = NULL; 1794 int i, n; 1795 1796 static char setitem = SETITEM; 1797 static char setitems = SETITEMS; 1798 1799 assert(iter != NULL); 1800 1801 if (self->proto == 0) { 1802 /* SETITEMS isn't available; do one at a time. */ 1803 for (;;) { 1804 p = PyIter_Next(iter); 1805 if (p == NULL) { 1806 if (PyErr_Occurred()) 1807 return -1; 1808 break; 1809 } 1810 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) { 1811 PyErr_SetString(PyExc_TypeError, "dict items " 1812 "iterator must return 2-tuples"); 1813 return -1; 1814 } 1815 i = save(self, PyTuple_GET_ITEM(p, 0), 0); 1816 if (i >= 0) 1817 i = save(self, PyTuple_GET_ITEM(p, 1), 0); 1818 Py_DECREF(p); 1819 if (i < 0) 1820 return -1; 1821 if (self->write_func(self, &setitem, 1) < 0) 1822 return -1; 1823 } 1824 return 0; 1825 } 1826 1827 /* proto > 0: write in batches of BATCHSIZE. */ 1828 do { 1829 /* Get first item */ 1830 firstitem = PyIter_Next(iter); 1831 if (firstitem == NULL) { 1832 if (PyErr_Occurred()) 1833 goto BatchFailed; 1834 1835 /* nothing more to add */ 1836 break; 1837 } 1838 if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) { 1839 PyErr_SetString(PyExc_TypeError, "dict items " 1840 "iterator must return 2-tuples"); 1841 goto BatchFailed; 1842 } 1843 1844 /* Try to get a second item */ 1845 p = PyIter_Next(iter); 1846 if (p == NULL) { 1847 if (PyErr_Occurred()) 1848 goto BatchFailed; 1849 1850 /* Only one item to write */ 1851 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0) 1852 goto BatchFailed; 1853 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0) 1854 goto BatchFailed; 1855 if (self->write_func(self, &setitem, 1) < 0) 1856 goto BatchFailed; 1857 Py_CLEAR(firstitem); 1858 break; 1859 } 1860 1861 /* More than one item to write */ 1862 1863 /* Pump out MARK, items, SETITEMS. */ 1864 if (self->write_func(self, &MARKv, 1) < 0) 1865 goto BatchFailed; 1866 1867 if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0) 1868 goto BatchFailed; 1869 if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0) 1870 goto BatchFailed; 1871 Py_CLEAR(firstitem); 1872 n = 1; 1873 1874 /* Fetch and save up to BATCHSIZE items */ 1875 while (p) { 1876 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) { 1877 PyErr_SetString(PyExc_TypeError, "dict items " 1878 "iterator must return 2-tuples"); 1879 goto BatchFailed; 1880 } 1881 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0) 1882 goto BatchFailed; 1883 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0) 1884 goto BatchFailed; 1885 Py_CLEAR(p); 1886 n += 1; 1887 1888 if (n == BATCHSIZE) 1889 break; 1890 1891 p = PyIter_Next(iter); 1892 if (p == NULL) { 1893 if (PyErr_Occurred()) 1894 goto BatchFailed; 1895 break; 1896 } 1897 } 1898 1899 if (self->write_func(self, &setitems, 1) < 0) 1900 goto BatchFailed; 1901 1902 } while (n == BATCHSIZE); 1903 return 0; 1861 1904 1862 1905 BatchFailed: 1863 Py_XDECREF(firstitem); 1864 Py_XDECREF(p); 1865 return -1; 1906 Py_XDECREF(firstitem); 1907 Py_XDECREF(p); 1908 return -1; 1909 } 1910 1911 /* This is a variant of batch_dict() above that specializes for dicts, with no 1912 * support for dict subclasses. Like batch_dict(), we batch up chunks of 1913 * MARK key value ... key value SETITEMS 1914 * opcode sequences. Calling code should have arranged to first create an 1915 * empty dict, or dict-like object, for the SETITEMS to operate on. 1916 * Returns 0 on success, -1 on error. 1917 * 1918 * Note that this currently doesn't work for protocol 0. 1919 */ 1920 static int 1921 batch_dict_exact(Picklerobject *self, PyObject *obj) 1922 { 1923 PyObject *key = NULL, *value = NULL; 1924 int i; 1925 Py_ssize_t dict_size, ppos = 0; 1926 1927 static char setitem = SETITEM; 1928 static char setitems = SETITEMS; 1929 1930 assert(obj != NULL); 1931 assert(self->proto > 0); 1932 1933 dict_size = PyDict_Size(obj); 1934 1935 /* Special-case len(d) == 1 to save space. */ 1936 if (dict_size == 1) { 1937 PyDict_Next(obj, &ppos, &key, &value); 1938 if (save(self, key, 0) < 0) 1939 return -1; 1940 if (save(self, value, 0) < 0) 1941 return -1; 1942 if (self->write_func(self, &setitem, 1) < 0) 1943 return -1; 1944 return 0; 1945 } 1946 1947 /* Write in batches of BATCHSIZE. */ 1948 do { 1949 i = 0; 1950 if (self->write_func(self, &MARKv, 1) < 0) 1951 return -1; 1952 while (PyDict_Next(obj, &ppos, &key, &value)) { 1953 if (save(self, key, 0) < 0) 1954 return -1; 1955 if (save(self, value, 0) < 0) 1956 return -1; 1957 if (++i == BATCHSIZE) 1958 break; 1959 } 1960 if (self->write_func(self, &setitems, 1) < 0) 1961 return -1; 1962 if (PyDict_Size(obj) != dict_size) { 1963 PyErr_Format( 1964 PyExc_RuntimeError, 1965 "dictionary changed size during iteration"); 1966 return -1; 1967 } 1968 1969 } while (i == BATCHSIZE); 1970 return 0; 1866 1971 } 1867 1972 … … 1869 1974 save_dict(Picklerobject *self, PyObject *args) 1870 1975 { 1871 int res = -1; 1872 char s[3]; 1873 int len; 1874 PyObject *iter; 1875 1876 if (self->fast && !fast_save_enter(self, args)) 1877 goto finally; 1878 1879 /* Create an empty dict. */ 1880 if (self->bin) { 1881 s[0] = EMPTY_DICT; 1882 len = 1; 1883 } 1884 else { 1885 s[0] = MARK; 1886 s[1] = DICT; 1887 len = 2; 1888 } 1889 1890 if (self->write_func(self, s, len) < 0) 1891 goto finally; 1892 1893 /* Get dict size, and bow out early if empty. */ 1894 if ((len = PyDict_Size(args)) < 0) 1895 goto finally; 1896 1897 if (len == 0) { 1898 if (put(self, args) >= 0) 1899 res = 0; 1900 goto finally; 1901 } 1902 if (put2(self, args) < 0) 1903 goto finally; 1904 1905 /* Materialize the dict items. */ 1906 iter = PyObject_CallMethod(args, "iteritems", "()"); 1907 if (iter == NULL) 1908 goto finally; 1909 if (Py_EnterRecursiveCall(" while pickling an object") == 0) 1910 { 1911 res = batch_dict(self, iter); 1912 Py_LeaveRecursiveCall(); 1913 } 1914 Py_DECREF(iter); 1976 int res = -1; 1977 char s[3]; 1978 Py_ssize_t len; 1979 1980 if (self->fast && !fast_save_enter(self, args)) 1981 goto finally; 1982 1983 /* Create an empty dict. */ 1984 if (self->bin) { 1985 s[0] = EMPTY_DICT; 1986 len = 1; 1987 } 1988 else { 1989 s[0] = MARK; 1990 s[1] = DICT; 1991 len = 2; 1992 } 1993 1994 if (self->write_func(self, s, len) < 0) 1995 goto finally; 1996 1997 /* Get dict size, and bow out early if empty. */ 1998 if ((len = PyDict_Size(args)) < 0) 1999 goto finally; 2000 2001 if (len == 0) { 2002 if (put(self, args) >= 0) 2003 res = 0; 2004 goto finally; 2005 } 2006 if (put2(self, args) < 0) 2007 goto finally; 2008 2009 /* Materialize the dict items. */ 2010 if (PyDict_CheckExact(args) && self->proto > 0) { 2011 /* We can take certain shortcuts if we know this is a dict and 2012 not a dict subclass. */ 2013 if (Py_EnterRecursiveCall(" while pickling an object") == 0) { 2014 res = batch_dict_exact(self, args); 2015 Py_LeaveRecursiveCall(); 2016 } 2017 } else { 2018 PyObject *iter = PyObject_CallMethod(args, "iteritems", "()"); 2019 if (iter == NULL) 2020 goto finally; 2021 if (Py_EnterRecursiveCall(" while pickling an object") == 0) { 2022 res = batch_dict(self, iter); 2023 Py_LeaveRecursiveCall(); 2024 } 2025 Py_DECREF(iter); 2026 } 1915 2027 1916 2028 finally: 1917 1918 1919 1920 2029 if (self->fast && !fast_save_leave(self, args)) 2030 res = -1; 2031 2032 return res; 1921 2033 } 1922 2034 … … 1925 2037 save_inst(Picklerobject *self, PyObject *args) 1926 2038 { 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 int i, len;1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 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 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2039 PyObject *class = 0, *module = 0, *name = 0, *state = 0, 2040 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0; 2041 char *module_str, *name_str; 2042 int module_size, name_size, res = -1; 2043 2044 static char inst = INST, obj = OBJ, build = BUILD; 2045 2046 if (self->fast && !fast_save_enter(self, args)) 2047 goto finally; 2048 2049 if (self->write_func(self, &MARKv, 1) < 0) 2050 goto finally; 2051 2052 if (!( class = PyObject_GetAttr(args, __class___str))) 2053 goto finally; 2054 2055 if (self->bin) { 2056 if (save(self, class, 0) < 0) 2057 goto finally; 2058 } 2059 2060 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) { 2061 PyObject *element = 0; 2062 Py_ssize_t i, len; 2063 2064 if (!( class_args = 2065 PyObject_Call(getinitargs_func, empty_tuple, NULL))) 2066 goto finally; 2067 2068 if ((len = PyObject_Size(class_args)) < 0) 2069 goto finally; 2070 2071 for (i = 0; i < len; i++) { 2072 if (!( element = PySequence_GetItem(class_args, i))) 2073 goto finally; 2074 2075 if (save(self, element, 0) < 0) { 2076 Py_DECREF(element); 2077 goto finally; 2078 } 2079 2080 Py_DECREF(element); 2081 } 2082 } 2083 else { 2084 if (PyErr_ExceptionMatches(PyExc_AttributeError)) 2085 PyErr_Clear(); 2086 else 2087 goto finally; 2088 } 2089 2090 if (!self->bin) { 2091 if (!( name = ((PyClassObject *)class)->cl_name )) { 2092 PyErr_SetString(PicklingError, "class has no name"); 2093 goto finally; 2094 } 2095 2096 if (!( module = whichmodule(class, name))) 2097 goto finally; 2098 2099 2100 if ((module_size = PyString_Size(module)) < 0 || 2101 (name_size = PyString_Size(name)) < 0) 2102 goto finally; 2103 2104 module_str = PyString_AS_STRING((PyStringObject *)module); 2105 name_str = PyString_AS_STRING((PyStringObject *)name); 2106 2107 if (self->write_func(self, &inst, 1) < 0) 2108 goto finally; 2109 2110 if (self->write_func(self, module_str, module_size) < 0) 2111 goto finally; 2112 2113 if (self->write_func(self, "\n", 1) < 0) 2114 goto finally; 2115 2116 if (self->write_func(self, name_str, name_size) < 0) 2117 goto finally; 2118 2119 if (self->write_func(self, "\n", 1) < 0) 2120 goto finally; 2121 } 2122 else if (self->write_func(self, &obj, 1) < 0) { 2123 goto finally; 2124 } 2125 2126 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) { 2127 state = PyObject_Call(getstate_func, empty_tuple, NULL); 2128 if (!state) 2129 goto finally; 2130 } 2131 else { 2132 if (PyErr_ExceptionMatches(PyExc_AttributeError)) 2133 PyErr_Clear(); 2134 else 2135 goto finally; 2136 2137 if (!( state = PyObject_GetAttr(args, __dict___str))) { 2138 if (PyErr_ExceptionMatches(PyExc_AttributeError)) 2139 PyErr_Clear(); 2140 else 2141 goto finally; 2142 res = 0; 2143 goto finally; 2144 } 2145 } 2146 2147 if (!PyDict_Check(state)) { 2148 if (put2(self, args) < 0) 2149 goto finally; 2150 } 2151 else { 2152 if (put(self, args) < 0) 2153 goto finally; 2154 } 2155 2156 if (save(self, state, 0) < 0) 2157 goto finally; 2158 2159 if (self->write_func(self, &build, 1) < 0) 2160 goto finally; 2161 2162 res = 0; 2051 2163 2052 2164 finally: 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2165 if (self->fast && !fast_save_leave(self, args)) 2166 res = -1; 2167 2168 Py_XDECREF(module); 2169 Py_XDECREF(class); 2170 Py_XDECREF(state); 2171 Py_XDECREF(getinitargs_func); 2172 Py_XDECREF(getstate_func); 2173 Py_XDECREF(class_args); 2174 2175 return res; 2064 2176 } 2065 2177 … … 2068 2180 save_global(Picklerobject *self, PyObject *args, PyObject *name) 2069 2181 { 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 PyObject *py_code;/* extension code as Python object */2128 long code;/* extension code as C value */2129 2130 2131 2132 2133 2134 2135 2136 goto gen_global;/* not registered */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 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 goto finally;/* and don't memoize */2177 2182 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0; 2183 char *name_str, *module_str; 2184 int module_size, name_size, res = -1; 2185 2186 static char global = GLOBAL; 2187 2188 if (name) { 2189 global_name = name; 2190 Py_INCREF(global_name); 2191 } 2192 else { 2193 if (!( global_name = PyObject_GetAttr(args, __name___str))) 2194 goto finally; 2195 } 2196 2197 if (!( module = whichmodule(args, global_name))) 2198 goto finally; 2199 2200 if ((module_size = PyString_Size(module)) < 0 || 2201 (name_size = PyString_Size(global_name)) < 0) 2202 goto finally; 2203 2204 module_str = PyString_AS_STRING((PyStringObject *)module); 2205 name_str = PyString_AS_STRING((PyStringObject *)global_name); 2206 2207 /* XXX This can be doing a relative import. Clearly it shouldn't, 2208 but I don't know how to stop it. :-( */ 2209 mod = PyImport_ImportModule(module_str); 2210 if (mod == NULL) { 2211 cPickle_ErrFormat(PicklingError, 2212 "Can't pickle %s: import of module %s " 2213 "failed", 2214 "OS", args, module); 2215 goto finally; 2216 } 2217 klass = PyObject_GetAttrString(mod, name_str); 2218 if (klass == NULL) { 2219 cPickle_ErrFormat(PicklingError, 2220 "Can't pickle %s: attribute lookup %s.%s " 2221 "failed", 2222 "OSS", args, module, global_name); 2223 goto finally; 2224 } 2225 if (klass != args) { 2226 Py_DECREF(klass); 2227 cPickle_ErrFormat(PicklingError, 2228 "Can't pickle %s: it's not the same object " 2229 "as %s.%s", 2230 "OSS", args, module, global_name); 2231 goto finally; 2232 } 2233 Py_DECREF(klass); 2234 2235 if (self->proto >= 2) { 2236 /* See whether this is in the extension registry, and if 2237 * so generate an EXT opcode. 2238 */ 2239 PyObject *py_code; /* extension code as Python object */ 2240 long code; /* extension code as C value */ 2241 char c_str[5]; 2242 int n; 2243 2244 PyTuple_SET_ITEM(two_tuple, 0, module); 2245 PyTuple_SET_ITEM(two_tuple, 1, global_name); 2246 py_code = PyDict_GetItem(extension_registry, two_tuple); 2247 if (py_code == NULL) 2248 goto gen_global; /* not registered */ 2249 2250 /* Verify py_code has the right type and value. */ 2251 if (!PyInt_Check(py_code)) { 2252 cPickle_ErrFormat(PicklingError, "Can't pickle %s: " 2253 "extension code %s isn't an integer", 2254 "OO", args, py_code); 2255 goto finally; 2256 } 2257 code = PyInt_AS_LONG(py_code); 2258 if (code <= 0 || code > 0x7fffffffL) { 2259 cPickle_ErrFormat(PicklingError, "Can't pickle %s: " 2260 "extension code %ld is out of range", 2261 "Ol", args, code); 2262 goto finally; 2263 } 2264 2265 /* Generate an EXT opcode. */ 2266 if (code <= 0xff) { 2267 c_str[0] = EXT1; 2268 c_str[1] = (char)code; 2269 n = 2; 2270 } 2271 else if (code <= 0xffff) { 2272 c_str[0] = EXT2; 2273 c_str[1] = (char)(code & 0xff); 2274 c_str[2] = (char)((code >> 8) & 0xff); 2275 n = 3; 2276 } 2277 else { 2278 c_str[0] = EXT4; 2279 c_str[1] = (char)(code & 0xff); 2280 c_str[2] = (char)((code >> 8) & 0xff); 2281 c_str[3] = (char)((code >> 16) & 0xff); 2282 c_str[4] = (char)((code >> 24) & 0xff); 2283 n = 5; 2284 } 2285 2286 if (self->write_func(self, c_str, n) >= 0) 2287 res = 0; 2288 goto finally; /* and don't memoize */ 2289 } 2178 2290 2179 2291 gen_global: 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2292 if (self->write_func(self, &global, 1) < 0) 2293 goto finally; 2294 2295 if (self->write_func(self, module_str, module_size) < 0) 2296 goto finally; 2297 2298 if (self->write_func(self, "\n", 1) < 0) 2299 goto finally; 2300 2301 if (self->write_func(self, name_str, name_size) < 0) 2302 goto finally; 2303 2304 if (self->write_func(self, "\n", 1) < 0) 2305 goto finally; 2306 2307 if (put(self, args) < 0) 2308 goto finally; 2309 2310 res = 0; 2199 2311 2200 2312 finally: 2201 2202 2203 2204 2205 2313 Py_XDECREF(module); 2314 Py_XDECREF(global_name); 2315 Py_XDECREF(mod); 2316 2317 return res; 2206 2318 } 2207 2319 … … 2209 2321 save_pers(Picklerobject *self, PyObject *args, PyObject *f) 2210 2322 { 2211 PyObject *pid = 0; 2212 int size, res = -1; 2213 2214 static char persid = PERSID, binpersid = BINPERSID; 2215 2216 Py_INCREF(args); 2217 ARG_TUP(self, args); 2218 if (self->arg) { 2219 pid = PyObject_Call(f, self->arg, NULL); 2220 FREE_ARG_TUP(self); 2221 } 2222 if (! pid) return -1; 2223 2224 if (pid != Py_None) { 2225 if (!self->bin) { 2226 if (!PyString_Check(pid)) { 2227 PyErr_SetString(PicklingError, 2228 "persistent id must be string"); 2229 goto finally; 2230 } 2231 2232 if (self->write_func(self, &persid, 1) < 0) 2233 goto finally; 2234 2235 if ((size = PyString_Size(pid)) < 0) 2236 goto finally; 2237 2238 if (self->write_func(self, 2239 PyString_AS_STRING( 2240 (PyStringObject *)pid), 2241 size) < 0) 2242 goto finally; 2243 2244 if (self->write_func(self, "\n", 1) < 0) 2245 goto finally; 2246 2247 res = 1; 2248 goto finally; 2249 } 2250 else if (save(self, pid, 1) >= 0) { 2251 if (self->write_func(self, &binpersid, 1) < 0) 2252 res = -1; 2253 else 2254 res = 1; 2255 } 2256 2257 goto finally; 2258 } 2259 2260 res = 0; 2323 PyObject *pid = 0; 2324 Py_ssize_t size; 2325 int res = -1; 2326 2327 static char persid = PERSID, binpersid = BINPERSID; 2328 2329 Py_INCREF(args); 2330 ARG_TUP(self, args); 2331 if (self->arg) { 2332 pid = PyObject_Call(f, self->arg, NULL); 2333 FREE_ARG_TUP(self); 2334 } 2335 if (! pid) return -1; 2336 2337 if (pid != Py_None) { 2338 if (!self->bin) { 2339 if (!PyString_Check(pid)) { 2340 PyErr_SetString(PicklingError, 2341 "persistent id must be string"); 2342 goto finally; 2343 } 2344 2345 if (self->write_func(self, &persid, 1) < 0) 2346 goto finally; 2347 2348 if ((size = PyString_Size(pid)) < 0) 2349 goto finally; 2350 2351 if (self->write_func(self, 2352 PyString_AS_STRING( 2353 (PyStringObject *)pid), 2354 size) < 0) 2355 goto finally; 2356 2357 if (self->write_func(self, "\n", 1) < 0) 2358 goto finally; 2359 2360 res = 1; 2361 goto finally; 2362 } 2363 else if (save(self, pid, 1) >= 0) { 2364 if (self->write_func(self, &binpersid, 1) < 0) 2365 res = -1; 2366 else 2367 res = 1; 2368 } 2369 2370 goto finally; 2371 } 2372 2373 res = 0; 2261 2374 2262 2375 finally: 2263 2264 2265 2376 Py_XDECREF(pid); 2377 2378 return res; 2266 2379 } 2267 2380 … … 2272 2385 save_reduce(Picklerobject *self, PyObject *args, PyObject *fn, PyObject *ob) 2273 2386 { 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 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 int n, i;2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2387 PyObject *callable; 2388 PyObject *argtup; 2389 PyObject *state = NULL; 2390 PyObject *listitems = Py_None; 2391 PyObject *dictitems = Py_None; 2392 Py_ssize_t size; 2393 2394 int use_newobj = self->proto >= 2; 2395 2396 static char reduce = REDUCE; 2397 static char build = BUILD; 2398 static char newobj = NEWOBJ; 2399 2400 size = PyTuple_Size(args); 2401 if (size < 2 || size > 5) { 2402 cPickle_ErrFormat(PicklingError, "tuple returned by " 2403 "%s must contain 2 through 5 elements", 2404 "O", fn); 2405 return -1; 2406 } 2407 2408 if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5, 2409 &callable, 2410 &argtup, 2411 &state, 2412 &listitems, 2413 &dictitems)) 2414 return -1; 2415 2416 if (!PyTuple_Check(argtup)) { 2417 cPickle_ErrFormat(PicklingError, "Second element of " 2418 "tuple returned by %s must be a tuple", 2419 "O", fn); 2420 return -1; 2421 } 2422 2423 if (state == Py_None) 2424 state = NULL; 2425 2426 if (listitems == Py_None) 2427 listitems = NULL; 2428 else if (!PyIter_Check(listitems)) { 2429 cPickle_ErrFormat(PicklingError, "Fourth element of " 2430 "tuple returned by %s must be an iterator, not %s", 2431 "Os", fn, Py_TYPE(listitems)->tp_name); 2432 return -1; 2433 } 2434 2435 if (dictitems == Py_None) 2436 dictitems = NULL; 2437 else if (!PyIter_Check(dictitems)) { 2438 cPickle_ErrFormat(PicklingError, "Fifth element of " 2439 "tuple returned by %s must be an iterator, not %s", 2440 "Os", fn, Py_TYPE(dictitems)->tp_name); 2441 return -1; 2442 } 2443 2444 /* Protocol 2 special case: if callable's name is __newobj__, use 2445 * NEWOBJ. This consumes a lot of code. 2446 */ 2447 if (use_newobj) { 2448 PyObject *temp = PyObject_GetAttr(callable, __name___str); 2449 2450 if (temp == NULL) { 2451 if (PyErr_ExceptionMatches(PyExc_AttributeError)) 2452 PyErr_Clear(); 2453 else 2454 return -1; 2455 use_newobj = 0; 2456 } 2457 else { 2458 use_newobj = PyString_Check(temp) && 2459 strcmp(PyString_AS_STRING(temp), 2460 "__newobj__") == 0; 2461 Py_DECREF(temp); 2462 } 2463 } 2464 if (use_newobj) { 2465 PyObject *cls; 2466 PyObject *newargtup; 2467 Py_ssize_t n, i; 2468 2469 /* Sanity checks. */ 2470 n = PyTuple_Size(argtup); 2471 if (n < 1) { 2472 PyErr_SetString(PicklingError, "__newobj__ arglist " 2473 "is empty"); 2474 return -1; 2475 } 2476 2477 cls = PyTuple_GET_ITEM(argtup, 0); 2478 if (! PyObject_HasAttrString(cls, "__new__")) { 2479 PyErr_SetString(PicklingError, "args[0] from " 2480 "__newobj__ args has no __new__"); 2481 return -1; 2482 } 2483 2484 /* XXX How could ob be NULL? */ 2485 if (ob != NULL) { 2486 PyObject *ob_dot_class; 2487 2488 ob_dot_class = PyObject_GetAttr(ob, __class___str); 2489 if (ob_dot_class == NULL) { 2490 if (PyErr_ExceptionMatches( 2491 PyExc_AttributeError)) 2492 PyErr_Clear(); 2493 else 2494 return -1; 2495 } 2496 i = ob_dot_class != cls; /* true iff a problem */ 2497 Py_XDECREF(ob_dot_class); 2498 if (i) { 2499 PyErr_SetString(PicklingError, "args[0] from " 2500 "__newobj__ args has the wrong class"); 2501 return -1; 2502 } 2503 } 2504 2505 /* Save the class and its __new__ arguments. */ 2506 if (save(self, cls, 0) < 0) 2507 return -1; 2508 2509 newargtup = PyTuple_New(n-1); /* argtup[1:] */ 2510 if (newargtup == NULL) 2511 return -1; 2512 for (i = 1; i < n; ++i) { 2513 PyObject *temp = PyTuple_GET_ITEM(argtup, i); 2514 Py_INCREF(temp); 2515 PyTuple_SET_ITEM(newargtup, i-1, temp); 2516 } 2517 i = save(self, newargtup, 0); 2518 Py_DECREF(newargtup); 2519 if (i < 0) 2520 return -1; 2521 2522 /* Add NEWOBJ opcode. */ 2523 if (self->write_func(self, &newobj, 1) < 0) 2524 return -1; 2525 } 2526 else { 2527 /* Not using NEWOBJ. */ 2528 if (save(self, callable, 0) < 0 || 2529 save(self, argtup, 0) < 0 || 2530 self->write_func(self, &reduce, 1) < 0) 2531 return -1; 2532 } 2533 2534 /* Memoize. */ 2535 /* XXX How can ob be NULL? */ 2536 if (ob != NULL) { 2537 if (state && !PyDict_Check(state)) { 2538 if (put2(self, ob) < 0) 2539 return -1; 2540 } 2541 else if (put(self, ob) < 0) 2542 return -1; 2543 } 2544 2545 2546 if (listitems && batch_list(self, listitems) < 0) 2547 return -1; 2548 2549 if (dictitems && batch_dict(self, dictitems) < 0) 2550 return -1; 2551 2552 if (state) { 2553 if (save(self, state, 0) < 0 || 2554 self->write_func(self, &build, 1) < 0) 2555 return -1; 2556 } 2557 2558 return 0; 2446 2559 } 2447 2560 … … 2449 2562 save(Picklerobject *self, PyObject *args, int pers_save) 2450 2563 { 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2564 PyTypeObject *type; 2565 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0; 2566 int res = -1; 2567 int tmp; 2568 2569 if (Py_EnterRecursiveCall(" while pickling an object")) 2570 return -1; 2571 2572 if (!pers_save && self->pers_func) { 2573 if ((tmp = save_pers(self, args, self->pers_func)) != 0) { 2574 res = tmp; 2575 goto finally; 2576 } 2577 } 2578 2579 if (args == Py_None) { 2580 res = save_none(self, args); 2581 goto finally; 2582 } 2583 2584 type = Py_TYPE(args); 2585 2586 switch (type->tp_name[0]) { 2587 case 'b': 2588 if (args == Py_False || args == Py_True) { 2589 res = save_bool(self, args); 2590 goto finally; 2591 } 2592 break; 2593 case 'i': 2594 if (type == &PyInt_Type) { 2595 res = save_int(self, args); 2596 goto finally; 2597 } 2598 break; 2599 2600 case 'l': 2601 if (type == &PyLong_Type) { 2602 res = save_long(self, args); 2603 goto finally; 2604 } 2605 break; 2606 2607 case 'f': 2608 if (type == &PyFloat_Type) { 2609 res = save_float(self, args); 2610 goto finally; 2611 } 2612 break; 2613 2614 case 't': 2615 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) { 2616 res = save_tuple(self, args); 2617 goto finally; 2618 } 2619 break; 2620 2621 case 's': 2622 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) { 2623 res = save_string(self, args, 0); 2624 goto finally; 2625 } 2626 break; 2514 2627 2515 2628 #ifdef Py_USING_UNICODE 2516 2517 2518 2519 2520 2521 2629 case 'u': 2630 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) { 2631 res = save_unicode(self, args, 0); 2632 goto finally; 2633 } 2634 break; 2522 2635 #endif 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2636 } 2637 2638 if (Py_REFCNT(args) > 1) { 2639 if (!( py_ob_id = PyLong_FromVoidPtr(args))) 2640 goto finally; 2641 2642 if (PyDict_GetItem(self->memo, py_ob_id)) { 2643 if (get(self, py_ob_id) < 0) 2644 goto finally; 2645 2646 res = 0; 2647 goto finally; 2648 } 2649 } 2650 2651 switch (type->tp_name[0]) { 2652 case 's': 2653 if (type == &PyString_Type) { 2654 res = save_string(self, args, 1); 2655 goto finally; 2656 } 2657 break; 2545 2658 2546 2659 #ifdef Py_USING_UNICODE 2547 2548 2549 2550 2551 2552 2660 case 'u': 2661 if (type == &PyUnicode_Type) { 2662 res = save_unicode(self, args, 1); 2663 goto finally; 2664 } 2665 break; 2553 2666 #endif 2554 2667 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 if (PyType_IsSubtype(type, &PyType_Type)) { 2621 res = save_global(self, args, NULL); 2622 goto finally; 2623 } 2624 2625 /* Get a reduction callable, and call it. This may come from 2626 * copy_reg.dispatch_table, the object's __reduce_ex__ method, 2627 * or the object's __reduce__ method. 2628 */ 2629 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type); 2630 if (__reduce__ != NULL) { 2631 Py_INCREF(__reduce__);2632 Py_INCREF(args); 2633 ARG_TUP(self, args); 2634 if (self->arg){2635 t = PyObject_Call(__reduce__, self->arg, NULL); 2636 FREE_ARG_TUP(self);2637 } 2638 2639 else { 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2668 case 't': 2669 if (type == &PyTuple_Type) { 2670 res = save_tuple(self, args); 2671 goto finally; 2672 } 2673 if (type == &PyType_Type) { 2674 res = save_global(self, args, NULL); 2675 goto finally; 2676 } 2677 break; 2678 2679 case 'l': 2680 if (type == &PyList_Type) { 2681 res = save_list(self, args); 2682 goto finally; 2683 } 2684 break; 2685 2686 case 'd': 2687 if (type == &PyDict_Type) { 2688 res = save_dict(self, args); 2689 goto finally; 2690 } 2691 break; 2692 2693 case 'i': 2694 if (type == &PyInstance_Type) { 2695 res = save_inst(self, args); 2696 goto finally; 2697 } 2698 break; 2699 2700 case 'c': 2701 if (type == &PyClass_Type) { 2702 res = save_global(self, args, NULL); 2703 goto finally; 2704 } 2705 break; 2706 2707 case 'f': 2708 if (type == &PyFunction_Type) { 2709 res = save_global(self, args, NULL); 2710 if (res && PyErr_ExceptionMatches(PickleError)) { 2711 /* fall back to reduce */ 2712 PyErr_Clear(); 2713 break; 2714 } 2715 goto finally; 2716 } 2717 break; 2718 2719 case 'b': 2720 if (type == &PyCFunction_Type) { 2721 res = save_global(self, args, NULL); 2722 goto finally; 2723 } 2724 } 2725 2726 if (!pers_save && self->inst_pers_func) { 2727 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) { 2728 res = tmp; 2729 goto finally; 2730 } 2731 } 2732 2733 /* Get a reduction callable, and call it. This may come from 2734 * copy_reg.dispatch_table, the object's __reduce_ex__ method, 2735 * or the object's __reduce__ method. 2736 */ 2737 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type); 2738 if (__reduce__ != NULL) { 2739 Py_INCREF(__reduce__); 2740 Py_INCREF(args); 2741 ARG_TUP(self, args); 2742 if (self->arg) { 2743 t = PyObject_Call(__reduce__, self->arg, NULL); 2744 FREE_ARG_TUP(self); 2745 } 2746 } 2747 else { 2748 if (PyType_IsSubtype(type, &PyType_Type)) { 2749 res = save_global(self, args, NULL); 2750 goto finally; 2751 } 2752 2753 /* Check for a __reduce_ex__ method. */ 2754 __reduce__ = PyObject_GetAttr(args, __reduce_ex___str); 2755 if (__reduce__ != NULL) { 2756 t = PyInt_FromLong(self->proto); 2757 if (t != NULL) { 2758 ARG_TUP(self, t); 2759 t = NULL; 2760 if (self->arg) { 2761 t = PyObject_Call(__reduce__, 2762 self->arg, NULL); 2763 FREE_ARG_TUP(self); 2764 } 2765 } 2766 } 2767 else { 2768 if (PyErr_ExceptionMatches(PyExc_AttributeError)) 2769 PyErr_Clear(); 2770 else 2771 goto finally; 2772 /* Check for a __reduce__ method. */ 2773 __reduce__ = PyObject_GetAttr(args, __reduce___str); 2774 if (__reduce__ != NULL) { 2775 t = PyObject_Call(__reduce__, 2776 empty_tuple, NULL); 2777 } 2778 else { 2779 PyErr_SetObject(UnpickleableError, args); 2780 goto finally; 2781 } 2782 } 2783 } 2784 2785 if (t == NULL) 2786 goto finally; 2787 2788 if (PyString_Check(t)) { 2789 res = save_global(self, args, t); 2790 goto finally; 2791 } 2792 2793 if (!PyTuple_Check(t)) { 2794 cPickle_ErrFormat(PicklingError, "Value returned by " 2795 "%s must be string or tuple", 2796 "O", __reduce__); 2797 goto finally; 2798 } 2799 2800 res = save_reduce(self, t, __reduce__, args); 2688 2801 2689 2802 finally: 2690 2691 2692 2693 2694 2695 2803 Py_LeaveRecursiveCall(); 2804 Py_XDECREF(py_ob_id); 2805 Py_XDECREF(__reduce__); 2806 Py_XDECREF(t); 2807 2808 return res; 2696 2809 } 2697 2810 … … 2700 2813 dump(Picklerobject *self, PyObject *args) 2701 2814 { 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2815 static char stop = STOP; 2816 2817 if (self->proto >= 2) { 2818 char bytes[2]; 2819 2820 bytes[0] = PROTO; 2821 assert(self->proto >= 0 && self->proto < 256); 2822 bytes[1] = (char)self->proto; 2823 if (self->write_func(self, bytes, 2) < 0) 2824 return -1; 2825 } 2826 2827 if (save(self, args, 0) < 0) 2828 return -1; 2829 2830 if (self->write_func(self, &stop, 1) < 0) 2831 return -1; 2832 2833 if (self->write_func(self, NULL, 0) < 0) 2834 return -1; 2835 2836 return 0; 2724 2837 } 2725 2838 … … 2727 2840 Pickle_clear_memo(Picklerobject *self, PyObject *args) 2728 2841 { 2729 2730 2731 2732 2842 if (self->memo) 2843 PyDict_Clear(self->memo); 2844 Py_INCREF(Py_None); 2845 return Py_None; 2733 2846 } 2734 2847 … … 2736 2849 Pickle_getvalue(Picklerobject *self, PyObject *args) 2737 2850 { 2738 int l, i, rsize, ssize, clear=1, lm;2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 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 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 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 2851 Py_ssize_t l, i, rsize, ssize, clear=1, lm; 2852 long ik; 2853 PyObject *k, *r; 2854 char *s, *p, *have_get; 2855 Pdata *data; 2856 2857 /* Can be called by Python code or C code */ 2858 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear)) 2859 return NULL; 2860 2861 /* Check to make sure we are based on a list */ 2862 if (! Pdata_Check(self->file)) { 2863 PyErr_SetString(PicklingError, 2864 "Attempt to getvalue() a non-list-based pickler"); 2865 return NULL; 2866 } 2867 2868 /* flush write buffer */ 2869 if (write_other(self, NULL, 0) < 0) return NULL; 2870 2871 data=(Pdata*)self->file; 2872 l=data->length; 2873 2874 /* set up an array to hold get/put status */ 2875 lm = PyDict_Size(self->memo); 2876 if (lm < 0) return NULL; 2877 lm++; 2878 have_get = malloc(lm); 2879 if (have_get == NULL) return PyErr_NoMemory(); 2880 memset(have_get, 0, lm); 2881 2882 /* Scan for gets. */ 2883 for (rsize = 0, i = l; --i >= 0; ) { 2884 k = data->data[i]; 2885 2886 if (PyString_Check(k)) 2887 rsize += PyString_GET_SIZE(k); 2888 2889 else if (PyInt_Check(k)) { /* put */ 2890 ik = PyInt_AS_LONG((PyIntObject*)k); 2891 if (ik >= lm || ik == 0) { 2892 PyErr_SetString(PicklingError, 2893 "Invalid get data"); 2894 goto err; 2895 } 2896 if (have_get[ik]) /* with matching get */ 2897 rsize += ik < 256 ? 2 : 5; 2898 } 2899 2900 else if (! (PyTuple_Check(k) && 2901 PyTuple_GET_SIZE(k) == 2 && 2902 PyInt_Check((k = PyTuple_GET_ITEM(k, 0)))) 2903 ) { 2904 PyErr_SetString(PicklingError, 2905 "Unexpected data in internal list"); 2906 goto err; 2907 } 2908 2909 else { /* put */ 2910 ik = PyInt_AS_LONG((PyIntObject *)k); 2911 if (ik >= lm || ik == 0) { 2912 PyErr_SetString(PicklingError, 2913 "Invalid get data"); 2914 return NULL; 2915 } 2916 have_get[ik] = 1; 2917 rsize += ik < 256 ? 2 : 5; 2918 } 2919 } 2920 2921 /* Now generate the result */ 2922 r = PyString_FromStringAndSize(NULL, rsize); 2923 if (r == NULL) goto err; 2924 s = PyString_AS_STRING((PyStringObject *)r); 2925 2926 for (i = 0; i < l; i++) { 2927 k = data->data[i]; 2928 2929 if (PyString_Check(k)) { 2930 ssize = PyString_GET_SIZE(k); 2931 if (ssize) { 2932 p=PyString_AS_STRING((PyStringObject *)k); 2933 while (--ssize >= 0) 2934 *s++ = *p++; 2935 } 2936 } 2937 2938 else if (PyTuple_Check(k)) { /* get */ 2939 ik = PyInt_AS_LONG((PyIntObject *) 2940 PyTuple_GET_ITEM(k, 0)); 2941 if (ik < 256) { 2942 *s++ = BINGET; 2943 *s++ = (int)(ik & 0xff); 2944 } 2945 else { 2946 *s++ = LONG_BINGET; 2947 *s++ = (int)(ik & 0xff); 2948 *s++ = (int)((ik >> 8) & 0xff); 2949 *s++ = (int)((ik >> 16) & 0xff); 2950 *s++ = (int)((ik >> 24) & 0xff); 2951 } 2952 } 2953 2954 else { /* put */ 2955 ik = PyInt_AS_LONG((PyIntObject*)k); 2956 2957 if (have_get[ik]) { /* with matching get */ 2958 if (ik < 256) { 2959 *s++ = BINPUT; 2960 *s++ = (int)(ik & 0xff); 2961 } 2962 else { 2963 *s++ = LONG_BINPUT; 2964 *s++ = (int)(ik & 0xff); 2965 *s++ = (int)((ik >> 8) & 0xff); 2966 *s++ = (int)((ik >> 16) & 0xff); 2967 *s++ = (int)((ik >> 24) & 0xff); 2968 } 2969 } 2970 } 2971 } 2972 2973 if (clear) { 2974 PyDict_Clear(self->memo); 2975 Pdata_clear(data, 0); 2976 } 2977 2978 free(have_get); 2979 return r; 2867 2980 err: 2868 2869 2981 free(have_get); 2982 return NULL; 2870 2983 } 2871 2984 … … 2873 2986 Pickler_dump(Picklerobject *self, PyObject *args) 2874 2987 { 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2988 PyObject *ob; 2989 int get=0; 2990 2991 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get))) 2992 return NULL; 2993 2994 if (dump(self, ob) < 0) 2995 return NULL; 2996 2997 if (get) return Pickle_getvalue(self, NULL); 2998 2999 /* XXX Why does dump() return self? */ 3000 Py_INCREF(self); 3001 return (PyObject*)self; 2889 3002 } 2890 3003 … … 2906 3019 newPicklerobject(PyObject *file, int proto) 2907 3020 { 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 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 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3021 Picklerobject *self; 3022 3023 if (proto < 0) 3024 proto = HIGHEST_PROTOCOL; 3025 if (proto > HIGHEST_PROTOCOL) { 3026 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; " 3027 "the highest available protocol is %d", 3028 proto, HIGHEST_PROTOCOL); 3029 return NULL; 3030 } 3031 3032 self = PyObject_GC_New(Picklerobject, &Picklertype); 3033 if (self == NULL) 3034 return NULL; 3035 self->proto = proto; 3036 self->bin = proto > 0; 3037 self->fp = NULL; 3038 self->write = NULL; 3039 self->memo = NULL; 3040 self->arg = NULL; 3041 self->pers_func = NULL; 3042 self->inst_pers_func = NULL; 3043 self->write_buf = NULL; 3044 self->fast = 0; 3045 self->fast_container = 0; 3046 self->fast_memo = NULL; 3047 self->buf_size = 0; 3048 self->dispatch_table = NULL; 3049 3050 self->file = NULL; 3051 if (file) 3052 Py_INCREF(file); 3053 else { 3054 file = Pdata_New(); 3055 if (file == NULL) 3056 goto err; 3057 } 3058 self->file = file; 3059 3060 if (!( self->memo = PyDict_New())) 3061 goto err; 3062 3063 if (PyFile_Check(file)) { 3064 self->fp = PyFile_AsFile(file); 3065 if (self->fp == NULL) { 3066 PyErr_SetString(PyExc_ValueError, 3067 "I/O operation on closed file"); 3068 goto err; 3069 } 3070 self->write_func = write_file; 3071 } 3072 else if (PycStringIO_OutputCheck(file)) { 3073 self->write_func = write_cStringIO; 3074 } 3075 else if (file == Py_None) { 3076 self->write_func = write_none; 3077 } 3078 else { 3079 self->write_func = write_other; 3080 3081 if (! Pdata_Check(file)) { 3082 self->write = PyObject_GetAttr(file, write_str); 3083 if (!self->write) { 3084 PyErr_Clear(); 3085 PyErr_SetString(PyExc_TypeError, 3086 "argument must have 'write' " 3087 "attribute"); 3088 goto err; 3089 } 3090 } 3091 3092 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE); 3093 if (self->write_buf == NULL) { 3094 PyErr_NoMemory(); 3095 goto err; 3096 } 3097 } 3098 3099 if (PyEval_GetRestricted()) { 3100 /* Restricted execution, get private tables */ 3101 PyObject *m = PyImport_ImportModule("copy_reg"); 3102 3103 if (m == NULL) 3104 goto err; 3105 self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str); 3106 Py_DECREF(m); 3107 if (self->dispatch_table == NULL) 3108 goto err; 3109 } 3110 else { 3111 self->dispatch_table = dispatch_table; 3112 Py_INCREF(dispatch_table); 3113 } 3114 PyObject_GC_Track(self); 3115 3116 return self; 3004 3117 3005 3118 err: 3006 3007 3119 Py_DECREF(self); 3120 return NULL; 3008 3121 } 3009 3122 … … 3012 3125 get_Pickler(PyObject *self, PyObject *args, PyObject *kwds) 3013 3126 { 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3127 static char *kwlist[] = {"file", "protocol", NULL}; 3128 PyObject *file = NULL; 3129 int proto = 0; 3130 3131 /* XXX 3132 * The documented signature is Pickler(file, protocol=0), but this 3133 * accepts Pickler() and Pickler(integer) too. The meaning then 3134 * is clear as mud, undocumented, and not supported by pickle.py. 3135 * I'm told Zope uses this, but I haven't traced into this code 3136 * far enough to figure out what it means. 3137 */ 3138 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) { 3139 PyErr_Clear(); 3140 proto = 0; 3141 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler", 3142 kwlist, &file, &proto)) 3143 return NULL; 3144 } 3145 return (PyObject *)newPicklerobject(file, proto); 3033 3146 } 3034 3147 … … 3037 3150 Pickler_dealloc(Picklerobject *self) 3038 3151 { 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3152 PyObject_GC_UnTrack(self); 3153 Py_XDECREF(self->write); 3154 Py_XDECREF(self->memo); 3155 Py_XDECREF(self->fast_memo); 3156 Py_XDECREF(self->arg); 3157 Py_XDECREF(self->file); 3158 Py_XDECREF(self->pers_func); 3159 Py_XDECREF(self->inst_pers_func); 3160 Py_XDECREF(self->dispatch_table); 3161 PyMem_Free(self->write_buf); 3162 Py_TYPE(self)->tp_free((PyObject *)self); 3050 3163 } 3051 3164 … … 3053 3166 Pickler_traverse(Picklerobject *self, visitproc visit, void *arg) 3054 3167 { 3055 3056 3057 3058 3059 3060 3061 3062 3063 3168 Py_VISIT(self->write); 3169 Py_VISIT(self->memo); 3170 Py_VISIT(self->fast_memo); 3171 Py_VISIT(self->arg); 3172 Py_VISIT(self->file); 3173 Py_VISIT(self->pers_func); 3174 Py_VISIT(self->inst_pers_func); 3175 Py_VISIT(self->dispatch_table); 3176 return 0; 3064 3177 } 3065 3178 … … 3067 3180 Pickler_clear(Picklerobject *self) 3068 3181 { 3069 3070 3071 3072 3073 3074 3075 3076 3077 3182 Py_CLEAR(self->write); 3183 Py_CLEAR(self->memo); 3184 Py_CLEAR(self->fast_memo); 3185 Py_CLEAR(self->arg); 3186 Py_CLEAR(self->file); 3187 Py_CLEAR(self->pers_func); 3188 Py_CLEAR(self->inst_pers_func); 3189 Py_CLEAR(self->dispatch_table); 3190 return 0; 3078 3191 } 3079 3192 … … 3081 3194 Pickler_get_pers_func(Picklerobject *p) 3082 3195 { 3083 3084 3085 3086 3087 3196 if (p->pers_func == NULL) 3197 PyErr_SetString(PyExc_AttributeError, "persistent_id"); 3198 else 3199 Py_INCREF(p->pers_func); 3200 return p->pers_func; 3088 3201 } 3089 3202 … … 3091 3204 Pickler_set_pers_func(Picklerobject *p, PyObject *v) 3092 3205 { 3093 3094 3095 3096 3097 3098 3099 3100 3101 3206 if (v == NULL) { 3207 PyErr_SetString(PyExc_TypeError, 3208 "attribute deletion is not supported"); 3209 return -1; 3210 } 3211 Py_XDECREF(p->pers_func); 3212 Py_INCREF(v); 3213 p->pers_func = v; 3214 return 0; 3102 3215 } 3103 3216 … … 3105 3218 Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v) 3106 3219 { 3107 3108 3109 3110 3111 3112 3113 3114 3115 3220 if (v == NULL) { 3221 PyErr_SetString(PyExc_TypeError, 3222 "attribute deletion is not supported"); 3223 return -1; 3224 } 3225 Py_XDECREF(p->inst_pers_func); 3226 Py_INCREF(v); 3227 p->inst_pers_func = v; 3228 return 0; 3116 3229 } 3117 3230 … … 3119 3232 Pickler_get_memo(Picklerobject *p) 3120 3233 { 3121 3122 3123 3124 3125 3234 if (p->memo == NULL) 3235 PyErr_SetString(PyExc_AttributeError, "memo"); 3236 else 3237 Py_INCREF(p->memo); 3238 return p->memo; 3126 3239 } 3127 3240 … … 3129 3242 Pickler_set_memo(Picklerobject *p, PyObject *v) 3130 3243 { 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3244 if (v == NULL) { 3245 PyErr_SetString(PyExc_TypeError, 3246 "attribute deletion is not supported"); 3247 return -1; 3248 } 3249 if (!PyDict_Check(v)) { 3250 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary"); 3251 return -1; 3252 } 3253 Py_XDECREF(p->memo); 3254 Py_INCREF(v); 3255 p->memo = v; 3256 return 0; 3144 3257 } 3145 3258 … … 3147 3260 Pickler_get_error(Picklerobject *p) 3148 3261 { 3149 3150 3151 3262 /* why is this an attribute on the Pickler? */ 3263 Py_INCREF(PicklingError); 3264 return PicklingError; 3152 3265 } 3153 3266 … … 3175 3288 sizeof(Picklerobject), /*tp_basicsize*/ 3176 3289 0, 3177 (destructor)Pickler_dealloc, 3178 0, 3179 0, 3180 0, 3181 0, 3182 0, 3183 0, 3184 0, 3185 0, 3186 0, 3187 0, 3188 0, 3189 PyObject_GenericGetAttr, 3190 PyObject_GenericSetAttr, 3191 0, 3290 (destructor)Pickler_dealloc, /* tp_dealloc */ 3291 0, /* tp_print */ 3292 0, /* tp_getattr */ 3293 0, /* tp_setattr */ 3294 0, /* tp_compare */ 3295 0, /* tp_repr */ 3296 0, /* tp_as_number */ 3297 0, /* tp_as_sequence */ 3298 0, /* tp_as_mapping */ 3299 0, /* tp_hash */ 3300 0, /* tp_call */ 3301 0, /* tp_str */ 3302 PyObject_GenericGetAttr, /* tp_getattro */ 3303 PyObject_GenericSetAttr, /* tp_setattro */ 3304 0, /* tp_as_buffer */ 3192 3305 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, 3193 Picklertype__doc__, 3194 (traverseproc)Pickler_traverse, 3195 (inquiry)Pickler_clear, 3196 0, 3197 0, 3198 0, 3199 0, 3200 Pickler_methods, 3201 Pickler_members, 3202 Pickler_getsets, 3306 Picklertype__doc__, /* tp_doc */ 3307 (traverseproc)Pickler_traverse, /* tp_traverse */ 3308 (inquiry)Pickler_clear, /* tp_clear */ 3309 0, /* tp_richcompare */ 3310 0, /* tp_weaklistoffset */ 3311 0, /* tp_iter */ 3312 0, /* tp_iternext */ 3313 Pickler_methods, /* tp_methods */ 3314 Pickler_members, /* tp_members */ 3315 Pickler_getsets, /* tp_getset */ 3203 3316 }; 3204 3317 … … 3206 3319 find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc) 3207 3320 { 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 } 3236 3237 static int3321 PyObject *global = 0, *module; 3322 3323 if (fc) { 3324 if (fc==Py_None) { 3325 PyErr_SetString(UnpicklingError, "Global and instance " 3326 "pickles are not supported."); 3327 return NULL; 3328 } 3329 return PyObject_CallFunctionObjArgs(fc, py_module_name, 3330 py_global_name, NULL); 3331 } 3332 3333 module = PySys_GetObject("modules"); 3334 if (module == NULL) 3335 return NULL; 3336 3337 module = PyDict_GetItem(module, py_module_name); 3338 if (module == NULL) { 3339 module = PyImport_Import(py_module_name); 3340 if (!module) 3341 return NULL; 3342 global = PyObject_GetAttr(module, py_global_name); 3343 Py_DECREF(module); 3344 } 3345 else 3346 global = PyObject_GetAttr(module, py_global_name); 3347 return global; 3348 } 3349 3350 static Py_ssize_t 3238 3351 marker(Unpicklerobject *self) 3239 3352 { 3240 3241 3242 3243 3244 3245 3353 if (self->num_marks < 1) { 3354 PyErr_SetString(UnpicklingError, "could not find MARK"); 3355 return -1; 3356 } 3357 3358 return self->marks[--self->num_marks]; 3246 3359 } 3247 3360 … … 3250 3363 load_none(Unpicklerobject *self) 3251 3364 { 3252 3253 3365 PDATA_APPEND(self->stack, Py_None, -1); 3366 return 0; 3254 3367 } 3255 3368 … … 3257 3370 bad_readline(void) 3258 3371 { 3259 3260 3372 PyErr_SetString(UnpicklingError, "pickle data was truncated"); 3373 return -1; 3261 3374 } 3262 3375 … … 3264 3377 load_int(Unpicklerobject *self) 3265 3378 { 3266 PyObject *py_int = 0; 3267 char *endptr, *s; 3268 int len, res = -1; 3269 long l; 3270 3271 if ((len = self->readline_func(self, &s)) < 0) return -1; 3272 if (len < 2) return bad_readline(); 3273 if (!( s=pystrndup(s,len))) return -1; 3274 3275 errno = 0; 3276 l = strtol(s, &endptr, 0); 3277 3278 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) { 3279 /* Hm, maybe we've got something long. Let's try reading 3280 it as a Python long object. */ 3281 errno = 0; 3282 py_int = PyLong_FromString(s, NULL, 0); 3283 if (py_int == NULL) { 3284 PyErr_SetString(PyExc_ValueError, 3285 "could not convert string to int"); 3286 goto finally; 3287 } 3288 } 3289 else { 3290 if (len == 3 && (l == 0 || l == 1)) { 3291 if (!( py_int = PyBool_FromLong(l))) goto finally; 3292 } 3293 else { 3294 if (!( py_int = PyInt_FromLong(l))) goto finally; 3295 } 3296 } 3297 3298 free(s); 3299 PDATA_PUSH(self->stack, py_int, -1); 3300 return 0; 3379 PyObject *py_int = 0; 3380 char *endptr, *s; 3381 Py_ssize_t len; 3382 int res = -1; 3383 long l; 3384 3385 if ((len = self->readline_func(self, &s)) < 0) return -1; 3386 if (len < 2) return bad_readline(); 3387 if (!( s=pystrndup(s,len))) return -1; 3388 3389 errno = 0; 3390 l = strtol(s, &endptr, 0); 3391 3392 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) { 3393 /* Hm, maybe we've got something long. Let's try reading 3394 it as a Python long object. */ 3395 errno = 0; 3396 py_int = PyLong_FromString(s, NULL, 0); 3397 if (py_int == NULL) { 3398 PyErr_SetString(PyExc_ValueError, 3399 "could not convert string to int"); 3400 goto finally; 3401 } 3402 } 3403 else { 3404 if (len == 3 && (l == 0 || l == 1)) { 3405 if (!( py_int = PyBool_FromLong(l))) goto finally; 3406 } 3407 else { 3408 if (!( py_int = PyInt_FromLong(l))) goto finally; 3409 } 3410 } 3411 3412 free(s); 3413 PDATA_PUSH(self->stack, py_int, -1); 3414 return 0; 3301 3415 3302 3416 finally: 3303 3304 3305 3417 free(s); 3418 3419 return res; 3306 3420 } 3307 3421 … … 3309 3423 load_bool(Unpicklerobject *self, PyObject *boolean) 3310 3424 { 3311 3312 3313 3425 assert(boolean == Py_True || boolean == Py_False); 3426 PDATA_APPEND(self->stack, boolean, -1); 3427 return 0; 3314 3428 } 3315 3429 … … 3322 3436 calc_binint(char *s, int x) 3323 3437 { 3324 3325 3326 3327 3328 3329 3330 3331 3438 unsigned char c; 3439 int i; 3440 long l; 3441 3442 for (i = 0, l = 0L; i < x; i++) { 3443 c = (unsigned char)s[i]; 3444 l |= (long)c << (i * 8); 3445 } 3332 3446 #if SIZEOF_LONG > 4 3333 3334 3335 3336 3337 3338 3447 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4) 3448 * is signed, so on a box with longs bigger than 4 bytes we need 3449 * to extend a BININT's sign bit to the full width. 3450 */ 3451 if (x == 4 && l & (1L << 31)) 3452 l |= (~0L) << 32; 3339 3453 #endif 3340 3454 return l; 3341 3455 } 3342 3456 … … 3345 3459 load_binintx(Unpicklerobject *self, char *s, int x) 3346 3460 { 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3461 PyObject *py_int = 0; 3462 long l; 3463 3464 l = calc_binint(s, x); 3465 3466 if (!( py_int = PyInt_FromLong(l))) 3467 return -1; 3468 3469 PDATA_PUSH(self->stack, py_int, -1); 3470 return 0; 3357 3471 } 3358 3472 … … 3361 3475 load_binint(Unpicklerobject *self) 3362 3476 { 3363 3364 3365 3366 3367 3368 3477 char *s; 3478 3479 if (self->read_func(self, &s, 4) < 0) 3480 return -1; 3481 3482 return load_binintx(self, s, 4); 3369 3483 } 3370 3484 … … 3373 3487 load_binint1(Unpicklerobject *self) 3374 3488 { 3375 3376 3377 3378 3379 3380 3489 char *s; 3490 3491 if (self->read_func(self, &s, 1) < 0) 3492 return -1; 3493 3494 return load_binintx(self, s, 1); 3381 3495 } 3382 3496 … … 3385 3499 load_binint2(Unpicklerobject *self) 3386 3500 { 3387 3388 3389 3390 3391 3392 3501 char *s; 3502 3503 if (self->read_func(self, &s, 2) < 0) 3504 return -1; 3505 3506 return load_binintx(self, s, 2); 3393 3507 } 3394 3508 … … 3396 3510 load_long(Unpicklerobject *self) 3397 3511 { 3398 PyObject *l = 0; 3399 char *end, *s; 3400 int len, res = -1; 3401 3402 if ((len = self->readline_func(self, &s)) < 0) return -1; 3403 if (len < 2) return bad_readline(); 3404 if (!( s=pystrndup(s,len))) return -1; 3405 3406 if (!( l = PyLong_FromString(s, &end, 0))) 3407 goto finally; 3408 3409 free(s); 3410 PDATA_PUSH(self->stack, l, -1); 3411 return 0; 3512 PyObject *l = 0; 3513 char *end, *s; 3514 Py_ssize_t len; 3515 int res = -1; 3516 3517 if ((len = self->readline_func(self, &s)) < 0) return -1; 3518 if (len < 2) return bad_readline(); 3519 if (!( s=pystrndup(s,len))) return -1; 3520 3521 if (!( l = PyLong_FromString(s, &end, 0))) 3522 goto finally; 3523 3524 free(s); 3525 PDATA_PUSH(self->stack, l, -1); 3526 return 0; 3412 3527 3413 3528 finally: 3414 3415 3416 3529 free(s); 3530 3531 return res; 3417 3532 } 3418 3533 … … 3423 3538 load_counted_long(Unpicklerobject *self, int size) 3424 3539 { 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3540 Py_ssize_t i; 3541 char *nbytes; 3542 unsigned char *pdata; 3543 PyObject *along; 3544 3545 assert(size == 1 || size == 4); 3546 i = self->read_func(self, &nbytes, size); 3547 if (i < 0) return -1; 3548 3549 size = calc_binint(nbytes, size); 3550 if (size < 0) { 3551 /* Corrupt or hostile pickle -- we never write one like 3552 * this. 3553 */ 3554 PyErr_SetString(UnpicklingError, "LONG pickle has negative " 3555 "byte count"); 3556 return -1; 3557 } 3558 3559 if (size == 0) 3560 along = PyLong_FromLong(0L); 3561 else { 3562 /* Read the raw little-endian bytes & convert. */ 3563 i = self->read_func(self, (char **)&pdata, size); 3564 if (i < 0) return -1; 3565 along = _PyLong_FromByteArray(pdata, (size_t)size, 3566 1 /* little endian */, 1 /* signed */); 3567 } 3568 if (along == NULL) 3569 return -1; 3570 PDATA_PUSH(self->stack, along, -1); 3571 return 0; 3457 3572 } 3458 3573 … … 3460 3575 load_float(Unpicklerobject *self) 3461 3576 { 3462 PyObject *py_float = 0; 3463 char *endptr, *s; 3464 int len, res = -1; 3465 double d; 3466 3467 if ((len = self->readline_func(self, &s)) < 0) return -1; 3468 if (len < 2) return bad_readline(); 3469 if (!( s=pystrndup(s,len))) return -1; 3470 3471 errno = 0; 3472 d = PyOS_ascii_strtod(s, &endptr); 3473 3474 if ((errno == ERANGE && !(fabs(d) <= 1.0)) || 3475 (endptr[0] != '\n') || (endptr[1] != '\0')) { 3476 PyErr_SetString(PyExc_ValueError, 3477 "could not convert string to float"); 3478 goto finally; 3479 } 3480 3481 if (!( py_float = PyFloat_FromDouble(d))) 3482 goto finally; 3483 3484 free(s); 3485 PDATA_PUSH(self->stack, py_float, -1); 3486 return 0; 3577 PyObject *py_float = 0; 3578 char *endptr, *s; 3579 Py_ssize_t len; 3580 int res = -1; 3581 double d; 3582 3583 if ((len = self->readline_func(self, &s)) < 0) return -1; 3584 if (len < 2) return bad_readline(); 3585 if (!( s=pystrndup(s,len))) return -1; 3586 3587 d = PyOS_string_to_double(s, &endptr, PyExc_OverflowError); 3588 3589 if (d == -1.0 && PyErr_Occurred()) { 3590 goto finally; 3591 } else if ((endptr[0] != '\n') || (endptr[1] != '\0')) { 3592 PyErr_SetString(PyExc_ValueError, 3593 "could not convert string to float"); 3594 goto finally; 3595 } 3596 3597 if (!( py_float = PyFloat_FromDouble(d))) 3598 goto finally; 3599 3600 free(s); 3601 PDATA_PUSH(self->stack, py_float, -1); 3602 return 0; 3487 3603 3488 3604 finally: 3489 3490 3491 3605 free(s); 3606 3607 return res; 3492 3608 } 3493 3609 … … 3495 3611 load_binfloat(Unpicklerobject *self) 3496 3612 { 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3613 PyObject *py_float; 3614 double x; 3615 char *p; 3616 3617 if (self->read_func(self, &p, 8) < 0) 3618 return -1; 3619 3620 x = _PyFloat_Unpack8((unsigned char *)p, 0); 3621 if (x == -1.0 && PyErr_Occurred()) 3622 return -1; 3623 3624 py_float = PyFloat_FromDouble(x); 3625 if (py_float == NULL) 3626 return -1; 3627 3628 PDATA_PUSH(self->stack, py_float, -1); 3629 return 0; 3514 3630 } 3515 3631 … … 3517 3633 load_string(Unpicklerobject *self) 3518 3634 { 3519 PyObject *str = 0; 3520 int len, res = -1; 3521 char *s, *p; 3522 3523 if ((len = self->readline_func(self, &s)) < 0) return -1; 3524 if (len < 2) return bad_readline(); 3525 if (!( s=pystrndup(s,len))) return -1; 3526 3527 3528 /* Strip outermost quotes */ 3529 while (s[len-1] <= ' ') 3530 len--; 3531 if(s[0]=='"' && s[len-1]=='"'){ 3532 s[len-1] = '\0'; 3533 p = s + 1 ; 3534 len -= 2; 3535 } else if(s[0]=='\'' && s[len-1]=='\''){ 3536 s[len-1] = '\0'; 3537 p = s + 1 ; 3538 len -= 2; 3539 } else 3540 goto insecure; 3541 /********************************************/ 3542 3543 str = PyString_DecodeEscape(p, len, NULL, 0, NULL); 3544 free(s); 3545 if (str) { 3546 PDATA_PUSH(self->stack, str, -1); 3547 res = 0; 3548 } 3549 return res; 3635 PyObject *str = 0; 3636 Py_ssize_t len; 3637 int res = -1; 3638 char *s, *p; 3639 3640 if ((len = self->readline_func(self, &s)) < 0) return -1; 3641 if (len < 2) return bad_readline(); 3642 if (!( s=pystrndup(s,len))) return -1; 3643 3644 3645 /* Strip outermost quotes */ 3646 while (len > 0 && s[len-1] <= ' ') 3647 len--; 3648 if (len > 1 && s[0]=='"' && s[len-1]=='"') { 3649 s[len-1] = '\0'; 3650 p = s + 1 ; 3651 len -= 2; 3652 } 3653 else if (len > 1 && s[0]=='\'' && s[len-1]=='\'') { 3654 s[len-1] = '\0'; 3655 p = s + 1 ; 3656 len -= 2; 3657 } 3658 else 3659 goto insecure; 3660 /********************************************/ 3661 3662 str = PyString_DecodeEscape(p, len, NULL, 0, NULL); 3663 free(s); 3664 if (str) { 3665 PDATA_PUSH(self->stack, str, -1); 3666 res = 0; 3667 } 3668 return res; 3550 3669 3551 3670 insecure: 3552 3553 3554 3671 free(s); 3672 PyErr_SetString(PyExc_ValueError,"insecure string pickle"); 3673 return -1; 3555 3674 } 3556 3675 … … 3559 3678 load_binstring(Unpicklerobject *self) 3560 3679 { 3561 3562 longl;3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3680 PyObject *py_string = 0; 3681 Py_ssize_t l; 3682 char *s; 3683 3684 if (self->read_func(self, &s, 4) < 0) return -1; 3685 3686 l = calc_binint(s, 4); 3687 if (l < 0) { 3688 /* Corrupt or hostile pickle -- we never write one like 3689 * this. 3690 */ 3691 PyErr_SetString(UnpicklingError, 3692 "BINSTRING pickle has negative byte count"); 3693 return -1; 3694 } 3695 3696 if (self->read_func(self, &s, l) < 0) 3697 return -1; 3698 3699 if (!( py_string = PyString_FromStringAndSize(s, l))) 3700 return -1; 3701 3702 PDATA_PUSH(self->stack, py_string, -1); 3703 return 0; 3585 3704 } 3586 3705 … … 3589 3708 load_short_binstring(Unpicklerobject *self) 3590 3709 { 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3710 PyObject *py_string = 0; 3711 unsigned char l; 3712 char *s; 3713 3714 if (self->read_func(self, &s, 1) < 0) 3715 return -1; 3716 3717 l = (unsigned char)s[0]; 3718 3719 if (self->read_func(self, &s, l) < 0) return -1; 3720 3721 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1; 3722 3723 PDATA_PUSH(self->stack, py_string, -1); 3724 return 0; 3606 3725 } 3607 3726 … … 3611 3730 load_unicode(Unpicklerobject *self) 3612 3731 { 3613 PyObject *str = 0; 3614 int len, res = -1; 3615 char *s; 3616 3617 if ((len = self->readline_func(self, &s)) < 0) return -1; 3618 if (len < 1) return bad_readline(); 3619 3620 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL))) 3621 goto finally; 3622 3623 PDATA_PUSH(self->stack, str, -1); 3624 return 0; 3625 3626 finally: 3627 return res; 3732 PyObject *str = 0; 3733 Py_ssize_t len; 3734 char *s; 3735 3736 if ((len = self->readline_func(self, &s)) < 0) return -1; 3737 if (len < 1) return bad_readline(); 3738 3739 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL))) 3740 return -1; 3741 3742 PDATA_PUSH(self->stack, str, -1); 3743 return 0; 3628 3744 } 3629 3745 #endif … … 3634 3750 load_binunicode(Unpicklerobject *self) 3635 3751 { 3636 3637 longl;3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3752 PyObject *unicode; 3753 Py_ssize_t l; 3754 char *s; 3755 3756 if (self->read_func(self, &s, 4) < 0) return -1; 3757 3758 l = calc_binint(s, 4); 3759 if (l < 0) { 3760 /* Corrupt or hostile pickle -- we never write one like 3761 * this. 3762 */ 3763 PyErr_SetString(UnpicklingError, 3764 "BINUNICODE pickle has negative byte count"); 3765 return -1; 3766 } 3767 3768 if (self->read_func(self, &s, l) < 0) 3769 return -1; 3770 3771 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL))) 3772 return -1; 3773 3774 PDATA_PUSH(self->stack, unicode, -1); 3775 return 0; 3660 3776 } 3661 3777 #endif … … 3665 3781 load_tuple(Unpicklerobject *self) 3666 3782 { 3667 3668 int i;3669 3670 3671 3672 3673 3783 PyObject *tup; 3784 Py_ssize_t i; 3785 3786 if ((i = marker(self)) < 0) return -1; 3787 if (!( tup=Pdata_popTuple(self->stack, i))) return -1; 3788 PDATA_PUSH(self->stack, tup, -1); 3789 return 0; 3674 3790 } 3675 3791 … … 3677 3793 load_counted_tuple(Unpicklerobject *self, int len) 3678 3794 { 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3795 PyObject *tup = PyTuple_New(len); 3796 3797 if (tup == NULL) 3798 return -1; 3799 3800 while (--len >= 0) { 3801 PyObject *element; 3802 3803 PDATA_POP(self->stack, element); 3804 if (element == NULL) 3805 return -1; 3806 PyTuple_SET_ITEM(tup, len, element); 3807 } 3808 PDATA_PUSH(self->stack, tup, -1); 3809 return 0; 3694 3810 } 3695 3811 … … 3697 3813 load_empty_list(Unpicklerobject *self) 3698 3814 { 3699 3700 3701 3702 3703 3815 PyObject *list; 3816 3817 if (!( list=PyList_New(0))) return -1; 3818 PDATA_PUSH(self->stack, list, -1); 3819 return 0; 3704 3820 } 3705 3821 … … 3707 3823 load_empty_dict(Unpicklerobject *self) 3708 3824 { 3709 3710 3711 3712 3713 3825 PyObject *dict; 3826 3827 if (!( dict=PyDict_New())) return -1; 3828 PDATA_PUSH(self->stack, dict, -1); 3829 return 0; 3714 3830 } 3715 3831 … … 3718 3834 load_list(Unpicklerobject *self) 3719 3835 { 3720 3721 int i;3722 3723 3724 3725 3726 3836 PyObject *list = 0; 3837 Py_ssize_t i; 3838 3839 if ((i = marker(self)) < 0) return -1; 3840 if (!( list=Pdata_popList(self->stack, i))) return -1; 3841 PDATA_PUSH(self->stack, list, -1); 3842 return 0; 3727 3843 } 3728 3844 … … 3730 3846 load_dict(Unpicklerobject *self) 3731 3847 { 3732 3733 int i, j, k;3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3848 PyObject *dict, *key, *value; 3849 Py_ssize_t i, j, k; 3850 3851 if ((i = marker(self)) < 0) return -1; 3852 j=self->stack->length; 3853 3854 if (!( dict = PyDict_New())) return -1; 3855 3856 for (k = i+1; k < j; k += 2) { 3857 key =self->stack->data[k-1]; 3858 value=self->stack->data[k ]; 3859 if (PyDict_SetItem(dict, key, value) < 0) { 3860 Py_DECREF(dict); 3861 return -1; 3862 } 3863 } 3864 Pdata_clear(self->stack, i); 3865 PDATA_PUSH(self->stack, dict, -1); 3866 return 0; 3751 3867 } 3752 3868 … … 3754 3870 Instance_New(PyObject *cls, PyObject *args) 3755 3871 { 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3872 PyObject *r = 0; 3873 3874 if (PyClass_Check(cls)) { 3875 int l; 3876 3877 if ((l=PyObject_Size(args)) < 0) goto err; 3878 if (!( l )) { 3879 PyObject *__getinitargs__; 3880 3881 __getinitargs__ = PyObject_GetAttr(cls, 3882 __getinitargs___str); 3883 if (!__getinitargs__) { 3884 /* We have a class with no __getinitargs__, 3885 so bypass usual construction */ 3886 PyObject *inst; 3887 3888 PyErr_Clear(); 3889 if (!( inst=PyInstance_NewRaw(cls, NULL))) 3890 goto err; 3891 return inst; 3892 } 3893 Py_DECREF(__getinitargs__); 3894 } 3895 3896 if ((r=PyInstance_New(cls, args, NULL))) return r; 3897 else goto err; 3898 } 3899 3900 if ((r=PyObject_CallObject(cls, args))) return r; 3785 3901 3786 3902 err: 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3903 { 3904 PyObject *tp, *v, *tb, *tmp_value; 3905 3906 PyErr_Fetch(&tp, &v, &tb); 3907 tmp_value = v; 3908 /* NULL occurs when there was a KeyboardInterrupt */ 3909 if (tmp_value == NULL) 3910 tmp_value = Py_None; 3911 if ((r = PyTuple_Pack(3, tmp_value, cls, args))) { 3912 Py_XDECREF(v); 3913 v=r; 3914 } 3915 PyErr_Restore(tp,v,tb); 3916 } 3917 return NULL; 3802 3918 } 3803 3919 … … 3806 3922 load_obj(Unpicklerobject *self) 3807 3923 { 3808 3809 int i;3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3924 PyObject *class, *tup, *obj=0; 3925 Py_ssize_t i; 3926 3927 if ((i = marker(self)) < 0) return -1; 3928 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1; 3929 PDATA_POP(self->stack, class); 3930 if (class) { 3931 obj = Instance_New(class, tup); 3932 Py_DECREF(class); 3933 } 3934 Py_DECREF(tup); 3935 3936 if (! obj) return -1; 3937 PDATA_PUSH(self->stack, obj, -1); 3938 return 0; 3823 3939 } 3824 3940 … … 3827 3943 load_inst(Unpicklerobject *self) 3828 3944 { 3829 3830 int i, len;3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3945 PyObject *tup, *class=0, *obj=0, *module_name, *class_name; 3946 Py_ssize_t i, len; 3947 char *s; 3948 3949 if ((i = marker(self)) < 0) return -1; 3950 3951 if ((len = self->readline_func(self, &s)) < 0) return -1; 3952 if (len < 2) return bad_readline(); 3953 module_name = PyString_FromStringAndSize(s, len - 1); 3954 if (!module_name) return -1; 3955 3956 if ((len = self->readline_func(self, &s)) >= 0) { 3957 if (len < 2) return bad_readline(); 3958 if ((class_name = PyString_FromStringAndSize(s, len - 1))) { 3959 class = find_class(module_name, class_name, 3960 self->find_class); 3961 Py_DECREF(class_name); 3962 } 3963 } 3964 Py_DECREF(module_name); 3965 3966 if (! class) return -1; 3967 3968 if ((tup=Pdata_popTuple(self->stack, i))) { 3969 obj = Instance_New(class, tup); 3970 Py_DECREF(tup); 3971 } 3972 Py_DECREF(class); 3973 3974 if (! obj) return -1; 3975 3976 PDATA_PUSH(self->stack, obj, -1); 3977 return 0; 3862 3978 } 3863 3979 … … 3865 3981 load_newobj(Unpicklerobject *self) 3866 3982 { 3867 3868 3869 PyTypeObject *cls;/* clsraw cast to its true type */3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3983 PyObject *args = NULL; 3984 PyObject *clsraw = NULL; 3985 PyTypeObject *cls; /* clsraw cast to its true type */ 3986 PyObject *obj; 3987 3988 /* Stack is ... cls argtuple, and we want to call 3989 * cls.__new__(cls, *argtuple). 3990 */ 3991 PDATA_POP(self->stack, args); 3992 if (args == NULL) goto Fail; 3993 if (! PyTuple_Check(args)) { 3994 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg " 3995 "tuple."); 3996 goto Fail; 3997 } 3998 3999 PDATA_POP(self->stack, clsraw); 4000 cls = (PyTypeObject *)clsraw; 4001 if (cls == NULL) goto Fail; 4002 if (! PyType_Check(cls)) { 4003 PyErr_SetString(UnpicklingError, "NEWOBJ class argument " 4004 "isn't a type object"); 4005 goto Fail; 4006 } 4007 if (cls->tp_new == NULL) { 4008 PyErr_SetString(UnpicklingError, "NEWOBJ class argument " 4009 "has NULL tp_new"); 4010 goto Fail; 4011 } 4012 4013 /* Call __new__. */ 4014 obj = cls->tp_new(cls, args, NULL); 4015 if (obj == NULL) goto Fail; 4016 4017 Py_DECREF(args); 4018 Py_DECREF(clsraw); 4019 PDATA_PUSH(self->stack, obj, -1); 4020 return 0; 3905 4021 3906 4022 Fail: 3907 3908 3909 4023 Py_XDECREF(args); 4024 Py_XDECREF(clsraw); 4025 return -1; 3910 4026 } 3911 4027 … … 3913 4029 load_global(Unpicklerobject *self) 3914 4030 { 3915 3916 int len;3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 4031 PyObject *class = 0, *module_name = 0, *class_name = 0; 4032 Py_ssize_t len; 4033 char *s; 4034 4035 if ((len = self->readline_func(self, &s)) < 0) return -1; 4036 if (len < 2) return bad_readline(); 4037 module_name = PyString_FromStringAndSize(s, len - 1); 4038 if (!module_name) return -1; 4039 4040 if ((len = self->readline_func(self, &s)) >= 0) { 4041 if (len < 2) { 4042 Py_DECREF(module_name); 4043 return bad_readline(); 4044 } 4045 if ((class_name = PyString_FromStringAndSize(s, len - 1))) { 4046 class = find_class(module_name, class_name, 4047 self->find_class); 4048 Py_DECREF(class_name); 4049 } 4050 } 4051 Py_DECREF(module_name); 4052 4053 if (! class) return -1; 4054 PDATA_PUSH(self->stack, class, -1); 4055 return 0; 3940 4056 } 3941 4057 … … 3944 4060 load_persid(Unpicklerobject *self) 3945 4061 { 3946 3947 int len;3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 4062 PyObject *pid = 0; 4063 Py_ssize_t len; 4064 char *s; 4065 4066 if (self->pers_func) { 4067 if ((len = self->readline_func(self, &s)) < 0) return -1; 4068 if (len < 2) return bad_readline(); 4069 4070 pid = PyString_FromStringAndSize(s, len - 1); 4071 if (!pid) return -1; 4072 4073 if (PyList_Check(self->pers_func)) { 4074 if (PyList_Append(self->pers_func, pid) < 0) { 4075 Py_DECREF(pid); 4076 return -1; 4077 } 4078 } 4079 else { 4080 ARG_TUP(self, pid); 4081 if (self->arg) { 4082 pid = PyObject_Call(self->pers_func, self->arg, 4083 NULL); 4084 FREE_ARG_TUP(self); 4085 } 4086 } 4087 4088 if (! pid) return -1; 4089 4090 PDATA_PUSH(self->stack, pid, -1); 4091 return 0; 4092 } 4093 else { 4094 PyErr_SetString(UnpicklingError, 4095 "A load persistent id instruction was encountered,\n" 4096 "but no persistent_load function was specified."); 4097 return -1; 4098 } 3983 4099 } 3984 4100 … … 3986 4102 load_binpersid(Unpicklerobject *self) 3987 4103 { 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4104 PyObject *pid = 0; 4105 4106 if (self->pers_func) { 4107 PDATA_POP(self->stack, pid); 4108 if (! pid) return -1; 4109 4110 if (PyList_Check(self->pers_func)) { 4111 if (PyList_Append(self->pers_func, pid) < 0) { 4112 Py_DECREF(pid); 4113 return -1; 4114 } 4115 } 4116 else { 4117 ARG_TUP(self, pid); 4118 if (self->arg) { 4119 pid = PyObject_Call(self->pers_func, self->arg, 4120 NULL); 4121 FREE_ARG_TUP(self); 4122 } 4123 if (! pid) return -1; 4124 } 4125 4126 PDATA_PUSH(self->stack, pid, -1); 4127 return 0; 4128 } 4129 else { 4130 PyErr_SetString(UnpicklingError, 4131 "A load persistent id instruction was encountered,\n" 4132 "but no persistent_load function was specified."); 4133 return -1; 4134 } 4019 4135 } 4020 4136 … … 4023 4139 load_pop(Unpicklerobject *self) 4024 4140 { 4025 int len = self->stack->length;4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4141 Py_ssize_t len = self->stack->length; 4142 4143 /* Note that we split the (pickle.py) stack into two stacks, 4144 an object stack and a mark stack. We have to be clever and 4145 pop the right one. We do this by looking at the top of the 4146 mark stack first, and only signalling a stack underflow if 4147 the object stack is empty and the mark stack doesn't match 4148 our expectations. 4149 */ 4150 if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) { 4151 self->num_marks--; 4152 } else if (len > 0) { 4153 len--; 4154 Py_DECREF(self->stack->data[len]); 4155 self->stack->length = len; 4156 } else { 4157 return stackUnderflow(); 4158 } 4159 return 0; 4044 4160 } 4045 4161 … … 4048 4164 load_pop_mark(Unpicklerobject *self) 4049 4165 { 4050 int i;4051 4052 4053 4054 4055 4056 4057 4166 Py_ssize_t i; 4167 4168 if ((i = marker(self)) < 0) 4169 return -1; 4170 4171 Pdata_clear(self->stack, i); 4172 4173 return 0; 4058 4174 } 4059 4175 … … 4062 4178 load_dup(Unpicklerobject *self) 4063 4179 { 4064 4065 int len;4066 4067 4068 4069 4070 4071 4180 PyObject *last; 4181 Py_ssize_t len; 4182 4183 if ((len = self->stack->length) <= 0) return stackUnderflow(); 4184 last=self->stack->data[len-1]; 4185 Py_INCREF(last); 4186 PDATA_PUSH(self->stack, last, -1); 4187 return 0; 4072 4188 } 4073 4189 … … 4076 4192 load_get(Unpicklerobject *self) 4077 4193 { 4078 4079 int len;4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4194 PyObject *py_str = 0, *value = 0; 4195 Py_ssize_t len; 4196 char *s; 4197 int rc; 4198 4199 if ((len = self->readline_func(self, &s)) < 0) return -1; 4200 if (len < 2) return bad_readline(); 4201 4202 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1; 4203 4204 value = PyDict_GetItem(self->memo, py_str); 4205 if (! value) { 4206 PyErr_SetObject(BadPickleGet, py_str); 4207 rc = -1; 4208 } 4209 else { 4210 PDATA_APPEND(self->stack, value, -1); 4211 rc = 0; 4212 } 4213 4214 Py_DECREF(py_str); 4215 return rc; 4100 4216 } 4101 4217 … … 4104 4220 load_binget(Unpicklerobject *self) 4105 4221 { 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4222 PyObject *py_key = 0, *value = 0; 4223 unsigned char key; 4224 char *s; 4225 int rc; 4226 4227 if (self->read_func(self, &s, 1) < 0) return -1; 4228 4229 key = (unsigned char)s[0]; 4230 if (!( py_key = PyInt_FromLong((long)key))) return -1; 4231 4232 value = PyDict_GetItem(self->memo, py_key); 4233 if (! value) { 4234 PyErr_SetObject(BadPickleGet, py_key); 4235 rc = -1; 4236 } 4237 else { 4238 PDATA_APPEND(self->stack, value, -1); 4239 rc = 0; 4240 } 4241 4242 Py_DECREF(py_key); 4243 return rc; 4128 4244 } 4129 4245 … … 4132 4248 load_long_binget(Unpicklerobject *self) 4133 4249 { 4134 4135 4136 4137 longkey;4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4250 PyObject *py_key = 0, *value = 0; 4251 unsigned char c; 4252 char *s; 4253 Py_ssize_t key; 4254 int rc; 4255 4256 if (self->read_func(self, &s, 4) < 0) return -1; 4257 4258 c = (unsigned char)s[0]; 4259 key = (long)c; 4260 c = (unsigned char)s[1]; 4261 key |= (long)c << 8; 4262 c = (unsigned char)s[2]; 4263 key |= (long)c << 16; 4264 c = (unsigned char)s[3]; 4265 key |= (long)c << 24; 4266 4267 if (!( py_key = PyInt_FromLong((long)key))) return -1; 4268 4269 value = PyDict_GetItem(self->memo, py_key); 4270 if (! value) { 4271 PyErr_SetObject(BadPickleGet, py_key); 4272 rc = -1; 4273 } 4274 else { 4275 PDATA_APPEND(self->stack, value, -1); 4276 rc = 0; 4277 } 4278 4279 Py_DECREF(py_key); 4280 return rc; 4165 4281 } 4166 4282 … … 4171 4287 load_extension(Unpicklerobject *self, int nbytes) 4172 4288 { 4173 char *codebytes;/* the nbytes bytes after the opcode */4174 long code;/* calc_binint returns long */4175 PyObject *py_code;/* code as a Python int */4176 PyObject *obj;/* the object to push */4177 PyObject *pair;/* (module_name, class_name) */4178 4179 4180 4181 4182 4183 if (code <= 0) {/* note that 0 is forbidden */4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4289 char *codebytes; /* the nbytes bytes after the opcode */ 4290 long code; /* calc_binint returns long */ 4291 PyObject *py_code; /* code as a Python int */ 4292 PyObject *obj; /* the object to push */ 4293 PyObject *pair; /* (module_name, class_name) */ 4294 PyObject *module_name, *class_name; 4295 4296 assert(nbytes == 1 || nbytes == 2 || nbytes == 4); 4297 if (self->read_func(self, &codebytes, nbytes) < 0) return -1; 4298 code = calc_binint(codebytes, nbytes); 4299 if (code <= 0) { /* note that 0 is forbidden */ 4300 /* Corrupt or hostile pickle. */ 4301 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0"); 4302 return -1; 4303 } 4304 4305 /* Look for the code in the cache. */ 4306 py_code = PyInt_FromLong(code); 4307 if (py_code == NULL) return -1; 4308 obj = PyDict_GetItem(extension_cache, py_code); 4309 if (obj != NULL) { 4310 /* Bingo. */ 4311 Py_DECREF(py_code); 4312 PDATA_APPEND(self->stack, obj, -1); 4313 return 0; 4314 } 4315 4316 /* Look up the (module_name, class_name) pair. */ 4317 pair = PyDict_GetItem(inverted_registry, py_code); 4318 if (pair == NULL) { 4319 Py_DECREF(py_code); 4320 PyErr_Format(PyExc_ValueError, "unregistered extension " 4321 "code %ld", code); 4322 return -1; 4323 } 4324 /* Since the extension registry is manipulable via Python code, 4325 * confirm that pair is really a 2-tuple of strings. 4326 */ 4327 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 || 4328 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) || 4329 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) { 4330 Py_DECREF(py_code); 4331 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] " 4332 "isn't a 2-tuple of strings", code); 4333 return -1; 4334 } 4335 /* Load the object. */ 4336 obj = find_class(module_name, class_name, self->find_class); 4337 if (obj == NULL) { 4338 Py_DECREF(py_code); 4339 return -1; 4340 } 4341 /* Cache code -> obj. */ 4342 code = PyDict_SetItem(extension_cache, py_code, obj); 4343 Py_DECREF(py_code); 4344 if (code < 0) { 4345 Py_DECREF(obj); 4346 return -1; 4347 } 4348 PDATA_PUSH(self->stack, obj, -1); 4349 return 0; 4234 4350 } 4235 4351 … … 4237 4353 load_put(Unpicklerobject *self) 4238 4354 { 4239 4240 int len, l;4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4355 PyObject *py_str = 0, *value = 0; 4356 Py_ssize_t len, l; 4357 char *s; 4358 4359 if ((l = self->readline_func(self, &s)) < 0) return -1; 4360 if (l < 2) return bad_readline(); 4361 if (!( len=self->stack->length )) return stackUnderflow(); 4362 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1; 4363 value=self->stack->data[len-1]; 4364 l=PyDict_SetItem(self->memo, py_str, value); 4365 Py_DECREF(py_str); 4366 return l; 4251 4367 } 4252 4368 … … 4255 4371 load_binput(Unpicklerobject *self) 4256 4372 { 4257 4258 4259 4260 int len;4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4373 PyObject *py_key = 0, *value = 0; 4374 unsigned char key; 4375 char *s; 4376 Py_ssize_t len; 4377 4378 if (self->read_func(self, &s, 1) < 0) return -1; 4379 if (!( (len=self->stack->length) > 0 )) return stackUnderflow(); 4380 4381 key = (unsigned char)s[0]; 4382 4383 if (!( py_key = PyInt_FromLong((long)key))) return -1; 4384 value=self->stack->data[len-1]; 4385 len=PyDict_SetItem(self->memo, py_key, value); 4386 Py_DECREF(py_key); 4387 return len; 4272 4388 } 4273 4389 … … 4276 4392 load_long_binput(Unpicklerobject *self) 4277 4393 { 4278 4279 longkey;4280 4281 4282 int len;4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 } 4302 4303 4304 static int 4305 do_append(Unpicklerobject *self, int x)4306 { 4307 4308 int len, i;4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4394 PyObject *py_key = 0, *value = 0; 4395 Py_ssize_t key; 4396 unsigned char c; 4397 char *s; 4398 Py_ssize_t len; 4399 4400 if (self->read_func(self, &s, 4) < 0) return -1; 4401 if (!( len=self->stack->length )) return stackUnderflow(); 4402 4403 c = (unsigned char)s[0]; 4404 key = (long)c; 4405 c = (unsigned char)s[1]; 4406 key |= (long)c << 8; 4407 c = (unsigned char)s[2]; 4408 key |= (long)c << 16; 4409 c = (unsigned char)s[3]; 4410 key |= (long)c << 24; 4411 4412 if (!( py_key = PyInt_FromLong(key))) return -1; 4413 value=self->stack->data[len-1]; 4414 len=PyDict_SetItem(self->memo, py_key, value); 4415 Py_DECREF(py_key); 4416 return len; 4417 } 4418 4419 4420 static int 4421 do_append(Unpicklerobject *self, Py_ssize_t x) 4422 { 4423 PyObject *value = 0, *list = 0, *append_method = 0; 4424 Py_ssize_t len, i; 4425 4426 len=self->stack->length; 4427 if (!( len >= x && x > 0 )) return stackUnderflow(); 4428 /* nothing to do */ 4429 if (len==x) return 0; 4430 4431 list=self->stack->data[x-1]; 4432 4433 if (PyList_Check(list)) { 4434 PyObject *slice; 4435 int list_len; 4436 4437 slice=Pdata_popList(self->stack, x); 4438 if (! slice) return -1; 4439 list_len = PyList_GET_SIZE(list); 4440 i=PyList_SetSlice(list, list_len, list_len, slice); 4441 Py_DECREF(slice); 4442 return i; 4443 } 4444 else { 4445 4446 if (!( append_method = PyObject_GetAttr(list, append_str))) 4447 return -1; 4448 4449 for (i = x; i < len; i++) { 4450 PyObject *junk; 4451 4452 value=self->stack->data[i]; 4453 junk=0; 4454 ARG_TUP(self, value); 4455 if (self->arg) { 4456 junk = PyObject_Call(append_method, self->arg, 4457 NULL); 4458 FREE_ARG_TUP(self); 4459 } 4460 if (! junk) { 4461 Pdata_clear(self->stack, i+1); 4462 self->stack->length=x; 4463 Py_DECREF(append_method); 4464 return -1; 4465 } 4466 Py_DECREF(junk); 4467 } 4468 self->stack->length=x; 4469 Py_DECREF(append_method); 4470 } 4471 4472 return 0; 4357 4473 } 4358 4474 … … 4361 4477 load_append(Unpicklerobject *self) 4362 4478 { 4363 4479 return do_append(self, self->stack->length - 1); 4364 4480 } 4365 4481 … … 4368 4484 load_appends(Unpicklerobject *self) 4369 4485 { 4370 4371 } 4372 4373 4374 static int4375 do_setitems(Unpicklerobject *self, intx)4376 { 4377 4378 int len, i, r=0;4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4486 return do_append(self, marker(self)); 4487 } 4488 4489 4490 static Py_ssize_t 4491 do_setitems(Unpicklerobject *self, Py_ssize_t x) 4492 { 4493 PyObject *value = 0, *key = 0, *dict = 0; 4494 Py_ssize_t len, i, r=0; 4495 4496 if (!( (len=self->stack->length) >= x 4497 && x > 0 )) return stackUnderflow(); 4498 4499 dict=self->stack->data[x-1]; 4500 4501 for (i = x+1; i < len; i += 2) { 4502 key =self->stack->data[i-1]; 4503 value=self->stack->data[i ]; 4504 if (PyObject_SetItem(dict, key, value) < 0) { 4505 r=-1; 4506 break; 4507 } 4508 } 4509 4510 Pdata_clear(self->stack, x); 4511 4512 return r; 4397 4513 } 4398 4514 … … 4401 4517 load_setitem(Unpicklerobject *self) 4402 4518 { 4403 4519 return do_setitems(self, self->stack->length - 2); 4404 4520 } 4405 4521 … … 4407 4523 load_setitems(Unpicklerobject *self) 4408 4524 { 4409 4525 return do_setitems(self, marker(self)); 4410 4526 } 4411 4527 … … 4414 4530 load_build(Unpicklerobject *self) 4415 4531 { 4416 PyObject *state, *inst, *slotstate; 4417 PyObject *__setstate__; 4418 PyObject *d_key, *d_value; 4419 Py_ssize_t i; 4420 int res = -1; 4421 4422 /* Stack is ... instance, state. We want to leave instance at 4423 * the stack top, possibly mutated via instance.__setstate__(state). 4424 */ 4425 if (self->stack->length < 2) 4426 return stackUnderflow(); 4427 PDATA_POP(self->stack, state); 4428 if (state == NULL) 4429 return -1; 4430 inst = self->stack->data[self->stack->length - 1]; 4431 4432 __setstate__ = PyObject_GetAttr(inst, __setstate___str); 4433 if (__setstate__ != NULL) { 4434 PyObject *junk = NULL; 4435 4436 /* The explicit __setstate__ is responsible for everything. */ 4437 ARG_TUP(self, state); 4438 if (self->arg) { 4439 junk = PyObject_Call(__setstate__, self->arg, NULL); 4440 FREE_ARG_TUP(self); 4441 } 4442 Py_DECREF(__setstate__); 4443 if (junk == NULL) 4444 return -1; 4445 Py_DECREF(junk); 4446 return 0; 4447 } 4448 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) 4449 return -1; 4450 PyErr_Clear(); 4451 4452 /* A default __setstate__. First see whether state embeds a 4453 * slot state dict too (a proto 2 addition). 4454 */ 4455 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) { 4456 PyObject *temp = state; 4457 state = PyTuple_GET_ITEM(temp, 0); 4458 slotstate = PyTuple_GET_ITEM(temp, 1); 4459 Py_INCREF(state); 4460 Py_INCREF(slotstate); 4461 Py_DECREF(temp); 4462 } 4463 else 4464 slotstate = NULL; 4465 4466 /* Set inst.__dict__ from the state dict (if any). */ 4467 if (state != Py_None) { 4468 PyObject *dict; 4469 if (! PyDict_Check(state)) { 4470 PyErr_SetString(UnpicklingError, "state is not a " 4471 "dictionary"); 4472 goto finally; 4473 } 4474 dict = PyObject_GetAttr(inst, __dict___str); 4475 if (dict == NULL) 4476 goto finally; 4477 4478 i = 0; 4479 while (PyDict_Next(state, &i, &d_key, &d_value)) { 4480 if (PyObject_SetItem(dict, d_key, d_value) < 0) 4481 goto finally; 4482 } 4483 Py_DECREF(dict); 4484 } 4485 4486 /* Also set instance attributes from the slotstate dict (if any). */ 4487 if (slotstate != NULL) { 4488 if (! PyDict_Check(slotstate)) { 4489 PyErr_SetString(UnpicklingError, "slot state is not " 4490 "a dictionary"); 4491 goto finally; 4492 } 4493 i = 0; 4494 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) { 4495 if (PyObject_SetAttr(inst, d_key, d_value) < 0) 4496 goto finally; 4497 } 4498 } 4499 res = 0; 4532 PyObject *state, *inst, *slotstate; 4533 PyObject *__setstate__; 4534 PyObject *d_key, *d_value; 4535 int res = -1; 4536 Py_ssize_t i; 4537 4538 /* Stack is ... instance, state. We want to leave instance at 4539 * the stack top, possibly mutated via instance.__setstate__(state). 4540 */ 4541 if (self->stack->length < 2) 4542 return stackUnderflow(); 4543 PDATA_POP(self->stack, state); 4544 if (state == NULL) 4545 return -1; 4546 inst = self->stack->data[self->stack->length - 1]; 4547 4548 __setstate__ = PyObject_GetAttr(inst, __setstate___str); 4549 if (__setstate__ != NULL) { 4550 PyObject *junk = NULL; 4551 4552 /* The explicit __setstate__ is responsible for everything. */ 4553 ARG_TUP(self, state); 4554 if (self->arg) { 4555 junk = PyObject_Call(__setstate__, self->arg, NULL); 4556 FREE_ARG_TUP(self); 4557 } 4558 Py_DECREF(__setstate__); 4559 if (junk == NULL) 4560 return -1; 4561 Py_DECREF(junk); 4562 return 0; 4563 } 4564 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) 4565 return -1; 4566 PyErr_Clear(); 4567 4568 /* A default __setstate__. First see whether state embeds a 4569 * slot state dict too (a proto 2 addition). 4570 */ 4571 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) { 4572 PyObject *temp = state; 4573 state = PyTuple_GET_ITEM(temp, 0); 4574 slotstate = PyTuple_GET_ITEM(temp, 1); 4575 Py_INCREF(state); 4576 Py_INCREF(slotstate); 4577 Py_DECREF(temp); 4578 } 4579 else 4580 slotstate = NULL; 4581 4582 /* Set inst.__dict__ from the state dict (if any). */ 4583 if (state != Py_None) { 4584 PyObject *dict; 4585 if (! PyDict_Check(state)) { 4586 PyErr_SetString(UnpicklingError, "state is not a " 4587 "dictionary"); 4588 goto finally; 4589 } 4590 dict = PyObject_GetAttr(inst, __dict___str); 4591 if (dict == NULL) 4592 goto finally; 4593 4594 i = 0; 4595 while (PyDict_Next(state, &i, &d_key, &d_value)) { 4596 /* normally the keys for instance attributes are 4597 interned. we should try to do that here. */ 4598 Py_INCREF(d_key); 4599 if (PyString_CheckExact(d_key)) 4600 PyString_InternInPlace(&d_key); 4601 if (PyObject_SetItem(dict, d_key, d_value) < 0) { 4602 Py_DECREF(d_key); 4603 goto finally; 4604 } 4605 Py_DECREF(d_key); 4606 } 4607 Py_DECREF(dict); 4608 } 4609 4610 /* Also set instance attributes from the slotstate dict (if any). */ 4611 if (slotstate != NULL) { 4612 if (! PyDict_Check(slotstate)) { 4613 PyErr_SetString(UnpicklingError, "slot state is not " 4614 "a dictionary"); 4615 goto finally; 4616 } 4617 i = 0; 4618 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) { 4619 if (PyObject_SetAttr(inst, d_key, d_value) < 0) 4620 goto finally; 4621 } 4622 } 4623 res = 0; 4500 4624 4501 4625 finally: 4502 4503 4504 4626 Py_DECREF(state); 4627 Py_XDECREF(slotstate); 4628 return res; 4505 4629 } 4506 4630 … … 4509 4633 load_mark(Unpicklerobject *self) 4510 4634 { 4511 int s;4512 4513 4514 4515 4516 4517 4518 4519 int *marks;4520 4521 4522 4523 marks=(int *)malloc(s * sizeof(int));4524 4525 marks=(int *)realloc(self->marks,4526 s * sizeof(int));4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4635 Py_ssize_t s; 4636 4637 /* Note that we split the (pickle.py) stack into two stacks, an 4638 object stack and a mark stack. Here we push a mark onto the 4639 mark stack. 4640 */ 4641 4642 if ((self->num_marks + 1) >= self->marks_size) { 4643 Py_ssize_t *marks; 4644 s=self->marks_size+20; 4645 if (s <= self->num_marks) s=self->num_marks + 1; 4646 if (self->marks == NULL) 4647 marks=(Py_ssize_t *)malloc(s * sizeof(Py_ssize_t)); 4648 else 4649 marks=(Py_ssize_t *)realloc(self->marks, 4650 s * sizeof(Py_ssize_t)); 4651 if (!marks) { 4652 PyErr_NoMemory(); 4653 return -1; 4654 } 4655 self->marks = marks; 4656 self->marks_size = s; 4657 } 4658 4659 self->marks[self->num_marks++] = self->stack->length; 4660 4661 return 0; 4538 4662 } 4539 4663 … … 4541 4665 load_reduce(Unpicklerobject *self) 4542 4666 { 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4667 PyObject *callable = 0, *arg_tup = 0, *ob = 0; 4668 4669 PDATA_POP(self->stack, arg_tup); 4670 if (! arg_tup) return -1; 4671 PDATA_POP(self->stack, callable); 4672 if (callable) { 4673 ob = Instance_New(callable, arg_tup); 4674 Py_DECREF(callable); 4675 } 4676 Py_DECREF(arg_tup); 4677 4678 if (! ob) return -1; 4679 4680 PDATA_PUSH(self->stack, ob, -1); 4681 return 0; 4558 4682 } 4559 4683 … … 4564 4688 load_proto(Unpicklerobject *self) 4565 4689 { 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4690 int i; 4691 char *protobyte; 4692 4693 i = self->read_func(self, &protobyte, 1); 4694 if (i < 0) 4695 return -1; 4696 4697 i = calc_binint(protobyte, 1); 4698 /* No point checking for < 0, since calc_binint returns an unsigned 4699 * int when chewing on 1 byte. 4700 */ 4701 assert(i >= 0); 4702 if (i <= HIGHEST_PROTOCOL) 4703 return 0; 4704 4705 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i); 4706 return -1; 4583 4707 } 4584 4708 … … 4586 4710 load(Unpicklerobject *self) 4587 4711 { 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4712 PyObject *err = 0, *val = 0; 4713 char *s; 4714 4715 self->num_marks = 0; 4716 if (self->stack->length) Pdata_clear(self->stack, 0); 4717 4718 while (1) { 4719 if (self->read_func(self, &s, 1) < 0) 4720 break; 4721 4722 switch (s[0]) { 4723 case NONE: 4724 if (load_none(self) < 0) 4725 break; 4726 continue; 4727 4728 case BININT: 4729 if (load_binint(self) < 0) 4730 break; 4731 continue; 4732 4733 case BININT1: 4734 if (load_binint1(self) < 0) 4735 break; 4736 continue; 4737 4738 case BININT2: 4739 if (load_binint2(self) < 0) 4740 break; 4741 continue; 4742 4743 case INT: 4744 if (load_int(self) < 0) 4745 break; 4746 continue; 4747 4748 case LONG: 4749 if (load_long(self) < 0) 4750 break; 4751 continue; 4752 4753 case LONG1: 4754 if (load_counted_long(self, 1) < 0) 4755 break; 4756 continue; 4757 4758 case LONG4: 4759 if (load_counted_long(self, 4) < 0) 4760 break; 4761 continue; 4762 4763 case FLOAT: 4764 if (load_float(self) < 0) 4765 break; 4766 continue; 4767 4768 case BINFLOAT: 4769 if (load_binfloat(self) < 0) 4770 break; 4771 continue; 4772 4773 case BINSTRING: 4774 if (load_binstring(self) < 0) 4775 break; 4776 continue; 4777 4778 case SHORT_BINSTRING: 4779 if (load_short_binstring(self) < 0) 4780 break; 4781 continue; 4782 4783 case STRING: 4784 if (load_string(self) < 0) 4785 break; 4786 continue; 4663 4787 4664 4788 #ifdef Py_USING_UNICODE 4665 4666 4667 4668 4669 4670 4671 4672 4673 4789 case UNICODE: 4790 if (load_unicode(self) < 0) 4791 break; 4792 continue; 4793 4794 case BINUNICODE: 4795 if (load_binunicode(self) < 0) 4796 break; 4797 continue; 4674 4798 #endif 4675 4799 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4800 case EMPTY_TUPLE: 4801 if (load_counted_tuple(self, 0) < 0) 4802 break; 4803 continue; 4804 4805 case TUPLE1: 4806 if (load_counted_tuple(self, 1) < 0) 4807 break; 4808 continue; 4809 4810 case TUPLE2: 4811 if (load_counted_tuple(self, 2) < 0) 4812 break; 4813 continue; 4814 4815 case TUPLE3: 4816 if (load_counted_tuple(self, 3) < 0) 4817 break; 4818 continue; 4819 4820 case TUPLE: 4821 if (load_tuple(self) < 0) 4822 break; 4823 continue; 4824 4825 case EMPTY_LIST: 4826 if (load_empty_list(self) < 0) 4827 break; 4828 continue; 4829 4830 case LIST: 4831 if (load_list(self) < 0) 4832 break; 4833 continue; 4834 4835 case EMPTY_DICT: 4836 if (load_empty_dict(self) < 0) 4837 break; 4838 continue; 4839 4840 case DICT: 4841 if (load_dict(self) < 0) 4842 break; 4843 continue; 4844 4845 case OBJ: 4846 if (load_obj(self) < 0) 4847 break; 4848 continue; 4849 4850 case INST: 4851 if (load_inst(self) < 0) 4852 break; 4853 continue; 4854 4855 case NEWOBJ: 4856 if (load_newobj(self) < 0) 4857 break; 4858 continue; 4859 4860 case GLOBAL: 4861 if (load_global(self) < 0) 4862 break; 4863 continue; 4864 4865 case APPEND: 4866 if (load_append(self) < 0) 4867 break; 4868 continue; 4869 4870 case APPENDS: 4871 if (load_appends(self) < 0) 4872 break; 4873 continue; 4874 4875 case BUILD: 4876 if (load_build(self) < 0) 4877 break; 4878 continue; 4879 4880 case DUP: 4881 if (load_dup(self) < 0) 4882 break; 4883 continue; 4884 4885 case BINGET: 4886 if (load_binget(self) < 0) 4887 break; 4888 continue; 4889 4890 case LONG_BINGET: 4891 if (load_long_binget(self) < 0) 4892 break; 4893 continue; 4894 4895 case GET: 4896 if (load_get(self) < 0) 4897 break; 4898 continue; 4899 4900 case EXT1: 4901 if (load_extension(self, 1) < 0) 4902 break; 4903 continue; 4904 4905 case EXT2: 4906 if (load_extension(self, 2) < 0) 4907 break; 4908 continue; 4909 4910 case EXT4: 4911 if (load_extension(self, 4) < 0) 4912 break; 4913 continue; 4914 case MARK: 4915 if (load_mark(self) < 0) 4916 break; 4917 continue; 4918 4919 case BINPUT: 4920 if (load_binput(self) < 0) 4921 break; 4922 continue; 4923 4924 case LONG_BINPUT: 4925 if (load_long_binput(self) < 0) 4926 break; 4927 continue; 4928 4929 case PUT: 4930 if (load_put(self) < 0) 4931 break; 4932 continue; 4933 4934 case POP: 4935 if (load_pop(self) < 0) 4936 break; 4937 continue; 4938 4939 case POP_MARK: 4940 if (load_pop_mark(self) < 0) 4941 break; 4942 continue; 4943 4944 case SETITEM: 4945 if (load_setitem(self) < 0) 4946 break; 4947 continue; 4948 4949 case SETITEMS: 4950 if (load_setitems(self) < 0) 4951 break; 4952 continue; 4953 4954 case STOP: 4955 break; 4956 4957 case PERSID: 4958 if (load_persid(self) < 0) 4959 break; 4960 continue; 4961 4962 case BINPERSID: 4963 if (load_binpersid(self) < 0) 4964 break; 4965 continue; 4966 4967 case REDUCE: 4968 if (load_reduce(self) < 0) 4969 break; 4970 continue; 4971 4972 case PROTO: 4973 if (load_proto(self) < 0) 4974 break; 4975 continue; 4976 4977 case NEWTRUE: 4978 if (load_bool(self, Py_True) < 0) 4979 break; 4980 continue; 4981 4982 case NEWFALSE: 4983 if (load_bool(self, Py_False) < 0) 4984 break; 4985 continue; 4986 4987 case '\0': 4988 /* end of file */ 4989 PyErr_SetNone(PyExc_EOFError); 4990 break; 4991 4992 default: 4993 cPickle_ErrFormat(UnpicklingError, 4994 "invalid load key, '%s'.", 4995 "c", s[0]); 4996 return NULL; 4997 } 4998 4999 break; 5000 } 5001 5002 if ((err = PyErr_Occurred())) { 5003 if (err == PyExc_EOFError) { 5004 PyErr_SetNone(PyExc_EOFError); 5005 } 5006 return NULL; 5007 } 5008 5009 PDATA_POP(self->stack, val); 5010 return val; 4887 5011 } 4888 5012 … … 4894 5018 noload_obj(Unpicklerobject *self) 4895 5019 { 4896 int i;4897 4898 4899 5020 Py_ssize_t i; 5021 5022 if ((i = marker(self)) < 0) return -1; 5023 return Pdata_clear(self->stack, i+1); 4900 5024 } 4901 5025 … … 4904 5028 noload_inst(Unpicklerobject *self) 4905 5029 { 4906 int i;4907 4908 4909 4910 4911 4912 4913 4914 5030 Py_ssize_t i; 5031 char *s; 5032 5033 if ((i = marker(self)) < 0) return -1; 5034 Pdata_clear(self->stack, i); 5035 if (self->readline_func(self, &s) < 0) return -1; 5036 if (self->readline_func(self, &s) < 0) return -1; 5037 PDATA_APPEND(self->stack, Py_None, -1); 5038 return 0; 4915 5039 } 4916 5040 … … 4918 5042 noload_newobj(Unpicklerobject *self) 4919 5043 { 4920 4921 4922 PDATA_POP(self->stack, obj);/* pop argtuple */4923 4924 4925 4926 PDATA_POP(self->stack, obj);/* pop cls */4927 4928 4929 4930 4931 5044 PyObject *obj; 5045 5046 PDATA_POP(self->stack, obj); /* pop argtuple */ 5047 if (obj == NULL) return -1; 5048 Py_DECREF(obj); 5049 5050 PDATA_POP(self->stack, obj); /* pop cls */ 5051 if (obj == NULL) return -1; 5052 Py_DECREF(obj); 5053 5054 PDATA_APPEND(self->stack, Py_None, -1); 5055 return 0; 4932 5056 } 4933 5057 … … 4935 5059 noload_global(Unpicklerobject *self) 4936 5060 { 4937 4938 4939 4940 4941 4942 5061 char *s; 5062 5063 if (self->readline_func(self, &s) < 0) return -1; 5064 if (self->readline_func(self, &s) < 0) return -1; 5065 PDATA_APPEND(self->stack, Py_None,-1); 5066 return 0; 4943 5067 } 4944 5068 … … 4947 5071 { 4948 5072 4949 4950 4951 4952 5073 if (self->stack->length < 2) return stackUnderflow(); 5074 Pdata_clear(self->stack, self->stack->length-2); 5075 PDATA_APPEND(self->stack, Py_None,-1); 5076 return 0; 4953 5077 } 4954 5078 … … 4964 5088 noload_extension(Unpicklerobject *self, int nbytes) 4965 5089 { 4966 char *codebytes; 4967 4968 assert(nbytes == 1 || nbytes == 2 || nbytes == 4); 4969 if (self->read_func(self, &codebytes, nbytes) < 0) return -1; 4970 PDATA_APPEND(self->stack, Py_None, -1); 4971 return 0; 4972 } 4973 5090 char *codebytes; 5091 5092 assert(nbytes == 1 || nbytes == 2 || nbytes == 4); 5093 if (self->read_func(self, &codebytes, nbytes) < 0) return -1; 5094 PDATA_APPEND(self->stack, Py_None, -1); 5095 return 0; 5096 } 5097 5098 static int 5099 noload_append(Unpicklerobject *self) 5100 { 5101 return Pdata_clear(self->stack, self->stack->length - 1); 5102 } 5103 5104 static int 5105 noload_appends(Unpicklerobject *self) 5106 { 5107 Py_ssize_t i; 5108 if ((i = marker(self)) < 0) return -1; 5109 return Pdata_clear(self->stack, i); 5110 } 5111 5112 static int 5113 noload_setitem(Unpicklerobject *self) 5114 { 5115 return Pdata_clear(self->stack, self->stack->length - 2); 5116 } 5117 5118 static int 5119 noload_setitems(Unpicklerobject *self) 5120 { 5121 Py_ssize_t i; 5122 if ((i = marker(self)) < 0) return -1; 5123 return Pdata_clear(self->stack, i); 5124 } 4974 5125 4975 5126 static PyObject * 4976 5127 noload(Unpicklerobject *self) 4977 5128 { 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5129 PyObject *err = 0, *val = 0; 5130 char *s; 5131 5132 self->num_marks = 0; 5133 Pdata_clear(self->stack, 0); 5134 5135 while (1) { 5136 if (self->read_func(self, &s, 1) < 0) 5137 break; 5138 5139 switch (s[0]) { 5140 case NONE: 5141 if (load_none(self) < 0) 5142 break; 5143 continue; 5144 5145 case BININT: 5146 if (load_binint(self) < 0) 5147 break; 5148 continue; 5149 5150 case BININT1: 5151 if (load_binint1(self) < 0) 5152 break; 5153 continue; 5154 5155 case BININT2: 5156 if (load_binint2(self) < 0) 5157 break; 5158 continue; 5159 5160 case INT: 5161 if (load_int(self) < 0) 5162 break; 5163 continue; 5164 5165 case LONG: 5166 if (load_long(self) < 0) 5167 break; 5168 continue; 5169 5170 case LONG1: 5171 if (load_counted_long(self, 1) < 0) 5172 break; 5173 continue; 5174 5175 case LONG4: 5176 if (load_counted_long(self, 4) < 0) 5177 break; 5178 continue; 5179 5180 case FLOAT: 5181 if (load_float(self) < 0) 5182 break; 5183 continue; 5184 5185 case BINFLOAT: 5186 if (load_binfloat(self) < 0) 5187 break; 5188 continue; 5189 5190 case BINSTRING: 5191 if (load_binstring(self) < 0) 5192 break; 5193 continue; 5194 5195 case SHORT_BINSTRING: 5196 if (load_short_binstring(self) < 0) 5197 break; 5198 continue; 5199 5200 case STRING: 5201 if (load_string(self) < 0) 5202 break; 5203 continue; 5053 5204 5054 5205 #ifdef Py_USING_UNICODE 5055 5056 5057 5058 5059 5060 5061 5062 5063 5206 case UNICODE: 5207 if (load_unicode(self) < 0) 5208 break; 5209 continue; 5210 5211 case BINUNICODE: 5212 if (load_binunicode(self) < 0) 5213 break; 5214 continue; 5064 5215 #endif 5065 5216 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 if (load_append(self) < 0)5133 5134 5135 5136 5137 if (load_appends(self) < 0)5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 if (load_setitem(self) < 0)5213 5214 5215 5216 5217 if (load_setitems(self) < 0)5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5217 case EMPTY_TUPLE: 5218 if (load_counted_tuple(self, 0) < 0) 5219 break; 5220 continue; 5221 5222 case TUPLE1: 5223 if (load_counted_tuple(self, 1) < 0) 5224 break; 5225 continue; 5226 5227 case TUPLE2: 5228 if (load_counted_tuple(self, 2) < 0) 5229 break; 5230 continue; 5231 5232 case TUPLE3: 5233 if (load_counted_tuple(self, 3) < 0) 5234 break; 5235 continue; 5236 5237 case TUPLE: 5238 if (load_tuple(self) < 0) 5239 break; 5240 continue; 5241 5242 case EMPTY_LIST: 5243 if (load_empty_list(self) < 0) 5244 break; 5245 continue; 5246 5247 case LIST: 5248 if (load_list(self) < 0) 5249 break; 5250 continue; 5251 5252 case EMPTY_DICT: 5253 if (load_empty_dict(self) < 0) 5254 break; 5255 continue; 5256 5257 case DICT: 5258 if (load_dict(self) < 0) 5259 break; 5260 continue; 5261 5262 case OBJ: 5263 if (noload_obj(self) < 0) 5264 break; 5265 continue; 5266 5267 case INST: 5268 if (noload_inst(self) < 0) 5269 break; 5270 continue; 5271 5272 case NEWOBJ: 5273 if (noload_newobj(self) < 0) 5274 break; 5275 continue; 5276 5277 case GLOBAL: 5278 if (noload_global(self) < 0) 5279 break; 5280 continue; 5281 5282 case APPEND: 5283 if (noload_append(self) < 0) 5284 break; 5285 continue; 5286 5287 case APPENDS: 5288 if (noload_appends(self) < 0) 5289 break; 5290 continue; 5291 5292 case BUILD: 5293 if (noload_build(self) < 0) 5294 break; 5295 continue; 5296 5297 case DUP: 5298 if (load_dup(self) < 0) 5299 break; 5300 continue; 5301 5302 case BINGET: 5303 if (load_binget(self) < 0) 5304 break; 5305 continue; 5306 5307 case LONG_BINGET: 5308 if (load_long_binget(self) < 0) 5309 break; 5310 continue; 5311 5312 case GET: 5313 if (load_get(self) < 0) 5314 break; 5315 continue; 5316 5317 case EXT1: 5318 if (noload_extension(self, 1) < 0) 5319 break; 5320 continue; 5321 5322 case EXT2: 5323 if (noload_extension(self, 2) < 0) 5324 break; 5325 continue; 5326 5327 case EXT4: 5328 if (noload_extension(self, 4) < 0) 5329 break; 5330 continue; 5331 5332 case MARK: 5333 if (load_mark(self) < 0) 5334 break; 5335 continue; 5336 5337 case BINPUT: 5338 if (load_binput(self) < 0) 5339 break; 5340 continue; 5341 5342 case LONG_BINPUT: 5343 if (load_long_binput(self) < 0) 5344 break; 5345 continue; 5346 5347 case PUT: 5348 if (load_put(self) < 0) 5349 break; 5350 continue; 5351 5352 case POP: 5353 if (load_pop(self) < 0) 5354 break; 5355 continue; 5356 5357 case POP_MARK: 5358 if (load_pop_mark(self) < 0) 5359 break; 5360 continue; 5361 5362 case SETITEM: 5363 if (noload_setitem(self) < 0) 5364 break; 5365 continue; 5366 5367 case SETITEMS: 5368 if (noload_setitems(self) < 0) 5369 break; 5370 continue; 5371 5372 case STOP: 5373 break; 5374 5375 case PERSID: 5376 if (load_persid(self) < 0) 5377 break; 5378 continue; 5379 5380 case BINPERSID: 5381 if (load_binpersid(self) < 0) 5382 break; 5383 continue; 5384 5385 case REDUCE: 5386 if (noload_reduce(self) < 0) 5387 break; 5388 continue; 5389 5390 case PROTO: 5391 if (load_proto(self) < 0) 5392 break; 5393 continue; 5394 5395 case NEWTRUE: 5396 if (load_bool(self, Py_True) < 0) 5397 break; 5398 continue; 5399 5400 case NEWFALSE: 5401 if (load_bool(self, Py_False) < 0) 5402 break; 5403 continue; 5404 default: 5405 cPickle_ErrFormat(UnpicklingError, 5406 "invalid load key, '%s'.", 5407 "c", s[0]); 5408 return NULL; 5409 } 5410 5411 break; 5412 } 5413 5414 if ((err = PyErr_Occurred())) { 5415 if (err == PyExc_EOFError) { 5416 PyErr_SetNone(PyExc_EOFError); 5417 } 5418 return NULL; 5419 } 5420 5421 PDATA_POP(self->stack, val); 5422 return val; 5272 5423 } 5273 5424 … … 5276 5427 Unpickler_load(Unpicklerobject *self, PyObject *unused) 5277 5428 { 5278 5429 return load(self); 5279 5430 } 5280 5431 … … 5282 5433 Unpickler_noload(Unpicklerobject *self, PyObject *unused) 5283 5434 { 5284 5435 return noload(self); 5285 5436 } 5286 5437 … … 5306 5457 newUnpicklerobject(PyObject *f) 5307 5458 { 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5459 Unpicklerobject *self; 5460 5461 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype))) 5462 return NULL; 5463 5464 self->file = NULL; 5465 self->arg = NULL; 5466 self->stack = (Pdata*)Pdata_New(); 5467 self->pers_func = NULL; 5468 self->last_string = NULL; 5469 self->marks = NULL; 5470 self->num_marks = 0; 5471 self->marks_size = 0; 5472 self->buf_size = 0; 5473 self->read = NULL; 5474 self->readline = NULL; 5475 self->find_class = NULL; 5476 5477 if (!( self->memo = PyDict_New())) 5478 goto err; 5479 5480 if (!self->stack) 5481 goto err; 5482 5483 Py_INCREF(f); 5484 self->file = f; 5485 5486 /* Set read, readline based on type of f */ 5487 if (PyFile_Check(f)) { 5488 self->fp = PyFile_AsFile(f); 5489 if (self->fp == NULL) { 5490 PyErr_SetString(PyExc_ValueError, 5491 "I/O operation on closed file"); 5492 goto err; 5493 } 5494 self->read_func = read_file; 5495 self->readline_func = readline_file; 5496 } 5497 else if (PycStringIO_InputCheck(f)) { 5498 self->fp = NULL; 5499 self->read_func = read_cStringIO; 5500 self->readline_func = readline_cStringIO; 5501 } 5502 else { 5503 5504 self->fp = NULL; 5505 self->read_func = read_other; 5506 self->readline_func = readline_other; 5507 5508 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) && 5509 (self->read = PyObject_GetAttr(f, read_str)))) { 5510 PyErr_Clear(); 5511 PyErr_SetString( PyExc_TypeError, 5512 "argument must have 'read' and " 5513 "'readline' attributes" ); 5514 goto err; 5515 } 5516 } 5517 PyObject_GC_Track(self); 5518 5519 return self; 5369 5520 5370 5521 err: 5371 5372 5522 Py_DECREF((PyObject *)self); 5523 return NULL; 5373 5524 } 5374 5525 … … 5377 5528 get_Unpickler(PyObject *self, PyObject *file) 5378 5529 { 5379 5530 return (PyObject *)newUnpicklerobject(file); 5380 5531 } 5381 5532 … … 5384 5535 Unpickler_dealloc(Unpicklerobject *self) 5385 5536 { 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 5404 5405 5537 PyObject_GC_UnTrack((PyObject *)self); 5538 Py_XDECREF(self->readline); 5539 Py_XDECREF(self->read); 5540 Py_XDECREF(self->file); 5541 Py_XDECREF(self->memo); 5542 Py_XDECREF(self->stack); 5543 Py_XDECREF(self->pers_func); 5544 Py_XDECREF(self->arg); 5545 Py_XDECREF(self->last_string); 5546 Py_XDECREF(self->find_class); 5547 5548 if (self->marks) { 5549 free(self->marks); 5550 } 5551 5552 if (self->buf_size) { 5553 free(self->buf); 5554 } 5555 5556 Py_TYPE(self)->tp_free((PyObject *)self); 5406 5557 } 5407 5558 … … 5409 5560 Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg) 5410 5561 { 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5562 Py_VISIT(self->readline); 5563 Py_VISIT(self->read); 5564 Py_VISIT(self->file); 5565 Py_VISIT(self->memo); 5566 Py_VISIT(self->stack); 5567 Py_VISIT(self->pers_func); 5568 Py_VISIT(self->arg); 5569 Py_VISIT(self->last_string); 5570 Py_VISIT(self->find_class); 5571 return 0; 5421 5572 } 5422 5573 … … 5424 5575 Unpickler_clear(Unpicklerobject *self) 5425 5576 { 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435 5577 Py_CLEAR(self->readline); 5578 Py_CLEAR(self->read); 5579 Py_CLEAR(self->file); 5580 Py_CLEAR(self->memo); 5581 Py_CLEAR(self->stack); 5582 Py_CLEAR(self->pers_func); 5583 Py_CLEAR(self->arg); 5584 Py_CLEAR(self->last_string); 5585 Py_CLEAR(self->find_class); 5586 return 0; 5436 5587 } 5437 5588 … … 5439 5590 Unpickler_getattr(Unpicklerobject *self, char *name) 5440 5591 { 5441 5442 5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5592 if (!strcmp(name, "persistent_load")) { 5593 if (!self->pers_func) { 5594 PyErr_SetString(PyExc_AttributeError, name); 5595 return NULL; 5596 } 5597 5598 Py_INCREF(self->pers_func); 5599 return self->pers_func; 5600 } 5601 5602 if (!strcmp(name, "find_global")) { 5603 if (!self->find_class) { 5604 PyErr_SetString(PyExc_AttributeError, name); 5605 return NULL; 5606 } 5607 5608 Py_INCREF(self->find_class); 5609 return self->find_class; 5610 } 5611 5612 if (!strcmp(name, "memo")) { 5613 if (!self->memo) { 5614 PyErr_SetString(PyExc_AttributeError, name); 5615 return NULL; 5616 } 5617 5618 Py_INCREF(self->memo); 5619 return self->memo; 5620 } 5621 5622 if (!strcmp(name, "UnpicklingError")) { 5623 Py_INCREF(UnpicklingError); 5624 return UnpicklingError; 5625 } 5626 5627 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name); 5477 5628 } 5478 5629 … … 5482 5633 { 5483 5634 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5635 if (!strcmp(name, "persistent_load")) { 5636 Py_XDECREF(self->pers_func); 5637 self->pers_func = value; 5638 Py_XINCREF(value); 5639 return 0; 5640 } 5641 5642 if (!strcmp(name, "find_global")) { 5643 Py_XDECREF(self->find_class); 5644 self->find_class = value; 5645 Py_XINCREF(value); 5646 return 0; 5647 } 5648 5649 if (! value) { 5650 PyErr_SetString(PyExc_TypeError, 5651 "attribute deletion is not supported"); 5652 return -1; 5653 } 5654 5655 if (strcmp(name, "memo") == 0) { 5656 if (!PyDict_Check(value)) { 5657 PyErr_SetString(PyExc_TypeError, 5658 "memo must be a dictionary"); 5659 return -1; 5660 } 5661 Py_XDECREF(self->memo); 5662 self->memo = value; 5663 Py_INCREF(value); 5664 return 0; 5665 } 5666 5667 PyErr_SetString(PyExc_AttributeError, name); 5668 return -1; 5518 5669 } 5519 5670 … … 5526 5677 cpm_dump(PyObject *self, PyObject *args, PyObject *kwds) 5527 5678 { 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5679 static char *kwlist[] = {"obj", "file", "protocol", NULL}; 5680 PyObject *ob, *file, *res = NULL; 5681 Picklerobject *pickler = 0; 5682 int proto = 0; 5683 5684 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist, 5685 &ob, &file, &proto))) 5686 goto finally; 5687 5688 if (!( pickler = newPicklerobject(file, proto))) 5689 goto finally; 5690 5691 if (dump(pickler, ob) < 0) 5692 goto finally; 5693 5694 Py_INCREF(Py_None); 5695 res = Py_None; 5545 5696 5546 5697 finally: 5547 5548 5549 5698 Py_XDECREF(pickler); 5699 5700 return res; 5550 5701 } 5551 5702 … … 5555 5706 cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds) 5556 5707 { 5557 5558 5559 5560 5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5708 static char *kwlist[] = {"obj", "protocol", NULL}; 5709 PyObject *ob, *file = 0, *res = NULL; 5710 Picklerobject *pickler = 0; 5711 int proto = 0; 5712 5713 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist, 5714 &ob, &proto))) 5715 goto finally; 5716 5717 if (!( file = PycStringIO->NewOutput(128))) 5718 goto finally; 5719 5720 if (!( pickler = newPicklerobject(file, proto))) 5721 goto finally; 5722 5723 if (dump(pickler, ob) < 0) 5724 goto finally; 5725 5726 res = PycStringIO->cgetvalue(file); 5576 5727 5577 5728 finally: 5578 5579 5580 5581 5729 Py_XDECREF(pickler); 5730 Py_XDECREF(file); 5731 5732 return res; 5582 5733 } 5583 5734 … … 5587 5738 cpm_load(PyObject *self, PyObject *ob) 5588 5739 { 5589 5590 5591 5592 5593 5594 5595 5740 Unpicklerobject *unpickler = 0; 5741 PyObject *res = NULL; 5742 5743 if (!( unpickler = newUnpicklerobject(ob))) 5744 goto finally; 5745 5746 res = load(unpickler); 5596 5747 5597 5748 finally: 5598 5599 5600 5749 Py_XDECREF(unpickler); 5750 5751 return res; 5601 5752 } 5602 5753 … … 5606 5757 cpm_loads(PyObject *self, PyObject *args) 5607 5758 { 5608 5609 5610 5611 5612 5613 5614 5615 5616 5617 5618 5619 5620 5759 PyObject *ob, *file = 0, *res = NULL; 5760 Unpicklerobject *unpickler = 0; 5761 5762 if (!( PyArg_ParseTuple(args, "S:loads", &ob))) 5763 goto finally; 5764 5765 if (!( file = PycStringIO->NewInput(ob))) 5766 goto finally; 5767 5768 if (!( unpickler = newUnpicklerobject(file))) 5769 goto finally; 5770 5771 res = load(unpickler); 5621 5772 5622 5773 finally: 5623 5624 5625 5626 5774 Py_XDECREF(file); 5775 Py_XDECREF(unpickler); 5776 5777 return res; 5627 5778 } 5628 5779 … … 5633 5784 static PyTypeObject Unpicklertype = { 5634 5785 PyVarObject_HEAD_INIT(NULL, 0) 5635 "cPickle.Unpickler", 5786 "cPickle.Unpickler", /*tp_name*/ 5636 5787 sizeof(Unpicklerobject), /*tp_basicsize*/ 5637 5788 0, 5638 (destructor)Unpickler_dealloc, 5639 0, 5640 (getattrfunc)Unpickler_getattr, 5641 (setattrfunc)Unpickler_setattr, 5642 0, 5643 0, 5644 0, 5645 0, 5646 0, 5647 0, 5648 0, 5649 0, 5650 0, 5651 0, 5652 0, 5789 (destructor)Unpickler_dealloc, /* tp_dealloc */ 5790 0, /* tp_print */ 5791 (getattrfunc)Unpickler_getattr, /* tp_getattr */ 5792 (setattrfunc)Unpickler_setattr, /* tp_setattr */ 5793 0, /* tp_compare */ 5794 0, /* tp_repr */ 5795 0, /* tp_as_number */ 5796 0, /* tp_as_sequence */ 5797 0, /* tp_as_mapping */ 5798 0, /* tp_hash */ 5799 0, /* tp_call */ 5800 0, /* tp_str */ 5801 0, /* tp_getattro */ 5802 0, /* tp_setattro */ 5803 0, /* tp_as_buffer */ 5653 5804 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, 5654 Unpicklertype__doc__, 5655 (traverseproc)Unpickler_traverse, 5656 (inquiry)Unpickler_clear, 5805 Unpicklertype__doc__, /* tp_doc */ 5806 (traverseproc)Unpickler_traverse, /* tp_traverse */ 5807 (inquiry)Unpickler_clear, /* tp_clear */ 5657 5808 }; 5658 5809 … … 5712 5863 init_stuff(PyObject *module_dict) 5713 5864 { 5714 5865 PyObject *copyreg, *t, *r; 5715 5866 5716 5867 #define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1; 5717 5868 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739 5740 5741 5742 5743 5744 5745 5746 5747 5748 5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767 5768 5769 5770 5771 5772 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 5793 5794 5795 5796 5797 5798 5799 5800 5801 5802 5803 5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 5831 5832 5833 5834 5835 5836 5837 5838 5839 5840 5841 5842 5843 } 5844 5845 #ifndef PyMODINIT_FUNC 5869 if (PyType_Ready(&Unpicklertype) < 0) 5870 return -1; 5871 if (PyType_Ready(&Picklertype) < 0) 5872 return -1; 5873 5874 INIT_STR(__class__); 5875 INIT_STR(__getinitargs__); 5876 INIT_STR(__dict__); 5877 INIT_STR(__getstate__); 5878 INIT_STR(__setstate__); 5879 INIT_STR(__name__); 5880 INIT_STR(__main__); 5881 INIT_STR(__reduce__); 5882 INIT_STR(__reduce_ex__); 5883 INIT_STR(write); 5884 INIT_STR(append); 5885 INIT_STR(read); 5886 INIT_STR(readline); 5887 INIT_STR(dispatch_table); 5888 5889 if (!( copyreg = PyImport_ImportModule("copy_reg"))) 5890 return -1; 5891 5892 /* This is special because we want to use a different 5893 one in restricted mode. */ 5894 dispatch_table = PyObject_GetAttr(copyreg, dispatch_table_str); 5895 if (!dispatch_table) return -1; 5896 5897 extension_registry = PyObject_GetAttrString(copyreg, 5898 "_extension_registry"); 5899 if (!extension_registry) return -1; 5900 5901 inverted_registry = PyObject_GetAttrString(copyreg, 5902 "_inverted_registry"); 5903 if (!inverted_registry) return -1; 5904 5905 extension_cache = PyObject_GetAttrString(copyreg, 5906 "_extension_cache"); 5907 if (!extension_cache) return -1; 5908 5909 Py_DECREF(copyreg); 5910 5911 if (!(empty_tuple = PyTuple_New(0))) 5912 return -1; 5913 5914 two_tuple = PyTuple_New(2); 5915 if (two_tuple == NULL) 5916 return -1; 5917 /* We use this temp container with no regard to refcounts, or to 5918 * keeping containees alive. Exempt from GC, because we don't 5919 * want anything looking at two_tuple() by magic. 5920 */ 5921 PyObject_GC_UnTrack(two_tuple); 5922 5923 /* Ugh */ 5924 if (!( t=PyImport_ImportModule("__builtin__"))) return -1; 5925 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0) 5926 return -1; 5927 5928 if (!( t=PyDict_New())) return -1; 5929 if (!( r=PyRun_String( 5930 "def __str__(self):\n" 5931 " return self.args and ('%s' % self.args[0]) or '(what)'\n", 5932 Py_file_input, 5933 module_dict, t) )) return -1; 5934 Py_DECREF(r); 5935 5936 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t); 5937 if (!PickleError) 5938 return -1; 5939 5940 Py_DECREF(t); 5941 5942 PicklingError = PyErr_NewException("cPickle.PicklingError", 5943 PickleError, NULL); 5944 if (!PicklingError) 5945 return -1; 5946 5947 if (!( t=PyDict_New())) return -1; 5948 if (!( r=PyRun_String( 5949 "def __str__(self):\n" 5950 " a=self.args\n" 5951 " a=a and type(a[0]) or '(what)'\n" 5952 " return 'Cannot pickle %s objects' % a\n" 5953 , Py_file_input, 5954 module_dict, t) )) return -1; 5955 Py_DECREF(r); 5956 5957 if (!( UnpickleableError = PyErr_NewException( 5958 "cPickle.UnpickleableError", PicklingError, t))) 5959 return -1; 5960 5961 Py_DECREF(t); 5962 5963 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError", 5964 PickleError, NULL))) 5965 return -1; 5966 5967 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet", 5968 UnpicklingError, NULL))) 5969 return -1; 5970 5971 if (PyDict_SetItemString(module_dict, "PickleError", 5972 PickleError) < 0) 5973 return -1; 5974 5975 if (PyDict_SetItemString(module_dict, "PicklingError", 5976 PicklingError) < 0) 5977 return -1; 5978 5979 if (PyDict_SetItemString(module_dict, "UnpicklingError", 5980 UnpicklingError) < 0) 5981 return -1; 5982 5983 if (PyDict_SetItemString(module_dict, "UnpickleableError", 5984 UnpickleableError) < 0) 5985 return -1; 5986 5987 if (PyDict_SetItemString(module_dict, "BadPickleGet", 5988 BadPickleGet) < 0) 5989 return -1; 5990 5991 PycString_IMPORT; 5992 5993 return 0; 5994 } 5995 5996 #ifndef PyMODINIT_FUNC /* declarations for DLL import/export */ 5846 5997 #define PyMODINIT_FUNC void 5847 5998 #endif … … 5849 6000 initcPickle(void) 5850 6001 { 5851 5852 5853 char *rev = "1.71";/* XXX when does this change? */5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874 5875 5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 5888 5889 5890 5891 5892 5893 5894 5895 5896 5897 5898 5899 "1.0",/* Original protocol 0 */5900 "1.1",/* Protocol 0 + INST */5901 "1.2",/* Original protocol 1 */5902 "1.3",/* Protocol 1 + BINFLOAT */5903 "2.0");/* Original protocol 2 */5904 5905 5906 5907 5908 } 6002 PyObject *m, *d, *di, *v, *k; 6003 Py_ssize_t i; 6004 char *rev = "1.71"; /* XXX when does this change? */ 6005 PyObject *format_version; 6006 PyObject *compatible_formats; 6007 6008 Py_TYPE(&Picklertype) = &PyType_Type; 6009 Py_TYPE(&Unpicklertype) = &PyType_Type; 6010 Py_TYPE(&PdataType) = &PyType_Type; 6011 6012 /* Initialize some pieces. We need to do this before module creation, 6013 * so we're forced to use a temporary dictionary. :( 6014 */ 6015 di = PyDict_New(); 6016 if (!di) return; 6017 if (init_stuff(di) < 0) return; 6018 6019 /* Create the module and add the functions */ 6020 m = Py_InitModule4("cPickle", cPickle_methods, 6021 cPickle_module_documentation, 6022 (PyObject*)NULL,PYTHON_API_VERSION); 6023 if (m == NULL) 6024 return; 6025 6026 /* Add some symbolic constants to the module */ 6027 d = PyModule_GetDict(m); 6028 v = PyString_FromString(rev); 6029 PyDict_SetItemString(d, "__version__", v); 6030 Py_XDECREF(v); 6031 6032 /* Copy data from di. Waaa. */ 6033 for (i=0; PyDict_Next(di, &i, &k, &v); ) { 6034 if (PyObject_SetItem(d, k, v) < 0) { 6035 Py_DECREF(di); 6036 return; 6037 } 6038 } 6039 Py_DECREF(di); 6040 6041 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL); 6042 if (i < 0) 6043 return; 6044 6045 /* These are purely informational; no code uses them. */ 6046 /* File format version we write. */ 6047 format_version = PyString_FromString("2.0"); 6048 /* Format versions we can read. */ 6049 compatible_formats = Py_BuildValue("[sssss]", 6050 "1.0", /* Original protocol 0 */ 6051 "1.1", /* Protocol 0 + INST */ 6052 "1.2", /* Original protocol 1 */ 6053 "1.3", /* Protocol 1 + BINFLOAT */ 6054 "2.0"); /* Original protocol 2 */ 6055 PyDict_SetItemString(d, "format_version", format_version); 6056 PyDict_SetItemString(d, "compatible_formats", compatible_formats); 6057 Py_XDECREF(format_version); 6058 Py_XDECREF(compatible_formats); 6059 }
Note:
See TracChangeset
for help on using the changeset viewer.