blob: 411f1e078210f7de1122029791fe1390c6000c37 [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{
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700830 if (o != NULL && flag) { /* currently only FLAG_REF is defined */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700831 if (PyList_Append(p->refs, o) < 0) {
832 Py_DECREF(o); /* release the new object */
833 return NULL;
834 }
835 }
836 return o;
837}
Mark Dickinsonbd792642009-03-18 20:06:12 +0000838
839static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000840r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000841{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000842 /* NULL is a valid return value, it does not necessarily means that
843 an exception is set. */
844 PyObject *v, *v2;
Benjamin Petersoneddb0a72013-03-20 00:40:07 -0500845 Py_ssize_t idx = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 long i, n;
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700847 int type, code = r_byte(p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200848 int flag, is_interned = 0;
Christian Heimes35728422013-10-13 02:29:06 +0200849 PyObject *retval = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000850
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700851 if (code == EOF) {
852 PyErr_SetString(PyExc_EOFError,
853 "EOF read where object expected");
854 return NULL;
855 }
856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000857 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
860 p->depth--;
861 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
862 return NULL;
863 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000864
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700865 flag = code & FLAG_REF;
866 type = code & ~FLAG_REF;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700867
868#define R_REF(O) do{\
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700869 if (flag) \
870 O = r_ref(O, flag, p);\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700871} while (0)
872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000873 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000875 case TYPE_NULL:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 case TYPE_NONE:
879 Py_INCREF(Py_None);
880 retval = Py_None;
881 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 case TYPE_STOPITER:
884 Py_INCREF(PyExc_StopIteration);
885 retval = PyExc_StopIteration;
886 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 case TYPE_ELLIPSIS:
889 Py_INCREF(Py_Ellipsis);
890 retval = Py_Ellipsis;
891 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 case TYPE_FALSE:
894 Py_INCREF(Py_False);
895 retval = Py_False;
896 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000897
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000898 case TYPE_TRUE:
899 Py_INCREF(Py_True);
900 retval = Py_True;
901 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 case TYPE_INT:
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100904 n = r_long(p);
905 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700906 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000908
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 case TYPE_LONG:
910 retval = r_PyLong(p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700911 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 case TYPE_FLOAT:
915 {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200916 char buf[256], *ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 double dx;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300919 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000920 PyErr_SetString(PyExc_EOFError,
921 "EOF read where object expected");
922 break;
923 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200924 ptr = r_string(n, p);
925 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300926 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200927 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 buf[n] = '\0';
929 dx = PyOS_string_to_double(buf, NULL, NULL);
930 if (dx == -1.0 && PyErr_Occurred())
931 break;
932 retval = PyFloat_FromDouble(dx);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700933 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 break;
935 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 case TYPE_BINARY_FLOAT:
938 {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200939 unsigned char *buf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 double x;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200941 buf = (unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +0000942 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000943 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 x = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +0000945 if (x == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 retval = PyFloat_FromDouble(x);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700948 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000949 break;
950 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000952 case TYPE_COMPLEX:
953 {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200954 char buf[256], *ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000955 Py_complex c;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300957 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 PyErr_SetString(PyExc_EOFError,
959 "EOF read where object expected");
960 break;
961 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200962 ptr = r_string(n, p);
963 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300964 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200965 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000966 buf[n] = '\0';
967 c.real = PyOS_string_to_double(buf, NULL, NULL);
968 if (c.real == -1.0 && PyErr_Occurred())
969 break;
970 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300971 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 PyErr_SetString(PyExc_EOFError,
973 "EOF read where object expected");
974 break;
975 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200976 ptr = r_string(n, p);
977 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300978 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200979 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000980 buf[n] = '\0';
981 c.imag = PyOS_string_to_double(buf, NULL, NULL);
982 if (c.imag == -1.0 && PyErr_Occurred())
983 break;
984 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700985 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 break;
987 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 case TYPE_BINARY_COMPLEX:
990 {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200991 unsigned char *buf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 Py_complex c;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200993 buf = (unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +0000994 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 c.real = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +0000997 if (c.real == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200999 buf = (unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001000 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001002 c.imag = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001003 if (c.imag == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001004 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001006 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007 break;
1008 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 case TYPE_STRING:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001011 {
1012 char *ptr;
1013 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001014 if (PyErr_Occurred())
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001015 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001016 if (n < 0 || n > SIZE32_MAX) {
1017 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001018 break;
1019 }
1020 v = PyBytes_FromStringAndSize((char *)NULL, n);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001021 if (v == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001022 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001023 ptr = r_string(n, p);
1024 if (ptr == NULL) {
1025 Py_DECREF(v);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001026 break;
1027 }
1028 memcpy(PyBytes_AS_STRING(v), ptr, n);
1029 retval = v;
1030 R_REF(retval);
1031 break;
1032 }
1033
1034 case TYPE_ASCII_INTERNED:
1035 is_interned = 1;
1036 case TYPE_ASCII:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001037 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001038 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001039 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001040 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001041 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001042 break;
1043 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001044 goto _read_ascii;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001045
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001046 case TYPE_SHORT_ASCII_INTERNED:
1047 is_interned = 1;
1048 case TYPE_SHORT_ASCII:
1049 n = r_byte(p);
1050 if (n == EOF) {
1051 PyErr_SetString(PyExc_EOFError,
1052 "EOF read where object expected");
1053 break;
1054 }
1055 _read_ascii:
1056 {
1057 char *ptr;
1058 ptr = r_string(n, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001059 if (ptr == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001060 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001061 v = PyUnicode_FromKindAndData(PyUnicode_1BYTE_KIND, ptr, n);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001062 if (v == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001063 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001064 if (is_interned)
1065 PyUnicode_InternInPlace(&v);
1066 retval = v;
1067 R_REF(retval);
1068 break;
1069 }
1070
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001071 case TYPE_INTERNED:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001072 is_interned = 1;
1073 case TYPE_UNICODE:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 {
1075 char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +00001076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001078 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001079 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001080 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 break;
1083 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001084 if (n != 0) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001085 buffer = r_string(n, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001086 if (buffer == NULL)
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001087 break;
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001088 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001089 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001090 else {
1091 v = PyUnicode_New(0, 0);
1092 }
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001093 if (v == NULL)
Victor Stinner3a8b79d2013-07-08 22:23:32 +02001094 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001095 if (is_interned)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001096 PyUnicode_InternInPlace(&v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 retval = v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001098 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001099 break;
1100 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001101
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001102 case TYPE_SMALL_TUPLE:
1103 n = (unsigned char) r_byte(p);
1104 goto _read_tuple;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 case TYPE_TUPLE:
1106 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001107 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001108 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001109 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 break;
1112 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001113 _read_tuple:
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001114 v = PyTuple_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001115 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001116 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001117 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 for (i = 0; i < n; i++) {
1119 v2 = r_object(p);
1120 if ( v2 == NULL ) {
1121 if (!PyErr_Occurred())
1122 PyErr_SetString(PyExc_TypeError,
1123 "NULL object in marshal data for tuple");
1124 Py_DECREF(v);
1125 v = NULL;
1126 break;
1127 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001128 PyTuple_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 }
1130 retval = v;
1131 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001133 case TYPE_LIST:
1134 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001135 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001136 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001137 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001138 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 break;
1140 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001141 v = PyList_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001142 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001143 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001145 for (i = 0; i < n; i++) {
1146 v2 = r_object(p);
1147 if ( v2 == NULL ) {
1148 if (!PyErr_Occurred())
1149 PyErr_SetString(PyExc_TypeError,
1150 "NULL object in marshal data for list");
1151 Py_DECREF(v);
1152 v = NULL;
1153 break;
1154 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001155 PyList_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001156 }
1157 retval = v;
1158 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001159
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 case TYPE_DICT:
1161 v = PyDict_New();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001162 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001163 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001165 for (;;) {
1166 PyObject *key, *val;
1167 key = r_object(p);
1168 if (key == NULL)
1169 break;
1170 val = r_object(p);
1171 if (val != NULL)
1172 PyDict_SetItem(v, key, val);
1173 Py_DECREF(key);
1174 Py_XDECREF(val);
1175 }
1176 if (PyErr_Occurred()) {
1177 Py_DECREF(v);
1178 v = NULL;
1179 }
1180 retval = v;
1181 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001183 case TYPE_SET:
1184 case TYPE_FROZENSET:
1185 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001186 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001187 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001188 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 break;
1191 }
1192 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001193 if (type == TYPE_SET) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001194 R_REF(v);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001195 } else {
1196 /* must use delayed registration of frozensets because they must
1197 * be init with a refcount of 1
1198 */
1199 idx = r_ref_reserve(flag, p);
1200 if (idx < 0)
1201 Py_CLEAR(v); /* signal error */
1202 }
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001203 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 for (i = 0; i < n; i++) {
1206 v2 = r_object(p);
1207 if ( v2 == NULL ) {
1208 if (!PyErr_Occurred())
1209 PyErr_SetString(PyExc_TypeError,
1210 "NULL object in marshal data for set");
1211 Py_DECREF(v);
1212 v = NULL;
1213 break;
1214 }
1215 if (PySet_Add(v, v2) == -1) {
1216 Py_DECREF(v);
1217 Py_DECREF(v2);
1218 v = NULL;
1219 break;
1220 }
1221 Py_DECREF(v2);
1222 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001223 if (type != TYPE_SET)
1224 v = r_ref_insert(v, idx, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 retval = v;
1226 break;
Raymond Hettingera422c342005-01-11 03:03:27 +00001227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001228 case TYPE_CODE:
1229 {
1230 int argcount;
1231 int kwonlyargcount;
1232 int nlocals;
1233 int stacksize;
1234 int flags;
1235 PyObject *code = NULL;
1236 PyObject *consts = NULL;
1237 PyObject *names = NULL;
1238 PyObject *varnames = NULL;
1239 PyObject *freevars = NULL;
1240 PyObject *cellvars = NULL;
1241 PyObject *filename = NULL;
1242 PyObject *name = NULL;
1243 int firstlineno;
1244 PyObject *lnotab = NULL;
Antoine Pitroue9bbe8b2013-04-13 22:41:09 +02001245
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001246 idx = r_ref_reserve(flag, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001247 if (idx < 0)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001248 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 /* XXX ignore long->int overflows for now */
1253 argcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001254 if (PyErr_Occurred())
1255 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 kwonlyargcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001257 if (PyErr_Occurred())
1258 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 nlocals = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001260 if (PyErr_Occurred())
1261 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 stacksize = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001263 if (PyErr_Occurred())
1264 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001265 flags = (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 code = r_object(p);
1269 if (code == NULL)
1270 goto code_error;
1271 consts = r_object(p);
1272 if (consts == NULL)
1273 goto code_error;
1274 names = r_object(p);
1275 if (names == NULL)
1276 goto code_error;
1277 varnames = r_object(p);
1278 if (varnames == NULL)
1279 goto code_error;
1280 freevars = r_object(p);
1281 if (freevars == NULL)
1282 goto code_error;
1283 cellvars = r_object(p);
1284 if (cellvars == NULL)
1285 goto code_error;
1286 filename = r_object(p);
1287 if (filename == NULL)
1288 goto code_error;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001289 if (PyUnicode_CheckExact(filename)) {
1290 if (p->current_filename != NULL) {
1291 if (!PyUnicode_Compare(filename, p->current_filename)) {
1292 Py_DECREF(filename);
1293 Py_INCREF(p->current_filename);
1294 filename = p->current_filename;
1295 }
1296 }
1297 else {
1298 p->current_filename = filename;
1299 }
1300 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 name = r_object(p);
1302 if (name == NULL)
1303 goto code_error;
1304 firstlineno = (int)r_long(p);
Kristján Valur Jónsson0a7697b2013-10-13 15:19:56 +00001305 if (firstlineno == -1 && PyErr_Occurred())
1306 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001307 lnotab = r_object(p);
1308 if (lnotab == NULL)
1309 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311 v = (PyObject *) PyCode_New(
1312 argcount, kwonlyargcount,
1313 nlocals, stacksize, flags,
1314 code, consts, names, varnames,
1315 freevars, cellvars, filename, name,
1316 firstlineno, lnotab);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001317 v = r_ref_insert(v, idx, flag, p);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 code_error:
1320 Py_XDECREF(code);
1321 Py_XDECREF(consts);
1322 Py_XDECREF(names);
1323 Py_XDECREF(varnames);
1324 Py_XDECREF(freevars);
1325 Py_XDECREF(cellvars);
1326 Py_XDECREF(filename);
1327 Py_XDECREF(name);
1328 Py_XDECREF(lnotab);
1329 }
1330 retval = v;
1331 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001332
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001333 case TYPE_REF:
1334 n = r_long(p);
1335 if (n < 0 || n >= PyList_GET_SIZE(p->refs)) {
Kristján Valur Jónsson0a7697b2013-10-13 15:19:56 +00001336 if (n == -1 && PyErr_Occurred())
1337 break;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001338 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001339 break;
1340 }
1341 v = PyList_GET_ITEM(p->refs, n);
1342 if (v == Py_None) {
1343 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001344 break;
1345 }
1346 Py_INCREF(v);
1347 retval = v;
1348 break;
1349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 default:
1351 /* Bogus data got written, which isn't ideal.
1352 This will let you keep working and recover. */
1353 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 break;
1355
1356 }
1357 p->depth--;
1358 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001359}
1360
Neal Norwitzd85c4522004-06-13 20:31:49 +00001361static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001362read_object(RFILE *p)
1363{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 PyObject *v;
1365 if (PyErr_Occurred()) {
1366 fprintf(stderr, "XXX readobject called with exception set\n");
1367 return NULL;
1368 }
1369 v = r_object(p);
1370 if (v == NULL && !PyErr_Occurred())
1371 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1372 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001373}
1374
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001375int
1376PyMarshal_ReadShortFromFile(FILE *fp)
1377{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001379 int res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001380 assert(fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001381 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001382 rf.fp = fp;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001383 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 rf.end = rf.ptr = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001385 rf.buf = NULL;
1386 res = r_short(&rf);
1387 if (rf.buf != NULL)
1388 PyMem_FREE(rf.buf);
1389 return res;
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001390}
1391
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001392long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001393PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001394{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001395 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001396 long res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001397 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001398 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001399 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001400 rf.ptr = rf.end = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001401 rf.buf = NULL;
1402 res = r_long(&rf);
1403 if (rf.buf != NULL)
1404 PyMem_FREE(rf.buf);
1405 return res;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001406}
1407
Tim Peters691e0e92001-01-18 04:39:16 +00001408#ifdef HAVE_FSTAT
1409/* Return size of file in bytes; < 0 if unknown. */
1410static off_t
1411getfilesize(FILE *fp)
1412{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001413 struct stat st;
1414 if (fstat(fileno(fp), &st) != 0)
1415 return -1;
1416 else
1417 return st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001418}
1419#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001420
Tim Peters691e0e92001-01-18 04:39:16 +00001421/* If we can get the size of the file up-front, and it's reasonably small,
1422 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1423 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001424 * CAUTION: since this may read the entire remainder of the file, don't
1425 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001426 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001427PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001428PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001429{
Antoine Pitrou5bc7ec92010-04-21 22:56:22 +00001430/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
Tim Peters691e0e92001-01-18 04:39:16 +00001431#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001432#ifdef HAVE_FSTAT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001433 off_t filesize;
1434 filesize = getfilesize(fp);
1435 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1436 char* pBuf = (char *)PyMem_MALLOC(filesize);
1437 if (pBuf != NULL) {
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001438 size_t n = fread(pBuf, 1, (size_t)filesize, fp);
1439 PyObject* v = PyMarshal_ReadObjectFromString(pBuf, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001440 PyMem_FREE(pBuf);
1441 return v;
1442 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 }
Tim Peters691e0e92001-01-18 04:39:16 +00001445#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001446 /* We don't have fstat, or we do but the file is larger than
1447 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1448 */
1449 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001450
Tim Peters691e0e92001-01-18 04:39:16 +00001451#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001452}
1453
Guido van Rossum79f25d91997-04-29 20:08:16 +00001454PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001455PyMarshal_ReadObjectFromFile(FILE *fp)
1456{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001457 RFILE rf;
1458 PyObject *result;
1459 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001460 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001461 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001462 rf.depth = 0;
1463 rf.ptr = rf.end = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001464 rf.buf = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001465 rf.refs = PyList_New(0);
1466 if (rf.refs == NULL)
1467 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001468 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001469 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001470 if (rf.buf != NULL)
1471 PyMem_FREE(rf.buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001472 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001473}
1474
1475PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +03001476PyMarshal_ReadObjectFromString(const char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001477{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001478 RFILE rf;
1479 PyObject *result;
1480 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001481 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001482 rf.current_filename = NULL;
Serhiy Storchakac6792272013-10-19 21:03:34 +03001483 rf.ptr = (char *)str;
1484 rf.end = (char *)str + len;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001485 rf.buf = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001487 rf.refs = PyList_New(0);
1488 if (rf.refs == NULL)
1489 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001490 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001491 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001492 if (rf.buf != NULL)
1493 PyMem_FREE(rf.buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001494 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001495}
1496
Guido van Rossum79f25d91997-04-29 20:08:16 +00001497PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001498PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001499{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001500 WFILE wf;
Guido van Rossume6d39042007-05-09 00:01:30 +00001501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001502 wf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001503 wf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001504 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1505 if (wf.str == NULL)
1506 return NULL;
1507 wf.ptr = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1508 wf.end = wf.ptr + PyBytes_Size(wf.str);
1509 wf.error = WFERR_OK;
1510 wf.depth = 0;
1511 wf.version = version;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001512 if (version >= 3) {
1513 if ((wf.refs = PyDict_New()) == NULL)
1514 return NULL;
1515 } else
1516 wf.refs = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001517 w_object(x, &wf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001518 Py_XDECREF(wf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519 if (wf.str != NULL) {
1520 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1521 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1522 Py_DECREF(wf.str);
1523 PyErr_SetString(PyExc_OverflowError,
1524 "too much marshal data for a string");
1525 return NULL;
1526 }
1527 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1528 return NULL;
1529 }
1530 if (wf.error != WFERR_OK) {
1531 Py_XDECREF(wf.str);
1532 if (wf.error == WFERR_NOMEMORY)
1533 PyErr_NoMemory();
1534 else
1535 PyErr_SetString(PyExc_ValueError,
1536 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1537 :"object too deeply nested to marshal");
1538 return NULL;
1539 }
Antoine Pitrou1c13f842012-03-02 18:22:23 +01001540 return wf.str;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001541}
1542
Guido van Rossum64b45521991-06-07 13:58:22 +00001543/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001544
Guido van Rossum79f25d91997-04-29 20:08:16 +00001545static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001546marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001547{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001548 /* XXX Quick hack -- need to do this differently */
1549 PyObject *x;
1550 PyObject *f;
1551 int version = Py_MARSHAL_VERSION;
1552 PyObject *s;
1553 PyObject *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001554 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
1557 return NULL;
1558 s = PyMarshal_WriteObjectToString(x, version);
1559 if (s == NULL)
1560 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001561 res = _PyObject_CallMethodId(f, &PyId_write, "O", s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001562 Py_DECREF(s);
1563 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001564}
1565
R. David Murraydd226ea2009-05-13 12:27:21 +00001566PyDoc_STRVAR(dump_doc,
1567"dump(value, file[, version])\n\
1568\n\
1569Write the value on the open file. The value must be a supported type.\n\
1570The file must be an open file object such as sys.stdout or returned by\n\
1571open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1572\n\
1573If the value has (or contains an object that has) an unsupported type, a\n\
1574ValueError exception is raised but garbage data will also be written\n\
1575to the file. The object will not be properly read back by load()\n\
1576\n\
1577The version argument indicates the data format that dump should use.");
1578
Guido van Rossum79f25d91997-04-29 20:08:16 +00001579static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001580marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001581{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001582 PyObject *data, *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001583 _Py_IDENTIFIER(read);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001584 RFILE rf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001585
1586 /*
1587 * Make a call to the read method, but read zero bytes.
1588 * This is to ensure that the object passed in at least
1589 * has a read method which returns bytes.
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001590 * This can be removed if we guarantee good error handling
1591 * for r_string()
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001592 */
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001593 data = _PyObject_CallMethodId(f, &PyId_read, "i", 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001594 if (data == NULL)
1595 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001596 if (!PyBytes_Check(data)) {
1597 PyErr_Format(PyExc_TypeError,
1598 "f.read() returned not bytes but %.100s",
1599 data->ob_type->tp_name);
1600 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 }
1602 else {
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001603 rf.depth = 0;
1604 rf.fp = NULL;
1605 rf.readable = f;
Vinay Sajipaac0f752011-07-02 18:42:21 +01001606 rf.current_filename = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001607 rf.ptr = rf.end = NULL;
1608 rf.buf = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001609 if ((rf.refs = PyList_New(0)) != NULL) {
1610 result = read_object(&rf);
1611 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001612 if (rf.buf != NULL)
1613 PyMem_FREE(rf.buf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001614 } else
1615 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001616 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001617 Py_DECREF(data);
1618 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001619}
1620
R. David Murraydd226ea2009-05-13 12:27:21 +00001621PyDoc_STRVAR(load_doc,
1622"load(file)\n\
1623\n\
1624Read one value from the open file and return it. If no valid value is\n\
1625read (e.g. because the data has a different Python versions\n\
1626incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1627The file must be an open file object opened in binary mode ('rb' or\n\
1628'r+b').\n\
1629\n\
1630Note: If an object containing an unsupported type was marshalled with\n\
1631dump(), load() will substitute None for the unmarshallable type.");
1632
1633
Guido van Rossum79f25d91997-04-29 20:08:16 +00001634static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001635marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001636{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 PyObject *x;
1638 int version = Py_MARSHAL_VERSION;
1639 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
1640 return NULL;
1641 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001642}
1643
R. David Murraydd226ea2009-05-13 12:27:21 +00001644PyDoc_STRVAR(dumps_doc,
1645"dumps(value[, version])\n\
1646\n\
1647Return the string that would be written to a file by dump(value, file).\n\
1648The value must be a supported type. Raise a ValueError exception if\n\
1649value has (or contains an object that has) an unsupported type.\n\
1650\n\
1651The version argument indicates the data format that dumps should use.");
1652
1653
Guido van Rossum79f25d91997-04-29 20:08:16 +00001654static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001655marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001656{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001657 RFILE rf;
1658 Py_buffer p;
1659 char *s;
1660 Py_ssize_t n;
1661 PyObject* result;
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001662 if (!PyArg_ParseTuple(args, "y*:loads", &p))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663 return NULL;
1664 s = p.buf;
1665 n = p.len;
1666 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001667 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001668 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 rf.ptr = s;
1670 rf.end = s + n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001671 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001672 if ((rf.refs = PyList_New(0)) == NULL)
1673 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001674 result = read_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675 PyBuffer_Release(&p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001676 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001678}
1679
R. David Murraydd226ea2009-05-13 12:27:21 +00001680PyDoc_STRVAR(loads_doc,
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001681"loads(bytes)\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001682\n\
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001683Convert the bytes object to a value. If no valid value is found, raise\n\
1684EOFError, ValueError or TypeError. Extra characters in the input are\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001685ignored.");
1686
Guido van Rossum79f25d91997-04-29 20:08:16 +00001687static PyMethodDef marshal_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1689 {"load", marshal_load, METH_O, load_doc},
1690 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1691 {"loads", marshal_loads, METH_VARARGS, loads_doc},
1692 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001693};
1694
R. David Murraydd226ea2009-05-13 12:27:21 +00001695
1696PyDoc_STRVAR(module_doc,
1697"This module contains functions that can read and write Python values in\n\
1698a binary format. The format is specific to Python, but independent of\n\
1699machine architecture issues.\n\
1700\n\
1701Not all Python object types are supported; in general, only objects\n\
1702whose value is independent from a particular invocation of Python can be\n\
1703written and read by this module. The following types are supported:\n\
1704None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1705tuples, lists, sets, dictionaries, and code objects, where it\n\
1706should be understood that tuples, lists and dictionaries are only\n\
1707supported as long as the values contained therein are themselves\n\
1708supported; and recursive lists and dictionaries should not be written\n\
1709(they will cause infinite loops).\n\
1710\n\
1711Variables:\n\
1712\n\
1713version -- indicates the format that the module uses. Version 0 is the\n\
1714 historical format, version 1 shares interned strings and version 2\n\
1715 uses a binary format for floating point numbers.\n\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001716 Version 3 shares common object references (New in version 3.4).\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001717\n\
1718Functions:\n\
1719\n\
1720dump() -- write value to a file\n\
1721load() -- read value from a file\n\
1722dumps() -- write value to a string\n\
1723loads() -- read value from a string");
1724
1725
1726
Brett Cannon429ef652008-06-27 00:35:35 +00001727static struct PyModuleDef marshalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 PyModuleDef_HEAD_INIT,
1729 "marshal",
1730 module_doc,
1731 0,
1732 marshal_methods,
1733 NULL,
1734 NULL,
1735 NULL,
1736 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001737};
1738
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001739PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001740PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001741{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001742 PyObject *mod = PyModule_Create(&marshalmodule);
1743 if (mod == NULL)
1744 return NULL;
1745 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
1746 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001747}