]> git.proxmox.com Git - mirror_edk2.git/blob - AppPkg/Applications/Python/PyMod-2.7.2/Python/marshal.c
785f4389ba938a2c9ba1d139ea65afe69f0d985c
[mirror_edk2.git] / AppPkg / Applications / Python / PyMod-2.7.2 / Python / marshal.c
1
2 /* Write Python objects to files and read them back.
3 This is intended for writing and reading compiled Python code only;
4 a true persistent storage facility would be much harder, since
5 it would have to take circular links and sharing into account. */
6
7 #define PY_SSIZE_T_CLEAN
8
9 #include "Python.h"
10 #include "longintrepr.h"
11 #include "code.h"
12 #include "marshal.h"
13
14 #ifndef ABS
15 #define ABS(x) ((x) < 0 ? -(x) : (x))
16 #endif
17
18 /* High water mark to determine when the marshalled object is dangerously deep
19 * and risks coring the interpreter. When the object stack gets this deep,
20 * raise an exception instead of continuing.
21 */
22 #define MAX_MARSHAL_STACK_DEPTH 2000
23
24 #define TYPE_NULL '0'
25 #define TYPE_NONE 'N'
26 #define TYPE_FALSE 'F'
27 #define TYPE_TRUE 'T'
28 #define TYPE_STOPITER 'S'
29 #define TYPE_ELLIPSIS '.'
30 #define TYPE_INT 'i'
31 #define TYPE_INT64 'I'
32 #define TYPE_FLOAT 'f'
33 #define TYPE_BINARY_FLOAT 'g'
34 #define TYPE_COMPLEX 'x'
35 #define TYPE_BINARY_COMPLEX 'y'
36 #define TYPE_LONG 'l'
37 #define TYPE_STRING 's'
38 #define TYPE_INTERNED 't'
39 #define TYPE_STRINGREF 'R'
40 #define TYPE_TUPLE '('
41 #define TYPE_LIST '['
42 #define TYPE_DICT '{'
43 #define TYPE_CODE 'c'
44 #define TYPE_UNICODE 'u'
45 #define TYPE_UNKNOWN '?'
46 #define TYPE_SET '<'
47 #define TYPE_FROZENSET '>'
48
49 #define WFERR_OK 0
50 #define WFERR_UNMARSHALLABLE 1
51 #define WFERR_NESTEDTOODEEP 2
52 #define WFERR_NOMEMORY 3
53
54 typedef struct {
55 FILE *fp;
56 int error; /* see WFERR_* values */
57 int depth;
58 /* If fp == NULL, the following are valid: */
59 PyObject *str;
60 char *ptr;
61 char *end;
62 PyObject *strings; /* dict on marshal, list on unmarshal */
63 int version;
64 } WFILE;
65
66 #define w_byte(c, p) if (((p)->fp)) putc((c), (p)->fp); \
67 else if ((p)->ptr != (p)->end) *(p)->ptr++ = (c); \
68 else w_more(c, p)
69
70 static void
71 w_more(int c, WFILE *p)
72 {
73 Py_ssize_t size, newsize;
74 if (p->str == NULL)
75 return; /* An error already occurred */
76 size = PyString_Size(p->str);
77 newsize = size + size + 1024;
78 if (newsize > 32*1024*1024) {
79 newsize = size + (size >> 3); /* 12.5% overallocation */
80 }
81 if (_PyString_Resize(&p->str, newsize) != 0) {
82 p->ptr = p->end = NULL;
83 }
84 else {
85 p->ptr = PyString_AS_STRING((PyStringObject *)p->str) + size;
86 p->end =
87 PyString_AS_STRING((PyStringObject *)p->str) + newsize;
88 *p->ptr++ = Py_SAFE_DOWNCAST(c, int, char);
89 }
90 }
91
92 static void
93 w_string(char *s, int n, WFILE *p)
94 {
95 if (p->fp != NULL) {
96 fwrite(s, 1, n, p->fp);
97 }
98 else {
99 while (--n >= 0) {
100 w_byte(*s, p);
101 s++;
102 }
103 }
104 }
105
106 static void
107 w_short(int x, WFILE *p)
108 {
109 w_byte((char)( x & 0xff), p);
110 w_byte((char)((x>> 8) & 0xff), p);
111 }
112
113 static void
114 w_long(long x, WFILE *p)
115 {
116 w_byte((char)( x & 0xff), p);
117 w_byte((char)((x>> 8) & 0xff), p);
118 w_byte((char)((x>>16) & 0xff), p);
119 w_byte((char)((x>>24) & 0xff), p);
120 }
121
122 #if SIZEOF_LONG > 4
123 static void
124 w_long64(long x, WFILE *p)
125 {
126 w_long(x, p);
127 w_long(x>>32, p);
128 }
129 #endif
130
131 /* We assume that Python longs are stored internally in base some power of
132 2**15; for the sake of portability we'll always read and write them in base
133 exactly 2**15. */
134
135 #define PyLong_MARSHAL_SHIFT 15
136 #define PyLong_MARSHAL_BASE ((short)1 << PyLong_MARSHAL_SHIFT)
137 #define PyLong_MARSHAL_MASK (PyLong_MARSHAL_BASE - 1)
138 #if PyLong_SHIFT % PyLong_MARSHAL_SHIFT != 0
139 #error "PyLong_SHIFT must be a multiple of PyLong_MARSHAL_SHIFT"
140 #endif
141 #define PyLong_MARSHAL_RATIO (PyLong_SHIFT / PyLong_MARSHAL_SHIFT)
142
143 static void
144 w_PyLong(const PyLongObject *ob, WFILE *p)
145 {
146 Py_ssize_t i, j, n, l;
147 digit d;
148
149 w_byte(TYPE_LONG, p);
150 if (Py_SIZE(ob) == 0) {
151 w_long((long)0, p);
152 return;
153 }
154
155 /* set l to number of base PyLong_MARSHAL_BASE digits */
156 n = ABS(Py_SIZE(ob));
157 l = (n-1) * PyLong_MARSHAL_RATIO;
158 d = ob->ob_digit[n-1];
159 assert(d != 0); /* a PyLong is always normalized */
160 do {
161 d >>= PyLong_MARSHAL_SHIFT;
162 l++;
163 } while (d != 0);
164 w_long((long)(Py_SIZE(ob) > 0 ? l : -l), p);
165
166 for (i=0; i < n-1; i++) {
167 d = ob->ob_digit[i];
168 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
169 w_short(d & PyLong_MARSHAL_MASK, p);
170 d >>= PyLong_MARSHAL_SHIFT;
171 }
172 assert (d == 0);
173 }
174 d = ob->ob_digit[n-1];
175 do {
176 w_short(d & PyLong_MARSHAL_MASK, p);
177 d >>= PyLong_MARSHAL_SHIFT;
178 } while (d != 0);
179 }
180
181 static void
182 w_object(PyObject *v, WFILE *p)
183 {
184 Py_ssize_t i, n;
185
186 p->depth++;
187
188 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
189 p->error = WFERR_NESTEDTOODEEP;
190 }
191 else if (v == NULL) {
192 w_byte(TYPE_NULL, p);
193 }
194 else if (v == Py_None) {
195 w_byte(TYPE_NONE, p);
196 }
197 else if (v == PyExc_StopIteration) {
198 w_byte(TYPE_STOPITER, p);
199 }
200 else if (v == Py_Ellipsis) {
201 w_byte(TYPE_ELLIPSIS, p);
202 }
203 else if (v == Py_False) {
204 w_byte(TYPE_FALSE, p);
205 }
206 else if (v == Py_True) {
207 w_byte(TYPE_TRUE, p);
208 }
209 else if (PyInt_CheckExact(v)) {
210 long x = PyInt_AS_LONG((PyIntObject *)v);
211 #if SIZEOF_LONG > 4
212 long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
213 if (y && y != -1) {
214 w_byte(TYPE_INT64, p);
215 w_long64(x, p);
216 }
217 else
218 #endif
219 {
220 w_byte(TYPE_INT, p);
221 w_long(x, p);
222 }
223 }
224 else if (PyLong_CheckExact(v)) {
225 PyLongObject *ob = (PyLongObject *)v;
226 w_PyLong(ob, p);
227 }
228 else if (PyFloat_CheckExact(v)) {
229 if (p->version > 1) {
230 unsigned char buf[8];
231 if (_PyFloat_Pack8(PyFloat_AsDouble(v),
232 buf, 1) < 0) {
233 p->error = WFERR_UNMARSHALLABLE;
234 return;
235 }
236 w_byte(TYPE_BINARY_FLOAT, p);
237 w_string((char*)buf, 8, p);
238 }
239 else {
240 char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
241 'g', 17, 0, NULL);
242 if (!buf) {
243 p->error = WFERR_NOMEMORY;
244 return;
245 }
246 n = strlen(buf);
247 w_byte(TYPE_FLOAT, p);
248 w_byte((int)n, p);
249 w_string(buf, (int)n, p);
250 PyMem_Free(buf);
251 }
252 }
253 #ifndef WITHOUT_COMPLEX
254 else if (PyComplex_CheckExact(v)) {
255 if (p->version > 1) {
256 unsigned char buf[8];
257 if (_PyFloat_Pack8(PyComplex_RealAsDouble(v),
258 buf, 1) < 0) {
259 p->error = WFERR_UNMARSHALLABLE;
260 return;
261 }
262 w_byte(TYPE_BINARY_COMPLEX, p);
263 w_string((char*)buf, 8, p);
264 if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v),
265 buf, 1) < 0) {
266 p->error = WFERR_UNMARSHALLABLE;
267 return;
268 }
269 w_string((char*)buf, 8, p);
270 }
271 else {
272 char *buf;
273 w_byte(TYPE_COMPLEX, p);
274 buf = PyOS_double_to_string(PyComplex_RealAsDouble(v),
275 'g', 17, 0, NULL);
276 if (!buf) {
277 p->error = WFERR_NOMEMORY;
278 return;
279 }
280 n = strlen(buf);
281 w_byte((int)n, p);
282 w_string(buf, (int)n, p);
283 PyMem_Free(buf);
284 buf = PyOS_double_to_string(PyComplex_ImagAsDouble(v),
285 'g', 17, 0, NULL);
286 if (!buf) {
287 p->error = WFERR_NOMEMORY;
288 return;
289 }
290 n = strlen(buf);
291 w_byte((int)n, p);
292 w_string(buf, (int)n, p);
293 PyMem_Free(buf);
294 }
295 }
296 #endif
297 else if (PyString_CheckExact(v)) {
298 if (p->strings && PyString_CHECK_INTERNED(v)) {
299 PyObject *o = PyDict_GetItem(p->strings, v);
300 if (o) {
301 long w = PyInt_AsLong(o);
302 w_byte(TYPE_STRINGREF, p);
303 w_long(w, p);
304 goto exit;
305 }
306 else {
307 int ok;
308 o = PyInt_FromSsize_t(PyDict_Size(p->strings));
309 ok = o &&
310 PyDict_SetItem(p->strings, v, o) >= 0;
311 Py_XDECREF(o);
312 if (!ok) {
313 p->depth--;
314 p->error = WFERR_UNMARSHALLABLE;
315 return;
316 }
317 w_byte(TYPE_INTERNED, p);
318 }
319 }
320 else {
321 w_byte(TYPE_STRING, p);
322 }
323 n = PyString_GET_SIZE(v);
324 if (n > INT_MAX) {
325 /* huge strings are not supported */
326 p->depth--;
327 p->error = WFERR_UNMARSHALLABLE;
328 return;
329 }
330 w_long((long)n, p);
331 w_string(PyString_AS_STRING(v), (int)n, p);
332 }
333 #ifdef Py_USING_UNICODE
334 else if (PyUnicode_CheckExact(v)) {
335 PyObject *utf8;
336 utf8 = PyUnicode_AsUTF8String(v);
337 if (utf8 == NULL) {
338 p->depth--;
339 p->error = WFERR_UNMARSHALLABLE;
340 return;
341 }
342 w_byte(TYPE_UNICODE, p);
343 n = PyString_GET_SIZE(utf8);
344 if (n > INT_MAX) {
345 p->depth--;
346 p->error = WFERR_UNMARSHALLABLE;
347 return;
348 }
349 w_long((long)n, p);
350 w_string(PyString_AS_STRING(utf8), (int)n, p);
351 Py_DECREF(utf8);
352 }
353 #endif
354 else if (PyTuple_CheckExact(v)) {
355 w_byte(TYPE_TUPLE, p);
356 n = PyTuple_Size(v);
357 w_long((long)n, p);
358 for (i = 0; i < n; i++) {
359 w_object(PyTuple_GET_ITEM(v, i), p);
360 }
361 }
362 else if (PyList_CheckExact(v)) {
363 w_byte(TYPE_LIST, p);
364 n = PyList_GET_SIZE(v);
365 w_long((long)n, p);
366 for (i = 0; i < n; i++) {
367 w_object(PyList_GET_ITEM(v, i), p);
368 }
369 }
370 else if (PyDict_CheckExact(v)) {
371 Py_ssize_t pos;
372 PyObject *key, *value;
373 w_byte(TYPE_DICT, p);
374 /* This one is NULL object terminated! */
375 pos = 0;
376 while (PyDict_Next(v, &pos, &key, &value)) {
377 w_object(key, p);
378 w_object(value, p);
379 }
380 w_object((PyObject *)NULL, p);
381 }
382 else if (PyAnySet_CheckExact(v)) {
383 PyObject *value, *it;
384
385 if (PyObject_TypeCheck(v, &PySet_Type))
386 w_byte(TYPE_SET, p);
387 else
388 w_byte(TYPE_FROZENSET, p);
389 n = PyObject_Size(v);
390 if (n == -1) {
391 p->depth--;
392 p->error = WFERR_UNMARSHALLABLE;
393 return;
394 }
395 w_long((long)n, p);
396 it = PyObject_GetIter(v);
397 if (it == NULL) {
398 p->depth--;
399 p->error = WFERR_UNMARSHALLABLE;
400 return;
401 }
402 while ((value = PyIter_Next(it)) != NULL) {
403 w_object(value, p);
404 Py_DECREF(value);
405 }
406 Py_DECREF(it);
407 if (PyErr_Occurred()) {
408 p->depth--;
409 p->error = WFERR_UNMARSHALLABLE;
410 return;
411 }
412 }
413 else if (PyCode_Check(v)) {
414 PyCodeObject *co = (PyCodeObject *)v;
415 w_byte(TYPE_CODE, p);
416 w_long(co->co_argcount, p);
417 w_long(co->co_nlocals, p);
418 w_long(co->co_stacksize, p);
419 w_long(co->co_flags, p);
420 w_object(co->co_code, p);
421 w_object(co->co_consts, p);
422 w_object(co->co_names, p);
423 w_object(co->co_varnames, p);
424 w_object(co->co_freevars, p);
425 w_object(co->co_cellvars, p);
426 w_object(co->co_filename, p);
427 w_object(co->co_name, p);
428 w_long(co->co_firstlineno, p);
429 w_object(co->co_lnotab, p);
430 }
431 else if (PyObject_CheckReadBuffer(v)) {
432 /* Write unknown buffer-style objects as a string */
433 char *s;
434 PyBufferProcs *pb = v->ob_type->tp_as_buffer;
435 w_byte(TYPE_STRING, p);
436 n = (*pb->bf_getreadbuffer)(v, 0, (void **)&s);
437 if (n > INT_MAX) {
438 p->depth--;
439 p->error = WFERR_UNMARSHALLABLE;
440 return;
441 }
442 w_long((long)n, p);
443 w_string(s, (int)n, p);
444 }
445 else {
446 w_byte(TYPE_UNKNOWN, p);
447 p->error = WFERR_UNMARSHALLABLE;
448 }
449 exit:
450 p->depth--;
451 }
452
453 /* version currently has no effect for writing longs. */
454 void
455 PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
456 {
457 WFILE wf;
458 wf.fp = fp;
459 wf.error = WFERR_OK;
460 wf.depth = 0;
461 wf.strings = NULL;
462 wf.version = version;
463 w_long(x, &wf);
464 }
465
466 void
467 PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
468 {
469 WFILE wf;
470 wf.fp = fp;
471 wf.error = WFERR_OK;
472 wf.depth = 0;
473 wf.strings = (version > 0) ? PyDict_New() : NULL;
474 wf.version = version;
475 w_object(x, &wf);
476 Py_XDECREF(wf.strings);
477 }
478
479 typedef WFILE RFILE; /* Same struct with different invariants */
480
481 #define rs_byte(p) (((p)->ptr < (p)->end) ? (unsigned char)*(p)->ptr++ : EOF)
482
483 #define r_byte(p) ((p)->fp ? getc((p)->fp) : rs_byte(p))
484
485 static int
486 r_string(char *s, int n, RFILE *p)
487 {
488 if (p->fp != NULL)
489 /* The result fits into int because it must be <=n. */
490 return (int)fread(s, 1, n, p->fp);
491 if (p->end - p->ptr < n)
492 n = (int)(p->end - p->ptr);
493 memcpy(s, p->ptr, n);
494 p->ptr += n;
495 return n;
496 }
497
498 static int
499 r_short(RFILE *p)
500 {
501 register short x;
502 x = r_byte(p);
503 x |= r_byte(p) << 8;
504 /* Sign-extension, in case short greater than 16 bits */
505 x |= -(x & 0x8000);
506 return x;
507 }
508
509 static long
510 r_long(RFILE *p)
511 {
512 register long x;
513 register FILE *fp = p->fp;
514 if (fp) {
515 x = getc(fp);
516 x |= (long)getc(fp) << 8;
517 x |= (long)getc(fp) << 16;
518 x |= (long)getc(fp) << 24;
519 }
520 else {
521 x = rs_byte(p);
522 x |= (long)rs_byte(p) << 8;
523 x |= (long)rs_byte(p) << 16;
524 x |= (long)rs_byte(p) << 24;
525 }
526 #if SIZEOF_LONG > 4
527 /* Sign extension for 64-bit machines */
528 x |= -(x & 0x80000000L);
529 #endif
530 return x;
531 }
532
533 /* r_long64 deals with the TYPE_INT64 code. On a machine with
534 sizeof(long) > 4, it returns a Python int object, else a Python long
535 object. Note that w_long64 writes out TYPE_INT if 32 bits is enough,
536 so there's no inefficiency here in returning a PyLong on 32-bit boxes
537 for everything written via TYPE_INT64 (i.e., if an int is written via
538 TYPE_INT64, it *needs* more than 32 bits).
539 */
540 static PyObject *
541 r_long64(RFILE *p)
542 {
543 long lo4 = r_long(p);
544 long hi4 = r_long(p);
545 #if SIZEOF_LONG > 4
546 long x = (hi4 << 32) | (lo4 & 0xFFFFFFFFL);
547 return PyInt_FromLong(x);
548 #else
549 unsigned char buf[8];
550 int one = 1;
551 int is_little_endian = (int)*(char*)&one;
552 if (is_little_endian) {
553 memcpy(buf, &lo4, 4);
554 memcpy(buf+4, &hi4, 4);
555 }
556 else {
557 memcpy(buf, &hi4, 4);
558 memcpy(buf+4, &lo4, 4);
559 }
560 return _PyLong_FromByteArray(buf, 8, is_little_endian, 1);
561 #endif
562 }
563
564 static PyObject *
565 r_PyLong(RFILE *p)
566 {
567 PyLongObject *ob;
568 int size, i, j, md, shorts_in_top_digit;
569 long n;
570 digit d;
571
572 n = r_long(p);
573 if (n == 0)
574 return (PyObject *)_PyLong_New(0);
575 if (n < -INT_MAX || n > INT_MAX) {
576 PyErr_SetString(PyExc_ValueError,
577 "bad marshal data (long size out of range)");
578 return NULL;
579 }
580
581 size = 1 + (ABS(n) - 1) / PyLong_MARSHAL_RATIO;
582 shorts_in_top_digit = 1 + (ABS(n) - 1) % PyLong_MARSHAL_RATIO;
583 ob = _PyLong_New(size);
584 if (ob == NULL)
585 return NULL;
586 Py_SIZE(ob) = n > 0 ? size : -size;
587
588 for (i = 0; i < size-1; i++) {
589 d = 0;
590 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
591 md = r_short(p);
592 if (md < 0 || md > PyLong_MARSHAL_BASE)
593 goto bad_digit;
594 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
595 }
596 ob->ob_digit[i] = d;
597 }
598 d = 0;
599 for (j=0; j < shorts_in_top_digit; j++) {
600 md = r_short(p);
601 if (md < 0 || md > PyLong_MARSHAL_BASE)
602 goto bad_digit;
603 /* topmost marshal digit should be nonzero */
604 if (md == 0 && j == shorts_in_top_digit - 1) {
605 Py_DECREF(ob);
606 PyErr_SetString(PyExc_ValueError,
607 "bad marshal data (unnormalized long data)");
608 return NULL;
609 }
610 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
611 }
612 /* top digit should be nonzero, else the resulting PyLong won't be
613 normalized */
614 ob->ob_digit[size-1] = d;
615 return (PyObject *)ob;
616 bad_digit:
617 Py_DECREF(ob);
618 PyErr_SetString(PyExc_ValueError,
619 "bad marshal data (digit out of range in long)");
620 return NULL;
621 }
622
623
624 static PyObject *
625 r_object(RFILE *p)
626 {
627 /* NULL is a valid return value, it does not necessarily means that
628 an exception is set. */
629 PyObject *v, *v2;
630 long i, n;
631 int type = r_byte(p);
632 PyObject *retval;
633
634 p->depth++;
635
636 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
637 p->depth--;
638 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
639 return NULL;
640 }
641
642 switch (type) {
643
644 case EOF:
645 PyErr_SetString(PyExc_EOFError,
646 "EOF read where object expected");
647 retval = NULL;
648 break;
649
650 case TYPE_NULL:
651 retval = NULL;
652 break;
653
654 case TYPE_NONE:
655 Py_INCREF(Py_None);
656 retval = Py_None;
657 break;
658
659 case TYPE_STOPITER:
660 Py_INCREF(PyExc_StopIteration);
661 retval = PyExc_StopIteration;
662 break;
663
664 case TYPE_ELLIPSIS:
665 Py_INCREF(Py_Ellipsis);
666 retval = Py_Ellipsis;
667 break;
668
669 case TYPE_FALSE:
670 Py_INCREF(Py_False);
671 retval = Py_False;
672 break;
673
674 case TYPE_TRUE:
675 Py_INCREF(Py_True);
676 retval = Py_True;
677 break;
678
679 case TYPE_INT:
680 retval = PyInt_FromLong(r_long(p));
681 break;
682
683 case TYPE_INT64:
684 retval = r_long64(p);
685 break;
686
687 case TYPE_LONG:
688 retval = r_PyLong(p);
689 break;
690
691 case TYPE_FLOAT:
692 {
693 char buf[256];
694 double dx;
695 n = r_byte(p);
696 if (n == EOF || r_string(buf, (int)n, p) != n) {
697 PyErr_SetString(PyExc_EOFError,
698 "EOF read where object expected");
699 retval = NULL;
700 break;
701 }
702 buf[n] = '\0';
703 dx = PyOS_string_to_double(buf, NULL, NULL);
704 if (dx == -1.0 && PyErr_Occurred()) {
705 retval = NULL;
706 break;
707 }
708 retval = PyFloat_FromDouble(dx);
709 break;
710 }
711
712 case TYPE_BINARY_FLOAT:
713 {
714 unsigned char buf[8];
715 double x;
716 if (r_string((char*)buf, 8, p) != 8) {
717 PyErr_SetString(PyExc_EOFError,
718 "EOF read where object expected");
719 retval = NULL;
720 break;
721 }
722 x = _PyFloat_Unpack8(buf, 1);
723 if (x == -1.0 && PyErr_Occurred()) {
724 retval = NULL;
725 break;
726 }
727 retval = PyFloat_FromDouble(x);
728 break;
729 }
730
731 #ifndef WITHOUT_COMPLEX
732 case TYPE_COMPLEX:
733 {
734 char buf[256];
735 Py_complex c;
736 n = r_byte(p);
737 if (n == EOF || r_string(buf, (int)n, p) != n) {
738 PyErr_SetString(PyExc_EOFError,
739 "EOF read where object expected");
740 retval = NULL;
741 break;
742 }
743 buf[n] = '\0';
744 c.real = PyOS_string_to_double(buf, NULL, NULL);
745 if (c.real == -1.0 && PyErr_Occurred()) {
746 retval = NULL;
747 break;
748 }
749 n = r_byte(p);
750 if (n == EOF || r_string(buf, (int)n, p) != n) {
751 PyErr_SetString(PyExc_EOFError,
752 "EOF read where object expected");
753 retval = NULL;
754 break;
755 }
756 buf[n] = '\0';
757 c.imag = PyOS_string_to_double(buf, NULL, NULL);
758 if (c.imag == -1.0 && PyErr_Occurred()) {
759 retval = NULL;
760 break;
761 }
762 retval = PyComplex_FromCComplex(c);
763 break;
764 }
765
766 case TYPE_BINARY_COMPLEX:
767 {
768 unsigned char buf[8];
769 Py_complex c;
770 if (r_string((char*)buf, 8, p) != 8) {
771 PyErr_SetString(PyExc_EOFError,
772 "EOF read where object expected");
773 retval = NULL;
774 break;
775 }
776 c.real = _PyFloat_Unpack8(buf, 1);
777 if (c.real == -1.0 && PyErr_Occurred()) {
778 retval = NULL;
779 break;
780 }
781 if (r_string((char*)buf, 8, p) != 8) {
782 PyErr_SetString(PyExc_EOFError,
783 "EOF read where object expected");
784 retval = NULL;
785 break;
786 }
787 c.imag = _PyFloat_Unpack8(buf, 1);
788 if (c.imag == -1.0 && PyErr_Occurred()) {
789 retval = NULL;
790 break;
791 }
792 retval = PyComplex_FromCComplex(c);
793 break;
794 }
795 #endif
796
797 case TYPE_INTERNED:
798 case TYPE_STRING:
799 n = r_long(p);
800 if (n < 0 || n > INT_MAX) {
801 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
802 retval = NULL;
803 break;
804 }
805 v = PyString_FromStringAndSize((char *)NULL, n);
806 if (v == NULL) {
807 retval = NULL;
808 break;
809 }
810 if (r_string(PyString_AS_STRING(v), (int)n, p) != n) {
811 Py_DECREF(v);
812 PyErr_SetString(PyExc_EOFError,
813 "EOF read where object expected");
814 retval = NULL;
815 break;
816 }
817 if (type == TYPE_INTERNED) {
818 PyString_InternInPlace(&v);
819 if (PyList_Append(p->strings, v) < 0) {
820 retval = NULL;
821 break;
822 }
823 }
824 retval = v;
825 break;
826
827 case TYPE_STRINGREF:
828 n = r_long(p);
829 if (n < 0 || n >= PyList_GET_SIZE(p->strings)) {
830 PyErr_SetString(PyExc_ValueError, "bad marshal data (string ref out of range)");
831 retval = NULL;
832 break;
833 }
834 v = PyList_GET_ITEM(p->strings, n);
835 Py_INCREF(v);
836 retval = v;
837 break;
838
839 #ifdef Py_USING_UNICODE
840 case TYPE_UNICODE:
841 {
842 char *buffer;
843
844 n = r_long(p);
845 if (n < 0 || n > INT_MAX) {
846 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
847 retval = NULL;
848 break;
849 }
850 buffer = PyMem_NEW(char, n);
851 if (buffer == NULL) {
852 retval = PyErr_NoMemory();
853 break;
854 }
855 if (r_string(buffer, (int)n, p) != n) {
856 PyMem_DEL(buffer);
857 PyErr_SetString(PyExc_EOFError,
858 "EOF read where object expected");
859 retval = NULL;
860 break;
861 }
862 v = PyUnicode_DecodeUTF8(buffer, n, NULL);
863 PyMem_DEL(buffer);
864 retval = v;
865 break;
866 }
867 #endif
868
869 case TYPE_TUPLE:
870 n = r_long(p);
871 if (n < 0 || n > INT_MAX) {
872 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
873 retval = NULL;
874 break;
875 }
876 v = PyTuple_New((int)n);
877 if (v == NULL) {
878 retval = NULL;
879 break;
880 }
881 for (i = 0; i < n; i++) {
882 v2 = r_object(p);
883 if ( v2 == NULL ) {
884 if (!PyErr_Occurred())
885 PyErr_SetString(PyExc_TypeError,
886 "NULL object in marshal data for tuple");
887 Py_DECREF(v);
888 v = NULL;
889 break;
890 }
891 PyTuple_SET_ITEM(v, (int)i, v2);
892 }
893 retval = v;
894 break;
895
896 case TYPE_LIST:
897 n = r_long(p);
898 if (n < 0 || n > INT_MAX) {
899 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
900 retval = NULL;
901 break;
902 }
903 v = PyList_New((int)n);
904 if (v == NULL) {
905 retval = NULL;
906 break;
907 }
908 for (i = 0; i < n; i++) {
909 v2 = r_object(p);
910 if ( v2 == NULL ) {
911 if (!PyErr_Occurred())
912 PyErr_SetString(PyExc_TypeError,
913 "NULL object in marshal data for list");
914 Py_DECREF(v);
915 v = NULL;
916 break;
917 }
918 PyList_SET_ITEM(v, (int)i, v2);
919 }
920 retval = v;
921 break;
922
923 case TYPE_DICT:
924 v = PyDict_New();
925 if (v == NULL) {
926 retval = NULL;
927 break;
928 }
929 for (;;) {
930 PyObject *key, *val;
931 key = r_object(p);
932 if (key == NULL)
933 break;
934 val = r_object(p);
935 if (val != NULL)
936 PyDict_SetItem(v, key, val);
937 Py_DECREF(key);
938 Py_XDECREF(val);
939 }
940 if (PyErr_Occurred()) {
941 Py_DECREF(v);
942 v = NULL;
943 }
944 retval = v;
945 break;
946
947 case TYPE_SET:
948 case TYPE_FROZENSET:
949 n = r_long(p);
950 if (n < 0 || n > INT_MAX) {
951 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
952 retval = NULL;
953 break;
954 }
955 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
956 if (v == NULL) {
957 retval = NULL;
958 break;
959 }
960 for (i = 0; i < n; i++) {
961 v2 = r_object(p);
962 if ( v2 == NULL ) {
963 if (!PyErr_Occurred())
964 PyErr_SetString(PyExc_TypeError,
965 "NULL object in marshal data for set");
966 Py_DECREF(v);
967 v = NULL;
968 break;
969 }
970 if (PySet_Add(v, v2) == -1) {
971 Py_DECREF(v);
972 Py_DECREF(v2);
973 v = NULL;
974 break;
975 }
976 Py_DECREF(v2);
977 }
978 retval = v;
979 break;
980
981 case TYPE_CODE:
982 if (PyEval_GetRestricted()) {
983 PyErr_SetString(PyExc_RuntimeError,
984 "cannot unmarshal code objects in "
985 "restricted execution mode");
986 retval = NULL;
987 break;
988 }
989 else {
990 int argcount;
991 int nlocals;
992 int stacksize;
993 int flags;
994 PyObject *code = NULL;
995 PyObject *consts = NULL;
996 PyObject *names = NULL;
997 PyObject *varnames = NULL;
998 PyObject *freevars = NULL;
999 PyObject *cellvars = NULL;
1000 PyObject *filename = NULL;
1001 PyObject *name = NULL;
1002 int firstlineno;
1003 PyObject *lnotab = NULL;
1004
1005 v = NULL;
1006
1007 /* XXX ignore long->int overflows for now */
1008 argcount = (int)r_long(p);
1009 nlocals = (int)r_long(p);
1010 stacksize = (int)r_long(p);
1011 flags = (int)r_long(p);
1012 code = r_object(p);
1013 if (code == NULL)
1014 goto code_error;
1015 consts = r_object(p);
1016 if (consts == NULL)
1017 goto code_error;
1018 names = r_object(p);
1019 if (names == NULL)
1020 goto code_error;
1021 varnames = r_object(p);
1022 if (varnames == NULL)
1023 goto code_error;
1024 freevars = r_object(p);
1025 if (freevars == NULL)
1026 goto code_error;
1027 cellvars = r_object(p);
1028 if (cellvars == NULL)
1029 goto code_error;
1030 filename = r_object(p);
1031 if (filename == NULL)
1032 goto code_error;
1033 name = r_object(p);
1034 if (name == NULL)
1035 goto code_error;
1036 firstlineno = (int)r_long(p);
1037 lnotab = r_object(p);
1038 if (lnotab == NULL)
1039 goto code_error;
1040
1041 v = (PyObject *) PyCode_New(
1042 argcount, nlocals, stacksize, flags,
1043 code, consts, names, varnames,
1044 freevars, cellvars, filename, name,
1045 firstlineno, lnotab);
1046
1047 code_error:
1048 Py_XDECREF(code);
1049 Py_XDECREF(consts);
1050 Py_XDECREF(names);
1051 Py_XDECREF(varnames);
1052 Py_XDECREF(freevars);
1053 Py_XDECREF(cellvars);
1054 Py_XDECREF(filename);
1055 Py_XDECREF(name);
1056 Py_XDECREF(lnotab);
1057
1058 }
1059 retval = v;
1060 break;
1061
1062 default:
1063 /* Bogus data got written, which isn't ideal.
1064 This will let you keep working and recover. */
1065 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
1066 retval = NULL;
1067 break;
1068
1069 }
1070 p->depth--;
1071 return retval;
1072 }
1073
1074 static PyObject *
1075 read_object(RFILE *p)
1076 {
1077 PyObject *v;
1078 if (PyErr_Occurred()) {
1079 fprintf(stderr, "XXX readobject called with exception set\n");
1080 return NULL;
1081 }
1082 v = r_object(p);
1083 if (v == NULL && !PyErr_Occurred())
1084 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1085 return v;
1086 }
1087
1088 int
1089 PyMarshal_ReadShortFromFile(FILE *fp)
1090 {
1091 RFILE rf;
1092 assert(fp);
1093 rf.fp = fp;
1094 rf.strings = NULL;
1095 rf.end = rf.ptr = NULL;
1096 return r_short(&rf);
1097 }
1098
1099 long
1100 PyMarshal_ReadLongFromFile(FILE *fp)
1101 {
1102 RFILE rf;
1103 rf.fp = fp;
1104 rf.strings = NULL;
1105 rf.ptr = rf.end = NULL;
1106 return r_long(&rf);
1107 }
1108
1109 #ifdef HAVE_FSTAT
1110 /* Return size of file in bytes; < 0 if unknown. */
1111 static off_t
1112 getfilesize(FILE *fp)
1113 {
1114 struct stat st;
1115 if (fstat(fileno(fp), &st) != 0)
1116 return -1;
1117 else
1118 return st.st_size;
1119 }
1120 #endif
1121
1122 /* If we can get the size of the file up-front, and it's reasonably small,
1123 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1124 * than reading a byte at a time from file; speeds .pyc imports.
1125 * CAUTION: since this may read the entire remainder of the file, don't
1126 * call it unless you know you're done with the file.
1127 */
1128 PyObject *
1129 PyMarshal_ReadLastObjectFromFile(FILE *fp)
1130 {
1131 /* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
1132 #define REASONABLE_FILE_LIMIT (1L << 18)
1133 #ifdef HAVE_FSTAT
1134 off_t filesize;
1135 filesize = getfilesize(fp);
1136 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1137 char* pBuf = (char *)PyMem_MALLOC(filesize);
1138 if (pBuf != NULL) {
1139 PyObject* v;
1140 size_t n;
1141 /* filesize must fit into an int, because it
1142 is smaller than REASONABLE_FILE_LIMIT */
1143 n = fread(pBuf, 1, (int)filesize, fp);
1144 v = PyMarshal_ReadObjectFromString(pBuf, n);
1145 PyMem_FREE(pBuf);
1146 return v;
1147 }
1148
1149 }
1150 #endif
1151 /* We don't have fstat, or we do but the file is larger than
1152 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1153 */
1154 return PyMarshal_ReadObjectFromFile(fp);
1155
1156 #undef REASONABLE_FILE_LIMIT
1157 }
1158
1159 PyObject *
1160 PyMarshal_ReadObjectFromFile(FILE *fp)
1161 {
1162 RFILE rf;
1163 PyObject *result;
1164 rf.fp = fp;
1165 rf.strings = PyList_New(0);
1166 rf.depth = 0;
1167 rf.ptr = rf.end = NULL;
1168 result = r_object(&rf);
1169 Py_DECREF(rf.strings);
1170 return result;
1171 }
1172
1173 PyObject *
1174 PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)
1175 {
1176 RFILE rf;
1177 PyObject *result;
1178 rf.fp = NULL;
1179 rf.ptr = str;
1180 rf.end = str + len;
1181 rf.strings = PyList_New(0);
1182 rf.depth = 0;
1183 result = r_object(&rf);
1184 Py_DECREF(rf.strings);
1185 return result;
1186 }
1187
1188 static void
1189 set_error(int error)
1190 {
1191 switch (error) {
1192 case WFERR_NOMEMORY:
1193 PyErr_NoMemory();
1194 break;
1195 case WFERR_UNMARSHALLABLE:
1196 PyErr_SetString(PyExc_ValueError, "unmarshallable object");
1197 break;
1198 case WFERR_NESTEDTOODEEP:
1199 default:
1200 PyErr_SetString(PyExc_ValueError,
1201 "object too deeply nested to marshal");
1202 break;
1203 }
1204 }
1205
1206 PyObject *
1207 PyMarshal_WriteObjectToString(PyObject *x, int version)
1208 {
1209 WFILE wf;
1210 wf.fp = NULL;
1211 wf.str = PyString_FromStringAndSize((char *)NULL, 50);
1212 if (wf.str == NULL)
1213 return NULL;
1214 wf.ptr = PyString_AS_STRING((PyStringObject *)wf.str);
1215 wf.end = wf.ptr + PyString_Size(wf.str);
1216 wf.error = WFERR_OK;
1217 wf.depth = 0;
1218 wf.version = version;
1219 wf.strings = (version > 0) ? PyDict_New() : NULL;
1220 w_object(x, &wf);
1221 Py_XDECREF(wf.strings);
1222 if (wf.str != NULL) {
1223 char *base = PyString_AS_STRING((PyStringObject *)wf.str);
1224 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1225 Py_DECREF(wf.str);
1226 PyErr_SetString(PyExc_OverflowError,
1227 "too much marshall data for a string");
1228 return NULL;
1229 }
1230 if (_PyString_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)))
1231 return NULL;
1232 }
1233 if (wf.error != WFERR_OK) {
1234 Py_XDECREF(wf.str);
1235 set_error(wf.error);
1236 return NULL;
1237 }
1238 return wf.str;
1239 }
1240
1241 /* And an interface for Python programs... */
1242
1243 static PyObject *
1244 marshal_dump(PyObject *self, PyObject *args)
1245 {
1246 WFILE wf;
1247 PyObject *x;
1248 PyObject *f;
1249 int version = Py_MARSHAL_VERSION;
1250 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
1251 return NULL;
1252 if (!PyFile_Check(f)) {
1253 PyErr_SetString(PyExc_TypeError,
1254 "marshal.dump() 2nd arg must be file");
1255 return NULL;
1256 }
1257 wf.fp = PyFile_AsFile(f);
1258 wf.str = NULL;
1259 wf.ptr = wf.end = NULL;
1260 wf.error = WFERR_OK;
1261 wf.depth = 0;
1262 wf.strings = (version > 0) ? PyDict_New() : 0;
1263 wf.version = version;
1264 w_object(x, &wf);
1265 Py_XDECREF(wf.strings);
1266 if (wf.error != WFERR_OK) {
1267 set_error(wf.error);
1268 return NULL;
1269 }
1270 Py_INCREF(Py_None);
1271 return Py_None;
1272 }
1273
1274 PyDoc_STRVAR(dump_doc,
1275 "dump(value, file[, version])\n\
1276 \n\
1277 Write the value on the open file. The value must be a supported type.\n\
1278 The file must be an open file object such as sys.stdout or returned by\n\
1279 open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1280 \n\
1281 If the value has (or contains an object that has) an unsupported type, a\n\
1282 ValueError exception is raised — but garbage data will also be written\n\
1283 to the file. The object will not be properly read back by load()\n\
1284 \n\
1285 New in version 2.4: The version argument indicates the data format that\n\
1286 dump should use.");
1287
1288 static PyObject *
1289 marshal_load(PyObject *self, PyObject *f)
1290 {
1291 RFILE rf;
1292 PyObject *result;
1293 if (!PyFile_Check(f)) {
1294 PyErr_SetString(PyExc_TypeError,
1295 "marshal.load() arg must be file");
1296 return NULL;
1297 }
1298 rf.fp = PyFile_AsFile(f);
1299 rf.strings = PyList_New(0);
1300 rf.depth = 0;
1301 result = read_object(&rf);
1302 Py_DECREF(rf.strings);
1303 return result;
1304 }
1305
1306 PyDoc_STRVAR(load_doc,
1307 "load(file)\n\
1308 \n\
1309 Read one value from the open file and return it. If no valid value is\n\
1310 read (e.g. because the data has a different Python version’s\n\
1311 incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1312 The file must be an open file object opened in binary mode ('rb' or\n\
1313 'r+b').\n\
1314 \n\
1315 Note: If an object containing an unsupported type was marshalled with\n\
1316 dump(), load() will substitute None for the unmarshallable type.");
1317
1318
1319 static PyObject *
1320 marshal_dumps(PyObject *self, PyObject *args)
1321 {
1322 PyObject *x;
1323 int version = Py_MARSHAL_VERSION;
1324 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
1325 return NULL;
1326 return PyMarshal_WriteObjectToString(x, version);
1327 }
1328
1329 PyDoc_STRVAR(dumps_doc,
1330 "dumps(value[, version])\n\
1331 \n\
1332 Return the string that would be written to a file by dump(value, file).\n\
1333 The value must be a supported type. Raise a ValueError exception if\n\
1334 value has (or contains an object that has) an unsupported type.\n\
1335 \n\
1336 New in version 2.4: The version argument indicates the data format that\n\
1337 dumps should use.");
1338
1339
1340 static PyObject *
1341 marshal_loads(PyObject *self, PyObject *args)
1342 {
1343 RFILE rf;
1344 char *s;
1345 Py_ssize_t n;
1346 PyObject* result;
1347 if (!PyArg_ParseTuple(args, "s#:loads", &s, &n))
1348 return NULL;
1349 rf.fp = NULL;
1350 rf.ptr = s;
1351 rf.end = s + n;
1352 rf.strings = PyList_New(0);
1353 rf.depth = 0;
1354 result = read_object(&rf);
1355 Py_DECREF(rf.strings);
1356 return result;
1357 }
1358
1359 PyDoc_STRVAR(loads_doc,
1360 "loads(string)\n\
1361 \n\
1362 Convert the string to a value. If no valid value is found, raise\n\
1363 EOFError, ValueError or TypeError. Extra characters in the string are\n\
1364 ignored.");
1365
1366 static PyMethodDef marshal_methods[] = {
1367 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1368 {"load", marshal_load, METH_O, load_doc},
1369 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1370 {"loads", marshal_loads, METH_VARARGS, loads_doc},
1371 {NULL, NULL} /* sentinel */
1372 };
1373
1374 PyDoc_STRVAR(marshal_doc,
1375 "This module contains functions that can read and write Python values in\n\
1376 a binary format. The format is specific to Python, but independent of\n\
1377 machine architecture issues.\n\
1378 \n\
1379 Not all Python object types are supported; in general, only objects\n\
1380 whose value is independent from a particular invocation of Python can be\n\
1381 written and read by this module. The following types are supported:\n\
1382 None, integers, long integers, floating point numbers, strings, Unicode\n\
1383 objects, tuples, lists, sets, dictionaries, and code objects, where it\n\
1384 should be understood that tuples, lists and dictionaries are only\n\
1385 supported as long as the values contained therein are themselves\n\
1386 supported; and recursive lists and dictionaries should not be written\n\
1387 (they will cause infinite loops).\n\
1388 \n\
1389 Variables:\n\
1390 \n\
1391 version -- indicates the format that the module uses. Version 0 is the\n\
1392 historical format, version 1 (added in Python 2.4) shares interned\n\
1393 strings and version 2 (added in Python 2.5) uses a binary format for\n\
1394 floating point numbers. (New in version 2.4)\n\
1395 \n\
1396 Functions:\n\
1397 \n\
1398 dump() -- write value to a file\n\
1399 load() -- read value from a file\n\
1400 dumps() -- write value to a string\n\
1401 loads() -- read value from a string");
1402
1403
1404 PyMODINIT_FUNC
1405 PyMarshal_Init(void)
1406 {
1407 PyObject *mod = Py_InitModule3("marshal", marshal_methods,
1408 marshal_doc);
1409 if (mod == NULL)
1410 return;
1411 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
1412 }