blob: e211a0f01825a50aa086a1a15e66422d449da1e4 [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
Mark Dickinsonbd792642009-03-18 20:06:12 +000016#define ABS(x) ((x) < 0 ? -(x) : (x))
17
Fred Drake6da0b912000-06-28 18:47:56 +000018/* 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.
Guido van Rossum63175a12007-08-29 20:39:13 +000021 * On Windows debug builds, reduce this value.
Fred Drake6da0b912000-06-28 18:47:56 +000022 */
Guido van Rossum63175a12007-08-29 20:39:13 +000023#if defined(MS_WINDOWS) && defined(_DEBUG)
24#define MAX_MARSHAL_STACK_DEPTH 1500
25#else
Guido van Rossumd59da4b2007-05-22 18:11:13 +000026#define MAX_MARSHAL_STACK_DEPTH 2000
Guido van Rossum63175a12007-08-29 20:39:13 +000027#endif
Fred Drake6da0b912000-06-28 18:47:56 +000028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000029#define TYPE_NULL '0'
30#define TYPE_NONE 'N'
31#define TYPE_FALSE 'F'
32#define TYPE_TRUE 'T'
33#define TYPE_STOPITER 'S'
34#define TYPE_ELLIPSIS '.'
35#define TYPE_INT 'i'
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000036#define TYPE_FLOAT 'f'
37#define TYPE_BINARY_FLOAT 'g'
38#define TYPE_COMPLEX 'x'
39#define TYPE_BINARY_COMPLEX 'y'
40#define TYPE_LONG 'l'
41#define TYPE_STRING 's'
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -070042#define TYPE_INTERNED 't'
43#define TYPE_REF 'r'
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000044#define TYPE_TUPLE '('
45#define TYPE_LIST '['
46#define TYPE_DICT '{'
47#define TYPE_CODE 'c'
48#define TYPE_UNICODE 'u'
49#define TYPE_UNKNOWN '?'
50#define TYPE_SET '<'
51#define TYPE_FROZENSET '>'
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -070052#define FLAG_REF '\x80' /* with a type, add obj to index */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000053
Antoine Pitrou1164dfc2013-10-12 22:25:39 +020054#define TYPE_ASCII 'a'
55#define TYPE_ASCII_INTERNED 'A'
56#define TYPE_SMALL_TUPLE ')'
57#define TYPE_SHORT_ASCII 'z'
58#define TYPE_SHORT_ASCII_INTERNED 'Z'
59
Eric Smithb1a03cf2009-04-21 11:57:38 +000060#define WFERR_OK 0
61#define WFERR_UNMARSHALLABLE 1
62#define WFERR_NESTEDTOODEEP 2
63#define WFERR_NOMEMORY 3
64
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000065typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000066 FILE *fp;
67 int error; /* see WFERR_* values */
68 int depth;
69 /* If fp == NULL, the following are valid: */
Éric Araujo6c0ba442011-07-26 17:23:57 +020070 PyObject *readable; /* Stream-like object being read from */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000071 PyObject *str;
Benjamin Peterson43b06862011-05-27 09:08:01 -050072 PyObject *current_filename;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000073 char *ptr;
74 char *end;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +020075 char *buf;
76 Py_ssize_t buf_size;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -070077 PyObject *refs; /* dict on marshal, list on unmarshal */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000078 int version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000079} WFILE;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000080
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000081#define w_byte(c, p) if (((p)->fp)) putc((c), (p)->fp); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000082 else if ((p)->ptr != (p)->end) *(p)->ptr++ = (c); \
83 else w_more(c, p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000084
85static void
Antoine Pitroub30f2712013-10-12 23:14:47 +020086w_more(char c, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000087{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000088 Py_ssize_t size, newsize;
89 if (p->str == NULL)
90 return; /* An error already occurred */
91 size = PyBytes_Size(p->str);
92 newsize = size + size + 1024;
93 if (newsize > 32*1024*1024) {
94 newsize = size + (size >> 3); /* 12.5% overallocation */
95 }
96 if (_PyBytes_Resize(&p->str, newsize) != 0) {
97 p->ptr = p->end = NULL;
98 }
99 else {
100 p->ptr = PyBytes_AS_STRING((PyBytesObject *)p->str) + size;
101 p->end =
102 PyBytes_AS_STRING((PyBytesObject *)p->str) + newsize;
Antoine Pitroub30f2712013-10-12 23:14:47 +0200103 *p->ptr++ = c;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000104 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000105}
106
107static void
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300108w_string(const char *s, Py_ssize_t n, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000109{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000110 if (p->fp != NULL) {
111 fwrite(s, 1, n, p->fp);
112 }
113 else {
114 while (--n >= 0) {
115 w_byte(*s, p);
116 s++;
117 }
118 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000119}
120
121static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000122w_short(int x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000123{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000124 w_byte((char)( x & 0xff), p);
125 w_byte((char)((x>> 8) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000126}
127
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000128static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000129w_long(long x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000130{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000131 w_byte((char)( x & 0xff), p);
132 w_byte((char)((x>> 8) & 0xff), p);
133 w_byte((char)((x>>16) & 0xff), p);
134 w_byte((char)((x>>24) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000135}
136
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200137#define SIZE32_MAX 0x7FFFFFFF
138
139#if SIZEOF_SIZE_T > 4
140# define W_SIZE(n, p) do { \
141 if ((n) > SIZE32_MAX) { \
142 (p)->depth--; \
143 (p)->error = WFERR_UNMARSHALLABLE; \
144 return; \
145 } \
146 w_long((long)(n), p); \
147 } while(0)
148#else
149# define W_SIZE w_long
150#endif
151
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300152static void
153w_pstring(const char *s, Py_ssize_t n, WFILE *p)
154{
155 W_SIZE(n, p);
156 w_string(s, n, p);
157}
158
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200159static void
160w_short_pstring(const char *s, Py_ssize_t n, WFILE *p)
161{
Antoine Pitroub30f2712013-10-12 23:14:47 +0200162 w_byte(Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char), p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200163 w_string(s, n, p);
164}
165
Serhiy Storchaka95949422013-08-27 19:40:23 +0300166/* We assume that Python ints are stored internally in base some power of
Mark Dickinsonbd792642009-03-18 20:06:12 +0000167 2**15; for the sake of portability we'll always read and write them in base
168 exactly 2**15. */
169
170#define PyLong_MARSHAL_SHIFT 15
171#define PyLong_MARSHAL_BASE ((short)1 << PyLong_MARSHAL_SHIFT)
172#define PyLong_MARSHAL_MASK (PyLong_MARSHAL_BASE - 1)
173#if PyLong_SHIFT % PyLong_MARSHAL_SHIFT != 0
174#error "PyLong_SHIFT must be a multiple of PyLong_MARSHAL_SHIFT"
175#endif
176#define PyLong_MARSHAL_RATIO (PyLong_SHIFT / PyLong_MARSHAL_SHIFT)
177
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700178#define W_TYPE(t, p) do { \
179 w_byte((t) | flag, (p)); \
180} while(0)
181
Mark Dickinsonbd792642009-03-18 20:06:12 +0000182static void
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700183w_PyLong(const PyLongObject *ob, char flag, WFILE *p)
Mark Dickinsonbd792642009-03-18 20:06:12 +0000184{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000185 Py_ssize_t i, j, n, l;
186 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000187
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700188 W_TYPE(TYPE_LONG, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000189 if (Py_SIZE(ob) == 0) {
190 w_long((long)0, p);
191 return;
192 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000194 /* set l to number of base PyLong_MARSHAL_BASE digits */
195 n = ABS(Py_SIZE(ob));
196 l = (n-1) * PyLong_MARSHAL_RATIO;
197 d = ob->ob_digit[n-1];
198 assert(d != 0); /* a PyLong is always normalized */
199 do {
200 d >>= PyLong_MARSHAL_SHIFT;
201 l++;
202 } while (d != 0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200203 if (l > SIZE32_MAX) {
204 p->depth--;
205 p->error = WFERR_UNMARSHALLABLE;
206 return;
207 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000208 w_long((long)(Py_SIZE(ob) > 0 ? l : -l), p);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000210 for (i=0; i < n-1; i++) {
211 d = ob->ob_digit[i];
212 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
213 w_short(d & PyLong_MARSHAL_MASK, p);
214 d >>= PyLong_MARSHAL_SHIFT;
215 }
216 assert (d == 0);
217 }
218 d = ob->ob_digit[n-1];
219 do {
220 w_short(d & PyLong_MARSHAL_MASK, p);
221 d >>= PyLong_MARSHAL_SHIFT;
222 } while (d != 0);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000223}
224
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700225static int
226w_ref(PyObject *v, char *flag, WFILE *p)
227{
228 PyObject *id;
229 PyObject *idx;
230
231 if (p->version < 3 || p->refs == NULL)
232 return 0; /* not writing object references */
233
234 /* if it has only one reference, it definitely isn't shared */
235 if (Py_REFCNT(v) == 1)
236 return 0;
237
238 id = PyLong_FromVoidPtr((void*)v);
239 if (id == NULL)
240 goto err;
241 idx = PyDict_GetItem(p->refs, id);
242 if (idx != NULL) {
243 /* write the reference index to the stream */
244 long w = PyLong_AsLong(idx);
245 Py_DECREF(id);
246 if (w == -1 && PyErr_Occurred()) {
247 goto err;
248 }
249 /* we don't store "long" indices in the dict */
250 assert(0 <= w && w <= 0x7fffffff);
251 w_byte(TYPE_REF, p);
252 w_long(w, p);
253 return 1;
254 } else {
255 int ok;
256 Py_ssize_t s = PyDict_Size(p->refs);
257 /* we don't support long indices */
258 if (s >= 0x7fffffff) {
259 PyErr_SetString(PyExc_ValueError, "too many objects");
260 goto err;
261 }
262 idx = PyLong_FromSsize_t(s);
263 ok = idx && PyDict_SetItem(p->refs, id, idx) == 0;
264 Py_DECREF(id);
265 Py_XDECREF(idx);
266 if (!ok)
267 goto err;
268 *flag |= FLAG_REF;
269 return 0;
270 }
271err:
272 p->error = WFERR_UNMARSHALLABLE;
273 return 1;
274}
275
276static void
277w_complex_object(PyObject *v, char flag, WFILE *p);
278
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000279static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000280w_object(PyObject *v, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000281{
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700282 char flag = '\0';
Fred Drake6da0b912000-06-28 18:47:56 +0000283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000284 p->depth++;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000285
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000286 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
287 p->error = WFERR_NESTEDTOODEEP;
288 }
289 else if (v == NULL) {
290 w_byte(TYPE_NULL, p);
291 }
292 else if (v == Py_None) {
293 w_byte(TYPE_NONE, p);
294 }
295 else if (v == PyExc_StopIteration) {
296 w_byte(TYPE_STOPITER, p);
297 }
298 else if (v == Py_Ellipsis) {
299 w_byte(TYPE_ELLIPSIS, p);
300 }
301 else if (v == Py_False) {
302 w_byte(TYPE_FALSE, p);
303 }
304 else if (v == Py_True) {
305 w_byte(TYPE_TRUE, p);
306 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700307 else if (!w_ref(v, &flag, p))
308 w_complex_object(v, flag, p);
309
310 p->depth--;
311}
312
313static void
314w_complex_object(PyObject *v, char flag, WFILE *p)
315{
316 Py_ssize_t i, n;
317
318 if (PyLong_CheckExact(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000319 long x = PyLong_AsLong(v);
320 if ((x == -1) && PyErr_Occurred()) {
321 PyLongObject *ob = (PyLongObject *)v;
322 PyErr_Clear();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700323 w_PyLong(ob, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000324 }
325 else {
Guido van Rossumc1547d91996-12-10 15:39:04 +0000326#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000327 long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
328 if (y && y != -1) {
Martin v. Löwis7e395722012-07-28 19:44:05 +0200329 /* Too large for TYPE_INT */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700330 w_PyLong((PyLongObject*)v, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000331 }
332 else
Guido van Rossumc1547d91996-12-10 15:39:04 +0000333#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700335 W_TYPE(TYPE_INT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000336 w_long(x, p);
337 }
338 }
339 }
340 else if (PyFloat_CheckExact(v)) {
341 if (p->version > 1) {
342 unsigned char buf[8];
343 if (_PyFloat_Pack8(PyFloat_AsDouble(v),
344 buf, 1) < 0) {
345 p->error = WFERR_UNMARSHALLABLE;
346 return;
347 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700348 W_TYPE(TYPE_BINARY_FLOAT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000349 w_string((char*)buf, 8, p);
350 }
351 else {
352 char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
353 'g', 17, 0, NULL);
354 if (!buf) {
355 p->error = WFERR_NOMEMORY;
356 return;
357 }
358 n = strlen(buf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700359 W_TYPE(TYPE_FLOAT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000360 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200361 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000362 PyMem_Free(buf);
363 }
364 }
365 else if (PyComplex_CheckExact(v)) {
366 if (p->version > 1) {
367 unsigned char buf[8];
368 if (_PyFloat_Pack8(PyComplex_RealAsDouble(v),
369 buf, 1) < 0) {
370 p->error = WFERR_UNMARSHALLABLE;
371 return;
372 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700373 W_TYPE(TYPE_BINARY_COMPLEX, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000374 w_string((char*)buf, 8, p);
375 if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v),
376 buf, 1) < 0) {
377 p->error = WFERR_UNMARSHALLABLE;
378 return;
379 }
380 w_string((char*)buf, 8, p);
381 }
382 else {
383 char *buf;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700384 W_TYPE(TYPE_COMPLEX, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000385 buf = PyOS_double_to_string(PyComplex_RealAsDouble(v),
386 'g', 17, 0, NULL);
387 if (!buf) {
388 p->error = WFERR_NOMEMORY;
389 return;
390 }
391 n = strlen(buf);
392 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200393 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000394 PyMem_Free(buf);
395 buf = PyOS_double_to_string(PyComplex_ImagAsDouble(v),
396 'g', 17, 0, NULL);
397 if (!buf) {
398 p->error = WFERR_NOMEMORY;
399 return;
400 }
401 n = strlen(buf);
402 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200403 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404 PyMem_Free(buf);
405 }
406 }
407 else if (PyBytes_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700408 W_TYPE(TYPE_STRING, p);
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300409 w_pstring(PyBytes_AS_STRING(v), PyBytes_GET_SIZE(v), p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000410 }
411 else if (PyUnicode_CheckExact(v)) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200412 if (p->version >= 4 && PyUnicode_IS_ASCII(v)) {
413 int is_short = PyUnicode_GET_LENGTH(v) < 256;
414 if (is_short) {
415 if (PyUnicode_CHECK_INTERNED(v))
416 W_TYPE(TYPE_SHORT_ASCII_INTERNED, p);
417 else
418 W_TYPE(TYPE_SHORT_ASCII, p);
419 w_short_pstring((char *) PyUnicode_1BYTE_DATA(v),
420 PyUnicode_GET_LENGTH(v), p);
421 }
422 else {
423 if (PyUnicode_CHECK_INTERNED(v))
424 W_TYPE(TYPE_ASCII_INTERNED, p);
425 else
426 W_TYPE(TYPE_ASCII, p);
427 w_pstring((char *) PyUnicode_1BYTE_DATA(v),
428 PyUnicode_GET_LENGTH(v), p);
429 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000430 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200431 else {
432 PyObject *utf8;
433 utf8 = PyUnicode_AsEncodedString(v, "utf8", "surrogatepass");
434 if (utf8 == NULL) {
435 p->depth--;
436 p->error = WFERR_UNMARSHALLABLE;
437 return;
438 }
439 if (p->version >= 3 && PyUnicode_CHECK_INTERNED(v))
440 W_TYPE(TYPE_INTERNED, p);
441 else
442 W_TYPE(TYPE_UNICODE, p);
443 w_pstring(PyBytes_AS_STRING(utf8), PyBytes_GET_SIZE(utf8), p);
444 Py_DECREF(utf8);
445 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000446 }
447 else if (PyTuple_CheckExact(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000448 n = PyTuple_Size(v);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200449 if (p->version >= 4 && n < 256) {
450 W_TYPE(TYPE_SMALL_TUPLE, p);
451 w_byte(n, p);
452 }
453 else {
454 W_TYPE(TYPE_TUPLE, p);
455 W_SIZE(n, p);
456 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000457 for (i = 0; i < n; i++) {
458 w_object(PyTuple_GET_ITEM(v, i), p);
459 }
460 }
461 else if (PyList_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700462 W_TYPE(TYPE_LIST, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000463 n = PyList_GET_SIZE(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200464 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000465 for (i = 0; i < n; i++) {
466 w_object(PyList_GET_ITEM(v, i), p);
467 }
468 }
469 else if (PyDict_CheckExact(v)) {
470 Py_ssize_t pos;
471 PyObject *key, *value;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700472 W_TYPE(TYPE_DICT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000473 /* This one is NULL object terminated! */
474 pos = 0;
475 while (PyDict_Next(v, &pos, &key, &value)) {
476 w_object(key, p);
477 w_object(value, p);
478 }
479 w_object((PyObject *)NULL, p);
480 }
481 else if (PyAnySet_CheckExact(v)) {
482 PyObject *value, *it;
Raymond Hettingera422c342005-01-11 03:03:27 +0000483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 if (PyObject_TypeCheck(v, &PySet_Type))
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700485 W_TYPE(TYPE_SET, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 else
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700487 W_TYPE(TYPE_FROZENSET, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000488 n = PyObject_Size(v);
489 if (n == -1) {
490 p->depth--;
491 p->error = WFERR_UNMARSHALLABLE;
492 return;
493 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200494 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 it = PyObject_GetIter(v);
496 if (it == NULL) {
497 p->depth--;
498 p->error = WFERR_UNMARSHALLABLE;
499 return;
500 }
501 while ((value = PyIter_Next(it)) != NULL) {
502 w_object(value, p);
503 Py_DECREF(value);
504 }
505 Py_DECREF(it);
506 if (PyErr_Occurred()) {
507 p->depth--;
508 p->error = WFERR_UNMARSHALLABLE;
509 return;
510 }
511 }
512 else if (PyCode_Check(v)) {
513 PyCodeObject *co = (PyCodeObject *)v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700514 W_TYPE(TYPE_CODE, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 w_long(co->co_argcount, p);
516 w_long(co->co_kwonlyargcount, p);
517 w_long(co->co_nlocals, p);
518 w_long(co->co_stacksize, p);
519 w_long(co->co_flags, p);
520 w_object(co->co_code, p);
521 w_object(co->co_consts, p);
522 w_object(co->co_names, p);
523 w_object(co->co_varnames, p);
524 w_object(co->co_freevars, p);
525 w_object(co->co_cellvars, p);
526 w_object(co->co_filename, p);
527 w_object(co->co_name, p);
528 w_long(co->co_firstlineno, p);
529 w_object(co->co_lnotab, p);
530 }
531 else if (PyObject_CheckBuffer(v)) {
532 /* Write unknown buffer-style objects as a string */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 Py_buffer view;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100534 if (PyObject_GetBuffer(v, &view, PyBUF_SIMPLE) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 w_byte(TYPE_UNKNOWN, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100536 p->depth--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 p->error = WFERR_UNMARSHALLABLE;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100538 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700540 W_TYPE(TYPE_STRING, p);
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300541 w_pstring(view.buf, view.len, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100542 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 }
544 else {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700545 W_TYPE(TYPE_UNKNOWN, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 p->error = WFERR_UNMARSHALLABLE;
547 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000548}
549
Serhiy Storchaka95949422013-08-27 19:40:23 +0300550/* version currently has no effect for writing ints. */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000551void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000552PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000553{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 WFILE wf;
555 wf.fp = fp;
556 wf.error = WFERR_OK;
557 wf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700558 wf.refs = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 wf.version = version;
560 w_long(x, &wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000561}
562
563void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000564PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000565{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 WFILE wf;
567 wf.fp = fp;
568 wf.error = WFERR_OK;
569 wf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700570 if (version >= 3) {
571 if ((wf.refs = PyDict_New()) == NULL)
572 return; /* caller mush check PyErr_Occurred() */
573 } else
574 wf.refs = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000575 wf.version = version;
576 w_object(x, &wf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700577 Py_XDECREF(wf.refs);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000578}
579
580typedef WFILE RFILE; /* Same struct with different invariants */
581
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200582static char *
583r_string(Py_ssize_t n, RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000584{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200585 Py_ssize_t read = -1;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100586
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200587 if (p->ptr != NULL) {
588 /* Fast path for loads() */
589 char *res = p->ptr;
590 Py_ssize_t left = p->end - p->ptr;
591 if (left < n) {
592 PyErr_SetString(PyExc_EOFError,
593 "marshal data too short");
594 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100595 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200596 p->ptr += n;
597 return res;
598 }
599 if (p->buf == NULL) {
600 p->buf = PyMem_MALLOC(n);
601 if (p->buf == NULL) {
602 PyErr_NoMemory();
603 return NULL;
604 }
605 p->buf_size = n;
606 }
607 else if (p->buf_size < n) {
608 p->buf = PyMem_REALLOC(p->buf, n);
609 if (p->buf == NULL) {
610 PyErr_NoMemory();
611 return NULL;
612 }
613 p->buf_size = n;
614 }
Victor Stinner763b0d12013-10-31 16:56:38 +0100615
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200616 if (!p->readable) {
617 assert(p->fp != NULL);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200618 read = fread(p->buf, 1, n, p->fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100619 }
620 else {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200621 _Py_IDENTIFIER(readinto);
622 PyObject *res, *mview;
623 Py_buffer buf;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200624
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200625 if (PyBuffer_FillInfo(&buf, NULL, p->buf, n, 0, PyBUF_CONTIG) == -1)
626 return NULL;
627 mview = PyMemoryView_FromBuffer(&buf);
628 if (mview == NULL)
629 return NULL;
630
631 res = _PyObject_CallMethodId(p->readable, &PyId_readinto, "N", mview);
632 if (res != NULL) {
633 read = PyNumber_AsSsize_t(res, PyExc_ValueError);
634 Py_DECREF(res);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100635 }
636 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200637 if (read != n) {
638 if (!PyErr_Occurred()) {
639 if (read > n)
640 PyErr_Format(PyExc_ValueError,
641 "read() returned too much data: "
642 "%zd bytes requested, %zd returned",
643 n, read);
644 else
645 PyErr_SetString(PyExc_EOFError,
646 "EOF read where not expected");
647 }
648 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100649 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200650 return p->buf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100651}
652
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100653static int
654r_byte(RFILE *p)
655{
656 int c = EOF;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100657
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200658 if (p->ptr != NULL) {
659 if (p->ptr < p->end)
660 c = (unsigned char) *p->ptr++;
661 return c;
662 }
663 if (!p->readable) {
664 assert(p->fp);
665 c = getc(p->fp);
666 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100667 else {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200668 char *ptr = r_string(1, p);
669 if (ptr != NULL)
670 c = *(unsigned char *) ptr;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100671 }
672 return c;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000673}
674
675static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000676r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000677{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200678 short x = -1;
679 unsigned char *buffer;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100680
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200681 buffer = (unsigned char *) r_string(2, p);
682 if (buffer != NULL) {
683 x = buffer[0];
684 x |= buffer[1] << 8;
685 /* Sign-extension, in case short greater than 16 bits */
686 x |= -(x & 0x8000);
687 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000688 return x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000689}
690
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000691static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000692r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000693{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200694 long x = -1;
695 unsigned char *buffer;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100696
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200697 buffer = (unsigned char *) r_string(4, p);
698 if (buffer != NULL) {
699 x = buffer[0];
700 x |= (long)buffer[1] << 8;
701 x |= (long)buffer[2] << 16;
702 x |= (long)buffer[3] << 24;
Guido van Rossumc1547d91996-12-10 15:39:04 +0000703#if SIZEOF_LONG > 4
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200704 /* Sign extension for 64-bit machines */
705 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000706#endif
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200707 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708 return x;
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000709}
710
Guido van Rossum79f25d91997-04-29 20:08:16 +0000711static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000712r_PyLong(RFILE *p)
713{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 PyLongObject *ob;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200715 long n, size, i;
716 int j, md, shorts_in_top_digit;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000718
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100720 if (PyErr_Occurred())
721 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000722 if (n == 0)
723 return (PyObject *)_PyLong_New(0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200724 if (n < -SIZE32_MAX || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 PyErr_SetString(PyExc_ValueError,
726 "bad marshal data (long size out of range)");
727 return NULL;
728 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 size = 1 + (ABS(n) - 1) / PyLong_MARSHAL_RATIO;
731 shorts_in_top_digit = 1 + (ABS(n) - 1) % PyLong_MARSHAL_RATIO;
732 ob = _PyLong_New(size);
733 if (ob == NULL)
734 return NULL;
Victor Stinner763b0d12013-10-31 16:56:38 +0100735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000736 Py_SIZE(ob) = n > 0 ? size : -size;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000738 for (i = 0; i < size-1; i++) {
739 d = 0;
740 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
741 md = r_short(p);
Victor Stinner763b0d12013-10-31 16:56:38 +0100742 if (PyErr_Occurred()) {
743 Py_DECREF(ob);
744 return NULL;
745 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000746 if (md < 0 || md > PyLong_MARSHAL_BASE)
747 goto bad_digit;
748 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
749 }
750 ob->ob_digit[i] = d;
751 }
Victor Stinner763b0d12013-10-31 16:56:38 +0100752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000753 d = 0;
754 for (j=0; j < shorts_in_top_digit; j++) {
755 md = r_short(p);
Victor Stinner763b0d12013-10-31 16:56:38 +0100756 if (PyErr_Occurred()) {
757 Py_DECREF(ob);
758 return NULL;
759 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000760 if (md < 0 || md > PyLong_MARSHAL_BASE)
761 goto bad_digit;
762 /* topmost marshal digit should be nonzero */
763 if (md == 0 && j == shorts_in_top_digit - 1) {
764 Py_DECREF(ob);
765 PyErr_SetString(PyExc_ValueError,
766 "bad marshal data (unnormalized long data)");
767 return NULL;
768 }
769 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
770 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100771 if (PyErr_Occurred()) {
772 Py_DECREF(ob);
773 return NULL;
774 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000775 /* top digit should be nonzero, else the resulting PyLong won't be
776 normalized */
777 ob->ob_digit[size-1] = d;
778 return (PyObject *)ob;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000779 bad_digit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000780 Py_DECREF(ob);
781 PyErr_SetString(PyExc_ValueError,
782 "bad marshal data (digit out of range in long)");
783 return NULL;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000784}
785
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700786/* allocate the reflist index for a new object. Return -1 on failure */
787static Py_ssize_t
788r_ref_reserve(int flag, RFILE *p)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700789{
790 if (flag) { /* currently only FLAG_REF is defined */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200791 Py_ssize_t idx = PyList_GET_SIZE(p->refs);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700792 if (idx >= 0x7ffffffe) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700793 PyErr_SetString(PyExc_ValueError, "bad marshal data (index list too large)");
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700794 return -1;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700795 }
796 if (PyList_Append(p->refs, Py_None) < 0)
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700797 return -1;
798 return idx;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700799 } else
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700800 return 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700801}
802
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700803/* insert the new object 'o' to the reflist at previously
804 * allocated index 'idx'.
805 * 'o' can be NULL, in which case nothing is done.
806 * if 'o' was non-NULL, and the function succeeds, 'o' is returned.
807 * if 'o' was non-NULL, and the function fails, 'o' is released and
808 * NULL returned. This simplifies error checking at the call site since
809 * a single test for NULL for the function result is enough.
810 */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700811static PyObject *
812r_ref_insert(PyObject *o, Py_ssize_t idx, int flag, RFILE *p)
813{
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700814 if (o != NULL && flag) { /* currently only FLAG_REF is defined */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200815 PyObject *tmp = PyList_GET_ITEM(p->refs, idx);
816 Py_INCREF(o);
817 PyList_SET_ITEM(p->refs, idx, o);
818 Py_DECREF(tmp);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700819 }
820 return o;
821}
822
823/* combination of both above, used when an object can be
824 * created whenever it is seen in the file, as opposed to
825 * after having loaded its sub-objects.
826 */
827static PyObject *
828r_ref(PyObject *o, int flag, RFILE *p)
829{
Victor Stinner359fabc2013-10-31 17:09:01 +0100830 assert(flag & FLAG_REF);
831 if (o == NULL)
832 return NULL;
833 if (PyList_Append(p->refs, o) < 0) {
834 Py_DECREF(o); /* release the new object */
835 return NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700836 }
837 return o;
838}
Mark Dickinsonbd792642009-03-18 20:06:12 +0000839
840static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000841r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000842{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000843 /* NULL is a valid return value, it does not necessarily means that
844 an exception is set. */
845 PyObject *v, *v2;
Benjamin Petersoneddb0a72013-03-20 00:40:07 -0500846 Py_ssize_t idx = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000847 long i, n;
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700848 int type, code = r_byte(p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200849 int flag, is_interned = 0;
Christian Heimes35728422013-10-13 02:29:06 +0200850 PyObject *retval = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000851
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700852 if (code == EOF) {
853 PyErr_SetString(PyExc_EOFError,
854 "EOF read where object expected");
855 return NULL;
856 }
857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000860 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
861 p->depth--;
862 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
863 return NULL;
864 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000865
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700866 flag = code & FLAG_REF;
867 type = code & ~FLAG_REF;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700868
869#define R_REF(O) do{\
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700870 if (flag) \
871 O = r_ref(O, flag, p);\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700872} while (0)
873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 case TYPE_NULL:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 case TYPE_NONE:
880 Py_INCREF(Py_None);
881 retval = Py_None;
882 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000884 case TYPE_STOPITER:
885 Py_INCREF(PyExc_StopIteration);
886 retval = PyExc_StopIteration;
887 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 case TYPE_ELLIPSIS:
890 Py_INCREF(Py_Ellipsis);
891 retval = Py_Ellipsis;
892 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000893
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000894 case TYPE_FALSE:
895 Py_INCREF(Py_False);
896 retval = Py_False;
897 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 case TYPE_TRUE:
900 Py_INCREF(Py_True);
901 retval = Py_True;
902 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000903
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 case TYPE_INT:
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100905 n = r_long(p);
906 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700907 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 case TYPE_LONG:
911 retval = r_PyLong(p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700912 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000915 case TYPE_FLOAT:
916 {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200917 char buf[256], *ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 double dx;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000919 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300920 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000921 PyErr_SetString(PyExc_EOFError,
922 "EOF read where object expected");
923 break;
924 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200925 ptr = r_string(n, p);
926 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300927 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200928 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000929 buf[n] = '\0';
930 dx = PyOS_string_to_double(buf, NULL, NULL);
931 if (dx == -1.0 && PyErr_Occurred())
932 break;
933 retval = PyFloat_FromDouble(dx);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700934 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000935 break;
936 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 case TYPE_BINARY_FLOAT:
939 {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200940 unsigned char *buf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 double x;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200942 buf = (unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +0000943 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 x = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +0000946 if (x == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000948 retval = PyFloat_FromDouble(x);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700949 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 break;
951 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 case TYPE_COMPLEX:
954 {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200955 char buf[256], *ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 Py_complex c;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300958 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 PyErr_SetString(PyExc_EOFError,
960 "EOF read where object expected");
961 break;
962 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200963 ptr = r_string(n, p);
964 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300965 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200966 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 buf[n] = '\0';
968 c.real = PyOS_string_to_double(buf, NULL, NULL);
969 if (c.real == -1.0 && PyErr_Occurred())
970 break;
971 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300972 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 PyErr_SetString(PyExc_EOFError,
974 "EOF read where object expected");
975 break;
976 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200977 ptr = r_string(n, p);
978 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300979 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200980 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 buf[n] = '\0';
982 c.imag = PyOS_string_to_double(buf, NULL, NULL);
983 if (c.imag == -1.0 && PyErr_Occurred())
984 break;
985 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700986 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 break;
988 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990 case TYPE_BINARY_COMPLEX:
991 {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200992 unsigned char *buf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000993 Py_complex c;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200994 buf = (unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +0000995 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 c.real = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +0000998 if (c.real == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001000 buf = (unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001001 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001002 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 c.imag = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001004 if (c.imag == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001007 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001008 break;
1009 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 case TYPE_STRING:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001012 {
1013 char *ptr;
1014 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001015 if (PyErr_Occurred())
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001016 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001017 if (n < 0 || n > SIZE32_MAX) {
1018 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001019 break;
1020 }
1021 v = PyBytes_FromStringAndSize((char *)NULL, n);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001022 if (v == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001023 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001024 ptr = r_string(n, p);
1025 if (ptr == NULL) {
1026 Py_DECREF(v);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001027 break;
1028 }
1029 memcpy(PyBytes_AS_STRING(v), ptr, n);
1030 retval = v;
1031 R_REF(retval);
1032 break;
1033 }
1034
1035 case TYPE_ASCII_INTERNED:
1036 is_interned = 1;
1037 case TYPE_ASCII:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001038 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001039 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001040 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001041 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001042 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 break;
1044 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001045 goto _read_ascii;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001046
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001047 case TYPE_SHORT_ASCII_INTERNED:
1048 is_interned = 1;
1049 case TYPE_SHORT_ASCII:
1050 n = r_byte(p);
1051 if (n == EOF) {
1052 PyErr_SetString(PyExc_EOFError,
1053 "EOF read where object expected");
1054 break;
1055 }
1056 _read_ascii:
1057 {
1058 char *ptr;
1059 ptr = r_string(n, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001060 if (ptr == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001061 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001062 v = PyUnicode_FromKindAndData(PyUnicode_1BYTE_KIND, ptr, n);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001063 if (v == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001064 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001065 if (is_interned)
1066 PyUnicode_InternInPlace(&v);
1067 retval = v;
1068 R_REF(retval);
1069 break;
1070 }
1071
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001072 case TYPE_INTERNED:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001073 is_interned = 1;
1074 case TYPE_UNICODE:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 {
1076 char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +00001077
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001078 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001079 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001080 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001081 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 break;
1084 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001085 if (n != 0) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001086 buffer = r_string(n, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001087 if (buffer == NULL)
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001088 break;
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001089 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001091 else {
1092 v = PyUnicode_New(0, 0);
1093 }
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001094 if (v == NULL)
Victor Stinner3a8b79d2013-07-08 22:23:32 +02001095 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001096 if (is_interned)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001097 PyUnicode_InternInPlace(&v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001098 retval = v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001099 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 break;
1101 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001102
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001103 case TYPE_SMALL_TUPLE:
1104 n = (unsigned char) r_byte(p);
Victor Stinnerb1b7b182013-10-31 17:07:08 +01001105 if (PyErr_Occurred())
1106 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001107 goto _read_tuple;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 case TYPE_TUPLE:
1109 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001110 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001111 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001112 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 break;
1115 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001116 _read_tuple:
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001117 v = PyTuple_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001118 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001119 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 break;
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001121
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 for (i = 0; i < n; i++) {
1123 v2 = r_object(p);
1124 if ( v2 == NULL ) {
1125 if (!PyErr_Occurred())
1126 PyErr_SetString(PyExc_TypeError,
1127 "NULL object in marshal data for tuple");
1128 Py_DECREF(v);
1129 v = NULL;
1130 break;
1131 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001132 PyTuple_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001133 }
1134 retval = v;
1135 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 case TYPE_LIST:
1138 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001139 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001140 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001141 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001143 break;
1144 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001145 v = PyList_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001146 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001147 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001148 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 for (i = 0; i < n; i++) {
1150 v2 = r_object(p);
1151 if ( v2 == NULL ) {
1152 if (!PyErr_Occurred())
1153 PyErr_SetString(PyExc_TypeError,
1154 "NULL object in marshal data for list");
1155 Py_DECREF(v);
1156 v = NULL;
1157 break;
1158 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001159 PyList_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 }
1161 retval = v;
1162 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001163
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 case TYPE_DICT:
1165 v = PyDict_New();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001166 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001167 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 for (;;) {
1170 PyObject *key, *val;
1171 key = r_object(p);
1172 if (key == NULL)
1173 break;
1174 val = r_object(p);
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001175 if (val == NULL) {
1176 Py_DECREF(key);
1177 break;
1178 }
1179 if (PyDict_SetItem(v, key, val) < 0) {
1180 Py_DECREF(key);
1181 Py_DECREF(val);
1182 break;
1183 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 Py_DECREF(key);
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001185 Py_DECREF(val);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 }
1187 if (PyErr_Occurred()) {
1188 Py_DECREF(v);
1189 v = NULL;
1190 }
1191 retval = v;
1192 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 case TYPE_SET:
1195 case TYPE_FROZENSET:
1196 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001197 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001198 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001199 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001201 break;
1202 }
1203 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001204 if (type == TYPE_SET) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001205 R_REF(v);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001206 } else {
1207 /* must use delayed registration of frozensets because they must
1208 * be init with a refcount of 1
1209 */
1210 idx = r_ref_reserve(flag, p);
1211 if (idx < 0)
1212 Py_CLEAR(v); /* signal error */
1213 }
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001214 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001215 break;
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 for (i = 0; i < n; i++) {
1218 v2 = r_object(p);
1219 if ( v2 == NULL ) {
1220 if (!PyErr_Occurred())
1221 PyErr_SetString(PyExc_TypeError,
1222 "NULL object in marshal data for set");
1223 Py_DECREF(v);
1224 v = NULL;
1225 break;
1226 }
1227 if (PySet_Add(v, v2) == -1) {
1228 Py_DECREF(v);
1229 Py_DECREF(v2);
1230 v = NULL;
1231 break;
1232 }
1233 Py_DECREF(v2);
1234 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001235 if (type != TYPE_SET)
1236 v = r_ref_insert(v, idx, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 retval = v;
1238 break;
Raymond Hettingera422c342005-01-11 03:03:27 +00001239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 case TYPE_CODE:
1241 {
1242 int argcount;
1243 int kwonlyargcount;
1244 int nlocals;
1245 int stacksize;
1246 int flags;
1247 PyObject *code = NULL;
1248 PyObject *consts = NULL;
1249 PyObject *names = NULL;
1250 PyObject *varnames = NULL;
1251 PyObject *freevars = NULL;
1252 PyObject *cellvars = NULL;
1253 PyObject *filename = NULL;
1254 PyObject *name = NULL;
1255 int firstlineno;
1256 PyObject *lnotab = NULL;
Antoine Pitroue9bbe8b2013-04-13 22:41:09 +02001257
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001258 idx = r_ref_reserve(flag, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001259 if (idx < 0)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001260 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 /* XXX ignore long->int overflows for now */
1265 argcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001266 if (PyErr_Occurred())
1267 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 kwonlyargcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001269 if (PyErr_Occurred())
1270 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271 nlocals = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001272 if (PyErr_Occurred())
1273 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 stacksize = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001275 if (PyErr_Occurred())
1276 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 flags = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001278 if (PyErr_Occurred())
1279 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280 code = r_object(p);
1281 if (code == NULL)
1282 goto code_error;
1283 consts = r_object(p);
1284 if (consts == NULL)
1285 goto code_error;
1286 names = r_object(p);
1287 if (names == NULL)
1288 goto code_error;
1289 varnames = r_object(p);
1290 if (varnames == NULL)
1291 goto code_error;
1292 freevars = r_object(p);
1293 if (freevars == NULL)
1294 goto code_error;
1295 cellvars = r_object(p);
1296 if (cellvars == NULL)
1297 goto code_error;
1298 filename = r_object(p);
1299 if (filename == NULL)
1300 goto code_error;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001301 if (PyUnicode_CheckExact(filename)) {
1302 if (p->current_filename != NULL) {
1303 if (!PyUnicode_Compare(filename, p->current_filename)) {
1304 Py_DECREF(filename);
1305 Py_INCREF(p->current_filename);
1306 filename = p->current_filename;
1307 }
1308 }
1309 else {
1310 p->current_filename = filename;
1311 }
1312 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 name = r_object(p);
1314 if (name == NULL)
1315 goto code_error;
1316 firstlineno = (int)r_long(p);
Kristján Valur Jónsson0a7697b2013-10-13 15:19:56 +00001317 if (firstlineno == -1 && PyErr_Occurred())
1318 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 lnotab = r_object(p);
1320 if (lnotab == NULL)
1321 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 v = (PyObject *) PyCode_New(
1324 argcount, kwonlyargcount,
1325 nlocals, stacksize, flags,
1326 code, consts, names, varnames,
1327 freevars, cellvars, filename, name,
1328 firstlineno, lnotab);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001329 v = r_ref_insert(v, idx, flag, p);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001330
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 code_error:
1332 Py_XDECREF(code);
1333 Py_XDECREF(consts);
1334 Py_XDECREF(names);
1335 Py_XDECREF(varnames);
1336 Py_XDECREF(freevars);
1337 Py_XDECREF(cellvars);
1338 Py_XDECREF(filename);
1339 Py_XDECREF(name);
1340 Py_XDECREF(lnotab);
1341 }
1342 retval = v;
1343 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001344
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001345 case TYPE_REF:
1346 n = r_long(p);
1347 if (n < 0 || n >= PyList_GET_SIZE(p->refs)) {
Kristján Valur Jónsson0a7697b2013-10-13 15:19:56 +00001348 if (n == -1 && PyErr_Occurred())
1349 break;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001350 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001351 break;
1352 }
1353 v = PyList_GET_ITEM(p->refs, n);
1354 if (v == Py_None) {
1355 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001356 break;
1357 }
1358 Py_INCREF(v);
1359 retval = v;
1360 break;
1361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001362 default:
1363 /* Bogus data got written, which isn't ideal.
1364 This will let you keep working and recover. */
1365 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001366 break;
1367
1368 }
1369 p->depth--;
1370 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001371}
1372
Neal Norwitzd85c4522004-06-13 20:31:49 +00001373static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001374read_object(RFILE *p)
1375{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001376 PyObject *v;
1377 if (PyErr_Occurred()) {
1378 fprintf(stderr, "XXX readobject called with exception set\n");
1379 return NULL;
1380 }
1381 v = r_object(p);
1382 if (v == NULL && !PyErr_Occurred())
1383 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1384 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001385}
1386
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001387int
1388PyMarshal_ReadShortFromFile(FILE *fp)
1389{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001391 int res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 assert(fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001393 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001394 rf.fp = fp;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001395 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001396 rf.end = rf.ptr = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001397 rf.buf = NULL;
1398 res = r_short(&rf);
1399 if (rf.buf != NULL)
1400 PyMem_FREE(rf.buf);
1401 return res;
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001402}
1403
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001404long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001405PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001406{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001407 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001408 long res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001410 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001411 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 rf.ptr = rf.end = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001413 rf.buf = NULL;
1414 res = r_long(&rf);
1415 if (rf.buf != NULL)
1416 PyMem_FREE(rf.buf);
1417 return res;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001418}
1419
Tim Peters691e0e92001-01-18 04:39:16 +00001420#ifdef HAVE_FSTAT
1421/* Return size of file in bytes; < 0 if unknown. */
1422static off_t
1423getfilesize(FILE *fp)
1424{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 struct stat st;
1426 if (fstat(fileno(fp), &st) != 0)
1427 return -1;
1428 else
1429 return st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001430}
1431#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001432
Tim Peters691e0e92001-01-18 04:39:16 +00001433/* If we can get the size of the file up-front, and it's reasonably small,
1434 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1435 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001436 * CAUTION: since this may read the entire remainder of the file, don't
1437 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001438 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001439PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001440PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001441{
Antoine Pitrou5bc7ec92010-04-21 22:56:22 +00001442/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
Tim Peters691e0e92001-01-18 04:39:16 +00001443#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001444#ifdef HAVE_FSTAT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001445 off_t filesize;
1446 filesize = getfilesize(fp);
1447 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1448 char* pBuf = (char *)PyMem_MALLOC(filesize);
1449 if (pBuf != NULL) {
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001450 size_t n = fread(pBuf, 1, (size_t)filesize, fp);
1451 PyObject* v = PyMarshal_ReadObjectFromString(pBuf, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001452 PyMem_FREE(pBuf);
1453 return v;
1454 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456 }
Tim Peters691e0e92001-01-18 04:39:16 +00001457#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001458 /* We don't have fstat, or we do but the file is larger than
1459 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1460 */
1461 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001462
Tim Peters691e0e92001-01-18 04:39:16 +00001463#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001464}
1465
Guido van Rossum79f25d91997-04-29 20:08:16 +00001466PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001467PyMarshal_ReadObjectFromFile(FILE *fp)
1468{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001469 RFILE rf;
1470 PyObject *result;
1471 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001472 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001473 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 rf.depth = 0;
1475 rf.ptr = rf.end = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001476 rf.buf = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001477 rf.refs = PyList_New(0);
1478 if (rf.refs == NULL)
1479 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001480 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001481 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001482 if (rf.buf != NULL)
1483 PyMem_FREE(rf.buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001485}
1486
1487PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +03001488PyMarshal_ReadObjectFromString(const char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001489{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001490 RFILE rf;
1491 PyObject *result;
1492 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001493 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001494 rf.current_filename = NULL;
Serhiy Storchakac6792272013-10-19 21:03:34 +03001495 rf.ptr = (char *)str;
1496 rf.end = (char *)str + len;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001497 rf.buf = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001498 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001499 rf.refs = PyList_New(0);
1500 if (rf.refs == NULL)
1501 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001502 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001503 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001504 if (rf.buf != NULL)
1505 PyMem_FREE(rf.buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001506 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001507}
1508
Guido van Rossum79f25d91997-04-29 20:08:16 +00001509PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001510PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001511{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 WFILE wf;
Guido van Rossume6d39042007-05-09 00:01:30 +00001513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001514 wf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001515 wf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001516 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1517 if (wf.str == NULL)
1518 return NULL;
1519 wf.ptr = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1520 wf.end = wf.ptr + PyBytes_Size(wf.str);
1521 wf.error = WFERR_OK;
1522 wf.depth = 0;
1523 wf.version = version;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001524 if (version >= 3) {
1525 if ((wf.refs = PyDict_New()) == NULL)
1526 return NULL;
1527 } else
1528 wf.refs = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 w_object(x, &wf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001530 Py_XDECREF(wf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 if (wf.str != NULL) {
1532 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1533 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1534 Py_DECREF(wf.str);
1535 PyErr_SetString(PyExc_OverflowError,
1536 "too much marshal data for a string");
1537 return NULL;
1538 }
1539 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1540 return NULL;
1541 }
1542 if (wf.error != WFERR_OK) {
1543 Py_XDECREF(wf.str);
1544 if (wf.error == WFERR_NOMEMORY)
1545 PyErr_NoMemory();
1546 else
1547 PyErr_SetString(PyExc_ValueError,
1548 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1549 :"object too deeply nested to marshal");
1550 return NULL;
1551 }
Antoine Pitrou1c13f842012-03-02 18:22:23 +01001552 return wf.str;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001553}
1554
Guido van Rossum64b45521991-06-07 13:58:22 +00001555/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001556
Guido van Rossum79f25d91997-04-29 20:08:16 +00001557static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001558marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001559{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001560 /* XXX Quick hack -- need to do this differently */
1561 PyObject *x;
1562 PyObject *f;
1563 int version = Py_MARSHAL_VERSION;
1564 PyObject *s;
1565 PyObject *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001566 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001568 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
1569 return NULL;
1570 s = PyMarshal_WriteObjectToString(x, version);
1571 if (s == NULL)
1572 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001573 res = _PyObject_CallMethodId(f, &PyId_write, "O", s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001574 Py_DECREF(s);
1575 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001576}
1577
R. David Murraydd226ea2009-05-13 12:27:21 +00001578PyDoc_STRVAR(dump_doc,
1579"dump(value, file[, version])\n\
1580\n\
1581Write the value on the open file. The value must be a supported type.\n\
1582The file must be an open file object such as sys.stdout or returned by\n\
1583open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1584\n\
1585If the value has (or contains an object that has) an unsupported type, a\n\
1586ValueError exception is raised but garbage data will also be written\n\
1587to the file. The object will not be properly read back by load()\n\
1588\n\
1589The version argument indicates the data format that dump should use.");
1590
Guido van Rossum79f25d91997-04-29 20:08:16 +00001591static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001592marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001593{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001594 PyObject *data, *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001595 _Py_IDENTIFIER(read);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001596 RFILE rf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001597
1598 /*
1599 * Make a call to the read method, but read zero bytes.
1600 * This is to ensure that the object passed in at least
1601 * has a read method which returns bytes.
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001602 * This can be removed if we guarantee good error handling
1603 * for r_string()
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001604 */
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001605 data = _PyObject_CallMethodId(f, &PyId_read, "i", 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001606 if (data == NULL)
1607 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001608 if (!PyBytes_Check(data)) {
1609 PyErr_Format(PyExc_TypeError,
1610 "f.read() returned not bytes but %.100s",
1611 data->ob_type->tp_name);
1612 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001613 }
1614 else {
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001615 rf.depth = 0;
1616 rf.fp = NULL;
1617 rf.readable = f;
Vinay Sajipaac0f752011-07-02 18:42:21 +01001618 rf.current_filename = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001619 rf.ptr = rf.end = NULL;
1620 rf.buf = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001621 if ((rf.refs = PyList_New(0)) != NULL) {
1622 result = read_object(&rf);
1623 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001624 if (rf.buf != NULL)
1625 PyMem_FREE(rf.buf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001626 } else
1627 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001629 Py_DECREF(data);
1630 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001631}
1632
R. David Murraydd226ea2009-05-13 12:27:21 +00001633PyDoc_STRVAR(load_doc,
1634"load(file)\n\
1635\n\
1636Read one value from the open file and return it. If no valid value is\n\
1637read (e.g. because the data has a different Python versions\n\
1638incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1639The file must be an open file object opened in binary mode ('rb' or\n\
1640'r+b').\n\
1641\n\
1642Note: If an object containing an unsupported type was marshalled with\n\
1643dump(), load() will substitute None for the unmarshallable type.");
1644
1645
Guido van Rossum79f25d91997-04-29 20:08:16 +00001646static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001647marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001648{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001649 PyObject *x;
1650 int version = Py_MARSHAL_VERSION;
1651 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
1652 return NULL;
1653 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001654}
1655
R. David Murraydd226ea2009-05-13 12:27:21 +00001656PyDoc_STRVAR(dumps_doc,
1657"dumps(value[, version])\n\
1658\n\
1659Return the string that would be written to a file by dump(value, file).\n\
1660The value must be a supported type. Raise a ValueError exception if\n\
1661value has (or contains an object that has) an unsupported type.\n\
1662\n\
1663The version argument indicates the data format that dumps should use.");
1664
1665
Guido van Rossum79f25d91997-04-29 20:08:16 +00001666static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001667marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001668{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 RFILE rf;
1670 Py_buffer p;
1671 char *s;
1672 Py_ssize_t n;
1673 PyObject* result;
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001674 if (!PyArg_ParseTuple(args, "y*:loads", &p))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675 return NULL;
1676 s = p.buf;
1677 n = p.len;
1678 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001679 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001680 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 rf.ptr = s;
1682 rf.end = s + n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001684 if ((rf.refs = PyList_New(0)) == NULL)
1685 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001686 result = read_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 PyBuffer_Release(&p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001688 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001690}
1691
R. David Murraydd226ea2009-05-13 12:27:21 +00001692PyDoc_STRVAR(loads_doc,
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001693"loads(bytes)\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001694\n\
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001695Convert the bytes object to a value. If no valid value is found, raise\n\
1696EOFError, ValueError or TypeError. Extra characters in the input are\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001697ignored.");
1698
Guido van Rossum79f25d91997-04-29 20:08:16 +00001699static PyMethodDef marshal_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1701 {"load", marshal_load, METH_O, load_doc},
1702 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1703 {"loads", marshal_loads, METH_VARARGS, loads_doc},
1704 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001705};
1706
R. David Murraydd226ea2009-05-13 12:27:21 +00001707
1708PyDoc_STRVAR(module_doc,
1709"This module contains functions that can read and write Python values in\n\
1710a binary format. The format is specific to Python, but independent of\n\
1711machine architecture issues.\n\
1712\n\
1713Not all Python object types are supported; in general, only objects\n\
1714whose value is independent from a particular invocation of Python can be\n\
1715written and read by this module. The following types are supported:\n\
1716None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1717tuples, lists, sets, dictionaries, and code objects, where it\n\
1718should be understood that tuples, lists and dictionaries are only\n\
1719supported as long as the values contained therein are themselves\n\
1720supported; and recursive lists and dictionaries should not be written\n\
1721(they will cause infinite loops).\n\
1722\n\
1723Variables:\n\
1724\n\
1725version -- indicates the format that the module uses. Version 0 is the\n\
1726 historical format, version 1 shares interned strings and version 2\n\
1727 uses a binary format for floating point numbers.\n\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001728 Version 3 shares common object references (New in version 3.4).\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001729\n\
1730Functions:\n\
1731\n\
1732dump() -- write value to a file\n\
1733load() -- read value from a file\n\
1734dumps() -- write value to a string\n\
1735loads() -- read value from a string");
1736
1737
1738
Brett Cannon429ef652008-06-27 00:35:35 +00001739static struct PyModuleDef marshalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 PyModuleDef_HEAD_INIT,
1741 "marshal",
1742 module_doc,
1743 0,
1744 marshal_methods,
1745 NULL,
1746 NULL,
1747 NULL,
1748 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001749};
1750
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001751PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001752PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001753{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 PyObject *mod = PyModule_Create(&marshalmodule);
1755 if (mod == NULL)
1756 return NULL;
1757 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
1758 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001759}