blob: 7273e7cd3adb46f246fe81e85a8e7c96d2e93713 [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 }
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;
Christian Heimes35728422013-10-13 02:29:06 +0200844 PyObject *retval = NULL;
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:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000871 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000873 case TYPE_NONE:
874 Py_INCREF(Py_None);
875 retval = Py_None;
876 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 case TYPE_STOPITER:
879 Py_INCREF(PyExc_StopIteration);
880 retval = PyExc_StopIteration;
881 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 case TYPE_ELLIPSIS:
884 Py_INCREF(Py_Ellipsis);
885 retval = Py_Ellipsis;
886 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 case TYPE_FALSE:
889 Py_INCREF(Py_False);
890 retval = Py_False;
891 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 case TYPE_TRUE:
894 Py_INCREF(Py_True);
895 retval = Py_True;
896 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000897
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000898 case TYPE_INT:
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100899 n = r_long(p);
900 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700901 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000903
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 case TYPE_LONG:
905 retval = r_PyLong(p);
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_FLOAT:
910 {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200911 char buf[256], *ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 double dx;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300914 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000915 PyErr_SetString(PyExc_EOFError,
916 "EOF read where object expected");
917 break;
918 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200919 ptr = r_string(n, p);
920 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300921 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200922 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 buf[n] = '\0';
924 dx = PyOS_string_to_double(buf, NULL, NULL);
925 if (dx == -1.0 && PyErr_Occurred())
926 break;
927 retval = PyFloat_FromDouble(dx);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700928 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000929 break;
930 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000931
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932 case TYPE_BINARY_FLOAT:
933 {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200934 unsigned char *buf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000935 double x;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200936 buf = (unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +0000937 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000939 x = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +0000940 if (x == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 retval = PyFloat_FromDouble(x);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700943 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 break;
945 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 case TYPE_COMPLEX:
948 {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200949 char buf[256], *ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 Py_complex c;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000951 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300952 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 PyErr_SetString(PyExc_EOFError,
954 "EOF read where object expected");
955 break;
956 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200957 ptr = r_string(n, p);
958 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300959 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200960 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 buf[n] = '\0';
962 c.real = PyOS_string_to_double(buf, NULL, NULL);
963 if (c.real == -1.0 && PyErr_Occurred())
964 break;
965 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300966 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 PyErr_SetString(PyExc_EOFError,
968 "EOF read where object expected");
969 break;
970 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200971 ptr = r_string(n, p);
972 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300973 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200974 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 buf[n] = '\0';
976 c.imag = PyOS_string_to_double(buf, NULL, NULL);
977 if (c.imag == -1.0 && PyErr_Occurred())
978 break;
979 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700980 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 break;
982 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 case TYPE_BINARY_COMPLEX:
985 {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200986 unsigned char *buf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 Py_complex c;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200988 buf = (unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +0000989 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000991 c.real = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +0000992 if (c.real == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000993 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200994 buf = (unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +0000995 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 c.imag = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +0000998 if (c.imag == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001001 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001002 break;
1003 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 case TYPE_STRING:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001006 {
1007 char *ptr;
1008 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001009 if (PyErr_Occurred())
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001010 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001011 if (n < 0 || n > SIZE32_MAX) {
1012 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001013 break;
1014 }
1015 v = PyBytes_FromStringAndSize((char *)NULL, n);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001016 if (v == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001017 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001018 ptr = r_string(n, p);
1019 if (ptr == NULL) {
1020 Py_DECREF(v);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001021 break;
1022 }
1023 memcpy(PyBytes_AS_STRING(v), ptr, n);
1024 retval = v;
1025 R_REF(retval);
1026 break;
1027 }
1028
1029 case TYPE_ASCII_INTERNED:
1030 is_interned = 1;
1031 case TYPE_ASCII:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001033 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001034 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001035 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001036 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001037 break;
1038 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001039 goto _read_ascii;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001040
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001041 case TYPE_SHORT_ASCII_INTERNED:
1042 is_interned = 1;
1043 case TYPE_SHORT_ASCII:
1044 n = r_byte(p);
1045 if (n == EOF) {
1046 PyErr_SetString(PyExc_EOFError,
1047 "EOF read where object expected");
1048 break;
1049 }
1050 _read_ascii:
1051 {
1052 char *ptr;
1053 ptr = r_string(n, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001054 if (ptr == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001055 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001056 v = PyUnicode_FromKindAndData(PyUnicode_1BYTE_KIND, ptr, n);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001057 if (v == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001058 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001059 if (is_interned)
1060 PyUnicode_InternInPlace(&v);
1061 retval = v;
1062 R_REF(retval);
1063 break;
1064 }
1065
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001066 case TYPE_INTERNED:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001067 is_interned = 1;
1068 case TYPE_UNICODE:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001069 {
1070 char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +00001071
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001072 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001073 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001074 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001075 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001076 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 break;
1078 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001079 if (n != 0) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001080 buffer = r_string(n, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001081 if (buffer == NULL)
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001082 break;
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001083 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001085 else {
1086 v = PyUnicode_New(0, 0);
1087 }
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001088 if (v == NULL)
Victor Stinner3a8b79d2013-07-08 22:23:32 +02001089 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001090 if (is_interned)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001091 PyUnicode_InternInPlace(&v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001092 retval = v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001093 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 break;
1095 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001096
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001097 case TYPE_SMALL_TUPLE:
1098 n = (unsigned char) r_byte(p);
1099 goto _read_tuple;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 case TYPE_TUPLE:
1101 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001102 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001103 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001104 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 break;
1107 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001108 _read_tuple:
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001109 v = PyTuple_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001110 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001111 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 for (i = 0; i < n; i++) {
1114 v2 = r_object(p);
1115 if ( v2 == NULL ) {
1116 if (!PyErr_Occurred())
1117 PyErr_SetString(PyExc_TypeError,
1118 "NULL object in marshal data for tuple");
1119 Py_DECREF(v);
1120 v = NULL;
1121 break;
1122 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001123 PyTuple_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001124 }
1125 retval = v;
1126 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001128 case TYPE_LIST:
1129 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001130 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001131 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001132 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001133 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001134 break;
1135 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001136 v = PyList_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001137 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001138 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 for (i = 0; i < n; i++) {
1141 v2 = r_object(p);
1142 if ( v2 == NULL ) {
1143 if (!PyErr_Occurred())
1144 PyErr_SetString(PyExc_TypeError,
1145 "NULL object in marshal data for list");
1146 Py_DECREF(v);
1147 v = NULL;
1148 break;
1149 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001150 PyList_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001151 }
1152 retval = v;
1153 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001154
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 case TYPE_DICT:
1156 v = PyDict_New();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001157 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001158 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 for (;;) {
1161 PyObject *key, *val;
1162 key = r_object(p);
1163 if (key == NULL)
1164 break;
1165 val = r_object(p);
1166 if (val != NULL)
1167 PyDict_SetItem(v, key, val);
1168 Py_DECREF(key);
1169 Py_XDECREF(val);
1170 }
1171 if (PyErr_Occurred()) {
1172 Py_DECREF(v);
1173 v = NULL;
1174 }
1175 retval = v;
1176 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001178 case TYPE_SET:
1179 case TYPE_FROZENSET:
1180 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001181 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001182 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001183 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 break;
1186 }
1187 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001188 if (type == TYPE_SET) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001189 R_REF(v);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001190 } else {
1191 /* must use delayed registration of frozensets because they must
1192 * be init with a refcount of 1
1193 */
1194 idx = r_ref_reserve(flag, p);
1195 if (idx < 0)
1196 Py_CLEAR(v); /* signal error */
1197 }
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001198 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 for (i = 0; i < n; i++) {
1201 v2 = r_object(p);
1202 if ( v2 == NULL ) {
1203 if (!PyErr_Occurred())
1204 PyErr_SetString(PyExc_TypeError,
1205 "NULL object in marshal data for set");
1206 Py_DECREF(v);
1207 v = NULL;
1208 break;
1209 }
1210 if (PySet_Add(v, v2) == -1) {
1211 Py_DECREF(v);
1212 Py_DECREF(v2);
1213 v = NULL;
1214 break;
1215 }
1216 Py_DECREF(v2);
1217 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001218 if (type != TYPE_SET)
1219 v = r_ref_insert(v, idx, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 retval = v;
1221 break;
Raymond Hettingera422c342005-01-11 03:03:27 +00001222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 case TYPE_CODE:
1224 {
1225 int argcount;
1226 int kwonlyargcount;
1227 int nlocals;
1228 int stacksize;
1229 int flags;
1230 PyObject *code = NULL;
1231 PyObject *consts = NULL;
1232 PyObject *names = NULL;
1233 PyObject *varnames = NULL;
1234 PyObject *freevars = NULL;
1235 PyObject *cellvars = NULL;
1236 PyObject *filename = NULL;
1237 PyObject *name = NULL;
1238 int firstlineno;
1239 PyObject *lnotab = NULL;
Antoine Pitroue9bbe8b2013-04-13 22:41:09 +02001240
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001241 idx = r_ref_reserve(flag, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001242 if (idx < 0)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001243 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001247 /* XXX ignore long->int overflows for now */
1248 argcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001249 if (PyErr_Occurred())
1250 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 kwonlyargcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001252 if (PyErr_Occurred())
1253 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 nlocals = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001255 if (PyErr_Occurred())
1256 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001257 stacksize = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001258 if (PyErr_Occurred())
1259 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 flags = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001261 if (PyErr_Occurred())
1262 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001263 code = r_object(p);
1264 if (code == NULL)
1265 goto code_error;
1266 consts = r_object(p);
1267 if (consts == NULL)
1268 goto code_error;
1269 names = r_object(p);
1270 if (names == NULL)
1271 goto code_error;
1272 varnames = r_object(p);
1273 if (varnames == NULL)
1274 goto code_error;
1275 freevars = r_object(p);
1276 if (freevars == NULL)
1277 goto code_error;
1278 cellvars = r_object(p);
1279 if (cellvars == NULL)
1280 goto code_error;
1281 filename = r_object(p);
1282 if (filename == NULL)
1283 goto code_error;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001284 if (PyUnicode_CheckExact(filename)) {
1285 if (p->current_filename != NULL) {
1286 if (!PyUnicode_Compare(filename, p->current_filename)) {
1287 Py_DECREF(filename);
1288 Py_INCREF(p->current_filename);
1289 filename = p->current_filename;
1290 }
1291 }
1292 else {
1293 p->current_filename = filename;
1294 }
1295 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 name = r_object(p);
1297 if (name == NULL)
1298 goto code_error;
1299 firstlineno = (int)r_long(p);
Kristján Valur Jónsson0a7697b2013-10-13 15:19:56 +00001300 if (firstlineno == -1 && PyErr_Occurred())
1301 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 lnotab = r_object(p);
1303 if (lnotab == NULL)
1304 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306 v = (PyObject *) PyCode_New(
1307 argcount, kwonlyargcount,
1308 nlocals, stacksize, flags,
1309 code, consts, names, varnames,
1310 freevars, cellvars, filename, name,
1311 firstlineno, lnotab);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001312 v = r_ref_insert(v, idx, flag, p);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001314 code_error:
1315 Py_XDECREF(code);
1316 Py_XDECREF(consts);
1317 Py_XDECREF(names);
1318 Py_XDECREF(varnames);
1319 Py_XDECREF(freevars);
1320 Py_XDECREF(cellvars);
1321 Py_XDECREF(filename);
1322 Py_XDECREF(name);
1323 Py_XDECREF(lnotab);
1324 }
1325 retval = v;
1326 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001327
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001328 case TYPE_REF:
1329 n = r_long(p);
1330 if (n < 0 || n >= PyList_GET_SIZE(p->refs)) {
Kristján Valur Jónsson0a7697b2013-10-13 15:19:56 +00001331 if (n == -1 && PyErr_Occurred())
1332 break;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001333 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001334 break;
1335 }
1336 v = PyList_GET_ITEM(p->refs, n);
1337 if (v == Py_None) {
1338 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001339 break;
1340 }
1341 Py_INCREF(v);
1342 retval = v;
1343 break;
1344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001345 default:
1346 /* Bogus data got written, which isn't ideal.
1347 This will let you keep working and recover. */
1348 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 break;
1350
1351 }
1352 p->depth--;
1353 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001354}
1355
Neal Norwitzd85c4522004-06-13 20:31:49 +00001356static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001357read_object(RFILE *p)
1358{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001359 PyObject *v;
1360 if (PyErr_Occurred()) {
1361 fprintf(stderr, "XXX readobject called with exception set\n");
1362 return NULL;
1363 }
1364 v = r_object(p);
1365 if (v == NULL && !PyErr_Occurred())
1366 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1367 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001368}
1369
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001370int
1371PyMarshal_ReadShortFromFile(FILE *fp)
1372{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001373 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001374 int res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001375 assert(fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001376 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001377 rf.fp = fp;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001378 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001379 rf.end = rf.ptr = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001380 rf.buf = NULL;
1381 res = r_short(&rf);
1382 if (rf.buf != NULL)
1383 PyMem_FREE(rf.buf);
1384 return res;
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001385}
1386
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001387long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001388PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001389{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001391 long res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001393 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001394 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001395 rf.ptr = rf.end = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001396 rf.buf = NULL;
1397 res = r_long(&rf);
1398 if (rf.buf != NULL)
1399 PyMem_FREE(rf.buf);
1400 return res;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001401}
1402
Tim Peters691e0e92001-01-18 04:39:16 +00001403#ifdef HAVE_FSTAT
1404/* Return size of file in bytes; < 0 if unknown. */
1405static off_t
1406getfilesize(FILE *fp)
1407{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001408 struct stat st;
1409 if (fstat(fileno(fp), &st) != 0)
1410 return -1;
1411 else
1412 return st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001413}
1414#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001415
Tim Peters691e0e92001-01-18 04:39:16 +00001416/* If we can get the size of the file up-front, and it's reasonably small,
1417 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1418 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001419 * CAUTION: since this may read the entire remainder of the file, don't
1420 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001421 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001422PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001423PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001424{
Antoine Pitrou5bc7ec92010-04-21 22:56:22 +00001425/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
Tim Peters691e0e92001-01-18 04:39:16 +00001426#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001427#ifdef HAVE_FSTAT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001428 off_t filesize;
1429 filesize = getfilesize(fp);
1430 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1431 char* pBuf = (char *)PyMem_MALLOC(filesize);
1432 if (pBuf != NULL) {
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001433 size_t n = fread(pBuf, 1, (size_t)filesize, fp);
1434 PyObject* v = PyMarshal_ReadObjectFromString(pBuf, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001435 PyMem_FREE(pBuf);
1436 return v;
1437 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439 }
Tim Peters691e0e92001-01-18 04:39:16 +00001440#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001441 /* We don't have fstat, or we do but the file is larger than
1442 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1443 */
1444 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001445
Tim Peters691e0e92001-01-18 04:39:16 +00001446#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001447}
1448
Guido van Rossum79f25d91997-04-29 20:08:16 +00001449PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001450PyMarshal_ReadObjectFromFile(FILE *fp)
1451{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001452 RFILE rf;
1453 PyObject *result;
1454 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001455 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001456 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001457 rf.depth = 0;
1458 rf.ptr = rf.end = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001459 rf.buf = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001460 rf.refs = PyList_New(0);
1461 if (rf.refs == NULL)
1462 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001464 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001465 if (rf.buf != NULL)
1466 PyMem_FREE(rf.buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001468}
1469
1470PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001471PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001472{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001473 RFILE rf;
1474 PyObject *result;
1475 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001476 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001477 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001478 rf.ptr = str;
1479 rf.end = str + len;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001480 rf.buf = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001481 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001482 rf.refs = PyList_New(0);
1483 if (rf.refs == NULL)
1484 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001486 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001487 if (rf.buf != NULL)
1488 PyMem_FREE(rf.buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001489 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001490}
1491
Guido van Rossum79f25d91997-04-29 20:08:16 +00001492PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001493PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001494{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495 WFILE wf;
Guido van Rossume6d39042007-05-09 00:01:30 +00001496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001497 wf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001498 wf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001499 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1500 if (wf.str == NULL)
1501 return NULL;
1502 wf.ptr = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1503 wf.end = wf.ptr + PyBytes_Size(wf.str);
1504 wf.error = WFERR_OK;
1505 wf.depth = 0;
1506 wf.version = version;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001507 if (version >= 3) {
1508 if ((wf.refs = PyDict_New()) == NULL)
1509 return NULL;
1510 } else
1511 wf.refs = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 w_object(x, &wf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001513 Py_XDECREF(wf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001514 if (wf.str != NULL) {
1515 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1516 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1517 Py_DECREF(wf.str);
1518 PyErr_SetString(PyExc_OverflowError,
1519 "too much marshal data for a string");
1520 return NULL;
1521 }
1522 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1523 return NULL;
1524 }
1525 if (wf.error != WFERR_OK) {
1526 Py_XDECREF(wf.str);
1527 if (wf.error == WFERR_NOMEMORY)
1528 PyErr_NoMemory();
1529 else
1530 PyErr_SetString(PyExc_ValueError,
1531 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1532 :"object too deeply nested to marshal");
1533 return NULL;
1534 }
Antoine Pitrou1c13f842012-03-02 18:22:23 +01001535 return wf.str;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001536}
1537
Guido van Rossum64b45521991-06-07 13:58:22 +00001538/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001539
Guido van Rossum79f25d91997-04-29 20:08:16 +00001540static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001541marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001542{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001543 /* XXX Quick hack -- need to do this differently */
1544 PyObject *x;
1545 PyObject *f;
1546 int version = Py_MARSHAL_VERSION;
1547 PyObject *s;
1548 PyObject *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001549 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
1552 return NULL;
1553 s = PyMarshal_WriteObjectToString(x, version);
1554 if (s == NULL)
1555 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001556 res = _PyObject_CallMethodId(f, &PyId_write, "O", s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 Py_DECREF(s);
1558 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001559}
1560
R. David Murraydd226ea2009-05-13 12:27:21 +00001561PyDoc_STRVAR(dump_doc,
1562"dump(value, file[, version])\n\
1563\n\
1564Write the value on the open file. The value must be a supported type.\n\
1565The file must be an open file object such as sys.stdout or returned by\n\
1566open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1567\n\
1568If the value has (or contains an object that has) an unsupported type, a\n\
1569ValueError exception is raised but garbage data will also be written\n\
1570to the file. The object will not be properly read back by load()\n\
1571\n\
1572The version argument indicates the data format that dump should use.");
1573
Guido van Rossum79f25d91997-04-29 20:08:16 +00001574static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001575marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001576{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 PyObject *data, *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001578 _Py_IDENTIFIER(read);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001579 RFILE rf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001580
1581 /*
1582 * Make a call to the read method, but read zero bytes.
1583 * This is to ensure that the object passed in at least
1584 * has a read method which returns bytes.
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001585 * This can be removed if we guarantee good error handling
1586 * for r_string()
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001587 */
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001588 data = _PyObject_CallMethodId(f, &PyId_read, "i", 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001589 if (data == NULL)
1590 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001591 if (!PyBytes_Check(data)) {
1592 PyErr_Format(PyExc_TypeError,
1593 "f.read() returned not bytes but %.100s",
1594 data->ob_type->tp_name);
1595 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001596 }
1597 else {
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001598 rf.depth = 0;
1599 rf.fp = NULL;
1600 rf.readable = f;
Vinay Sajipaac0f752011-07-02 18:42:21 +01001601 rf.current_filename = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001602 rf.ptr = rf.end = NULL;
1603 rf.buf = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001604 if ((rf.refs = PyList_New(0)) != NULL) {
1605 result = read_object(&rf);
1606 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001607 if (rf.buf != NULL)
1608 PyMem_FREE(rf.buf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001609 } else
1610 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001611 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001612 Py_DECREF(data);
1613 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001614}
1615
R. David Murraydd226ea2009-05-13 12:27:21 +00001616PyDoc_STRVAR(load_doc,
1617"load(file)\n\
1618\n\
1619Read one value from the open file and return it. If no valid value is\n\
1620read (e.g. because the data has a different Python versions\n\
1621incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1622The file must be an open file object opened in binary mode ('rb' or\n\
1623'r+b').\n\
1624\n\
1625Note: If an object containing an unsupported type was marshalled with\n\
1626dump(), load() will substitute None for the unmarshallable type.");
1627
1628
Guido van Rossum79f25d91997-04-29 20:08:16 +00001629static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001630marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001631{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001632 PyObject *x;
1633 int version = Py_MARSHAL_VERSION;
1634 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
1635 return NULL;
1636 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001637}
1638
R. David Murraydd226ea2009-05-13 12:27:21 +00001639PyDoc_STRVAR(dumps_doc,
1640"dumps(value[, version])\n\
1641\n\
1642Return the string that would be written to a file by dump(value, file).\n\
1643The value must be a supported type. Raise a ValueError exception if\n\
1644value has (or contains an object that has) an unsupported type.\n\
1645\n\
1646The version argument indicates the data format that dumps should use.");
1647
1648
Guido van Rossum79f25d91997-04-29 20:08:16 +00001649static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001650marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001651{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001652 RFILE rf;
1653 Py_buffer p;
1654 char *s;
1655 Py_ssize_t n;
1656 PyObject* result;
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001657 if (!PyArg_ParseTuple(args, "y*:loads", &p))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 return NULL;
1659 s = p.buf;
1660 n = p.len;
1661 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001662 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001663 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001664 rf.ptr = s;
1665 rf.end = s + n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001666 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001667 if ((rf.refs = PyList_New(0)) == NULL)
1668 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 result = read_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670 PyBuffer_Release(&p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001671 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001673}
1674
R. David Murraydd226ea2009-05-13 12:27:21 +00001675PyDoc_STRVAR(loads_doc,
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001676"loads(bytes)\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001677\n\
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001678Convert the bytes object to a value. If no valid value is found, raise\n\
1679EOFError, ValueError or TypeError. Extra characters in the input are\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001680ignored.");
1681
Guido van Rossum79f25d91997-04-29 20:08:16 +00001682static PyMethodDef marshal_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1684 {"load", marshal_load, METH_O, load_doc},
1685 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1686 {"loads", marshal_loads, METH_VARARGS, loads_doc},
1687 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001688};
1689
R. David Murraydd226ea2009-05-13 12:27:21 +00001690
1691PyDoc_STRVAR(module_doc,
1692"This module contains functions that can read and write Python values in\n\
1693a binary format. The format is specific to Python, but independent of\n\
1694machine architecture issues.\n\
1695\n\
1696Not all Python object types are supported; in general, only objects\n\
1697whose value is independent from a particular invocation of Python can be\n\
1698written and read by this module. The following types are supported:\n\
1699None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1700tuples, lists, sets, dictionaries, and code objects, where it\n\
1701should be understood that tuples, lists and dictionaries are only\n\
1702supported as long as the values contained therein are themselves\n\
1703supported; and recursive lists and dictionaries should not be written\n\
1704(they will cause infinite loops).\n\
1705\n\
1706Variables:\n\
1707\n\
1708version -- indicates the format that the module uses. Version 0 is the\n\
1709 historical format, version 1 shares interned strings and version 2\n\
1710 uses a binary format for floating point numbers.\n\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001711 Version 3 shares common object references (New in version 3.4).\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001712\n\
1713Functions:\n\
1714\n\
1715dump() -- write value to a file\n\
1716load() -- read value from a file\n\
1717dumps() -- write value to a string\n\
1718loads() -- read value from a string");
1719
1720
1721
Brett Cannon429ef652008-06-27 00:35:35 +00001722static struct PyModuleDef marshalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001723 PyModuleDef_HEAD_INIT,
1724 "marshal",
1725 module_doc,
1726 0,
1727 marshal_methods,
1728 NULL,
1729 NULL,
1730 NULL,
1731 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001732};
1733
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001734PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001735PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001736{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737 PyObject *mod = PyModule_Create(&marshalmodule);
1738 if (mod == NULL)
1739 return NULL;
1740 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
1741 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001742}