blob: ca64be394821a1c17ed45d6f29f341ad1675e379 [file] [log] [blame]
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001
2/* Write Python objects to files and read them back.
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07003 This is primarily intended for writing and reading compiled Python code,
4 even though dicts, lists, sets and frozensets, not commonly seen in
5 code objects, are supported.
6 Version 3 of this protocol properly supports circular links
7 and sharing. */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00008
Thomas Wouters695934a2006-03-01 23:49:13 +00009#define PY_SSIZE_T_CLEAN
10
Guido van Rossum79f25d91997-04-29 20:08:16 +000011#include "Python.h"
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000012#include "longintrepr.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000013#include "code.h"
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000014#include "marshal.h"
15
Fred Drake6da0b912000-06-28 18:47:56 +000016/* High water mark to determine when the marshalled object is dangerously deep
17 * and risks coring the interpreter. When the object stack gets this deep,
18 * raise an exception instead of continuing.
Guido van Rossum63175a12007-08-29 20:39:13 +000019 * On Windows debug builds, reduce this value.
Fred Drake6da0b912000-06-28 18:47:56 +000020 */
Guido van Rossum63175a12007-08-29 20:39:13 +000021#if defined(MS_WINDOWS) && defined(_DEBUG)
22#define MAX_MARSHAL_STACK_DEPTH 1500
23#else
Guido van Rossumd59da4b2007-05-22 18:11:13 +000024#define MAX_MARSHAL_STACK_DEPTH 2000
Guido van Rossum63175a12007-08-29 20:39:13 +000025#endif
Fred Drake6da0b912000-06-28 18:47:56 +000026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000027#define TYPE_NULL '0'
28#define TYPE_NONE 'N'
29#define TYPE_FALSE 'F'
30#define TYPE_TRUE 'T'
31#define TYPE_STOPITER 'S'
32#define TYPE_ELLIPSIS '.'
33#define TYPE_INT 'i'
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000034#define TYPE_FLOAT 'f'
35#define TYPE_BINARY_FLOAT 'g'
36#define TYPE_COMPLEX 'x'
37#define TYPE_BINARY_COMPLEX 'y'
38#define TYPE_LONG 'l'
39#define TYPE_STRING 's'
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -070040#define TYPE_INTERNED 't'
41#define TYPE_REF 'r'
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000042#define TYPE_TUPLE '('
43#define TYPE_LIST '['
44#define TYPE_DICT '{'
45#define TYPE_CODE 'c'
46#define TYPE_UNICODE 'u'
47#define TYPE_UNKNOWN '?'
48#define TYPE_SET '<'
49#define TYPE_FROZENSET '>'
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -070050#define FLAG_REF '\x80' /* with a type, add obj to index */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000051
Antoine Pitrou1164dfc2013-10-12 22:25:39 +020052#define TYPE_ASCII 'a'
53#define TYPE_ASCII_INTERNED 'A'
54#define TYPE_SMALL_TUPLE ')'
55#define TYPE_SHORT_ASCII 'z'
56#define TYPE_SHORT_ASCII_INTERNED 'Z'
57
Eric Smithb1a03cf2009-04-21 11:57:38 +000058#define WFERR_OK 0
59#define WFERR_UNMARSHALLABLE 1
60#define WFERR_NESTEDTOODEEP 2
61#define WFERR_NOMEMORY 3
62
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000063typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 FILE *fp;
65 int error; /* see WFERR_* values */
66 int depth;
67 /* If fp == NULL, the following are valid: */
Éric Araujo6c0ba442011-07-26 17:23:57 +020068 PyObject *readable; /* Stream-like object being read from */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000069 PyObject *str;
Benjamin Peterson43b06862011-05-27 09:08:01 -050070 PyObject *current_filename;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000071 char *ptr;
72 char *end;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +020073 char *buf;
74 Py_ssize_t buf_size;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -070075 PyObject *refs; /* dict on marshal, list on unmarshal */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000076 int version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000077} WFILE;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000078
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000079#define w_byte(c, p) if (((p)->fp)) putc((c), (p)->fp); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000080 else if ((p)->ptr != (p)->end) *(p)->ptr++ = (c); \
Victor Stinnerda062552013-11-16 00:13:29 +010081 else w_more((c), p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000082
83static void
Antoine Pitroub30f2712013-10-12 23:14:47 +020084w_more(char c, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000085{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000086 Py_ssize_t size, newsize;
87 if (p->str == NULL)
88 return; /* An error already occurred */
89 size = PyBytes_Size(p->str);
90 newsize = size + size + 1024;
91 if (newsize > 32*1024*1024) {
92 newsize = size + (size >> 3); /* 12.5% overallocation */
93 }
94 if (_PyBytes_Resize(&p->str, newsize) != 0) {
95 p->ptr = p->end = NULL;
96 }
97 else {
98 p->ptr = PyBytes_AS_STRING((PyBytesObject *)p->str) + size;
99 p->end =
100 PyBytes_AS_STRING((PyBytesObject *)p->str) + newsize;
Antoine Pitroub30f2712013-10-12 23:14:47 +0200101 *p->ptr++ = c;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000102 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000103}
104
105static void
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300106w_string(const char *s, Py_ssize_t n, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000107{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000108 if (p->fp != NULL) {
109 fwrite(s, 1, n, p->fp);
110 }
111 else {
112 while (--n >= 0) {
113 w_byte(*s, p);
114 s++;
115 }
116 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000117}
118
119static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000120w_short(int x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000122 w_byte((char)( x & 0xff), p);
123 w_byte((char)((x>> 8) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000124}
125
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000126static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000127w_long(long x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000128{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000129 w_byte((char)( x & 0xff), p);
130 w_byte((char)((x>> 8) & 0xff), p);
131 w_byte((char)((x>>16) & 0xff), p);
132 w_byte((char)((x>>24) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000133}
134
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200135#define SIZE32_MAX 0x7FFFFFFF
136
137#if SIZEOF_SIZE_T > 4
138# define W_SIZE(n, p) do { \
139 if ((n) > SIZE32_MAX) { \
140 (p)->depth--; \
141 (p)->error = WFERR_UNMARSHALLABLE; \
142 return; \
143 } \
144 w_long((long)(n), p); \
145 } while(0)
146#else
147# define W_SIZE w_long
148#endif
149
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300150static void
151w_pstring(const char *s, Py_ssize_t n, WFILE *p)
152{
153 W_SIZE(n, p);
154 w_string(s, n, p);
155}
156
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200157static void
158w_short_pstring(const char *s, Py_ssize_t n, WFILE *p)
159{
Antoine Pitroub30f2712013-10-12 23:14:47 +0200160 w_byte(Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char), p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200161 w_string(s, n, p);
162}
163
Serhiy Storchaka95949422013-08-27 19:40:23 +0300164/* We assume that Python ints are stored internally in base some power of
Mark Dickinsonbd792642009-03-18 20:06:12 +0000165 2**15; for the sake of portability we'll always read and write them in base
166 exactly 2**15. */
167
168#define PyLong_MARSHAL_SHIFT 15
169#define PyLong_MARSHAL_BASE ((short)1 << PyLong_MARSHAL_SHIFT)
170#define PyLong_MARSHAL_MASK (PyLong_MARSHAL_BASE - 1)
171#if PyLong_SHIFT % PyLong_MARSHAL_SHIFT != 0
172#error "PyLong_SHIFT must be a multiple of PyLong_MARSHAL_SHIFT"
173#endif
174#define PyLong_MARSHAL_RATIO (PyLong_SHIFT / PyLong_MARSHAL_SHIFT)
175
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700176#define W_TYPE(t, p) do { \
177 w_byte((t) | flag, (p)); \
178} while(0)
179
Mark Dickinsonbd792642009-03-18 20:06:12 +0000180static void
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700181w_PyLong(const PyLongObject *ob, char flag, WFILE *p)
Mark Dickinsonbd792642009-03-18 20:06:12 +0000182{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000183 Py_ssize_t i, j, n, l;
184 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000185
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700186 W_TYPE(TYPE_LONG, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000187 if (Py_SIZE(ob) == 0) {
188 w_long((long)0, p);
189 return;
190 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000192 /* set l to number of base PyLong_MARSHAL_BASE digits */
Victor Stinner45e8e2f2014-05-14 17:24:35 +0200193 n = Py_ABS(Py_SIZE(ob));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000194 l = (n-1) * PyLong_MARSHAL_RATIO;
195 d = ob->ob_digit[n-1];
196 assert(d != 0); /* a PyLong is always normalized */
197 do {
198 d >>= PyLong_MARSHAL_SHIFT;
199 l++;
200 } while (d != 0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200201 if (l > SIZE32_MAX) {
202 p->depth--;
203 p->error = WFERR_UNMARSHALLABLE;
204 return;
205 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000206 w_long((long)(Py_SIZE(ob) > 0 ? l : -l), p);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000207
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000208 for (i=0; i < n-1; i++) {
209 d = ob->ob_digit[i];
210 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
211 w_short(d & PyLong_MARSHAL_MASK, p);
212 d >>= PyLong_MARSHAL_SHIFT;
213 }
214 assert (d == 0);
215 }
216 d = ob->ob_digit[n-1];
217 do {
218 w_short(d & PyLong_MARSHAL_MASK, p);
219 d >>= PyLong_MARSHAL_SHIFT;
220 } while (d != 0);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000221}
222
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700223static int
224w_ref(PyObject *v, char *flag, WFILE *p)
225{
226 PyObject *id;
227 PyObject *idx;
228
229 if (p->version < 3 || p->refs == NULL)
230 return 0; /* not writing object references */
231
232 /* if it has only one reference, it definitely isn't shared */
233 if (Py_REFCNT(v) == 1)
234 return 0;
235
236 id = PyLong_FromVoidPtr((void*)v);
237 if (id == NULL)
238 goto err;
239 idx = PyDict_GetItem(p->refs, id);
240 if (idx != NULL) {
241 /* write the reference index to the stream */
242 long w = PyLong_AsLong(idx);
243 Py_DECREF(id);
244 if (w == -1 && PyErr_Occurred()) {
245 goto err;
246 }
247 /* we don't store "long" indices in the dict */
248 assert(0 <= w && w <= 0x7fffffff);
249 w_byte(TYPE_REF, p);
250 w_long(w, p);
251 return 1;
252 } else {
253 int ok;
254 Py_ssize_t s = PyDict_Size(p->refs);
255 /* we don't support long indices */
256 if (s >= 0x7fffffff) {
257 PyErr_SetString(PyExc_ValueError, "too many objects");
258 goto err;
259 }
260 idx = PyLong_FromSsize_t(s);
261 ok = idx && PyDict_SetItem(p->refs, id, idx) == 0;
262 Py_DECREF(id);
263 Py_XDECREF(idx);
264 if (!ok)
265 goto err;
266 *flag |= FLAG_REF;
267 return 0;
268 }
269err:
270 p->error = WFERR_UNMARSHALLABLE;
271 return 1;
272}
273
274static void
275w_complex_object(PyObject *v, char flag, WFILE *p);
276
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000277static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000278w_object(PyObject *v, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000279{
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700280 char flag = '\0';
Fred Drake6da0b912000-06-28 18:47:56 +0000281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000282 p->depth++;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000284 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
285 p->error = WFERR_NESTEDTOODEEP;
286 }
287 else if (v == NULL) {
288 w_byte(TYPE_NULL, p);
289 }
290 else if (v == Py_None) {
291 w_byte(TYPE_NONE, p);
292 }
293 else if (v == PyExc_StopIteration) {
294 w_byte(TYPE_STOPITER, p);
295 }
296 else if (v == Py_Ellipsis) {
297 w_byte(TYPE_ELLIPSIS, p);
298 }
299 else if (v == Py_False) {
300 w_byte(TYPE_FALSE, p);
301 }
302 else if (v == Py_True) {
303 w_byte(TYPE_TRUE, p);
304 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700305 else if (!w_ref(v, &flag, p))
306 w_complex_object(v, flag, p);
307
308 p->depth--;
309}
310
311static void
312w_complex_object(PyObject *v, char flag, WFILE *p)
313{
314 Py_ssize_t i, n;
315
316 if (PyLong_CheckExact(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000317 long x = PyLong_AsLong(v);
318 if ((x == -1) && PyErr_Occurred()) {
319 PyLongObject *ob = (PyLongObject *)v;
320 PyErr_Clear();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700321 w_PyLong(ob, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000322 }
323 else {
Guido van Rossumc1547d91996-12-10 15:39:04 +0000324#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000325 long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
326 if (y && y != -1) {
Martin v. Löwis7e395722012-07-28 19:44:05 +0200327 /* Too large for TYPE_INT */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700328 w_PyLong((PyLongObject*)v, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000329 }
330 else
Guido van Rossumc1547d91996-12-10 15:39:04 +0000331#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000332 {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700333 W_TYPE(TYPE_INT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 w_long(x, p);
335 }
336 }
337 }
338 else if (PyFloat_CheckExact(v)) {
339 if (p->version > 1) {
340 unsigned char buf[8];
341 if (_PyFloat_Pack8(PyFloat_AsDouble(v),
342 buf, 1) < 0) {
343 p->error = WFERR_UNMARSHALLABLE;
344 return;
345 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700346 W_TYPE(TYPE_BINARY_FLOAT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000347 w_string((char*)buf, 8, p);
348 }
349 else {
350 char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
351 'g', 17, 0, NULL);
352 if (!buf) {
353 p->error = WFERR_NOMEMORY;
354 return;
355 }
356 n = strlen(buf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700357 W_TYPE(TYPE_FLOAT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000358 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200359 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000360 PyMem_Free(buf);
361 }
362 }
363 else if (PyComplex_CheckExact(v)) {
364 if (p->version > 1) {
365 unsigned char buf[8];
366 if (_PyFloat_Pack8(PyComplex_RealAsDouble(v),
367 buf, 1) < 0) {
368 p->error = WFERR_UNMARSHALLABLE;
369 return;
370 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700371 W_TYPE(TYPE_BINARY_COMPLEX, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000372 w_string((char*)buf, 8, p);
373 if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v),
374 buf, 1) < 0) {
375 p->error = WFERR_UNMARSHALLABLE;
376 return;
377 }
378 w_string((char*)buf, 8, p);
379 }
380 else {
381 char *buf;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700382 W_TYPE(TYPE_COMPLEX, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000383 buf = PyOS_double_to_string(PyComplex_RealAsDouble(v),
384 'g', 17, 0, NULL);
385 if (!buf) {
386 p->error = WFERR_NOMEMORY;
387 return;
388 }
389 n = strlen(buf);
390 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200391 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000392 PyMem_Free(buf);
393 buf = PyOS_double_to_string(PyComplex_ImagAsDouble(v),
394 'g', 17, 0, NULL);
395 if (!buf) {
396 p->error = WFERR_NOMEMORY;
397 return;
398 }
399 n = strlen(buf);
400 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200401 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000402 PyMem_Free(buf);
403 }
404 }
405 else if (PyBytes_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700406 W_TYPE(TYPE_STRING, p);
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300407 w_pstring(PyBytes_AS_STRING(v), PyBytes_GET_SIZE(v), p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000408 }
409 else if (PyUnicode_CheckExact(v)) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200410 if (p->version >= 4 && PyUnicode_IS_ASCII(v)) {
411 int is_short = PyUnicode_GET_LENGTH(v) < 256;
412 if (is_short) {
413 if (PyUnicode_CHECK_INTERNED(v))
414 W_TYPE(TYPE_SHORT_ASCII_INTERNED, p);
415 else
416 W_TYPE(TYPE_SHORT_ASCII, p);
417 w_short_pstring((char *) PyUnicode_1BYTE_DATA(v),
418 PyUnicode_GET_LENGTH(v), p);
419 }
420 else {
421 if (PyUnicode_CHECK_INTERNED(v))
422 W_TYPE(TYPE_ASCII_INTERNED, p);
423 else
424 W_TYPE(TYPE_ASCII, p);
425 w_pstring((char *) PyUnicode_1BYTE_DATA(v),
426 PyUnicode_GET_LENGTH(v), p);
427 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000428 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200429 else {
430 PyObject *utf8;
431 utf8 = PyUnicode_AsEncodedString(v, "utf8", "surrogatepass");
432 if (utf8 == NULL) {
433 p->depth--;
434 p->error = WFERR_UNMARSHALLABLE;
435 return;
436 }
437 if (p->version >= 3 && PyUnicode_CHECK_INTERNED(v))
438 W_TYPE(TYPE_INTERNED, p);
439 else
440 W_TYPE(TYPE_UNICODE, p);
441 w_pstring(PyBytes_AS_STRING(utf8), PyBytes_GET_SIZE(utf8), p);
442 Py_DECREF(utf8);
443 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000444 }
445 else if (PyTuple_CheckExact(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000446 n = PyTuple_Size(v);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200447 if (p->version >= 4 && n < 256) {
448 W_TYPE(TYPE_SMALL_TUPLE, p);
Victor Stinnerda062552013-11-16 00:13:29 +0100449 w_byte((unsigned char)n, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200450 }
451 else {
452 W_TYPE(TYPE_TUPLE, p);
453 W_SIZE(n, p);
454 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000455 for (i = 0; i < n; i++) {
456 w_object(PyTuple_GET_ITEM(v, i), p);
457 }
458 }
459 else if (PyList_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700460 W_TYPE(TYPE_LIST, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000461 n = PyList_GET_SIZE(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200462 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000463 for (i = 0; i < n; i++) {
464 w_object(PyList_GET_ITEM(v, i), p);
465 }
466 }
467 else if (PyDict_CheckExact(v)) {
468 Py_ssize_t pos;
469 PyObject *key, *value;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700470 W_TYPE(TYPE_DICT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000471 /* This one is NULL object terminated! */
472 pos = 0;
473 while (PyDict_Next(v, &pos, &key, &value)) {
474 w_object(key, p);
475 w_object(value, p);
476 }
477 w_object((PyObject *)NULL, p);
478 }
479 else if (PyAnySet_CheckExact(v)) {
480 PyObject *value, *it;
Raymond Hettingera422c342005-01-11 03:03:27 +0000481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000482 if (PyObject_TypeCheck(v, &PySet_Type))
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700483 W_TYPE(TYPE_SET, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 else
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700485 W_TYPE(TYPE_FROZENSET, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 n = PyObject_Size(v);
487 if (n == -1) {
488 p->depth--;
489 p->error = WFERR_UNMARSHALLABLE;
490 return;
491 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200492 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 it = PyObject_GetIter(v);
494 if (it == NULL) {
495 p->depth--;
496 p->error = WFERR_UNMARSHALLABLE;
497 return;
498 }
499 while ((value = PyIter_Next(it)) != NULL) {
500 w_object(value, p);
501 Py_DECREF(value);
502 }
503 Py_DECREF(it);
504 if (PyErr_Occurred()) {
505 p->depth--;
506 p->error = WFERR_UNMARSHALLABLE;
507 return;
508 }
509 }
510 else if (PyCode_Check(v)) {
511 PyCodeObject *co = (PyCodeObject *)v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700512 W_TYPE(TYPE_CODE, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 w_long(co->co_argcount, p);
514 w_long(co->co_kwonlyargcount, p);
515 w_long(co->co_nlocals, p);
516 w_long(co->co_stacksize, p);
517 w_long(co->co_flags, p);
518 w_object(co->co_code, p);
519 w_object(co->co_consts, p);
520 w_object(co->co_names, p);
521 w_object(co->co_varnames, p);
522 w_object(co->co_freevars, p);
523 w_object(co->co_cellvars, p);
524 w_object(co->co_filename, p);
525 w_object(co->co_name, p);
526 w_long(co->co_firstlineno, p);
527 w_object(co->co_lnotab, p);
528 }
529 else if (PyObject_CheckBuffer(v)) {
530 /* Write unknown buffer-style objects as a string */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 Py_buffer view;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100532 if (PyObject_GetBuffer(v, &view, PyBUF_SIMPLE) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 w_byte(TYPE_UNKNOWN, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100534 p->depth--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 p->error = WFERR_UNMARSHALLABLE;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100536 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700538 W_TYPE(TYPE_STRING, p);
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300539 w_pstring(view.buf, view.len, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100540 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000541 }
542 else {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700543 W_TYPE(TYPE_UNKNOWN, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000544 p->error = WFERR_UNMARSHALLABLE;
545 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000546}
547
Serhiy Storchaka95949422013-08-27 19:40:23 +0300548/* version currently has no effect for writing ints. */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000549void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000550PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000551{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 WFILE wf;
553 wf.fp = fp;
554 wf.error = WFERR_OK;
555 wf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700556 wf.refs = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 wf.version = version;
558 w_long(x, &wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000559}
560
561void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000562PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000563{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 WFILE wf;
565 wf.fp = fp;
566 wf.error = WFERR_OK;
567 wf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700568 if (version >= 3) {
569 if ((wf.refs = PyDict_New()) == NULL)
570 return; /* caller mush check PyErr_Occurred() */
571 } else
572 wf.refs = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 wf.version = version;
574 w_object(x, &wf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700575 Py_XDECREF(wf.refs);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000576}
577
578typedef WFILE RFILE; /* Same struct with different invariants */
579
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200580static char *
581r_string(Py_ssize_t n, RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000582{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200583 Py_ssize_t read = -1;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100584
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200585 if (p->ptr != NULL) {
586 /* Fast path for loads() */
587 char *res = p->ptr;
588 Py_ssize_t left = p->end - p->ptr;
589 if (left < n) {
590 PyErr_SetString(PyExc_EOFError,
591 "marshal data too short");
592 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100593 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200594 p->ptr += n;
595 return res;
596 }
597 if (p->buf == NULL) {
598 p->buf = PyMem_MALLOC(n);
599 if (p->buf == NULL) {
600 PyErr_NoMemory();
601 return NULL;
602 }
603 p->buf_size = n;
604 }
605 else if (p->buf_size < n) {
606 p->buf = PyMem_REALLOC(p->buf, n);
607 if (p->buf == NULL) {
608 PyErr_NoMemory();
609 return NULL;
610 }
611 p->buf_size = n;
612 }
Victor Stinner763b0d12013-10-31 16:56:38 +0100613
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200614 if (!p->readable) {
615 assert(p->fp != NULL);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200616 read = fread(p->buf, 1, n, p->fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100617 }
618 else {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200619 _Py_IDENTIFIER(readinto);
620 PyObject *res, *mview;
621 Py_buffer buf;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200622
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200623 if (PyBuffer_FillInfo(&buf, NULL, p->buf, n, 0, PyBUF_CONTIG) == -1)
624 return NULL;
625 mview = PyMemoryView_FromBuffer(&buf);
626 if (mview == NULL)
627 return NULL;
628
629 res = _PyObject_CallMethodId(p->readable, &PyId_readinto, "N", mview);
630 if (res != NULL) {
631 read = PyNumber_AsSsize_t(res, PyExc_ValueError);
632 Py_DECREF(res);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100633 }
634 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200635 if (read != n) {
636 if (!PyErr_Occurred()) {
637 if (read > n)
638 PyErr_Format(PyExc_ValueError,
639 "read() returned too much data: "
640 "%zd bytes requested, %zd returned",
641 n, read);
642 else
643 PyErr_SetString(PyExc_EOFError,
644 "EOF read where not expected");
645 }
646 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100647 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200648 return p->buf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100649}
650
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100651static int
652r_byte(RFILE *p)
653{
654 int c = EOF;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100655
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200656 if (p->ptr != NULL) {
657 if (p->ptr < p->end)
658 c = (unsigned char) *p->ptr++;
659 return c;
660 }
661 if (!p->readable) {
662 assert(p->fp);
663 c = getc(p->fp);
664 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100665 else {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200666 char *ptr = r_string(1, p);
667 if (ptr != NULL)
668 c = *(unsigned char *) ptr;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100669 }
670 return c;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000671}
672
673static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000674r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000675{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200676 short x = -1;
677 unsigned char *buffer;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100678
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200679 buffer = (unsigned char *) r_string(2, p);
680 if (buffer != NULL) {
681 x = buffer[0];
682 x |= buffer[1] << 8;
683 /* Sign-extension, in case short greater than 16 bits */
684 x |= -(x & 0x8000);
685 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 return x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000687}
688
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000689static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000690r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000691{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200692 long x = -1;
693 unsigned char *buffer;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100694
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200695 buffer = (unsigned char *) r_string(4, p);
696 if (buffer != NULL) {
697 x = buffer[0];
698 x |= (long)buffer[1] << 8;
699 x |= (long)buffer[2] << 16;
700 x |= (long)buffer[3] << 24;
Guido van Rossumc1547d91996-12-10 15:39:04 +0000701#if SIZEOF_LONG > 4
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200702 /* Sign extension for 64-bit machines */
703 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000704#endif
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200705 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 return x;
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000707}
708
Guido van Rossum79f25d91997-04-29 20:08:16 +0000709static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000710r_PyLong(RFILE *p)
711{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 PyLongObject *ob;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200713 long n, size, i;
714 int j, md, shorts_in_top_digit;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100718 if (PyErr_Occurred())
719 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000720 if (n == 0)
721 return (PyObject *)_PyLong_New(0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200722 if (n < -SIZE32_MAX || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 PyErr_SetString(PyExc_ValueError,
724 "bad marshal data (long size out of range)");
725 return NULL;
726 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000727
Victor Stinner45e8e2f2014-05-14 17:24:35 +0200728 size = 1 + (Py_ABS(n) - 1) / PyLong_MARSHAL_RATIO;
729 shorts_in_top_digit = 1 + (Py_ABS(n) - 1) % PyLong_MARSHAL_RATIO;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 ob = _PyLong_New(size);
731 if (ob == NULL)
732 return NULL;
Victor Stinner763b0d12013-10-31 16:56:38 +0100733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 Py_SIZE(ob) = n > 0 ? size : -size;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000736 for (i = 0; i < size-1; i++) {
737 d = 0;
738 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
739 md = r_short(p);
Victor Stinner763b0d12013-10-31 16:56:38 +0100740 if (PyErr_Occurred()) {
741 Py_DECREF(ob);
742 return NULL;
743 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000744 if (md < 0 || md > PyLong_MARSHAL_BASE)
745 goto bad_digit;
746 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
747 }
748 ob->ob_digit[i] = d;
749 }
Victor Stinner763b0d12013-10-31 16:56:38 +0100750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000751 d = 0;
752 for (j=0; j < shorts_in_top_digit; j++) {
753 md = r_short(p);
Victor Stinner763b0d12013-10-31 16:56:38 +0100754 if (PyErr_Occurred()) {
755 Py_DECREF(ob);
756 return NULL;
757 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000758 if (md < 0 || md > PyLong_MARSHAL_BASE)
759 goto bad_digit;
760 /* topmost marshal digit should be nonzero */
761 if (md == 0 && j == shorts_in_top_digit - 1) {
762 Py_DECREF(ob);
763 PyErr_SetString(PyExc_ValueError,
764 "bad marshal data (unnormalized long data)");
765 return NULL;
766 }
767 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
768 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100769 if (PyErr_Occurred()) {
770 Py_DECREF(ob);
771 return NULL;
772 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 /* top digit should be nonzero, else the resulting PyLong won't be
774 normalized */
775 ob->ob_digit[size-1] = d;
776 return (PyObject *)ob;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000777 bad_digit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 Py_DECREF(ob);
779 PyErr_SetString(PyExc_ValueError,
780 "bad marshal data (digit out of range in long)");
781 return NULL;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000782}
783
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700784/* allocate the reflist index for a new object. Return -1 on failure */
785static Py_ssize_t
786r_ref_reserve(int flag, RFILE *p)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700787{
788 if (flag) { /* currently only FLAG_REF is defined */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200789 Py_ssize_t idx = PyList_GET_SIZE(p->refs);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700790 if (idx >= 0x7ffffffe) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700791 PyErr_SetString(PyExc_ValueError, "bad marshal data (index list too large)");
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700792 return -1;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700793 }
794 if (PyList_Append(p->refs, Py_None) < 0)
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700795 return -1;
796 return idx;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700797 } else
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700798 return 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700799}
800
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700801/* insert the new object 'o' to the reflist at previously
802 * allocated index 'idx'.
803 * 'o' can be NULL, in which case nothing is done.
804 * if 'o' was non-NULL, and the function succeeds, 'o' is returned.
805 * if 'o' was non-NULL, and the function fails, 'o' is released and
806 * NULL returned. This simplifies error checking at the call site since
807 * a single test for NULL for the function result is enough.
808 */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700809static PyObject *
810r_ref_insert(PyObject *o, Py_ssize_t idx, int flag, RFILE *p)
811{
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700812 if (o != NULL && flag) { /* currently only FLAG_REF is defined */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200813 PyObject *tmp = PyList_GET_ITEM(p->refs, idx);
814 Py_INCREF(o);
815 PyList_SET_ITEM(p->refs, idx, o);
816 Py_DECREF(tmp);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700817 }
818 return o;
819}
820
821/* combination of both above, used when an object can be
822 * created whenever it is seen in the file, as opposed to
823 * after having loaded its sub-objects.
824 */
825static PyObject *
826r_ref(PyObject *o, int flag, RFILE *p)
827{
Victor Stinner359fabc2013-10-31 17:09:01 +0100828 assert(flag & FLAG_REF);
829 if (o == NULL)
830 return NULL;
831 if (PyList_Append(p->refs, o) < 0) {
832 Py_DECREF(o); /* release the new object */
833 return NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700834 }
835 return o;
836}
Mark Dickinsonbd792642009-03-18 20:06:12 +0000837
838static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000839r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000840{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 /* NULL is a valid return value, it does not necessarily means that
842 an exception is set. */
843 PyObject *v, *v2;
Benjamin Petersoneddb0a72013-03-20 00:40:07 -0500844 Py_ssize_t idx = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 long i, n;
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700846 int type, code = r_byte(p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200847 int flag, is_interned = 0;
Christian Heimes35728422013-10-13 02:29:06 +0200848 PyObject *retval = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000849
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700850 if (code == EOF) {
851 PyErr_SetString(PyExc_EOFError,
852 "EOF read where object expected");
853 return NULL;
854 }
855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
859 p->depth--;
860 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
861 return NULL;
862 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000863
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700864 flag = code & FLAG_REF;
865 type = code & ~FLAG_REF;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700866
867#define R_REF(O) do{\
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700868 if (flag) \
869 O = r_ref(O, flag, p);\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700870} while (0)
871
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 case TYPE_NULL:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000875 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 case TYPE_NONE:
878 Py_INCREF(Py_None);
879 retval = Py_None;
880 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882 case TYPE_STOPITER:
883 Py_INCREF(PyExc_StopIteration);
884 retval = PyExc_StopIteration;
885 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 case TYPE_ELLIPSIS:
888 Py_INCREF(Py_Ellipsis);
889 retval = Py_Ellipsis;
890 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000891
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000892 case TYPE_FALSE:
893 Py_INCREF(Py_False);
894 retval = Py_False;
895 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000896
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 case TYPE_TRUE:
898 Py_INCREF(Py_True);
899 retval = Py_True;
900 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 case TYPE_INT:
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100903 n = r_long(p);
904 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700905 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 case TYPE_LONG:
909 retval = r_PyLong(p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700910 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 case TYPE_FLOAT:
914 {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200915 char buf[256], *ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 double dx;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300918 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000919 PyErr_SetString(PyExc_EOFError,
920 "EOF read where object expected");
921 break;
922 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200923 ptr = r_string(n, p);
924 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300925 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200926 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000927 buf[n] = '\0';
928 dx = PyOS_string_to_double(buf, NULL, NULL);
929 if (dx == -1.0 && PyErr_Occurred())
930 break;
931 retval = PyFloat_FromDouble(dx);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700932 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 break;
934 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000935
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 case TYPE_BINARY_FLOAT:
937 {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200938 unsigned char *buf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000939 double x;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200940 buf = (unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +0000941 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000943 x = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +0000944 if (x == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 retval = PyFloat_FromDouble(x);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700947 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000948 break;
949 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000951 case TYPE_COMPLEX:
952 {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200953 char buf[256], *ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 Py_complex c;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000955 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300956 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 PyErr_SetString(PyExc_EOFError,
958 "EOF read where object expected");
959 break;
960 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200961 ptr = r_string(n, p);
962 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300963 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200964 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 buf[n] = '\0';
966 c.real = PyOS_string_to_double(buf, NULL, NULL);
967 if (c.real == -1.0 && PyErr_Occurred())
968 break;
969 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300970 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971 PyErr_SetString(PyExc_EOFError,
972 "EOF read where object expected");
973 break;
974 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200975 ptr = r_string(n, p);
976 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300977 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200978 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 buf[n] = '\0';
980 c.imag = PyOS_string_to_double(buf, NULL, NULL);
981 if (c.imag == -1.0 && PyErr_Occurred())
982 break;
983 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700984 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 break;
986 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 case TYPE_BINARY_COMPLEX:
989 {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200990 unsigned char *buf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000991 Py_complex c;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200992 buf = (unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +0000993 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000994 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 c.real = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +0000996 if (c.real == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200998 buf = (unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +0000999 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 c.imag = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001002 if (c.imag == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001004 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001005 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 break;
1007 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 case TYPE_STRING:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001010 {
1011 char *ptr;
1012 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001013 if (PyErr_Occurred())
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001014 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001015 if (n < 0 || n > SIZE32_MAX) {
1016 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001017 break;
1018 }
1019 v = PyBytes_FromStringAndSize((char *)NULL, n);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001020 if (v == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001021 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001022 ptr = r_string(n, p);
1023 if (ptr == NULL) {
1024 Py_DECREF(v);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001025 break;
1026 }
1027 memcpy(PyBytes_AS_STRING(v), ptr, n);
1028 retval = v;
1029 R_REF(retval);
1030 break;
1031 }
1032
1033 case TYPE_ASCII_INTERNED:
1034 is_interned = 1;
1035 case TYPE_ASCII:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001037 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001038 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001039 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001040 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001041 break;
1042 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001043 goto _read_ascii;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001044
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001045 case TYPE_SHORT_ASCII_INTERNED:
1046 is_interned = 1;
1047 case TYPE_SHORT_ASCII:
1048 n = r_byte(p);
1049 if (n == EOF) {
1050 PyErr_SetString(PyExc_EOFError,
1051 "EOF read where object expected");
1052 break;
1053 }
1054 _read_ascii:
1055 {
1056 char *ptr;
1057 ptr = r_string(n, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001058 if (ptr == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001059 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001060 v = PyUnicode_FromKindAndData(PyUnicode_1BYTE_KIND, ptr, n);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001061 if (v == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001062 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001063 if (is_interned)
1064 PyUnicode_InternInPlace(&v);
1065 retval = v;
1066 R_REF(retval);
1067 break;
1068 }
1069
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001070 case TYPE_INTERNED:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001071 is_interned = 1;
1072 case TYPE_UNICODE:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 {
1074 char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +00001075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001076 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001077 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001078 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001079 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 break;
1082 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001083 if (n != 0) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001084 buffer = r_string(n, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001085 if (buffer == NULL)
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001086 break;
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001087 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001089 else {
1090 v = PyUnicode_New(0, 0);
1091 }
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001092 if (v == NULL)
Victor Stinner3a8b79d2013-07-08 22:23:32 +02001093 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001094 if (is_interned)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001095 PyUnicode_InternInPlace(&v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001096 retval = v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001097 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001098 break;
1099 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001100
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001101 case TYPE_SMALL_TUPLE:
1102 n = (unsigned char) r_byte(p);
Victor Stinnerb1b7b182013-10-31 17:07:08 +01001103 if (PyErr_Occurred())
1104 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001105 goto _read_tuple;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 case TYPE_TUPLE:
1107 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001108 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001109 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001110 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 break;
1113 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001114 _read_tuple:
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001115 v = PyTuple_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001116 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001117 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 break;
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 for (i = 0; i < n; i++) {
1121 v2 = r_object(p);
1122 if ( v2 == NULL ) {
1123 if (!PyErr_Occurred())
1124 PyErr_SetString(PyExc_TypeError,
1125 "NULL object in marshal data for tuple");
1126 Py_DECREF(v);
1127 v = NULL;
1128 break;
1129 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001130 PyTuple_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001131 }
1132 retval = v;
1133 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 case TYPE_LIST:
1136 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001137 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001138 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001139 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 break;
1142 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001143 v = PyList_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001144 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001145 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 for (i = 0; i < n; i++) {
1148 v2 = r_object(p);
1149 if ( v2 == NULL ) {
1150 if (!PyErr_Occurred())
1151 PyErr_SetString(PyExc_TypeError,
1152 "NULL object in marshal data for list");
1153 Py_DECREF(v);
1154 v = NULL;
1155 break;
1156 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001157 PyList_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001158 }
1159 retval = v;
1160 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001161
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 case TYPE_DICT:
1163 v = PyDict_New();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001164 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001165 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 for (;;) {
1168 PyObject *key, *val;
1169 key = r_object(p);
1170 if (key == NULL)
1171 break;
1172 val = r_object(p);
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001173 if (val == NULL) {
1174 Py_DECREF(key);
1175 break;
1176 }
1177 if (PyDict_SetItem(v, key, val) < 0) {
1178 Py_DECREF(key);
1179 Py_DECREF(val);
1180 break;
1181 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001182 Py_DECREF(key);
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001183 Py_DECREF(val);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 }
1185 if (PyErr_Occurred()) {
1186 Py_DECREF(v);
1187 v = NULL;
1188 }
1189 retval = v;
1190 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001192 case TYPE_SET:
1193 case TYPE_FROZENSET:
1194 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001195 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001196 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001197 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001198 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 break;
1200 }
1201 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001202 if (type == TYPE_SET) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001203 R_REF(v);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001204 } else {
1205 /* must use delayed registration of frozensets because they must
1206 * be init with a refcount of 1
1207 */
1208 idx = r_ref_reserve(flag, p);
1209 if (idx < 0)
1210 Py_CLEAR(v); /* signal error */
1211 }
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001212 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 break;
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001215 for (i = 0; i < n; i++) {
1216 v2 = r_object(p);
1217 if ( v2 == NULL ) {
1218 if (!PyErr_Occurred())
1219 PyErr_SetString(PyExc_TypeError,
1220 "NULL object in marshal data for set");
1221 Py_DECREF(v);
1222 v = NULL;
1223 break;
1224 }
1225 if (PySet_Add(v, v2) == -1) {
1226 Py_DECREF(v);
1227 Py_DECREF(v2);
1228 v = NULL;
1229 break;
1230 }
1231 Py_DECREF(v2);
1232 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001233 if (type != TYPE_SET)
1234 v = r_ref_insert(v, idx, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 retval = v;
1236 break;
Raymond Hettingera422c342005-01-11 03:03:27 +00001237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 case TYPE_CODE:
1239 {
1240 int argcount;
1241 int kwonlyargcount;
1242 int nlocals;
1243 int stacksize;
1244 int flags;
1245 PyObject *code = NULL;
1246 PyObject *consts = NULL;
1247 PyObject *names = NULL;
1248 PyObject *varnames = NULL;
1249 PyObject *freevars = NULL;
1250 PyObject *cellvars = NULL;
1251 PyObject *filename = NULL;
1252 PyObject *name = NULL;
1253 int firstlineno;
1254 PyObject *lnotab = NULL;
Antoine Pitroue9bbe8b2013-04-13 22:41:09 +02001255
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001256 idx = r_ref_reserve(flag, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001257 if (idx < 0)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001258 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 /* XXX ignore long->int overflows for now */
1263 argcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001264 if (PyErr_Occurred())
1265 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 kwonlyargcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001267 if (PyErr_Occurred())
1268 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001269 nlocals = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001270 if (PyErr_Occurred())
1271 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 stacksize = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001273 if (PyErr_Occurred())
1274 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275 flags = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001276 if (PyErr_Occurred())
1277 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 code = r_object(p);
1279 if (code == NULL)
1280 goto code_error;
1281 consts = r_object(p);
1282 if (consts == NULL)
1283 goto code_error;
1284 names = r_object(p);
1285 if (names == NULL)
1286 goto code_error;
1287 varnames = r_object(p);
1288 if (varnames == NULL)
1289 goto code_error;
1290 freevars = r_object(p);
1291 if (freevars == NULL)
1292 goto code_error;
1293 cellvars = r_object(p);
1294 if (cellvars == NULL)
1295 goto code_error;
1296 filename = r_object(p);
1297 if (filename == NULL)
1298 goto code_error;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001299 if (PyUnicode_CheckExact(filename)) {
1300 if (p->current_filename != NULL) {
1301 if (!PyUnicode_Compare(filename, p->current_filename)) {
1302 Py_DECREF(filename);
1303 Py_INCREF(p->current_filename);
1304 filename = p->current_filename;
1305 }
1306 }
1307 else {
1308 p->current_filename = filename;
1309 }
1310 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311 name = r_object(p);
1312 if (name == NULL)
1313 goto code_error;
1314 firstlineno = (int)r_long(p);
Kristján Valur Jónsson0a7697b2013-10-13 15:19:56 +00001315 if (firstlineno == -1 && PyErr_Occurred())
1316 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 lnotab = r_object(p);
1318 if (lnotab == NULL)
1319 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 v = (PyObject *) PyCode_New(
1322 argcount, kwonlyargcount,
1323 nlocals, stacksize, flags,
1324 code, consts, names, varnames,
1325 freevars, cellvars, filename, name,
1326 firstlineno, lnotab);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001327 v = r_ref_insert(v, idx, flag, p);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 code_error:
1330 Py_XDECREF(code);
1331 Py_XDECREF(consts);
1332 Py_XDECREF(names);
1333 Py_XDECREF(varnames);
1334 Py_XDECREF(freevars);
1335 Py_XDECREF(cellvars);
1336 Py_XDECREF(filename);
1337 Py_XDECREF(name);
1338 Py_XDECREF(lnotab);
1339 }
1340 retval = v;
1341 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001342
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001343 case TYPE_REF:
1344 n = r_long(p);
1345 if (n < 0 || n >= PyList_GET_SIZE(p->refs)) {
Kristján Valur Jónsson0a7697b2013-10-13 15:19:56 +00001346 if (n == -1 && PyErr_Occurred())
1347 break;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001348 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001349 break;
1350 }
1351 v = PyList_GET_ITEM(p->refs, n);
1352 if (v == Py_None) {
1353 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001354 break;
1355 }
1356 Py_INCREF(v);
1357 retval = v;
1358 break;
1359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001360 default:
1361 /* Bogus data got written, which isn't ideal.
1362 This will let you keep working and recover. */
1363 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 break;
1365
1366 }
1367 p->depth--;
1368 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001369}
1370
Neal Norwitzd85c4522004-06-13 20:31:49 +00001371static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001372read_object(RFILE *p)
1373{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 PyObject *v;
1375 if (PyErr_Occurred()) {
1376 fprintf(stderr, "XXX readobject called with exception set\n");
1377 return NULL;
1378 }
1379 v = r_object(p);
1380 if (v == NULL && !PyErr_Occurred())
1381 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1382 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001383}
1384
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001385int
1386PyMarshal_ReadShortFromFile(FILE *fp)
1387{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001388 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001389 int res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 assert(fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001391 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 rf.fp = fp;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001393 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001394 rf.end = rf.ptr = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001395 rf.buf = NULL;
1396 res = r_short(&rf);
1397 if (rf.buf != NULL)
1398 PyMem_FREE(rf.buf);
1399 return res;
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001400}
1401
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001402long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001403PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001404{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001405 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001406 long res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001407 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001408 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001409 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001410 rf.ptr = rf.end = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001411 rf.buf = NULL;
1412 res = r_long(&rf);
1413 if (rf.buf != NULL)
1414 PyMem_FREE(rf.buf);
1415 return res;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001416}
1417
Tim Peters691e0e92001-01-18 04:39:16 +00001418#ifdef HAVE_FSTAT
1419/* Return size of file in bytes; < 0 if unknown. */
1420static off_t
1421getfilesize(FILE *fp)
1422{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 struct stat st;
1424 if (fstat(fileno(fp), &st) != 0)
1425 return -1;
1426 else
1427 return st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001428}
1429#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001430
Tim Peters691e0e92001-01-18 04:39:16 +00001431/* If we can get the size of the file up-front, and it's reasonably small,
1432 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1433 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001434 * CAUTION: since this may read the entire remainder of the file, don't
1435 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001436 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001437PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001438PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001439{
Antoine Pitrou5bc7ec92010-04-21 22:56:22 +00001440/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
Tim Peters691e0e92001-01-18 04:39:16 +00001441#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001442#ifdef HAVE_FSTAT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001443 off_t filesize;
1444 filesize = getfilesize(fp);
1445 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1446 char* pBuf = (char *)PyMem_MALLOC(filesize);
1447 if (pBuf != NULL) {
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001448 size_t n = fread(pBuf, 1, (size_t)filesize, fp);
1449 PyObject* v = PyMarshal_ReadObjectFromString(pBuf, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450 PyMem_FREE(pBuf);
1451 return v;
1452 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 }
Tim Peters691e0e92001-01-18 04:39:16 +00001455#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456 /* We don't have fstat, or we do but the file is larger than
1457 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1458 */
1459 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001460
Tim Peters691e0e92001-01-18 04:39:16 +00001461#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001462}
1463
Guido van Rossum79f25d91997-04-29 20:08:16 +00001464PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001465PyMarshal_ReadObjectFromFile(FILE *fp)
1466{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467 RFILE rf;
1468 PyObject *result;
1469 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001470 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001471 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001472 rf.depth = 0;
1473 rf.ptr = rf.end = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001474 rf.buf = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001475 rf.refs = PyList_New(0);
1476 if (rf.refs == NULL)
1477 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001478 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001479 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001480 if (rf.buf != NULL)
1481 PyMem_FREE(rf.buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001483}
1484
1485PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +03001486PyMarshal_ReadObjectFromString(const char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001487{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001488 RFILE rf;
1489 PyObject *result;
1490 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001491 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001492 rf.current_filename = NULL;
Serhiy Storchakac6792272013-10-19 21:03:34 +03001493 rf.ptr = (char *)str;
1494 rf.end = (char *)str + len;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001495 rf.buf = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001497 rf.refs = PyList_New(0);
1498 if (rf.refs == NULL)
1499 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001500 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001501 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001502 if (rf.buf != NULL)
1503 PyMem_FREE(rf.buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001504 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001505}
1506
Guido van Rossum79f25d91997-04-29 20:08:16 +00001507PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001508PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001509{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001510 WFILE wf;
Guido van Rossume6d39042007-05-09 00:01:30 +00001511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 wf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001513 wf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001514 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1515 if (wf.str == NULL)
1516 return NULL;
1517 wf.ptr = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1518 wf.end = wf.ptr + PyBytes_Size(wf.str);
1519 wf.error = WFERR_OK;
1520 wf.depth = 0;
1521 wf.version = version;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001522 if (version >= 3) {
1523 if ((wf.refs = PyDict_New()) == NULL)
1524 return NULL;
1525 } else
1526 wf.refs = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001527 w_object(x, &wf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001528 Py_XDECREF(wf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 if (wf.str != NULL) {
1530 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1531 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1532 Py_DECREF(wf.str);
1533 PyErr_SetString(PyExc_OverflowError,
1534 "too much marshal data for a string");
1535 return NULL;
1536 }
1537 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1538 return NULL;
1539 }
1540 if (wf.error != WFERR_OK) {
1541 Py_XDECREF(wf.str);
1542 if (wf.error == WFERR_NOMEMORY)
1543 PyErr_NoMemory();
1544 else
1545 PyErr_SetString(PyExc_ValueError,
1546 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1547 :"object too deeply nested to marshal");
1548 return NULL;
1549 }
Antoine Pitrou1c13f842012-03-02 18:22:23 +01001550 return wf.str;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001551}
1552
Guido van Rossum64b45521991-06-07 13:58:22 +00001553/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001554
Guido van Rossum79f25d91997-04-29 20:08:16 +00001555static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001556marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001557{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001558 /* XXX Quick hack -- need to do this differently */
1559 PyObject *x;
1560 PyObject *f;
1561 int version = Py_MARSHAL_VERSION;
1562 PyObject *s;
1563 PyObject *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001564 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
1567 return NULL;
1568 s = PyMarshal_WriteObjectToString(x, version);
1569 if (s == NULL)
1570 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001571 res = _PyObject_CallMethodId(f, &PyId_write, "O", s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001572 Py_DECREF(s);
1573 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001574}
1575
R. David Murraydd226ea2009-05-13 12:27:21 +00001576PyDoc_STRVAR(dump_doc,
1577"dump(value, file[, version])\n\
1578\n\
1579Write the value on the open file. The value must be a supported type.\n\
1580The file must be an open file object such as sys.stdout or returned by\n\
1581open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1582\n\
1583If the value has (or contains an object that has) an unsupported type, a\n\
1584ValueError exception is raised but garbage data will also be written\n\
1585to the file. The object will not be properly read back by load()\n\
1586\n\
1587The version argument indicates the data format that dump should use.");
1588
Guido van Rossum79f25d91997-04-29 20:08:16 +00001589static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001590marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001591{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 PyObject *data, *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001593 _Py_IDENTIFIER(read);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001594 RFILE rf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001595
1596 /*
1597 * Make a call to the read method, but read zero bytes.
1598 * This is to ensure that the object passed in at least
1599 * has a read method which returns bytes.
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001600 * This can be removed if we guarantee good error handling
1601 * for r_string()
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001602 */
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001603 data = _PyObject_CallMethodId(f, &PyId_read, "i", 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 if (data == NULL)
1605 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001606 if (!PyBytes_Check(data)) {
1607 PyErr_Format(PyExc_TypeError,
1608 "f.read() returned not bytes but %.100s",
1609 data->ob_type->tp_name);
1610 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001611 }
1612 else {
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001613 rf.depth = 0;
1614 rf.fp = NULL;
1615 rf.readable = f;
Vinay Sajipaac0f752011-07-02 18:42:21 +01001616 rf.current_filename = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001617 rf.ptr = rf.end = NULL;
1618 rf.buf = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001619 if ((rf.refs = PyList_New(0)) != NULL) {
1620 result = read_object(&rf);
1621 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001622 if (rf.buf != NULL)
1623 PyMem_FREE(rf.buf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001624 } else
1625 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001627 Py_DECREF(data);
1628 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001629}
1630
R. David Murraydd226ea2009-05-13 12:27:21 +00001631PyDoc_STRVAR(load_doc,
1632"load(file)\n\
1633\n\
1634Read one value from the open file and return it. If no valid value is\n\
1635read (e.g. because the data has a different Python versions\n\
1636incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1637The file must be an open file object opened in binary mode ('rb' or\n\
1638'r+b').\n\
1639\n\
1640Note: If an object containing an unsupported type was marshalled with\n\
1641dump(), load() will substitute None for the unmarshallable type.");
1642
1643
Guido van Rossum79f25d91997-04-29 20:08:16 +00001644static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001645marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001646{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001647 PyObject *x;
1648 int version = Py_MARSHAL_VERSION;
1649 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
1650 return NULL;
1651 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001652}
1653
R. David Murraydd226ea2009-05-13 12:27:21 +00001654PyDoc_STRVAR(dumps_doc,
1655"dumps(value[, version])\n\
1656\n\
1657Return the string that would be written to a file by dump(value, file).\n\
1658The value must be a supported type. Raise a ValueError exception if\n\
1659value has (or contains an object that has) an unsupported type.\n\
1660\n\
1661The version argument indicates the data format that dumps should use.");
1662
1663
Guido van Rossum79f25d91997-04-29 20:08:16 +00001664static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001665marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001666{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001667 RFILE rf;
1668 Py_buffer p;
1669 char *s;
1670 Py_ssize_t n;
1671 PyObject* result;
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001672 if (!PyArg_ParseTuple(args, "y*:loads", &p))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001673 return NULL;
1674 s = p.buf;
1675 n = p.len;
1676 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001677 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001678 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001679 rf.ptr = s;
1680 rf.end = s + n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001682 if ((rf.refs = PyList_New(0)) == NULL)
1683 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001684 result = read_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 PyBuffer_Release(&p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001686 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001688}
1689
R. David Murraydd226ea2009-05-13 12:27:21 +00001690PyDoc_STRVAR(loads_doc,
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001691"loads(bytes)\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001692\n\
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001693Convert the bytes object to a value. If no valid value is found, raise\n\
1694EOFError, ValueError or TypeError. Extra characters in the input are\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001695ignored.");
1696
Guido van Rossum79f25d91997-04-29 20:08:16 +00001697static PyMethodDef marshal_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001698 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1699 {"load", marshal_load, METH_O, load_doc},
1700 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1701 {"loads", marshal_loads, METH_VARARGS, loads_doc},
1702 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001703};
1704
R. David Murraydd226ea2009-05-13 12:27:21 +00001705
1706PyDoc_STRVAR(module_doc,
1707"This module contains functions that can read and write Python values in\n\
1708a binary format. The format is specific to Python, but independent of\n\
1709machine architecture issues.\n\
1710\n\
1711Not all Python object types are supported; in general, only objects\n\
1712whose value is independent from a particular invocation of Python can be\n\
1713written and read by this module. The following types are supported:\n\
1714None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1715tuples, lists, sets, dictionaries, and code objects, where it\n\
1716should be understood that tuples, lists and dictionaries are only\n\
1717supported as long as the values contained therein are themselves\n\
1718supported; and recursive lists and dictionaries should not be written\n\
1719(they will cause infinite loops).\n\
1720\n\
1721Variables:\n\
1722\n\
1723version -- indicates the format that the module uses. Version 0 is the\n\
1724 historical format, version 1 shares interned strings and version 2\n\
1725 uses a binary format for floating point numbers.\n\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001726 Version 3 shares common object references (New in version 3.4).\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001727\n\
1728Functions:\n\
1729\n\
1730dump() -- write value to a file\n\
1731load() -- read value from a file\n\
1732dumps() -- write value to a string\n\
1733loads() -- read value from a string");
1734
1735
1736
Brett Cannon429ef652008-06-27 00:35:35 +00001737static struct PyModuleDef marshalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001738 PyModuleDef_HEAD_INIT,
1739 "marshal",
1740 module_doc,
1741 0,
1742 marshal_methods,
1743 NULL,
1744 NULL,
1745 NULL,
1746 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001747};
1748
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001749PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001750PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001751{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 PyObject *mod = PyModule_Create(&marshalmodule);
1753 if (mod == NULL)
1754 return NULL;
1755 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
1756 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001757}