blob: 12565f36ba23d39cf58ecf5b423d8044d58b1e2a [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
Fredrik Lundh11534382000-07-23 18:24:06 +000086w_more(int 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;
103 *p->ptr++ = Py_SAFE_DOWNCAST(c, int, char);
104 }
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{
162 w_byte(n, p);
163 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 }
615 if (!p->readable) {
616 assert(p->fp != NULL);
617 /* The result fits into int because it must be <=n. */
618 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
653
654static int
655r_byte(RFILE *p)
656{
657 int c = EOF;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100658
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200659 if (p->ptr != NULL) {
660 if (p->ptr < p->end)
661 c = (unsigned char) *p->ptr++;
662 return c;
663 }
664 if (!p->readable) {
665 assert(p->fp);
666 c = getc(p->fp);
667 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100668 else {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200669 char *ptr = r_string(1, p);
670 if (ptr != NULL)
671 c = *(unsigned char *) ptr;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100672 }
673 return c;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000674}
675
676static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000677r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000678{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200679 short x = -1;
680 unsigned char *buffer;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100681
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200682 buffer = (unsigned char *) r_string(2, p);
683 if (buffer != NULL) {
684 x = buffer[0];
685 x |= buffer[1] << 8;
686 /* Sign-extension, in case short greater than 16 bits */
687 x |= -(x & 0x8000);
688 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 return x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000690}
691
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000692static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000693r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000694{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200695 long x = -1;
696 unsigned char *buffer;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100697
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200698 buffer = (unsigned char *) r_string(4, p);
699 if (buffer != NULL) {
700 x = buffer[0];
701 x |= (long)buffer[1] << 8;
702 x |= (long)buffer[2] << 16;
703 x |= (long)buffer[3] << 24;
Guido van Rossumc1547d91996-12-10 15:39:04 +0000704#if SIZEOF_LONG > 4
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200705 /* Sign extension for 64-bit machines */
706 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000707#endif
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200708 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000709 return x;
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000710}
711
Guido van Rossum79f25d91997-04-29 20:08:16 +0000712static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000713r_PyLong(RFILE *p)
714{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 PyLongObject *ob;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200716 long n, size, i;
717 int j, md, shorts_in_top_digit;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000720 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100721 if (PyErr_Occurred())
722 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 if (n == 0)
724 return (PyObject *)_PyLong_New(0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200725 if (n < -SIZE32_MAX || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000726 PyErr_SetString(PyExc_ValueError,
727 "bad marshal data (long size out of range)");
728 return NULL;
729 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000731 size = 1 + (ABS(n) - 1) / PyLong_MARSHAL_RATIO;
732 shorts_in_top_digit = 1 + (ABS(n) - 1) % PyLong_MARSHAL_RATIO;
733 ob = _PyLong_New(size);
734 if (ob == NULL)
735 return NULL;
736 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);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100742 if (PyErr_Occurred())
743 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000744 if (md < 0 || md > PyLong_MARSHAL_BASE)
745 goto bad_digit;
746 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
747 }
748 ob->ob_digit[i] = d;
749 }
750 d = 0;
751 for (j=0; j < shorts_in_top_digit; j++) {
752 md = r_short(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100753 if (PyErr_Occurred())
754 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000755 if (md < 0 || md > PyLong_MARSHAL_BASE)
756 goto bad_digit;
757 /* topmost marshal digit should be nonzero */
758 if (md == 0 && j == shorts_in_top_digit - 1) {
759 Py_DECREF(ob);
760 PyErr_SetString(PyExc_ValueError,
761 "bad marshal data (unnormalized long data)");
762 return NULL;
763 }
764 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
765 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100766 if (PyErr_Occurred()) {
767 Py_DECREF(ob);
768 return NULL;
769 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 /* top digit should be nonzero, else the resulting PyLong won't be
771 normalized */
772 ob->ob_digit[size-1] = d;
773 return (PyObject *)ob;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000774 bad_digit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000775 Py_DECREF(ob);
776 PyErr_SetString(PyExc_ValueError,
777 "bad marshal data (digit out of range in long)");
778 return NULL;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000779}
780
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700781/* allocate the reflist index for a new object. Return -1 on failure */
782static Py_ssize_t
783r_ref_reserve(int flag, RFILE *p)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700784{
785 if (flag) { /* currently only FLAG_REF is defined */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200786 Py_ssize_t idx = PyList_GET_SIZE(p->refs);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700787 if (idx >= 0x7ffffffe) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700788 PyErr_SetString(PyExc_ValueError, "bad marshal data (index list too large)");
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700789 return -1;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700790 }
791 if (PyList_Append(p->refs, Py_None) < 0)
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700792 return -1;
793 return idx;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700794 } else
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700795 return 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700796}
797
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700798/* insert the new object 'o' to the reflist at previously
799 * allocated index 'idx'.
800 * 'o' can be NULL, in which case nothing is done.
801 * if 'o' was non-NULL, and the function succeeds, 'o' is returned.
802 * if 'o' was non-NULL, and the function fails, 'o' is released and
803 * NULL returned. This simplifies error checking at the call site since
804 * a single test for NULL for the function result is enough.
805 */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700806static PyObject *
807r_ref_insert(PyObject *o, Py_ssize_t idx, int flag, RFILE *p)
808{
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700809 if (o != NULL && flag) { /* currently only FLAG_REF is defined */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200810 PyObject *tmp = PyList_GET_ITEM(p->refs, idx);
811 Py_INCREF(o);
812 PyList_SET_ITEM(p->refs, idx, o);
813 Py_DECREF(tmp);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700814 }
815 return o;
816}
817
818/* combination of both above, used when an object can be
819 * created whenever it is seen in the file, as opposed to
820 * after having loaded its sub-objects.
821 */
822static PyObject *
823r_ref(PyObject *o, int flag, RFILE *p)
824{
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700825 if (o != NULL && flag) { /* currently only FLAG_REF is defined */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700826 if (PyList_Append(p->refs, o) < 0) {
827 Py_DECREF(o); /* release the new object */
828 return NULL;
829 }
830 }
831 return o;
832}
Mark Dickinsonbd792642009-03-18 20:06:12 +0000833
834static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000835r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000836{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 /* NULL is a valid return value, it does not necessarily means that
838 an exception is set. */
839 PyObject *v, *v2;
Benjamin Petersoneddb0a72013-03-20 00:40:07 -0500840 Py_ssize_t idx = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 long i, n;
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700842 int type, code = r_byte(p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200843 int flag, is_interned = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 PyObject *retval;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000845
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700846 if (code == EOF) {
847 PyErr_SetString(PyExc_EOFError,
848 "EOF read where object expected");
849 return NULL;
850 }
851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
855 p->depth--;
856 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
857 return NULL;
858 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000859
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700860 flag = code & FLAG_REF;
861 type = code & ~FLAG_REF;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700862
863#define R_REF(O) do{\
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700864 if (flag) \
865 O = r_ref(O, flag, p);\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700866} while (0)
867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000870 case TYPE_NULL:
871 retval = NULL;
872 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 case TYPE_NONE:
875 Py_INCREF(Py_None);
876 retval = Py_None;
877 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 case TYPE_STOPITER:
880 Py_INCREF(PyExc_StopIteration);
881 retval = PyExc_StopIteration;
882 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000884 case TYPE_ELLIPSIS:
885 Py_INCREF(Py_Ellipsis);
886 retval = Py_Ellipsis;
887 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 case TYPE_FALSE:
890 Py_INCREF(Py_False);
891 retval = Py_False;
892 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000893
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000894 case TYPE_TRUE:
895 Py_INCREF(Py_True);
896 retval = Py_True;
897 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 case TYPE_INT:
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100900 n = r_long(p);
901 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700902 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000905 case TYPE_LONG:
906 retval = r_PyLong(p);
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_FLOAT:
911 {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200912 char buf[256], *ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 double dx;
914 retval = NULL;
915 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300916 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 PyErr_SetString(PyExc_EOFError,
918 "EOF read where object expected");
919 break;
920 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200921 ptr = r_string(n, p);
922 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300923 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200924 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 buf[n] = '\0';
926 dx = PyOS_string_to_double(buf, NULL, NULL);
927 if (dx == -1.0 && PyErr_Occurred())
928 break;
929 retval = PyFloat_FromDouble(dx);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700930 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000931 break;
932 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 case TYPE_BINARY_FLOAT:
935 {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200936 unsigned char *buf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 double x;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200938 buf = (unsigned char *) r_string(8, p);
939 if (buf == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 retval = NULL;
941 break;
942 }
943 x = _PyFloat_Unpack8(buf, 1);
944 if (x == -1.0 && PyErr_Occurred()) {
945 retval = NULL;
946 break;
947 }
948 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;
957 retval = NULL;
958 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300959 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000960 PyErr_SetString(PyExc_EOFError,
961 "EOF read where object expected");
962 break;
963 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200964 ptr = r_string(n, p);
965 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300966 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200967 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 buf[n] = '\0';
969 c.real = PyOS_string_to_double(buf, NULL, NULL);
970 if (c.real == -1.0 && PyErr_Occurred())
971 break;
972 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300973 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974 PyErr_SetString(PyExc_EOFError,
975 "EOF read where object expected");
976 break;
977 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200978 ptr = r_string(n, p);
979 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300980 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200981 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000982 buf[n] = '\0';
983 c.imag = PyOS_string_to_double(buf, NULL, NULL);
984 if (c.imag == -1.0 && PyErr_Occurred())
985 break;
986 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700987 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 break;
989 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000990
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000991 case TYPE_BINARY_COMPLEX:
992 {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200993 unsigned char *buf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000994 Py_complex c;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200995 buf = (unsigned char *) r_string(8, p);
996 if (buf == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 retval = NULL;
998 break;
999 }
1000 c.real = _PyFloat_Unpack8(buf, 1);
1001 if (c.real == -1.0 && PyErr_Occurred()) {
1002 retval = NULL;
1003 break;
1004 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001005 buf = (unsigned char *) r_string(8, p);
1006 if (buf == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007 retval = NULL;
1008 break;
1009 }
1010 c.imag = _PyFloat_Unpack8(buf, 1);
1011 if (c.imag == -1.0 && PyErr_Occurred()) {
1012 retval = NULL;
1013 break;
1014 }
1015 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001016 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001017 break;
1018 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 case TYPE_STRING:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001021 {
1022 char *ptr;
1023 n = r_long(p);
1024 if (PyErr_Occurred()) {
1025 retval = NULL;
1026 break;
1027 }
1028 if (n < 0 || n > SIZE32_MAX) {
1029 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
1030 retval = NULL;
1031 break;
1032 }
1033 v = PyBytes_FromStringAndSize((char *)NULL, n);
1034 if (v == NULL) {
1035 retval = NULL;
1036 break;
1037 }
1038 ptr = r_string(n, p);
1039 if (ptr == NULL) {
1040 Py_DECREF(v);
1041 retval = NULL;
1042 break;
1043 }
1044 memcpy(PyBytes_AS_STRING(v), ptr, n);
1045 retval = v;
1046 R_REF(retval);
1047 break;
1048 }
1049
1050 case TYPE_ASCII_INTERNED:
1051 is_interned = 1;
1052 case TYPE_ASCII:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001054 if (PyErr_Occurred()) {
1055 retval = NULL;
1056 break;
1057 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001058 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001059 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001060 retval = NULL;
1061 break;
1062 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001063 goto _read_ascii;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001064
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001065 case TYPE_SHORT_ASCII_INTERNED:
1066 is_interned = 1;
1067 case TYPE_SHORT_ASCII:
1068 n = r_byte(p);
1069 if (n == EOF) {
1070 PyErr_SetString(PyExc_EOFError,
1071 "EOF read where object expected");
1072 break;
1073 }
1074 _read_ascii:
1075 {
1076 char *ptr;
1077 ptr = r_string(n, p);
1078 if (ptr == NULL) {
1079 retval = NULL;
1080 break;
1081 }
1082 v = PyUnicode_FromKindAndData(PyUnicode_1BYTE_KIND, ptr, n);
1083 if (v == NULL) {
1084 retval = NULL;
1085 break;
1086 }
1087 if (is_interned)
1088 PyUnicode_InternInPlace(&v);
1089 retval = v;
1090 R_REF(retval);
1091 break;
1092 }
1093
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001094 case TYPE_INTERNED:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001095 is_interned = 1;
1096 case TYPE_UNICODE:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 {
1098 char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +00001099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001101 if (PyErr_Occurred()) {
1102 retval = NULL;
1103 break;
1104 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001105 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
1107 retval = NULL;
1108 break;
1109 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001110 if (n != 0) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001111 buffer = r_string(n, p);
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001112 if (buffer == NULL) {
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001113 retval = NULL;
1114 break;
1115 }
1116 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001117 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001118 else {
1119 v = PyUnicode_New(0, 0);
1120 }
Victor Stinner3a8b79d2013-07-08 22:23:32 +02001121 if (v == NULL) {
1122 retval = NULL;
1123 break;
1124 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001125 if (is_interned)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001126 PyUnicode_InternInPlace(&v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001127 retval = v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001128 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 break;
1130 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001131
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001132 case TYPE_SMALL_TUPLE:
1133 n = (unsigned char) r_byte(p);
1134 goto _read_tuple;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 case TYPE_TUPLE:
1136 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001137 if (PyErr_Occurred()) {
1138 retval = NULL;
1139 break;
1140 }
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 (tuple size out of range)");
1143 retval = NULL;
1144 break;
1145 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001146 _read_tuple:
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001147 v = PyTuple_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001148 R_REF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 if (v == NULL) {
1150 retval = NULL;
1151 break;
1152 }
1153 for (i = 0; i < n; i++) {
1154 v2 = r_object(p);
1155 if ( v2 == NULL ) {
1156 if (!PyErr_Occurred())
1157 PyErr_SetString(PyExc_TypeError,
1158 "NULL object in marshal data for tuple");
1159 Py_DECREF(v);
1160 v = NULL;
1161 break;
1162 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001163 PyTuple_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 }
1165 retval = v;
1166 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 case TYPE_LIST:
1169 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001170 if (PyErr_Occurred()) {
1171 retval = NULL;
1172 break;
1173 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001174 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
1176 retval = NULL;
1177 break;
1178 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001179 v = PyList_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001180 R_REF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 if (v == NULL) {
1182 retval = NULL;
1183 break;
1184 }
1185 for (i = 0; i < n; i++) {
1186 v2 = r_object(p);
1187 if ( v2 == NULL ) {
1188 if (!PyErr_Occurred())
1189 PyErr_SetString(PyExc_TypeError,
1190 "NULL object in marshal data for list");
1191 Py_DECREF(v);
1192 v = NULL;
1193 break;
1194 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001195 PyList_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001196 }
1197 retval = v;
1198 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 case TYPE_DICT:
1201 v = PyDict_New();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001202 R_REF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001203 if (v == NULL) {
1204 retval = NULL;
1205 break;
1206 }
1207 for (;;) {
1208 PyObject *key, *val;
1209 key = r_object(p);
1210 if (key == NULL)
1211 break;
1212 val = r_object(p);
1213 if (val != NULL)
1214 PyDict_SetItem(v, key, val);
1215 Py_DECREF(key);
1216 Py_XDECREF(val);
1217 }
1218 if (PyErr_Occurred()) {
1219 Py_DECREF(v);
1220 v = NULL;
1221 }
1222 retval = v;
1223 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 case TYPE_SET:
1226 case TYPE_FROZENSET:
1227 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001228 if (PyErr_Occurred()) {
1229 retval = NULL;
1230 break;
1231 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001232 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001233 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
1234 retval = NULL;
1235 break;
1236 }
1237 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001238 if (type == TYPE_SET) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001239 R_REF(v);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001240 } else {
1241 /* must use delayed registration of frozensets because they must
1242 * be init with a refcount of 1
1243 */
1244 idx = r_ref_reserve(flag, p);
1245 if (idx < 0)
1246 Py_CLEAR(v); /* signal error */
1247 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 if (v == NULL) {
1249 retval = NULL;
1250 break;
1251 }
1252 for (i = 0; i < n; i++) {
1253 v2 = r_object(p);
1254 if ( v2 == NULL ) {
1255 if (!PyErr_Occurred())
1256 PyErr_SetString(PyExc_TypeError,
1257 "NULL object in marshal data for set");
1258 Py_DECREF(v);
1259 v = NULL;
1260 break;
1261 }
1262 if (PySet_Add(v, v2) == -1) {
1263 Py_DECREF(v);
1264 Py_DECREF(v2);
1265 v = NULL;
1266 break;
1267 }
1268 Py_DECREF(v2);
1269 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001270 if (type != TYPE_SET)
1271 v = r_ref_insert(v, idx, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 retval = v;
1273 break;
Raymond Hettingera422c342005-01-11 03:03:27 +00001274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275 case TYPE_CODE:
1276 {
1277 int argcount;
1278 int kwonlyargcount;
1279 int nlocals;
1280 int stacksize;
1281 int flags;
1282 PyObject *code = NULL;
1283 PyObject *consts = NULL;
1284 PyObject *names = NULL;
1285 PyObject *varnames = NULL;
1286 PyObject *freevars = NULL;
1287 PyObject *cellvars = NULL;
1288 PyObject *filename = NULL;
1289 PyObject *name = NULL;
1290 int firstlineno;
1291 PyObject *lnotab = NULL;
Antoine Pitroue9bbe8b2013-04-13 22:41:09 +02001292
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001293 idx = r_ref_reserve(flag, p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001294 if (idx < 0) {
1295 retval = NULL;
1296 break;
1297 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 /* XXX ignore long->int overflows for now */
1302 argcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001303 if (PyErr_Occurred())
1304 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 kwonlyargcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001306 if (PyErr_Occurred())
1307 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 nlocals = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001309 if (PyErr_Occurred())
1310 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311 stacksize = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001312 if (PyErr_Occurred())
1313 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001314 flags = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001315 if (PyErr_Occurred())
1316 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 code = r_object(p);
1318 if (code == NULL)
1319 goto code_error;
1320 consts = r_object(p);
1321 if (consts == NULL)
1322 goto code_error;
1323 names = r_object(p);
1324 if (names == NULL)
1325 goto code_error;
1326 varnames = r_object(p);
1327 if (varnames == NULL)
1328 goto code_error;
1329 freevars = r_object(p);
1330 if (freevars == NULL)
1331 goto code_error;
1332 cellvars = r_object(p);
1333 if (cellvars == NULL)
1334 goto code_error;
1335 filename = r_object(p);
1336 if (filename == NULL)
1337 goto code_error;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001338 if (PyUnicode_CheckExact(filename)) {
1339 if (p->current_filename != NULL) {
1340 if (!PyUnicode_Compare(filename, p->current_filename)) {
1341 Py_DECREF(filename);
1342 Py_INCREF(p->current_filename);
1343 filename = p->current_filename;
1344 }
1345 }
1346 else {
1347 p->current_filename = filename;
1348 }
1349 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 name = r_object(p);
1351 if (name == NULL)
1352 goto code_error;
1353 firstlineno = (int)r_long(p);
1354 lnotab = r_object(p);
1355 if (lnotab == NULL)
1356 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 v = (PyObject *) PyCode_New(
1359 argcount, kwonlyargcount,
1360 nlocals, stacksize, flags,
1361 code, consts, names, varnames,
1362 freevars, cellvars, filename, name,
1363 firstlineno, lnotab);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001364 v = r_ref_insert(v, idx, flag, p);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001366 code_error:
1367 Py_XDECREF(code);
1368 Py_XDECREF(consts);
1369 Py_XDECREF(names);
1370 Py_XDECREF(varnames);
1371 Py_XDECREF(freevars);
1372 Py_XDECREF(cellvars);
1373 Py_XDECREF(filename);
1374 Py_XDECREF(name);
1375 Py_XDECREF(lnotab);
1376 }
1377 retval = v;
1378 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001379
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001380 case TYPE_REF:
1381 n = r_long(p);
1382 if (n < 0 || n >= PyList_GET_SIZE(p->refs)) {
1383 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
1384 retval = NULL;
1385 break;
1386 }
1387 v = PyList_GET_ITEM(p->refs, n);
1388 if (v == Py_None) {
1389 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
1390 retval = NULL;
1391 break;
1392 }
1393 Py_INCREF(v);
1394 retval = v;
1395 break;
1396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001397 default:
1398 /* Bogus data got written, which isn't ideal.
1399 This will let you keep working and recover. */
1400 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
1401 retval = NULL;
1402 break;
1403
1404 }
1405 p->depth--;
1406 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001407}
1408
Neal Norwitzd85c4522004-06-13 20:31:49 +00001409static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001410read_object(RFILE *p)
1411{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 PyObject *v;
1413 if (PyErr_Occurred()) {
1414 fprintf(stderr, "XXX readobject called with exception set\n");
1415 return NULL;
1416 }
1417 v = r_object(p);
1418 if (v == NULL && !PyErr_Occurred())
1419 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1420 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001421}
1422
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001423int
1424PyMarshal_ReadShortFromFile(FILE *fp)
1425{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001427 int res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001428 assert(fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001429 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430 rf.fp = fp;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001431 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001432 rf.end = rf.ptr = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001433 rf.buf = NULL;
1434 res = r_short(&rf);
1435 if (rf.buf != NULL)
1436 PyMem_FREE(rf.buf);
1437 return res;
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001438}
1439
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001440long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001441PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001442{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001443 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001444 long res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001445 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001446 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001447 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 rf.ptr = rf.end = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001449 rf.buf = NULL;
1450 res = r_long(&rf);
1451 if (rf.buf != NULL)
1452 PyMem_FREE(rf.buf);
1453 return res;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001454}
1455
Tim Peters691e0e92001-01-18 04:39:16 +00001456#ifdef HAVE_FSTAT
1457/* Return size of file in bytes; < 0 if unknown. */
1458static off_t
1459getfilesize(FILE *fp)
1460{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 struct stat st;
1462 if (fstat(fileno(fp), &st) != 0)
1463 return -1;
1464 else
1465 return st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001466}
1467#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001468
Tim Peters691e0e92001-01-18 04:39:16 +00001469/* If we can get the size of the file up-front, and it's reasonably small,
1470 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1471 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001472 * CAUTION: since this may read the entire remainder of the file, don't
1473 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001474 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001475PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001476PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001477{
Antoine Pitrou5bc7ec92010-04-21 22:56:22 +00001478/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
Tim Peters691e0e92001-01-18 04:39:16 +00001479#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001480#ifdef HAVE_FSTAT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001481 off_t filesize;
1482 filesize = getfilesize(fp);
1483 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1484 char* pBuf = (char *)PyMem_MALLOC(filesize);
1485 if (pBuf != NULL) {
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001486 size_t n = fread(pBuf, 1, (size_t)filesize, fp);
1487 PyObject* v = PyMarshal_ReadObjectFromString(pBuf, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001488 PyMem_FREE(pBuf);
1489 return v;
1490 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001492 }
Tim Peters691e0e92001-01-18 04:39:16 +00001493#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001494 /* We don't have fstat, or we do but the file is larger than
1495 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1496 */
1497 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001498
Tim Peters691e0e92001-01-18 04:39:16 +00001499#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001500}
1501
Guido van Rossum79f25d91997-04-29 20:08:16 +00001502PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001503PyMarshal_ReadObjectFromFile(FILE *fp)
1504{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001505 RFILE rf;
1506 PyObject *result;
1507 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001508 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001509 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001510 rf.depth = 0;
1511 rf.ptr = rf.end = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001512 rf.buf = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001513 rf.refs = PyList_New(0);
1514 if (rf.refs == NULL)
1515 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001516 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001517 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001518 if (rf.buf != NULL)
1519 PyMem_FREE(rf.buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001520 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001521}
1522
1523PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001524PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001525{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001526 RFILE rf;
1527 PyObject *result;
1528 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001529 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001530 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 rf.ptr = str;
1532 rf.end = str + len;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001533 rf.buf = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001535 rf.refs = PyList_New(0);
1536 if (rf.refs == NULL)
1537 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001538 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001539 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001540 if (rf.buf != NULL)
1541 PyMem_FREE(rf.buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001542 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001543}
1544
Guido van Rossum79f25d91997-04-29 20:08:16 +00001545PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001546PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001547{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001548 WFILE wf;
Guido van Rossume6d39042007-05-09 00:01:30 +00001549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001550 wf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001551 wf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1553 if (wf.str == NULL)
1554 return NULL;
1555 wf.ptr = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1556 wf.end = wf.ptr + PyBytes_Size(wf.str);
1557 wf.error = WFERR_OK;
1558 wf.depth = 0;
1559 wf.version = version;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001560 if (version >= 3) {
1561 if ((wf.refs = PyDict_New()) == NULL)
1562 return NULL;
1563 } else
1564 wf.refs = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 w_object(x, &wf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001566 Py_XDECREF(wf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001567 if (wf.str != NULL) {
1568 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1569 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1570 Py_DECREF(wf.str);
1571 PyErr_SetString(PyExc_OverflowError,
1572 "too much marshal data for a string");
1573 return NULL;
1574 }
1575 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1576 return NULL;
1577 }
1578 if (wf.error != WFERR_OK) {
1579 Py_XDECREF(wf.str);
1580 if (wf.error == WFERR_NOMEMORY)
1581 PyErr_NoMemory();
1582 else
1583 PyErr_SetString(PyExc_ValueError,
1584 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1585 :"object too deeply nested to marshal");
1586 return NULL;
1587 }
Antoine Pitrou1c13f842012-03-02 18:22:23 +01001588 return wf.str;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001589}
1590
Guido van Rossum64b45521991-06-07 13:58:22 +00001591/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001592
Guido van Rossum79f25d91997-04-29 20:08:16 +00001593static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001594marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001595{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001596 /* XXX Quick hack -- need to do this differently */
1597 PyObject *x;
1598 PyObject *f;
1599 int version = Py_MARSHAL_VERSION;
1600 PyObject *s;
1601 PyObject *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001602 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001603
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
1605 return NULL;
1606 s = PyMarshal_WriteObjectToString(x, version);
1607 if (s == NULL)
1608 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001609 res = _PyObject_CallMethodId(f, &PyId_write, "O", s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 Py_DECREF(s);
1611 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001612}
1613
R. David Murraydd226ea2009-05-13 12:27:21 +00001614PyDoc_STRVAR(dump_doc,
1615"dump(value, file[, version])\n\
1616\n\
1617Write the value on the open file. The value must be a supported type.\n\
1618The file must be an open file object such as sys.stdout or returned by\n\
1619open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1620\n\
1621If the value has (or contains an object that has) an unsupported type, a\n\
1622ValueError exception is raised but garbage data will also be written\n\
1623to the file. The object will not be properly read back by load()\n\
1624\n\
1625The version argument indicates the data format that dump should use.");
1626
Guido van Rossum79f25d91997-04-29 20:08:16 +00001627static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001628marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001629{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001630 PyObject *data, *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001631 _Py_IDENTIFIER(read);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001632 RFILE rf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001633
1634 /*
1635 * Make a call to the read method, but read zero bytes.
1636 * This is to ensure that the object passed in at least
1637 * has a read method which returns bytes.
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001638 * This can be removed if we guarantee good error handling
1639 * for r_string()
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001640 */
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001641 data = _PyObject_CallMethodId(f, &PyId_read, "i", 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001642 if (data == NULL)
1643 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001644 if (!PyBytes_Check(data)) {
1645 PyErr_Format(PyExc_TypeError,
1646 "f.read() returned not bytes but %.100s",
1647 data->ob_type->tp_name);
1648 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001649 }
1650 else {
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001651 rf.depth = 0;
1652 rf.fp = NULL;
1653 rf.readable = f;
Vinay Sajipaac0f752011-07-02 18:42:21 +01001654 rf.current_filename = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001655 rf.ptr = rf.end = NULL;
1656 rf.buf = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001657 if ((rf.refs = PyList_New(0)) != NULL) {
1658 result = read_object(&rf);
1659 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001660 if (rf.buf != NULL)
1661 PyMem_FREE(rf.buf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001662 } else
1663 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001664 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 Py_DECREF(data);
1666 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001667}
1668
R. David Murraydd226ea2009-05-13 12:27:21 +00001669PyDoc_STRVAR(load_doc,
1670"load(file)\n\
1671\n\
1672Read one value from the open file and return it. If no valid value is\n\
1673read (e.g. because the data has a different Python versions\n\
1674incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1675The file must be an open file object opened in binary mode ('rb' or\n\
1676'r+b').\n\
1677\n\
1678Note: If an object containing an unsupported type was marshalled with\n\
1679dump(), load() will substitute None for the unmarshallable type.");
1680
1681
Guido van Rossum79f25d91997-04-29 20:08:16 +00001682static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001683marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001684{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 PyObject *x;
1686 int version = Py_MARSHAL_VERSION;
1687 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
1688 return NULL;
1689 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001690}
1691
R. David Murraydd226ea2009-05-13 12:27:21 +00001692PyDoc_STRVAR(dumps_doc,
1693"dumps(value[, version])\n\
1694\n\
1695Return the string that would be written to a file by dump(value, file).\n\
1696The value must be a supported type. Raise a ValueError exception if\n\
1697value has (or contains an object that has) an unsupported type.\n\
1698\n\
1699The version argument indicates the data format that dumps should use.");
1700
1701
Guido van Rossum79f25d91997-04-29 20:08:16 +00001702static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001703marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001704{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001705 RFILE rf;
1706 Py_buffer p;
1707 char *s;
1708 Py_ssize_t n;
1709 PyObject* result;
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001710 if (!PyArg_ParseTuple(args, "y*:loads", &p))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 return NULL;
1712 s = p.buf;
1713 n = p.len;
1714 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001715 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001716 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717 rf.ptr = s;
1718 rf.end = s + n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001720 if ((rf.refs = PyList_New(0)) == NULL)
1721 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 result = read_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001723 PyBuffer_Release(&p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001724 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001725 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001726}
1727
R. David Murraydd226ea2009-05-13 12:27:21 +00001728PyDoc_STRVAR(loads_doc,
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001729"loads(bytes)\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001730\n\
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001731Convert the bytes object to a value. If no valid value is found, raise\n\
1732EOFError, ValueError or TypeError. Extra characters in the input are\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001733ignored.");
1734
Guido van Rossum79f25d91997-04-29 20:08:16 +00001735static PyMethodDef marshal_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1737 {"load", marshal_load, METH_O, load_doc},
1738 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1739 {"loads", marshal_loads, METH_VARARGS, loads_doc},
1740 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001741};
1742
R. David Murraydd226ea2009-05-13 12:27:21 +00001743
1744PyDoc_STRVAR(module_doc,
1745"This module contains functions that can read and write Python values in\n\
1746a binary format. The format is specific to Python, but independent of\n\
1747machine architecture issues.\n\
1748\n\
1749Not all Python object types are supported; in general, only objects\n\
1750whose value is independent from a particular invocation of Python can be\n\
1751written and read by this module. The following types are supported:\n\
1752None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1753tuples, lists, sets, dictionaries, and code objects, where it\n\
1754should be understood that tuples, lists and dictionaries are only\n\
1755supported as long as the values contained therein are themselves\n\
1756supported; and recursive lists and dictionaries should not be written\n\
1757(they will cause infinite loops).\n\
1758\n\
1759Variables:\n\
1760\n\
1761version -- indicates the format that the module uses. Version 0 is the\n\
1762 historical format, version 1 shares interned strings and version 2\n\
1763 uses a binary format for floating point numbers.\n\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001764 Version 3 shares common object references (New in version 3.4).\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001765\n\
1766Functions:\n\
1767\n\
1768dump() -- write value to a file\n\
1769load() -- read value from a file\n\
1770dumps() -- write value to a string\n\
1771loads() -- read value from a string");
1772
1773
1774
Brett Cannon429ef652008-06-27 00:35:35 +00001775static struct PyModuleDef marshalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001776 PyModuleDef_HEAD_INIT,
1777 "marshal",
1778 module_doc,
1779 0,
1780 marshal_methods,
1781 NULL,
1782 NULL,
1783 NULL,
1784 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001785};
1786
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001787PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001788PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001789{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001790 PyObject *mod = PyModule_Create(&marshalmodule);
1791 if (mod == NULL)
1792 return NULL;
1793 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
1794 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001795}