blob: 4401afb2116ada3e62078130aa6c8201be427939 [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);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200617 read = fread(p->buf, 1, n, p->fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100618 }
619 else {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200620 _Py_IDENTIFIER(readinto);
621 PyObject *res, *mview;
622 Py_buffer buf;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200623
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200624 if (PyBuffer_FillInfo(&buf, NULL, p->buf, n, 0, PyBUF_CONTIG) == -1)
625 return NULL;
626 mview = PyMemoryView_FromBuffer(&buf);
627 if (mview == NULL)
628 return NULL;
629
630 res = _PyObject_CallMethodId(p->readable, &PyId_readinto, "N", mview);
631 if (res != NULL) {
632 read = PyNumber_AsSsize_t(res, PyExc_ValueError);
633 Py_DECREF(res);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100634 }
635 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200636 if (read != n) {
637 if (!PyErr_Occurred()) {
638 if (read > n)
639 PyErr_Format(PyExc_ValueError,
640 "read() returned too much data: "
641 "%zd bytes requested, %zd returned",
642 n, read);
643 else
644 PyErr_SetString(PyExc_EOFError,
645 "EOF read where not expected");
646 }
647 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100648 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200649 return p->buf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100650}
651
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100652static int
653r_byte(RFILE *p)
654{
655 int c = EOF;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100656
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200657 if (p->ptr != NULL) {
658 if (p->ptr < p->end)
659 c = (unsigned char) *p->ptr++;
660 return c;
661 }
662 if (!p->readable) {
663 assert(p->fp);
664 c = getc(p->fp);
665 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100666 else {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200667 char *ptr = r_string(1, p);
668 if (ptr != NULL)
669 c = *(unsigned char *) ptr;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100670 }
671 return c;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000672}
673
674static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000675r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000676{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200677 short x = -1;
678 unsigned char *buffer;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100679
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200680 buffer = (unsigned char *) r_string(2, p);
681 if (buffer != NULL) {
682 x = buffer[0];
683 x |= buffer[1] << 8;
684 /* Sign-extension, in case short greater than 16 bits */
685 x |= -(x & 0x8000);
686 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 return x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000688}
689
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000690static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000691r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000692{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200693 long x = -1;
694 unsigned char *buffer;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100695
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200696 buffer = (unsigned char *) r_string(4, p);
697 if (buffer != NULL) {
698 x = buffer[0];
699 x |= (long)buffer[1] << 8;
700 x |= (long)buffer[2] << 16;
701 x |= (long)buffer[3] << 24;
Guido van Rossumc1547d91996-12-10 15:39:04 +0000702#if SIZEOF_LONG > 4
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200703 /* Sign extension for 64-bit machines */
704 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000705#endif
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200706 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707 return x;
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000708}
709
Guido van Rossum79f25d91997-04-29 20:08:16 +0000710static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000711r_PyLong(RFILE *p)
712{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 PyLongObject *ob;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200714 long n, size, i;
715 int j, md, shorts_in_top_digit;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100719 if (PyErr_Occurred())
720 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 if (n == 0)
722 return (PyObject *)_PyLong_New(0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200723 if (n < -SIZE32_MAX || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000724 PyErr_SetString(PyExc_ValueError,
725 "bad marshal data (long size out of range)");
726 return NULL;
727 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000729 size = 1 + (ABS(n) - 1) / PyLong_MARSHAL_RATIO;
730 shorts_in_top_digit = 1 + (ABS(n) - 1) % PyLong_MARSHAL_RATIO;
731 ob = _PyLong_New(size);
732 if (ob == NULL)
733 return NULL;
734 Py_SIZE(ob) = n > 0 ? size : -size;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000736 for (i = 0; i < size-1; i++) {
737 d = 0;
738 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
739 md = r_short(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100740 if (PyErr_Occurred())
741 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000742 if (md < 0 || md > PyLong_MARSHAL_BASE)
743 goto bad_digit;
744 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
745 }
746 ob->ob_digit[i] = d;
747 }
748 d = 0;
749 for (j=0; j < shorts_in_top_digit; j++) {
750 md = r_short(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100751 if (PyErr_Occurred())
752 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000753 if (md < 0 || md > PyLong_MARSHAL_BASE)
754 goto bad_digit;
755 /* topmost marshal digit should be nonzero */
756 if (md == 0 && j == shorts_in_top_digit - 1) {
757 Py_DECREF(ob);
758 PyErr_SetString(PyExc_ValueError,
759 "bad marshal data (unnormalized long data)");
760 return NULL;
761 }
762 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
763 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100764 if (PyErr_Occurred()) {
765 Py_DECREF(ob);
766 return NULL;
767 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 /* top digit should be nonzero, else the resulting PyLong won't be
769 normalized */
770 ob->ob_digit[size-1] = d;
771 return (PyObject *)ob;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000772 bad_digit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 Py_DECREF(ob);
774 PyErr_SetString(PyExc_ValueError,
775 "bad marshal data (digit out of range in long)");
776 return NULL;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000777}
778
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700779/* allocate the reflist index for a new object. Return -1 on failure */
780static Py_ssize_t
781r_ref_reserve(int flag, RFILE *p)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700782{
783 if (flag) { /* currently only FLAG_REF is defined */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200784 Py_ssize_t idx = PyList_GET_SIZE(p->refs);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700785 if (idx >= 0x7ffffffe) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700786 PyErr_SetString(PyExc_ValueError, "bad marshal data (index list too large)");
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700787 return -1;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700788 }
789 if (PyList_Append(p->refs, Py_None) < 0)
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700790 return -1;
791 return idx;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700792 } else
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700793 return 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700794}
795
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700796/* insert the new object 'o' to the reflist at previously
797 * allocated index 'idx'.
798 * 'o' can be NULL, in which case nothing is done.
799 * if 'o' was non-NULL, and the function succeeds, 'o' is returned.
800 * if 'o' was non-NULL, and the function fails, 'o' is released and
801 * NULL returned. This simplifies error checking at the call site since
802 * a single test for NULL for the function result is enough.
803 */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700804static PyObject *
805r_ref_insert(PyObject *o, Py_ssize_t idx, int flag, RFILE *p)
806{
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700807 if (o != NULL && flag) { /* currently only FLAG_REF is defined */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200808 PyObject *tmp = PyList_GET_ITEM(p->refs, idx);
809 Py_INCREF(o);
810 PyList_SET_ITEM(p->refs, idx, o);
811 Py_DECREF(tmp);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700812 }
813 return o;
814}
815
816/* combination of both above, used when an object can be
817 * created whenever it is seen in the file, as opposed to
818 * after having loaded its sub-objects.
819 */
820static PyObject *
821r_ref(PyObject *o, int flag, RFILE *p)
822{
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700823 if (o != NULL && flag) { /* currently only FLAG_REF is defined */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700824 if (PyList_Append(p->refs, o) < 0) {
825 Py_DECREF(o); /* release the new object */
826 return NULL;
827 }
828 }
829 return o;
830}
Mark Dickinsonbd792642009-03-18 20:06:12 +0000831
832static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000833r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000834{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000835 /* NULL is a valid return value, it does not necessarily means that
836 an exception is set. */
837 PyObject *v, *v2;
Benjamin Petersoneddb0a72013-03-20 00:40:07 -0500838 Py_ssize_t idx = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 long i, n;
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700840 int type, code = r_byte(p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200841 int flag, is_interned = 0;
Christian Heimes35728422013-10-13 02:29:06 +0200842 PyObject *retval = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000843
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700844 if (code == EOF) {
845 PyErr_SetString(PyExc_EOFError,
846 "EOF read where object expected");
847 return NULL;
848 }
849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
853 p->depth--;
854 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
855 return NULL;
856 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000857
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700858 flag = code & FLAG_REF;
859 type = code & ~FLAG_REF;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700860
861#define R_REF(O) do{\
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700862 if (flag) \
863 O = r_ref(O, flag, p);\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700864} while (0)
865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 case TYPE_NULL:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000869 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000870
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000871 case TYPE_NONE:
872 Py_INCREF(Py_None);
873 retval = Py_None;
874 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 case TYPE_STOPITER:
877 Py_INCREF(PyExc_StopIteration);
878 retval = PyExc_StopIteration;
879 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 case TYPE_ELLIPSIS:
882 Py_INCREF(Py_Ellipsis);
883 retval = Py_Ellipsis;
884 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886 case TYPE_FALSE:
887 Py_INCREF(Py_False);
888 retval = Py_False;
889 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000891 case TYPE_TRUE:
892 Py_INCREF(Py_True);
893 retval = Py_True;
894 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000895
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000896 case TYPE_INT:
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100897 n = r_long(p);
898 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700899 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 case TYPE_LONG:
903 retval = r_PyLong(p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700904 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000905 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 case TYPE_FLOAT:
908 {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200909 char buf[256], *ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 double dx;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300912 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 PyErr_SetString(PyExc_EOFError,
914 "EOF read where object expected");
915 break;
916 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200917 ptr = r_string(n, p);
918 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300919 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200920 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000921 buf[n] = '\0';
922 dx = PyOS_string_to_double(buf, NULL, NULL);
923 if (dx == -1.0 && PyErr_Occurred())
924 break;
925 retval = PyFloat_FromDouble(dx);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700926 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000927 break;
928 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000929
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000930 case TYPE_BINARY_FLOAT:
931 {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200932 unsigned char *buf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 double x;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200934 buf = (unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +0000935 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 x = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +0000938 if (x == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000939 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 retval = PyFloat_FromDouble(x);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700941 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 break;
943 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 case TYPE_COMPLEX:
946 {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200947 char buf[256], *ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000948 Py_complex c;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000949 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300950 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000951 PyErr_SetString(PyExc_EOFError,
952 "EOF read where object expected");
953 break;
954 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200955 ptr = r_string(n, p);
956 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300957 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200958 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 buf[n] = '\0';
960 c.real = PyOS_string_to_double(buf, NULL, NULL);
961 if (c.real == -1.0 && PyErr_Occurred())
962 break;
963 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300964 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 PyErr_SetString(PyExc_EOFError,
966 "EOF read where object expected");
967 break;
968 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200969 ptr = r_string(n, p);
970 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300971 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200972 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 buf[n] = '\0';
974 c.imag = PyOS_string_to_double(buf, NULL, NULL);
975 if (c.imag == -1.0 && PyErr_Occurred())
976 break;
977 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700978 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 break;
980 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000981
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000982 case TYPE_BINARY_COMPLEX:
983 {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200984 unsigned char *buf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 Py_complex c;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200986 buf = (unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +0000987 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 c.real = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +0000990 if (c.real == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000991 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200992 buf = (unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +0000993 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000994 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 c.imag = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +0000996 if (c.imag == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700999 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 break;
1001 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001002
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 case TYPE_STRING:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001004 {
1005 char *ptr;
1006 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001007 if (PyErr_Occurred())
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001008 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001009 if (n < 0 || n > SIZE32_MAX) {
1010 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001011 break;
1012 }
1013 v = PyBytes_FromStringAndSize((char *)NULL, n);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001014 if (v == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001015 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001016 ptr = r_string(n, p);
1017 if (ptr == NULL) {
1018 Py_DECREF(v);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001019 break;
1020 }
1021 memcpy(PyBytes_AS_STRING(v), ptr, n);
1022 retval = v;
1023 R_REF(retval);
1024 break;
1025 }
1026
1027 case TYPE_ASCII_INTERNED:
1028 is_interned = 1;
1029 case TYPE_ASCII:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001030 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001031 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001032 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001033 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001034 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001035 break;
1036 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001037 goto _read_ascii;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001038
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001039 case TYPE_SHORT_ASCII_INTERNED:
1040 is_interned = 1;
1041 case TYPE_SHORT_ASCII:
1042 n = r_byte(p);
1043 if (n == EOF) {
1044 PyErr_SetString(PyExc_EOFError,
1045 "EOF read where object expected");
1046 break;
1047 }
1048 _read_ascii:
1049 {
1050 char *ptr;
1051 ptr = r_string(n, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001052 if (ptr == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001053 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001054 v = PyUnicode_FromKindAndData(PyUnicode_1BYTE_KIND, ptr, n);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001055 if (v == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001056 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001057 if (is_interned)
1058 PyUnicode_InternInPlace(&v);
1059 retval = v;
1060 R_REF(retval);
1061 break;
1062 }
1063
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001064 case TYPE_INTERNED:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001065 is_interned = 1;
1066 case TYPE_UNICODE:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001067 {
1068 char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +00001069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001071 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001072 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001073 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 break;
1076 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001077 if (n != 0) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001078 buffer = r_string(n, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001079 if (buffer == NULL)
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001080 break;
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001081 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001083 else {
1084 v = PyUnicode_New(0, 0);
1085 }
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001086 if (v == NULL)
Victor Stinner3a8b79d2013-07-08 22:23:32 +02001087 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001088 if (is_interned)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001089 PyUnicode_InternInPlace(&v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 retval = v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001091 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001092 break;
1093 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001094
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001095 case TYPE_SMALL_TUPLE:
1096 n = (unsigned char) r_byte(p);
1097 goto _read_tuple;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001098 case TYPE_TUPLE:
1099 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001100 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001101 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001102 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001104 break;
1105 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001106 _read_tuple:
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001107 v = PyTuple_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001108 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001109 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 for (i = 0; i < n; i++) {
1112 v2 = r_object(p);
1113 if ( v2 == NULL ) {
1114 if (!PyErr_Occurred())
1115 PyErr_SetString(PyExc_TypeError,
1116 "NULL object in marshal data for tuple");
1117 Py_DECREF(v);
1118 v = NULL;
1119 break;
1120 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001121 PyTuple_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 }
1123 retval = v;
1124 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001126 case TYPE_LIST:
1127 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001128 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001129 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001130 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001131 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001132 break;
1133 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001134 v = PyList_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001135 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001136 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001138 for (i = 0; i < n; i++) {
1139 v2 = r_object(p);
1140 if ( v2 == NULL ) {
1141 if (!PyErr_Occurred())
1142 PyErr_SetString(PyExc_TypeError,
1143 "NULL object in marshal data for list");
1144 Py_DECREF(v);
1145 v = NULL;
1146 break;
1147 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001148 PyList_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 }
1150 retval = v;
1151 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 case TYPE_DICT:
1154 v = PyDict_New();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001155 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001156 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001157 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001158 for (;;) {
1159 PyObject *key, *val;
1160 key = r_object(p);
1161 if (key == NULL)
1162 break;
1163 val = r_object(p);
1164 if (val != NULL)
1165 PyDict_SetItem(v, key, val);
1166 Py_DECREF(key);
1167 Py_XDECREF(val);
1168 }
1169 if (PyErr_Occurred()) {
1170 Py_DECREF(v);
1171 v = NULL;
1172 }
1173 retval = v;
1174 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 case TYPE_SET:
1177 case TYPE_FROZENSET:
1178 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001179 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001180 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001181 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001182 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001183 break;
1184 }
1185 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001186 if (type == TYPE_SET) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001187 R_REF(v);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001188 } else {
1189 /* must use delayed registration of frozensets because they must
1190 * be init with a refcount of 1
1191 */
1192 idx = r_ref_reserve(flag, p);
1193 if (idx < 0)
1194 Py_CLEAR(v); /* signal error */
1195 }
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001196 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001198 for (i = 0; i < n; i++) {
1199 v2 = r_object(p);
1200 if ( v2 == NULL ) {
1201 if (!PyErr_Occurred())
1202 PyErr_SetString(PyExc_TypeError,
1203 "NULL object in marshal data for set");
1204 Py_DECREF(v);
1205 v = NULL;
1206 break;
1207 }
1208 if (PySet_Add(v, v2) == -1) {
1209 Py_DECREF(v);
1210 Py_DECREF(v2);
1211 v = NULL;
1212 break;
1213 }
1214 Py_DECREF(v2);
1215 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001216 if (type != TYPE_SET)
1217 v = r_ref_insert(v, idx, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 retval = v;
1219 break;
Raymond Hettingera422c342005-01-11 03:03:27 +00001220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 case TYPE_CODE:
1222 {
1223 int argcount;
1224 int kwonlyargcount;
1225 int nlocals;
1226 int stacksize;
1227 int flags;
1228 PyObject *code = NULL;
1229 PyObject *consts = NULL;
1230 PyObject *names = NULL;
1231 PyObject *varnames = NULL;
1232 PyObject *freevars = NULL;
1233 PyObject *cellvars = NULL;
1234 PyObject *filename = NULL;
1235 PyObject *name = NULL;
1236 int firstlineno;
1237 PyObject *lnotab = NULL;
Antoine Pitroue9bbe8b2013-04-13 22:41:09 +02001238
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001239 idx = r_ref_reserve(flag, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001240 if (idx < 0)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001241 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001243 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 /* XXX ignore long->int overflows for now */
1246 argcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001247 if (PyErr_Occurred())
1248 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 kwonlyargcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001250 if (PyErr_Occurred())
1251 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 nlocals = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001253 if (PyErr_Occurred())
1254 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 stacksize = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001256 if (PyErr_Occurred())
1257 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 flags = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001259 if (PyErr_Occurred())
1260 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001261 code = r_object(p);
1262 if (code == NULL)
1263 goto code_error;
1264 consts = r_object(p);
1265 if (consts == NULL)
1266 goto code_error;
1267 names = r_object(p);
1268 if (names == NULL)
1269 goto code_error;
1270 varnames = r_object(p);
1271 if (varnames == NULL)
1272 goto code_error;
1273 freevars = r_object(p);
1274 if (freevars == NULL)
1275 goto code_error;
1276 cellvars = r_object(p);
1277 if (cellvars == NULL)
1278 goto code_error;
1279 filename = r_object(p);
1280 if (filename == NULL)
1281 goto code_error;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001282 if (PyUnicode_CheckExact(filename)) {
1283 if (p->current_filename != NULL) {
1284 if (!PyUnicode_Compare(filename, p->current_filename)) {
1285 Py_DECREF(filename);
1286 Py_INCREF(p->current_filename);
1287 filename = p->current_filename;
1288 }
1289 }
1290 else {
1291 p->current_filename = filename;
1292 }
1293 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 name = r_object(p);
1295 if (name == NULL)
1296 goto code_error;
1297 firstlineno = (int)r_long(p);
Kristján Valur Jónsson0a7697b2013-10-13 15:19:56 +00001298 if (firstlineno == -1 && PyErr_Occurred())
1299 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 lnotab = r_object(p);
1301 if (lnotab == NULL)
1302 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 v = (PyObject *) PyCode_New(
1305 argcount, kwonlyargcount,
1306 nlocals, stacksize, flags,
1307 code, consts, names, varnames,
1308 freevars, cellvars, filename, name,
1309 firstlineno, lnotab);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001310 v = r_ref_insert(v, idx, flag, p);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 code_error:
1313 Py_XDECREF(code);
1314 Py_XDECREF(consts);
1315 Py_XDECREF(names);
1316 Py_XDECREF(varnames);
1317 Py_XDECREF(freevars);
1318 Py_XDECREF(cellvars);
1319 Py_XDECREF(filename);
1320 Py_XDECREF(name);
1321 Py_XDECREF(lnotab);
1322 }
1323 retval = v;
1324 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001325
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001326 case TYPE_REF:
1327 n = r_long(p);
1328 if (n < 0 || n >= PyList_GET_SIZE(p->refs)) {
Kristján Valur Jónsson0a7697b2013-10-13 15:19:56 +00001329 if (n == -1 && PyErr_Occurred())
1330 break;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001331 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001332 break;
1333 }
1334 v = PyList_GET_ITEM(p->refs, n);
1335 if (v == Py_None) {
1336 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001337 break;
1338 }
1339 Py_INCREF(v);
1340 retval = v;
1341 break;
1342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 default:
1344 /* Bogus data got written, which isn't ideal.
1345 This will let you keep working and recover. */
1346 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001347 break;
1348
1349 }
1350 p->depth--;
1351 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001352}
1353
Neal Norwitzd85c4522004-06-13 20:31:49 +00001354static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001355read_object(RFILE *p)
1356{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001357 PyObject *v;
1358 if (PyErr_Occurred()) {
1359 fprintf(stderr, "XXX readobject called with exception set\n");
1360 return NULL;
1361 }
1362 v = r_object(p);
1363 if (v == NULL && !PyErr_Occurred())
1364 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1365 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001366}
1367
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001368int
1369PyMarshal_ReadShortFromFile(FILE *fp)
1370{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001371 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001372 int res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001373 assert(fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001374 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001375 rf.fp = fp;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001376 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001377 rf.end = rf.ptr = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001378 rf.buf = NULL;
1379 res = r_short(&rf);
1380 if (rf.buf != NULL)
1381 PyMem_FREE(rf.buf);
1382 return res;
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001383}
1384
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001385long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001386PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001387{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001388 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001389 long res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001391 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001392 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001393 rf.ptr = rf.end = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001394 rf.buf = NULL;
1395 res = r_long(&rf);
1396 if (rf.buf != NULL)
1397 PyMem_FREE(rf.buf);
1398 return res;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001399}
1400
Tim Peters691e0e92001-01-18 04:39:16 +00001401#ifdef HAVE_FSTAT
1402/* Return size of file in bytes; < 0 if unknown. */
1403static off_t
1404getfilesize(FILE *fp)
1405{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001406 struct stat st;
1407 if (fstat(fileno(fp), &st) != 0)
1408 return -1;
1409 else
1410 return st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001411}
1412#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001413
Tim Peters691e0e92001-01-18 04:39:16 +00001414/* If we can get the size of the file up-front, and it's reasonably small,
1415 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1416 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001417 * CAUTION: since this may read the entire remainder of the file, don't
1418 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001419 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001420PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001421PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001422{
Antoine Pitrou5bc7ec92010-04-21 22:56:22 +00001423/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
Tim Peters691e0e92001-01-18 04:39:16 +00001424#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001425#ifdef HAVE_FSTAT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 off_t filesize;
1427 filesize = getfilesize(fp);
1428 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1429 char* pBuf = (char *)PyMem_MALLOC(filesize);
1430 if (pBuf != NULL) {
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001431 size_t n = fread(pBuf, 1, (size_t)filesize, fp);
1432 PyObject* v = PyMarshal_ReadObjectFromString(pBuf, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001433 PyMem_FREE(pBuf);
1434 return v;
1435 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437 }
Tim Peters691e0e92001-01-18 04:39:16 +00001438#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439 /* We don't have fstat, or we do but the file is larger than
1440 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1441 */
1442 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001443
Tim Peters691e0e92001-01-18 04:39:16 +00001444#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001445}
1446
Guido van Rossum79f25d91997-04-29 20:08:16 +00001447PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001448PyMarshal_ReadObjectFromFile(FILE *fp)
1449{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450 RFILE rf;
1451 PyObject *result;
1452 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001453 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001454 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455 rf.depth = 0;
1456 rf.ptr = rf.end = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001457 rf.buf = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001458 rf.refs = PyList_New(0);
1459 if (rf.refs == NULL)
1460 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001462 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001463 if (rf.buf != NULL)
1464 PyMem_FREE(rf.buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001465 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001466}
1467
1468PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +03001469PyMarshal_ReadObjectFromString(const char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001470{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001471 RFILE rf;
1472 PyObject *result;
1473 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001474 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001475 rf.current_filename = NULL;
Serhiy Storchakac6792272013-10-19 21:03:34 +03001476 rf.ptr = (char *)str;
1477 rf.end = (char *)str + len;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001478 rf.buf = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001479 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001480 rf.refs = PyList_New(0);
1481 if (rf.refs == NULL)
1482 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001483 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001484 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001485 if (rf.buf != NULL)
1486 PyMem_FREE(rf.buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001487 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001488}
1489
Guido van Rossum79f25d91997-04-29 20:08:16 +00001490PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001491PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001492{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001493 WFILE wf;
Guido van Rossume6d39042007-05-09 00:01:30 +00001494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495 wf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001496 wf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001497 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1498 if (wf.str == NULL)
1499 return NULL;
1500 wf.ptr = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1501 wf.end = wf.ptr + PyBytes_Size(wf.str);
1502 wf.error = WFERR_OK;
1503 wf.depth = 0;
1504 wf.version = version;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001505 if (version >= 3) {
1506 if ((wf.refs = PyDict_New()) == NULL)
1507 return NULL;
1508 } else
1509 wf.refs = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001510 w_object(x, &wf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001511 Py_XDECREF(wf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 if (wf.str != NULL) {
1513 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1514 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1515 Py_DECREF(wf.str);
1516 PyErr_SetString(PyExc_OverflowError,
1517 "too much marshal data for a string");
1518 return NULL;
1519 }
1520 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1521 return NULL;
1522 }
1523 if (wf.error != WFERR_OK) {
1524 Py_XDECREF(wf.str);
1525 if (wf.error == WFERR_NOMEMORY)
1526 PyErr_NoMemory();
1527 else
1528 PyErr_SetString(PyExc_ValueError,
1529 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1530 :"object too deeply nested to marshal");
1531 return NULL;
1532 }
Antoine Pitrou1c13f842012-03-02 18:22:23 +01001533 return wf.str;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001534}
1535
Guido van Rossum64b45521991-06-07 13:58:22 +00001536/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001537
Guido van Rossum79f25d91997-04-29 20:08:16 +00001538static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001539marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001540{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 /* XXX Quick hack -- need to do this differently */
1542 PyObject *x;
1543 PyObject *f;
1544 int version = Py_MARSHAL_VERSION;
1545 PyObject *s;
1546 PyObject *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001547 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
1550 return NULL;
1551 s = PyMarshal_WriteObjectToString(x, version);
1552 if (s == NULL)
1553 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001554 res = _PyObject_CallMethodId(f, &PyId_write, "O", s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001555 Py_DECREF(s);
1556 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001557}
1558
R. David Murraydd226ea2009-05-13 12:27:21 +00001559PyDoc_STRVAR(dump_doc,
1560"dump(value, file[, version])\n\
1561\n\
1562Write the value on the open file. The value must be a supported type.\n\
1563The file must be an open file object such as sys.stdout or returned by\n\
1564open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1565\n\
1566If the value has (or contains an object that has) an unsupported type, a\n\
1567ValueError exception is raised but garbage data will also be written\n\
1568to the file. The object will not be properly read back by load()\n\
1569\n\
1570The version argument indicates the data format that dump should use.");
1571
Guido van Rossum79f25d91997-04-29 20:08:16 +00001572static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001573marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001574{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001575 PyObject *data, *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001576 _Py_IDENTIFIER(read);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 RFILE rf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001578
1579 /*
1580 * Make a call to the read method, but read zero bytes.
1581 * This is to ensure that the object passed in at least
1582 * has a read method which returns bytes.
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001583 * This can be removed if we guarantee good error handling
1584 * for r_string()
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001585 */
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001586 data = _PyObject_CallMethodId(f, &PyId_read, "i", 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001587 if (data == NULL)
1588 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001589 if (!PyBytes_Check(data)) {
1590 PyErr_Format(PyExc_TypeError,
1591 "f.read() returned not bytes but %.100s",
1592 data->ob_type->tp_name);
1593 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001594 }
1595 else {
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001596 rf.depth = 0;
1597 rf.fp = NULL;
1598 rf.readable = f;
Vinay Sajipaac0f752011-07-02 18:42:21 +01001599 rf.current_filename = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001600 rf.ptr = rf.end = NULL;
1601 rf.buf = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001602 if ((rf.refs = PyList_New(0)) != NULL) {
1603 result = read_object(&rf);
1604 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001605 if (rf.buf != NULL)
1606 PyMem_FREE(rf.buf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001607 } else
1608 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001609 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 Py_DECREF(data);
1611 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001612}
1613
R. David Murraydd226ea2009-05-13 12:27:21 +00001614PyDoc_STRVAR(load_doc,
1615"load(file)\n\
1616\n\
1617Read one value from the open file and return it. If no valid value is\n\
1618read (e.g. because the data has a different Python versions\n\
1619incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1620The file must be an open file object opened in binary mode ('rb' or\n\
1621'r+b').\n\
1622\n\
1623Note: If an object containing an unsupported type was marshalled with\n\
1624dump(), load() will substitute None for the unmarshallable type.");
1625
1626
Guido van Rossum79f25d91997-04-29 20:08:16 +00001627static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001628marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001629{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001630 PyObject *x;
1631 int version = Py_MARSHAL_VERSION;
1632 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
1633 return NULL;
1634 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001635}
1636
R. David Murraydd226ea2009-05-13 12:27:21 +00001637PyDoc_STRVAR(dumps_doc,
1638"dumps(value[, version])\n\
1639\n\
1640Return the string that would be written to a file by dump(value, file).\n\
1641The value must be a supported type. Raise a ValueError exception if\n\
1642value has (or contains an object that has) an unsupported type.\n\
1643\n\
1644The version argument indicates the data format that dumps should use.");
1645
1646
Guido van Rossum79f25d91997-04-29 20:08:16 +00001647static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001648marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001649{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001650 RFILE rf;
1651 Py_buffer p;
1652 char *s;
1653 Py_ssize_t n;
1654 PyObject* result;
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001655 if (!PyArg_ParseTuple(args, "y*:loads", &p))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001656 return NULL;
1657 s = p.buf;
1658 n = p.len;
1659 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001660 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001661 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 rf.ptr = s;
1663 rf.end = s + n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001664 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001665 if ((rf.refs = PyList_New(0)) == NULL)
1666 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001667 result = read_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001668 PyBuffer_Release(&p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001669 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001671}
1672
R. David Murraydd226ea2009-05-13 12:27:21 +00001673PyDoc_STRVAR(loads_doc,
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001674"loads(bytes)\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001675\n\
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001676Convert the bytes object to a value. If no valid value is found, raise\n\
1677EOFError, ValueError or TypeError. Extra characters in the input are\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001678ignored.");
1679
Guido van Rossum79f25d91997-04-29 20:08:16 +00001680static PyMethodDef marshal_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1682 {"load", marshal_load, METH_O, load_doc},
1683 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1684 {"loads", marshal_loads, METH_VARARGS, loads_doc},
1685 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001686};
1687
R. David Murraydd226ea2009-05-13 12:27:21 +00001688
1689PyDoc_STRVAR(module_doc,
1690"This module contains functions that can read and write Python values in\n\
1691a binary format. The format is specific to Python, but independent of\n\
1692machine architecture issues.\n\
1693\n\
1694Not all Python object types are supported; in general, only objects\n\
1695whose value is independent from a particular invocation of Python can be\n\
1696written and read by this module. The following types are supported:\n\
1697None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1698tuples, lists, sets, dictionaries, and code objects, where it\n\
1699should be understood that tuples, lists and dictionaries are only\n\
1700supported as long as the values contained therein are themselves\n\
1701supported; and recursive lists and dictionaries should not be written\n\
1702(they will cause infinite loops).\n\
1703\n\
1704Variables:\n\
1705\n\
1706version -- indicates the format that the module uses. Version 0 is the\n\
1707 historical format, version 1 shares interned strings and version 2\n\
1708 uses a binary format for floating point numbers.\n\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001709 Version 3 shares common object references (New in version 3.4).\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001710\n\
1711Functions:\n\
1712\n\
1713dump() -- write value to a file\n\
1714load() -- read value from a file\n\
1715dumps() -- write value to a string\n\
1716loads() -- read value from a string");
1717
1718
1719
Brett Cannon429ef652008-06-27 00:35:35 +00001720static struct PyModuleDef marshalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001721 PyModuleDef_HEAD_INIT,
1722 "marshal",
1723 module_doc,
1724 0,
1725 marshal_methods,
1726 NULL,
1727 NULL,
1728 NULL,
1729 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001730};
1731
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001732PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001733PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001734{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 PyObject *mod = PyModule_Create(&marshalmodule);
1736 if (mod == NULL)
1737 return NULL;
1738 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
1739 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001740}