blob: 51d35c22956fd7511274a99066c6b9d77aac7438 [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"
Serhiy Storchakace921c622015-02-11 15:53:31 +020015#include "../Modules/hashtable.h"
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000016
Fred Drake6da0b912000-06-28 18:47:56 +000017/* High water mark to determine when the marshalled object is dangerously deep
18 * and risks coring the interpreter. When the object stack gets this deep,
19 * raise an exception instead of continuing.
Guido van Rossum63175a12007-08-29 20:39:13 +000020 * On Windows debug builds, reduce this value.
Fred Drake6da0b912000-06-28 18:47:56 +000021 */
Guido van Rossum63175a12007-08-29 20:39:13 +000022#if defined(MS_WINDOWS) && defined(_DEBUG)
Steve Dowerf6c69e62014-11-01 15:15:16 -070023#define MAX_MARSHAL_STACK_DEPTH 1000
Guido van Rossum63175a12007-08-29 20:39:13 +000024#else
Guido van Rossumd59da4b2007-05-22 18:11:13 +000025#define MAX_MARSHAL_STACK_DEPTH 2000
Guido van Rossum63175a12007-08-29 20:39:13 +000026#endif
Fred Drake6da0b912000-06-28 18:47:56 +000027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000028#define TYPE_NULL '0'
29#define TYPE_NONE 'N'
30#define TYPE_FALSE 'F'
31#define TYPE_TRUE 'T'
32#define TYPE_STOPITER 'S'
33#define TYPE_ELLIPSIS '.'
34#define TYPE_INT 'i'
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000035#define TYPE_FLOAT 'f'
36#define TYPE_BINARY_FLOAT 'g'
37#define TYPE_COMPLEX 'x'
38#define TYPE_BINARY_COMPLEX 'y'
39#define TYPE_LONG 'l'
40#define TYPE_STRING 's'
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -070041#define TYPE_INTERNED 't'
42#define TYPE_REF 'r'
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000043#define TYPE_TUPLE '('
44#define TYPE_LIST '['
45#define TYPE_DICT '{'
46#define TYPE_CODE 'c'
47#define TYPE_UNICODE 'u'
48#define TYPE_UNKNOWN '?'
49#define TYPE_SET '<'
50#define TYPE_FROZENSET '>'
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -070051#define FLAG_REF '\x80' /* with a type, add obj to index */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000052
Antoine Pitrou1164dfc2013-10-12 22:25:39 +020053#define TYPE_ASCII 'a'
54#define TYPE_ASCII_INTERNED 'A'
55#define TYPE_SMALL_TUPLE ')'
56#define TYPE_SHORT_ASCII 'z'
57#define TYPE_SHORT_ASCII_INTERNED 'Z'
58
Eric Smithb1a03cf2009-04-21 11:57:38 +000059#define WFERR_OK 0
60#define WFERR_UNMARSHALLABLE 1
61#define WFERR_NESTEDTOODEEP 2
62#define WFERR_NOMEMORY 3
63
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000064typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000065 FILE *fp;
66 int error; /* see WFERR_* values */
67 int depth;
68 /* If fp == NULL, the following are valid: */
Éric Araujo6c0ba442011-07-26 17:23:57 +020069 PyObject *readable; /* Stream-like object being read from */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000070 PyObject *str;
Benjamin Peterson43b06862011-05-27 09:08:01 -050071 PyObject *current_filename;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000072 char *ptr;
73 char *end;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +020074 char *buf;
75 Py_ssize_t buf_size;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -070076 PyObject *refs; /* dict on marshal, list on unmarshal */
Serhiy Storchakace921c622015-02-11 15:53:31 +020077 _Py_hashtable_t *hashtable;
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
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +020081#define w_byte(c, p) do { \
82 if ((p)->ptr != (p)->end || w_reserve((p), 1)) \
83 *(p)->ptr++ = (c); \
84 } while(0)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000085
86static void
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +020087w_flush(WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000088{
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +020089 assert(p->fp != NULL);
90 fwrite(p->buf, 1, p->ptr - p->buf, p->fp);
91 p->ptr = p->buf;
92}
93
94static int
95w_reserve(WFILE *p, Py_ssize_t needed)
96{
97 Py_ssize_t pos, size, delta;
98 if (p->ptr == NULL)
99 return 0; /* An error already occurred */
100 if (p->fp != NULL) {
101 w_flush(p);
102 return needed <= p->end - p->ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000103 }
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200104 assert(p->str != NULL);
105 pos = p->ptr - p->buf;
106 size = PyBytes_Size(p->str);
107 if (size > 16*1024*1024)
108 delta = (size >> 3); /* 12.5% overallocation */
109 else
110 delta = size + 1024;
111 delta = Py_MAX(delta, needed);
112 if (delta > PY_SSIZE_T_MAX - size) {
113 p->error = WFERR_NOMEMORY;
114 return 0;
115 }
116 size += delta;
117 if (_PyBytes_Resize(&p->str, size) != 0) {
118 p->ptr = p->buf = p->end = NULL;
119 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000120 }
121 else {
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200122 p->buf = PyBytes_AS_STRING(p->str);
123 p->ptr = p->buf + pos;
124 p->end = p->buf + size;
125 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000126 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000127}
128
129static void
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300130w_string(const char *s, Py_ssize_t n, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000131{
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200132 Py_ssize_t m;
133 if (!n || p->ptr == NULL)
134 return;
135 m = p->end - p->ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000136 if (p->fp != NULL) {
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200137 if (n <= m) {
138 Py_MEMCPY(p->ptr, s, n);
139 p->ptr += n;
140 }
141 else {
142 w_flush(p);
143 fwrite(s, 1, n, p->fp);
144 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000145 }
146 else {
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200147 if (n <= m || w_reserve(p, n - m)) {
148 Py_MEMCPY(p->ptr, s, n);
149 p->ptr += n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000150 }
151 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000152}
153
154static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000155w_short(int x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000156{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000157 w_byte((char)( x & 0xff), p);
158 w_byte((char)((x>> 8) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000159}
160
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000161static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000162w_long(long x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000163{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000164 w_byte((char)( x & 0xff), p);
165 w_byte((char)((x>> 8) & 0xff), p);
166 w_byte((char)((x>>16) & 0xff), p);
167 w_byte((char)((x>>24) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000168}
169
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200170#define SIZE32_MAX 0x7FFFFFFF
171
172#if SIZEOF_SIZE_T > 4
173# define W_SIZE(n, p) do { \
174 if ((n) > SIZE32_MAX) { \
175 (p)->depth--; \
176 (p)->error = WFERR_UNMARSHALLABLE; \
177 return; \
178 } \
179 w_long((long)(n), p); \
180 } while(0)
181#else
182# define W_SIZE w_long
183#endif
184
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300185static void
186w_pstring(const char *s, Py_ssize_t n, WFILE *p)
187{
188 W_SIZE(n, p);
189 w_string(s, n, p);
190}
191
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200192static void
193w_short_pstring(const char *s, Py_ssize_t n, WFILE *p)
194{
Antoine Pitroub30f2712013-10-12 23:14:47 +0200195 w_byte(Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char), p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200196 w_string(s, n, p);
197}
198
Serhiy Storchaka95949422013-08-27 19:40:23 +0300199/* We assume that Python ints are stored internally in base some power of
Mark Dickinsonbd792642009-03-18 20:06:12 +0000200 2**15; for the sake of portability we'll always read and write them in base
201 exactly 2**15. */
202
203#define PyLong_MARSHAL_SHIFT 15
204#define PyLong_MARSHAL_BASE ((short)1 << PyLong_MARSHAL_SHIFT)
205#define PyLong_MARSHAL_MASK (PyLong_MARSHAL_BASE - 1)
206#if PyLong_SHIFT % PyLong_MARSHAL_SHIFT != 0
207#error "PyLong_SHIFT must be a multiple of PyLong_MARSHAL_SHIFT"
208#endif
209#define PyLong_MARSHAL_RATIO (PyLong_SHIFT / PyLong_MARSHAL_SHIFT)
210
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700211#define W_TYPE(t, p) do { \
212 w_byte((t) | flag, (p)); \
213} while(0)
214
Mark Dickinsonbd792642009-03-18 20:06:12 +0000215static void
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700216w_PyLong(const PyLongObject *ob, char flag, WFILE *p)
Mark Dickinsonbd792642009-03-18 20:06:12 +0000217{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000218 Py_ssize_t i, j, n, l;
219 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000220
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700221 W_TYPE(TYPE_LONG, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000222 if (Py_SIZE(ob) == 0) {
223 w_long((long)0, p);
224 return;
225 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 /* set l to number of base PyLong_MARSHAL_BASE digits */
Victor Stinner45e8e2f2014-05-14 17:24:35 +0200228 n = Py_ABS(Py_SIZE(ob));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 l = (n-1) * PyLong_MARSHAL_RATIO;
230 d = ob->ob_digit[n-1];
231 assert(d != 0); /* a PyLong is always normalized */
232 do {
233 d >>= PyLong_MARSHAL_SHIFT;
234 l++;
235 } while (d != 0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200236 if (l > SIZE32_MAX) {
237 p->depth--;
238 p->error = WFERR_UNMARSHALLABLE;
239 return;
240 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000241 w_long((long)(Py_SIZE(ob) > 0 ? l : -l), p);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000243 for (i=0; i < n-1; i++) {
244 d = ob->ob_digit[i];
245 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
246 w_short(d & PyLong_MARSHAL_MASK, p);
247 d >>= PyLong_MARSHAL_SHIFT;
248 }
249 assert (d == 0);
250 }
251 d = ob->ob_digit[n-1];
252 do {
253 w_short(d & PyLong_MARSHAL_MASK, p);
254 d >>= PyLong_MARSHAL_SHIFT;
255 } while (d != 0);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000256}
257
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700258static int
259w_ref(PyObject *v, char *flag, WFILE *p)
260{
Serhiy Storchakace921c622015-02-11 15:53:31 +0200261 _Py_hashtable_entry_t *entry;
262 int w;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700263
Serhiy Storchakace921c622015-02-11 15:53:31 +0200264 if (p->version < 3 || p->hashtable == NULL)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700265 return 0; /* not writing object references */
266
267 /* if it has only one reference, it definitely isn't shared */
268 if (Py_REFCNT(v) == 1)
269 return 0;
270
Serhiy Storchakace921c622015-02-11 15:53:31 +0200271 entry = _Py_hashtable_get_entry(p->hashtable, v);
272 if (entry != NULL) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700273 /* write the reference index to the stream */
Serhiy Storchakace921c622015-02-11 15:53:31 +0200274 _Py_HASHTABLE_ENTRY_READ_DATA(p->hashtable, &w, sizeof(w), entry);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700275 /* we don't store "long" indices in the dict */
276 assert(0 <= w && w <= 0x7fffffff);
277 w_byte(TYPE_REF, p);
278 w_long(w, p);
279 return 1;
280 } else {
Serhiy Storchakace921c622015-02-11 15:53:31 +0200281 size_t s = p->hashtable->entries;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700282 /* we don't support long indices */
283 if (s >= 0x7fffffff) {
284 PyErr_SetString(PyExc_ValueError, "too many objects");
285 goto err;
286 }
Serhiy Storchakace921c622015-02-11 15:53:31 +0200287 w = s;
288 Py_INCREF(v);
289 if (_Py_HASHTABLE_SET(p->hashtable, v, w) < 0) {
290 Py_DECREF(v);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700291 goto err;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200292 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700293 *flag |= FLAG_REF;
294 return 0;
295 }
296err:
297 p->error = WFERR_UNMARSHALLABLE;
298 return 1;
299}
300
301static void
302w_complex_object(PyObject *v, char flag, WFILE *p);
303
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000304static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000305w_object(PyObject *v, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000306{
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700307 char flag = '\0';
Fred Drake6da0b912000-06-28 18:47:56 +0000308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 p->depth++;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000311 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
312 p->error = WFERR_NESTEDTOODEEP;
313 }
314 else if (v == NULL) {
315 w_byte(TYPE_NULL, p);
316 }
317 else if (v == Py_None) {
318 w_byte(TYPE_NONE, p);
319 }
320 else if (v == PyExc_StopIteration) {
321 w_byte(TYPE_STOPITER, p);
322 }
323 else if (v == Py_Ellipsis) {
324 w_byte(TYPE_ELLIPSIS, p);
325 }
326 else if (v == Py_False) {
327 w_byte(TYPE_FALSE, p);
328 }
329 else if (v == Py_True) {
330 w_byte(TYPE_TRUE, p);
331 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700332 else if (!w_ref(v, &flag, p))
333 w_complex_object(v, flag, p);
334
335 p->depth--;
336}
337
338static void
339w_complex_object(PyObject *v, char flag, WFILE *p)
340{
341 Py_ssize_t i, n;
342
343 if (PyLong_CheckExact(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 long x = PyLong_AsLong(v);
345 if ((x == -1) && PyErr_Occurred()) {
346 PyLongObject *ob = (PyLongObject *)v;
347 PyErr_Clear();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700348 w_PyLong(ob, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000349 }
350 else {
Guido van Rossumc1547d91996-12-10 15:39:04 +0000351#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000352 long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
353 if (y && y != -1) {
Martin v. Löwis7e395722012-07-28 19:44:05 +0200354 /* Too large for TYPE_INT */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700355 w_PyLong((PyLongObject*)v, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000356 }
357 else
Guido van Rossumc1547d91996-12-10 15:39:04 +0000358#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000359 {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700360 W_TYPE(TYPE_INT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000361 w_long(x, p);
362 }
363 }
364 }
365 else if (PyFloat_CheckExact(v)) {
366 if (p->version > 1) {
367 unsigned char buf[8];
368 if (_PyFloat_Pack8(PyFloat_AsDouble(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_FLOAT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000374 w_string((char*)buf, 8, p);
375 }
376 else {
377 char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
378 'g', 17, 0, NULL);
379 if (!buf) {
380 p->error = WFERR_NOMEMORY;
381 return;
382 }
383 n = strlen(buf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700384 W_TYPE(TYPE_FLOAT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000385 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200386 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000387 PyMem_Free(buf);
388 }
389 }
390 else if (PyComplex_CheckExact(v)) {
391 if (p->version > 1) {
392 unsigned char buf[8];
393 if (_PyFloat_Pack8(PyComplex_RealAsDouble(v),
394 buf, 1) < 0) {
395 p->error = WFERR_UNMARSHALLABLE;
396 return;
397 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700398 W_TYPE(TYPE_BINARY_COMPLEX, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000399 w_string((char*)buf, 8, p);
400 if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v),
401 buf, 1) < 0) {
402 p->error = WFERR_UNMARSHALLABLE;
403 return;
404 }
405 w_string((char*)buf, 8, p);
406 }
407 else {
408 char *buf;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700409 W_TYPE(TYPE_COMPLEX, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000410 buf = PyOS_double_to_string(PyComplex_RealAsDouble(v),
411 'g', 17, 0, NULL);
412 if (!buf) {
413 p->error = WFERR_NOMEMORY;
414 return;
415 }
416 n = strlen(buf);
417 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200418 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000419 PyMem_Free(buf);
420 buf = PyOS_double_to_string(PyComplex_ImagAsDouble(v),
421 'g', 17, 0, NULL);
422 if (!buf) {
423 p->error = WFERR_NOMEMORY;
424 return;
425 }
426 n = strlen(buf);
427 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200428 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429 PyMem_Free(buf);
430 }
431 }
432 else if (PyBytes_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700433 W_TYPE(TYPE_STRING, p);
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300434 w_pstring(PyBytes_AS_STRING(v), PyBytes_GET_SIZE(v), p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000435 }
436 else if (PyUnicode_CheckExact(v)) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200437 if (p->version >= 4 && PyUnicode_IS_ASCII(v)) {
438 int is_short = PyUnicode_GET_LENGTH(v) < 256;
439 if (is_short) {
440 if (PyUnicode_CHECK_INTERNED(v))
441 W_TYPE(TYPE_SHORT_ASCII_INTERNED, p);
442 else
443 W_TYPE(TYPE_SHORT_ASCII, p);
444 w_short_pstring((char *) PyUnicode_1BYTE_DATA(v),
445 PyUnicode_GET_LENGTH(v), p);
446 }
447 else {
448 if (PyUnicode_CHECK_INTERNED(v))
449 W_TYPE(TYPE_ASCII_INTERNED, p);
450 else
451 W_TYPE(TYPE_ASCII, p);
452 w_pstring((char *) PyUnicode_1BYTE_DATA(v),
453 PyUnicode_GET_LENGTH(v), p);
454 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000455 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200456 else {
457 PyObject *utf8;
458 utf8 = PyUnicode_AsEncodedString(v, "utf8", "surrogatepass");
459 if (utf8 == NULL) {
460 p->depth--;
461 p->error = WFERR_UNMARSHALLABLE;
462 return;
463 }
464 if (p->version >= 3 && PyUnicode_CHECK_INTERNED(v))
465 W_TYPE(TYPE_INTERNED, p);
466 else
467 W_TYPE(TYPE_UNICODE, p);
468 w_pstring(PyBytes_AS_STRING(utf8), PyBytes_GET_SIZE(utf8), p);
469 Py_DECREF(utf8);
470 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000471 }
472 else if (PyTuple_CheckExact(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000473 n = PyTuple_Size(v);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200474 if (p->version >= 4 && n < 256) {
475 W_TYPE(TYPE_SMALL_TUPLE, p);
Victor Stinnerda062552013-11-16 00:13:29 +0100476 w_byte((unsigned char)n, p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200477 }
478 else {
479 W_TYPE(TYPE_TUPLE, p);
480 W_SIZE(n, p);
481 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000482 for (i = 0; i < n; i++) {
483 w_object(PyTuple_GET_ITEM(v, i), p);
484 }
485 }
486 else if (PyList_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700487 W_TYPE(TYPE_LIST, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000488 n = PyList_GET_SIZE(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200489 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000490 for (i = 0; i < n; i++) {
491 w_object(PyList_GET_ITEM(v, i), p);
492 }
493 }
494 else if (PyDict_CheckExact(v)) {
495 Py_ssize_t pos;
496 PyObject *key, *value;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700497 W_TYPE(TYPE_DICT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 /* This one is NULL object terminated! */
499 pos = 0;
500 while (PyDict_Next(v, &pos, &key, &value)) {
501 w_object(key, p);
502 w_object(value, p);
503 }
504 w_object((PyObject *)NULL, p);
505 }
506 else if (PyAnySet_CheckExact(v)) {
507 PyObject *value, *it;
Raymond Hettingera422c342005-01-11 03:03:27 +0000508
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000509 if (PyObject_TypeCheck(v, &PySet_Type))
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700510 W_TYPE(TYPE_SET, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 else
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700512 W_TYPE(TYPE_FROZENSET, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 n = PyObject_Size(v);
514 if (n == -1) {
515 p->depth--;
516 p->error = WFERR_UNMARSHALLABLE;
517 return;
518 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200519 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000520 it = PyObject_GetIter(v);
521 if (it == NULL) {
522 p->depth--;
523 p->error = WFERR_UNMARSHALLABLE;
524 return;
525 }
526 while ((value = PyIter_Next(it)) != NULL) {
527 w_object(value, p);
528 Py_DECREF(value);
529 }
530 Py_DECREF(it);
531 if (PyErr_Occurred()) {
532 p->depth--;
533 p->error = WFERR_UNMARSHALLABLE;
534 return;
535 }
536 }
537 else if (PyCode_Check(v)) {
538 PyCodeObject *co = (PyCodeObject *)v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700539 W_TYPE(TYPE_CODE, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 w_long(co->co_argcount, p);
541 w_long(co->co_kwonlyargcount, p);
542 w_long(co->co_nlocals, p);
543 w_long(co->co_stacksize, p);
544 w_long(co->co_flags, p);
545 w_object(co->co_code, p);
546 w_object(co->co_consts, p);
547 w_object(co->co_names, p);
548 w_object(co->co_varnames, p);
549 w_object(co->co_freevars, p);
550 w_object(co->co_cellvars, p);
551 w_object(co->co_filename, p);
552 w_object(co->co_name, p);
553 w_long(co->co_firstlineno, p);
554 w_object(co->co_lnotab, p);
555 }
556 else if (PyObject_CheckBuffer(v)) {
Serhiy Storchakab757c832014-12-05 22:25:22 +0200557 /* Write unknown bytes-like objects as a byte string */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 Py_buffer view;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100559 if (PyObject_GetBuffer(v, &view, PyBUF_SIMPLE) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 w_byte(TYPE_UNKNOWN, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100561 p->depth--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000562 p->error = WFERR_UNMARSHALLABLE;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100563 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700565 W_TYPE(TYPE_STRING, p);
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300566 w_pstring(view.buf, view.len, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100567 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 }
569 else {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700570 W_TYPE(TYPE_UNKNOWN, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000571 p->error = WFERR_UNMARSHALLABLE;
572 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000573}
574
Serhiy Storchakace921c622015-02-11 15:53:31 +0200575static int
576w_init_refs(WFILE *wf, int version)
577{
578 if (version >= 3) {
579 wf->hashtable = _Py_hashtable_new(sizeof(int), _Py_hashtable_hash_ptr,
580 _Py_hashtable_compare_direct);
581 if (wf->hashtable == NULL) {
582 PyErr_NoMemory();
583 return -1;
584 }
585 }
586 return 0;
587}
588
589static int
590w_decref_entry(_Py_hashtable_entry_t *entry, void *Py_UNUSED(data))
591{
592 Py_XDECREF(entry->key);
593 return 0;
594}
595
596static void
597w_clear_refs(WFILE *wf)
598{
599 if (wf->hashtable != NULL) {
600 _Py_hashtable_foreach(wf->hashtable, w_decref_entry, NULL);
601 _Py_hashtable_destroy(wf->hashtable);
602 }
603}
604
Serhiy Storchaka95949422013-08-27 19:40:23 +0300605/* version currently has no effect for writing ints. */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000606void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000607PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000608{
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200609 char buf[4];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 WFILE wf;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200611 memset(&wf, 0, sizeof(wf));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 wf.fp = fp;
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200613 wf.ptr = wf.buf = buf;
614 wf.end = wf.ptr + sizeof(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 wf.error = WFERR_OK;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 wf.version = version;
617 w_long(x, &wf);
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200618 w_flush(&wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000619}
620
621void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000622PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000623{
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200624 char buf[BUFSIZ];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 WFILE wf;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200626 memset(&wf, 0, sizeof(wf));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 wf.fp = fp;
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200628 wf.ptr = wf.buf = buf;
629 wf.end = wf.ptr + sizeof(buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 wf.error = WFERR_OK;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 wf.version = version;
Serhiy Storchakace921c622015-02-11 15:53:31 +0200632 if (w_init_refs(&wf, version))
633 return; /* caller mush check PyErr_Occurred() */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 w_object(x, &wf);
Serhiy Storchakace921c622015-02-11 15:53:31 +0200635 w_clear_refs(&wf);
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +0200636 w_flush(&wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000637}
638
639typedef WFILE RFILE; /* Same struct with different invariants */
640
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200641static char *
642r_string(Py_ssize_t n, RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000643{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200644 Py_ssize_t read = -1;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100645
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200646 if (p->ptr != NULL) {
647 /* Fast path for loads() */
648 char *res = p->ptr;
649 Py_ssize_t left = p->end - p->ptr;
650 if (left < n) {
651 PyErr_SetString(PyExc_EOFError,
652 "marshal data too short");
653 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100654 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200655 p->ptr += n;
656 return res;
657 }
658 if (p->buf == NULL) {
659 p->buf = PyMem_MALLOC(n);
660 if (p->buf == NULL) {
661 PyErr_NoMemory();
662 return NULL;
663 }
664 p->buf_size = n;
665 }
666 else if (p->buf_size < n) {
667 p->buf = PyMem_REALLOC(p->buf, n);
668 if (p->buf == NULL) {
669 PyErr_NoMemory();
670 return NULL;
671 }
672 p->buf_size = n;
673 }
Victor Stinner763b0d12013-10-31 16:56:38 +0100674
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200675 if (!p->readable) {
676 assert(p->fp != NULL);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200677 read = fread(p->buf, 1, n, p->fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100678 }
679 else {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200680 _Py_IDENTIFIER(readinto);
681 PyObject *res, *mview;
682 Py_buffer buf;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200683
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200684 if (PyBuffer_FillInfo(&buf, NULL, p->buf, n, 0, PyBUF_CONTIG) == -1)
685 return NULL;
686 mview = PyMemoryView_FromBuffer(&buf);
687 if (mview == NULL)
688 return NULL;
689
690 res = _PyObject_CallMethodId(p->readable, &PyId_readinto, "N", mview);
691 if (res != NULL) {
692 read = PyNumber_AsSsize_t(res, PyExc_ValueError);
693 Py_DECREF(res);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100694 }
695 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200696 if (read != n) {
697 if (!PyErr_Occurred()) {
698 if (read > n)
699 PyErr_Format(PyExc_ValueError,
700 "read() returned too much data: "
701 "%zd bytes requested, %zd returned",
702 n, read);
703 else
704 PyErr_SetString(PyExc_EOFError,
705 "EOF read where not expected");
706 }
707 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100708 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200709 return p->buf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100710}
711
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100712static int
713r_byte(RFILE *p)
714{
715 int c = EOF;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100716
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200717 if (p->ptr != NULL) {
718 if (p->ptr < p->end)
719 c = (unsigned char) *p->ptr++;
720 return c;
721 }
722 if (!p->readable) {
723 assert(p->fp);
724 c = getc(p->fp);
725 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100726 else {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200727 char *ptr = r_string(1, p);
728 if (ptr != NULL)
729 c = *(unsigned char *) ptr;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100730 }
731 return c;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000732}
733
734static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000735r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000736{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200737 short x = -1;
738 unsigned char *buffer;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100739
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200740 buffer = (unsigned char *) r_string(2, p);
741 if (buffer != NULL) {
742 x = buffer[0];
743 x |= buffer[1] << 8;
744 /* Sign-extension, in case short greater than 16 bits */
745 x |= -(x & 0x8000);
746 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000747 return x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000748}
749
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000750static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000751r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000752{
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200753 long x = -1;
754 unsigned char *buffer;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100755
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200756 buffer = (unsigned char *) r_string(4, p);
757 if (buffer != NULL) {
758 x = buffer[0];
759 x |= (long)buffer[1] << 8;
760 x |= (long)buffer[2] << 16;
761 x |= (long)buffer[3] << 24;
Guido van Rossumc1547d91996-12-10 15:39:04 +0000762#if SIZEOF_LONG > 4
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200763 /* Sign extension for 64-bit machines */
764 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000765#endif
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200766 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 return x;
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000768}
769
Guido van Rossum79f25d91997-04-29 20:08:16 +0000770static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000771r_PyLong(RFILE *p)
772{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 PyLongObject *ob;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200774 long n, size, i;
775 int j, md, shorts_in_top_digit;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000776 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100779 if (PyErr_Occurred())
780 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000781 if (n == 0)
782 return (PyObject *)_PyLong_New(0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200783 if (n < -SIZE32_MAX || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000784 PyErr_SetString(PyExc_ValueError,
785 "bad marshal data (long size out of range)");
786 return NULL;
787 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000788
Victor Stinner45e8e2f2014-05-14 17:24:35 +0200789 size = 1 + (Py_ABS(n) - 1) / PyLong_MARSHAL_RATIO;
790 shorts_in_top_digit = 1 + (Py_ABS(n) - 1) % PyLong_MARSHAL_RATIO;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000791 ob = _PyLong_New(size);
792 if (ob == NULL)
793 return NULL;
Victor Stinner763b0d12013-10-31 16:56:38 +0100794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000795 Py_SIZE(ob) = n > 0 ? size : -size;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 for (i = 0; i < size-1; i++) {
798 d = 0;
799 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
800 md = r_short(p);
Victor Stinner763b0d12013-10-31 16:56:38 +0100801 if (PyErr_Occurred()) {
802 Py_DECREF(ob);
803 return NULL;
804 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000805 if (md < 0 || md > PyLong_MARSHAL_BASE)
806 goto bad_digit;
807 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
808 }
809 ob->ob_digit[i] = d;
810 }
Victor Stinner763b0d12013-10-31 16:56:38 +0100811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000812 d = 0;
813 for (j=0; j < shorts_in_top_digit; j++) {
814 md = r_short(p);
Victor Stinner763b0d12013-10-31 16:56:38 +0100815 if (PyErr_Occurred()) {
816 Py_DECREF(ob);
817 return NULL;
818 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000819 if (md < 0 || md > PyLong_MARSHAL_BASE)
820 goto bad_digit;
821 /* topmost marshal digit should be nonzero */
822 if (md == 0 && j == shorts_in_top_digit - 1) {
823 Py_DECREF(ob);
824 PyErr_SetString(PyExc_ValueError,
825 "bad marshal data (unnormalized long data)");
826 return NULL;
827 }
828 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
829 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100830 if (PyErr_Occurred()) {
831 Py_DECREF(ob);
832 return NULL;
833 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 /* top digit should be nonzero, else the resulting PyLong won't be
835 normalized */
836 ob->ob_digit[size-1] = d;
837 return (PyObject *)ob;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000838 bad_digit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 Py_DECREF(ob);
840 PyErr_SetString(PyExc_ValueError,
841 "bad marshal data (digit out of range in long)");
842 return NULL;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000843}
844
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700845/* allocate the reflist index for a new object. Return -1 on failure */
846static Py_ssize_t
847r_ref_reserve(int flag, RFILE *p)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700848{
849 if (flag) { /* currently only FLAG_REF is defined */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200850 Py_ssize_t idx = PyList_GET_SIZE(p->refs);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700851 if (idx >= 0x7ffffffe) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700852 PyErr_SetString(PyExc_ValueError, "bad marshal data (index list too large)");
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700853 return -1;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700854 }
855 if (PyList_Append(p->refs, Py_None) < 0)
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700856 return -1;
857 return idx;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700858 } else
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700859 return 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700860}
861
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700862/* insert the new object 'o' to the reflist at previously
863 * allocated index 'idx'.
864 * 'o' can be NULL, in which case nothing is done.
865 * if 'o' was non-NULL, and the function succeeds, 'o' is returned.
866 * if 'o' was non-NULL, and the function fails, 'o' is released and
867 * NULL returned. This simplifies error checking at the call site since
868 * a single test for NULL for the function result is enough.
869 */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700870static PyObject *
871r_ref_insert(PyObject *o, Py_ssize_t idx, int flag, RFILE *p)
872{
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700873 if (o != NULL && flag) { /* currently only FLAG_REF is defined */
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200874 PyObject *tmp = PyList_GET_ITEM(p->refs, idx);
875 Py_INCREF(o);
876 PyList_SET_ITEM(p->refs, idx, o);
877 Py_DECREF(tmp);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700878 }
879 return o;
880}
881
882/* combination of both above, used when an object can be
883 * created whenever it is seen in the file, as opposed to
884 * after having loaded its sub-objects.
885 */
886static PyObject *
887r_ref(PyObject *o, int flag, RFILE *p)
888{
Victor Stinner359fabc2013-10-31 17:09:01 +0100889 assert(flag & FLAG_REF);
890 if (o == NULL)
891 return NULL;
892 if (PyList_Append(p->refs, o) < 0) {
893 Py_DECREF(o); /* release the new object */
894 return NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700895 }
896 return o;
897}
Mark Dickinsonbd792642009-03-18 20:06:12 +0000898
899static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000900r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000901{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 /* NULL is a valid return value, it does not necessarily means that
903 an exception is set. */
904 PyObject *v, *v2;
Benjamin Petersoneddb0a72013-03-20 00:40:07 -0500905 Py_ssize_t idx = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 long i, n;
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700907 int type, code = r_byte(p);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200908 int flag, is_interned = 0;
Christian Heimes35728422013-10-13 02:29:06 +0200909 PyObject *retval = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000910
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700911 if (code == EOF) {
912 PyErr_SetString(PyExc_EOFError,
913 "EOF read where object expected");
914 return NULL;
915 }
916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000918
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000919 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
920 p->depth--;
921 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
922 return NULL;
923 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000924
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700925 flag = code & FLAG_REF;
926 type = code & ~FLAG_REF;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700927
928#define R_REF(O) do{\
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700929 if (flag) \
930 O = r_ref(O, flag, p);\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700931} while (0)
932
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000934
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000935 case TYPE_NULL:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 case TYPE_NONE:
939 Py_INCREF(Py_None);
940 retval = Py_None;
941 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000943 case TYPE_STOPITER:
944 Py_INCREF(PyExc_StopIteration);
945 retval = PyExc_StopIteration;
946 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000948 case TYPE_ELLIPSIS:
949 Py_INCREF(Py_Ellipsis);
950 retval = Py_Ellipsis;
951 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 case TYPE_FALSE:
954 Py_INCREF(Py_False);
955 retval = Py_False;
956 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 case TYPE_TRUE:
959 Py_INCREF(Py_True);
960 retval = Py_True;
961 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 case TYPE_INT:
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100964 n = r_long(p);
965 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700966 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 case TYPE_LONG:
970 retval = r_PyLong(p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700971 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000973
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974 case TYPE_FLOAT:
975 {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200976 char buf[256], *ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 double dx;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300979 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000980 PyErr_SetString(PyExc_EOFError,
981 "EOF read where object expected");
982 break;
983 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200984 ptr = r_string(n, p);
985 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300986 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200987 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 buf[n] = '\0';
989 dx = PyOS_string_to_double(buf, NULL, NULL);
990 if (dx == -1.0 && PyErr_Occurred())
991 break;
992 retval = PyFloat_FromDouble(dx);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700993 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000994 break;
995 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 case TYPE_BINARY_FLOAT:
998 {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +0200999 unsigned char *buf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 double x;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001001 buf = (unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001002 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001004 x = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001005 if (x == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007 retval = PyFloat_FromDouble(x);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001008 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 break;
1010 }
Michael W. Hudsondf888462005-06-03 14:41:55 +00001011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 case TYPE_COMPLEX:
1013 {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001014 char buf[256], *ptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 Py_complex c;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +03001017 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 PyErr_SetString(PyExc_EOFError,
1019 "EOF read where object expected");
1020 break;
1021 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001022 ptr = r_string(n, p);
1023 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +03001024 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001025 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 buf[n] = '\0';
1027 c.real = PyOS_string_to_double(buf, NULL, NULL);
1028 if (c.real == -1.0 && PyErr_Occurred())
1029 break;
1030 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +03001031 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 PyErr_SetString(PyExc_EOFError,
1033 "EOF read where object expected");
1034 break;
1035 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001036 ptr = r_string(n, p);
1037 if (ptr == NULL)
Serhiy Storchaka3641a742013-07-11 22:20:47 +03001038 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001039 memcpy(buf, ptr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 buf[n] = '\0';
1041 c.imag = PyOS_string_to_double(buf, NULL, NULL);
1042 if (c.imag == -1.0 && PyErr_Occurred())
1043 break;
1044 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001045 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 break;
1047 }
Michael W. Hudsondf888462005-06-03 14:41:55 +00001048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 case TYPE_BINARY_COMPLEX:
1050 {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001051 unsigned char *buf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 Py_complex c;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001053 buf = (unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001054 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 c.real = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001057 if (c.real == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001059 buf = (unsigned char *) r_string(8, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001060 if (buf == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 c.imag = _PyFloat_Unpack8(buf, 1);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001063 if (c.imag == -1.0 && PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001065 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001066 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001067 break;
1068 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 case TYPE_STRING:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001071 {
1072 char *ptr;
1073 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001074 if (PyErr_Occurred())
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001075 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001076 if (n < 0 || n > SIZE32_MAX) {
1077 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001078 break;
1079 }
1080 v = PyBytes_FromStringAndSize((char *)NULL, n);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001081 if (v == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001082 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001083 ptr = r_string(n, p);
1084 if (ptr == NULL) {
1085 Py_DECREF(v);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001086 break;
1087 }
1088 memcpy(PyBytes_AS_STRING(v), ptr, n);
1089 retval = v;
1090 R_REF(retval);
1091 break;
1092 }
1093
1094 case TYPE_ASCII_INTERNED:
1095 is_interned = 1;
1096 case TYPE_ASCII:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001098 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001099 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001100 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001101 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001102 break;
1103 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001104 goto _read_ascii;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001105
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001106 case TYPE_SHORT_ASCII_INTERNED:
1107 is_interned = 1;
1108 case TYPE_SHORT_ASCII:
1109 n = r_byte(p);
1110 if (n == EOF) {
1111 PyErr_SetString(PyExc_EOFError,
1112 "EOF read where object expected");
1113 break;
1114 }
1115 _read_ascii:
1116 {
1117 char *ptr;
1118 ptr = r_string(n, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001119 if (ptr == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001120 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001121 v = PyUnicode_FromKindAndData(PyUnicode_1BYTE_KIND, ptr, n);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001122 if (v == NULL)
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001123 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001124 if (is_interned)
1125 PyUnicode_InternInPlace(&v);
1126 retval = v;
1127 R_REF(retval);
1128 break;
1129 }
1130
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001131 case TYPE_INTERNED:
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001132 is_interned = 1;
1133 case TYPE_UNICODE:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001134 {
1135 char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +00001136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001138 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001139 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001140 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 break;
1143 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001144 if (n != 0) {
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001145 buffer = r_string(n, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001146 if (buffer == NULL)
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001147 break;
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001148 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 }
Victor Stinnerf1913ca2013-06-21 19:08:06 +02001150 else {
1151 v = PyUnicode_New(0, 0);
1152 }
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001153 if (v == NULL)
Victor Stinner3a8b79d2013-07-08 22:23:32 +02001154 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001155 if (is_interned)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001156 PyUnicode_InternInPlace(&v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001157 retval = v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001158 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 break;
1160 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001161
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001162 case TYPE_SMALL_TUPLE:
1163 n = (unsigned char) r_byte(p);
Victor Stinnerb1b7b182013-10-31 17:07:08 +01001164 if (PyErr_Occurred())
1165 break;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001166 goto _read_tuple;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 case TYPE_TUPLE:
1168 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001169 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001170 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001171 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001172 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001173 break;
1174 }
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001175 _read_tuple:
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001176 v = PyTuple_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001177 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001178 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 break;
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 for (i = 0; i < n; i++) {
1182 v2 = r_object(p);
1183 if ( v2 == NULL ) {
1184 if (!PyErr_Occurred())
1185 PyErr_SetString(PyExc_TypeError,
1186 "NULL object in marshal data for tuple");
1187 Py_DECREF(v);
1188 v = NULL;
1189 break;
1190 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001191 PyTuple_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001192 }
1193 retval = v;
1194 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001195
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001196 case TYPE_LIST:
1197 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001198 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001199 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001200 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001201 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001202 break;
1203 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001204 v = PyList_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001205 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001206 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001207 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 for (i = 0; i < n; i++) {
1209 v2 = r_object(p);
1210 if ( v2 == NULL ) {
1211 if (!PyErr_Occurred())
1212 PyErr_SetString(PyExc_TypeError,
1213 "NULL object in marshal data for list");
1214 Py_DECREF(v);
1215 v = NULL;
1216 break;
1217 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001218 PyList_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 }
1220 retval = v;
1221 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 case TYPE_DICT:
1224 v = PyDict_New();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001225 R_REF(v);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001226 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001228 for (;;) {
1229 PyObject *key, *val;
1230 key = r_object(p);
1231 if (key == NULL)
1232 break;
1233 val = r_object(p);
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001234 if (val == NULL) {
1235 Py_DECREF(key);
1236 break;
1237 }
1238 if (PyDict_SetItem(v, key, val) < 0) {
1239 Py_DECREF(key);
1240 Py_DECREF(val);
1241 break;
1242 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001243 Py_DECREF(key);
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001244 Py_DECREF(val);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 }
1246 if (PyErr_Occurred()) {
1247 Py_DECREF(v);
1248 v = NULL;
1249 }
1250 retval = v;
1251 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 case TYPE_SET:
1254 case TYPE_FROZENSET:
1255 n = r_long(p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001256 if (PyErr_Occurred())
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001257 break;
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001258 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 break;
1261 }
1262 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001263 if (type == TYPE_SET) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001264 R_REF(v);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001265 } else {
1266 /* must use delayed registration of frozensets because they must
1267 * be init with a refcount of 1
1268 */
1269 idx = r_ref_reserve(flag, p);
1270 if (idx < 0)
1271 Py_CLEAR(v); /* signal error */
1272 }
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001273 if (v == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 break;
Victor Stinnerd5cae6f2013-10-31 17:14:52 +01001275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 for (i = 0; i < n; i++) {
1277 v2 = r_object(p);
1278 if ( v2 == NULL ) {
1279 if (!PyErr_Occurred())
1280 PyErr_SetString(PyExc_TypeError,
1281 "NULL object in marshal data for set");
1282 Py_DECREF(v);
1283 v = NULL;
1284 break;
1285 }
1286 if (PySet_Add(v, v2) == -1) {
1287 Py_DECREF(v);
1288 Py_DECREF(v2);
1289 v = NULL;
1290 break;
1291 }
1292 Py_DECREF(v2);
1293 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001294 if (type != TYPE_SET)
1295 v = r_ref_insert(v, idx, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 retval = v;
1297 break;
Raymond Hettingera422c342005-01-11 03:03:27 +00001298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 case TYPE_CODE:
1300 {
1301 int argcount;
1302 int kwonlyargcount;
1303 int nlocals;
1304 int stacksize;
1305 int flags;
1306 PyObject *code = NULL;
1307 PyObject *consts = NULL;
1308 PyObject *names = NULL;
1309 PyObject *varnames = NULL;
1310 PyObject *freevars = NULL;
1311 PyObject *cellvars = NULL;
1312 PyObject *filename = NULL;
1313 PyObject *name = NULL;
1314 int firstlineno;
1315 PyObject *lnotab = NULL;
Antoine Pitroue9bbe8b2013-04-13 22:41:09 +02001316
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001317 idx = r_ref_reserve(flag, p);
Kristján Valur Jónsson59832582013-10-13 13:41:59 +00001318 if (idx < 0)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001319 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 /* XXX ignore long->int overflows for now */
1324 argcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001325 if (PyErr_Occurred())
1326 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 kwonlyargcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001328 if (PyErr_Occurred())
1329 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001330 nlocals = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001331 if (PyErr_Occurred())
1332 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001333 stacksize = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001334 if (PyErr_Occurred())
1335 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 flags = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001337 if (PyErr_Occurred())
1338 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001339 code = r_object(p);
1340 if (code == NULL)
1341 goto code_error;
1342 consts = r_object(p);
1343 if (consts == NULL)
1344 goto code_error;
1345 names = r_object(p);
1346 if (names == NULL)
1347 goto code_error;
1348 varnames = r_object(p);
1349 if (varnames == NULL)
1350 goto code_error;
1351 freevars = r_object(p);
1352 if (freevars == NULL)
1353 goto code_error;
1354 cellvars = r_object(p);
1355 if (cellvars == NULL)
1356 goto code_error;
1357 filename = r_object(p);
1358 if (filename == NULL)
1359 goto code_error;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001360 if (PyUnicode_CheckExact(filename)) {
1361 if (p->current_filename != NULL) {
1362 if (!PyUnicode_Compare(filename, p->current_filename)) {
1363 Py_DECREF(filename);
1364 Py_INCREF(p->current_filename);
1365 filename = p->current_filename;
1366 }
1367 }
1368 else {
1369 p->current_filename = filename;
1370 }
1371 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001372 name = r_object(p);
1373 if (name == NULL)
1374 goto code_error;
1375 firstlineno = (int)r_long(p);
Kristján Valur Jónsson0a7697b2013-10-13 15:19:56 +00001376 if (firstlineno == -1 && PyErr_Occurred())
1377 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 lnotab = r_object(p);
1379 if (lnotab == NULL)
1380 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001381
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001382 v = (PyObject *) PyCode_New(
1383 argcount, kwonlyargcount,
1384 nlocals, stacksize, flags,
1385 code, consts, names, varnames,
1386 freevars, cellvars, filename, name,
1387 firstlineno, lnotab);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001388 v = r_ref_insert(v, idx, flag, p);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001389
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 code_error:
1391 Py_XDECREF(code);
1392 Py_XDECREF(consts);
1393 Py_XDECREF(names);
1394 Py_XDECREF(varnames);
1395 Py_XDECREF(freevars);
1396 Py_XDECREF(cellvars);
1397 Py_XDECREF(filename);
1398 Py_XDECREF(name);
1399 Py_XDECREF(lnotab);
1400 }
1401 retval = v;
1402 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001403
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001404 case TYPE_REF:
1405 n = r_long(p);
1406 if (n < 0 || n >= PyList_GET_SIZE(p->refs)) {
Kristján Valur Jónsson0a7697b2013-10-13 15:19:56 +00001407 if (n == -1 && PyErr_Occurred())
1408 break;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001409 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001410 break;
1411 }
1412 v = PyList_GET_ITEM(p->refs, n);
1413 if (v == Py_None) {
1414 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001415 break;
1416 }
1417 Py_INCREF(v);
1418 retval = v;
1419 break;
1420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001421 default:
1422 /* Bogus data got written, which isn't ideal.
1423 This will let you keep working and recover. */
1424 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 break;
1426
1427 }
1428 p->depth--;
1429 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001430}
1431
Neal Norwitzd85c4522004-06-13 20:31:49 +00001432static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001433read_object(RFILE *p)
1434{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001435 PyObject *v;
1436 if (PyErr_Occurred()) {
1437 fprintf(stderr, "XXX readobject called with exception set\n");
1438 return NULL;
1439 }
1440 v = r_object(p);
1441 if (v == NULL && !PyErr_Occurred())
1442 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1443 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001444}
1445
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001446int
1447PyMarshal_ReadShortFromFile(FILE *fp)
1448{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001449 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001450 int res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001451 assert(fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001452 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453 rf.fp = fp;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001454 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455 rf.end = rf.ptr = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001456 rf.buf = NULL;
1457 res = r_short(&rf);
1458 if (rf.buf != NULL)
1459 PyMem_FREE(rf.buf);
1460 return res;
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001461}
1462
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001463long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001464PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001465{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 RFILE rf;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001467 long res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001468 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001469 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001470 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001471 rf.ptr = rf.end = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001472 rf.buf = NULL;
1473 res = r_long(&rf);
1474 if (rf.buf != NULL)
1475 PyMem_FREE(rf.buf);
1476 return res;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001477}
1478
Tim Peters691e0e92001-01-18 04:39:16 +00001479#ifdef HAVE_FSTAT
1480/* Return size of file in bytes; < 0 if unknown. */
1481static off_t
1482getfilesize(FILE *fp)
1483{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 struct stat st;
1485 if (fstat(fileno(fp), &st) != 0)
1486 return -1;
1487 else
1488 return st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001489}
1490#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001491
Tim Peters691e0e92001-01-18 04:39:16 +00001492/* If we can get the size of the file up-front, and it's reasonably small,
1493 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1494 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001495 * CAUTION: since this may read the entire remainder of the file, don't
1496 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001497 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001498PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001499PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001500{
Antoine Pitrou5bc7ec92010-04-21 22:56:22 +00001501/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
Tim Peters691e0e92001-01-18 04:39:16 +00001502#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001503#ifdef HAVE_FSTAT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001504 off_t filesize;
1505 filesize = getfilesize(fp);
1506 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1507 char* pBuf = (char *)PyMem_MALLOC(filesize);
1508 if (pBuf != NULL) {
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001509 size_t n = fread(pBuf, 1, (size_t)filesize, fp);
1510 PyObject* v = PyMarshal_ReadObjectFromString(pBuf, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001511 PyMem_FREE(pBuf);
1512 return v;
1513 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001515 }
Tim Peters691e0e92001-01-18 04:39:16 +00001516#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001517 /* We don't have fstat, or we do but the file is larger than
1518 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1519 */
1520 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001521
Tim Peters691e0e92001-01-18 04:39:16 +00001522#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001523}
1524
Guido van Rossum79f25d91997-04-29 20:08:16 +00001525PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001526PyMarshal_ReadObjectFromFile(FILE *fp)
1527{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001528 RFILE rf;
1529 PyObject *result;
1530 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001531 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001532 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001533 rf.depth = 0;
1534 rf.ptr = rf.end = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001535 rf.buf = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001536 rf.refs = PyList_New(0);
1537 if (rf.refs == NULL)
1538 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001539 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001540 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001541 if (rf.buf != NULL)
1542 PyMem_FREE(rf.buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001543 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001544}
1545
1546PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +03001547PyMarshal_ReadObjectFromString(const char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001548{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 RFILE rf;
1550 PyObject *result;
1551 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001552 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001553 rf.current_filename = NULL;
Serhiy Storchakac6792272013-10-19 21:03:34 +03001554 rf.ptr = (char *)str;
1555 rf.end = (char *)str + len;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001556 rf.buf = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001558 rf.refs = PyList_New(0);
1559 if (rf.refs == NULL)
1560 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001561 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001562 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001563 if (rf.buf != NULL)
1564 PyMem_FREE(rf.buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001566}
1567
Guido van Rossum79f25d91997-04-29 20:08:16 +00001568PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001569PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001570{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001571 WFILE wf;
Guido van Rossume6d39042007-05-09 00:01:30 +00001572
Serhiy Storchakace921c622015-02-11 15:53:31 +02001573 memset(&wf, 0, sizeof(wf));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001574 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1575 if (wf.str == NULL)
1576 return NULL;
Serhiy Storchakac1efe5f2015-02-11 15:54:54 +02001577 wf.ptr = wf.buf = PyBytes_AS_STRING((PyBytesObject *)wf.str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 wf.end = wf.ptr + PyBytes_Size(wf.str);
1579 wf.error = WFERR_OK;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 wf.version = version;
Serhiy Storchakace921c622015-02-11 15:53:31 +02001581 if (w_init_refs(&wf, version)) {
1582 Py_DECREF(wf.str);
1583 return NULL;
1584 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001585 w_object(x, &wf);
Serhiy Storchakace921c622015-02-11 15:53:31 +02001586 w_clear_refs(&wf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001587 if (wf.str != NULL) {
1588 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1589 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1590 Py_DECREF(wf.str);
1591 PyErr_SetString(PyExc_OverflowError,
1592 "too much marshal data for a string");
1593 return NULL;
1594 }
1595 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1596 return NULL;
1597 }
1598 if (wf.error != WFERR_OK) {
1599 Py_XDECREF(wf.str);
1600 if (wf.error == WFERR_NOMEMORY)
1601 PyErr_NoMemory();
1602 else
1603 PyErr_SetString(PyExc_ValueError,
1604 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1605 :"object too deeply nested to marshal");
1606 return NULL;
1607 }
Antoine Pitrou1c13f842012-03-02 18:22:23 +01001608 return wf.str;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001609}
1610
Guido van Rossum64b45521991-06-07 13:58:22 +00001611/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001612
Guido van Rossum79f25d91997-04-29 20:08:16 +00001613static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001614marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001615{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001616 /* XXX Quick hack -- need to do this differently */
1617 PyObject *x;
1618 PyObject *f;
1619 int version = Py_MARSHAL_VERSION;
1620 PyObject *s;
1621 PyObject *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001622 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001623
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001624 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
1625 return NULL;
1626 s = PyMarshal_WriteObjectToString(x, version);
1627 if (s == NULL)
1628 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001629 res = _PyObject_CallMethodId(f, &PyId_write, "O", s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001630 Py_DECREF(s);
1631 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001632}
1633
R. David Murraydd226ea2009-05-13 12:27:21 +00001634PyDoc_STRVAR(dump_doc,
1635"dump(value, file[, version])\n\
1636\n\
1637Write the value on the open file. The value must be a supported type.\n\
1638The file must be an open file object such as sys.stdout or returned by\n\
1639open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1640\n\
1641If the value has (or contains an object that has) an unsupported type, a\n\
1642ValueError exception is raised but garbage data will also be written\n\
1643to the file. The object will not be properly read back by load()\n\
1644\n\
1645The version argument indicates the data format that dump should use.");
1646
Guido van Rossum79f25d91997-04-29 20:08:16 +00001647static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001648marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001649{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001650 PyObject *data, *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001651 _Py_IDENTIFIER(read);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001652 RFILE rf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001653
1654 /*
1655 * Make a call to the read method, but read zero bytes.
1656 * This is to ensure that the object passed in at least
1657 * has a read method which returns bytes.
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001658 * This can be removed if we guarantee good error handling
1659 * for r_string()
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001660 */
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001661 data = _PyObject_CallMethodId(f, &PyId_read, "i", 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 if (data == NULL)
1663 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001664 if (!PyBytes_Check(data)) {
1665 PyErr_Format(PyExc_TypeError,
1666 "f.read() returned not bytes but %.100s",
1667 data->ob_type->tp_name);
1668 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 }
1670 else {
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001671 rf.depth = 0;
1672 rf.fp = NULL;
1673 rf.readable = f;
Vinay Sajipaac0f752011-07-02 18:42:21 +01001674 rf.current_filename = NULL;
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001675 rf.ptr = rf.end = NULL;
1676 rf.buf = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001677 if ((rf.refs = PyList_New(0)) != NULL) {
1678 result = read_object(&rf);
1679 Py_DECREF(rf.refs);
Antoine Pitrou1164dfc2013-10-12 22:25:39 +02001680 if (rf.buf != NULL)
1681 PyMem_FREE(rf.buf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001682 } else
1683 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001684 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 Py_DECREF(data);
1686 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001687}
1688
R. David Murraydd226ea2009-05-13 12:27:21 +00001689PyDoc_STRVAR(load_doc,
1690"load(file)\n\
1691\n\
1692Read one value from the open file and return it. If no valid value is\n\
1693read (e.g. because the data has a different Python versions\n\
1694incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1695The file must be an open file object opened in binary mode ('rb' or\n\
1696'r+b').\n\
1697\n\
1698Note: If an object containing an unsupported type was marshalled with\n\
1699dump(), load() will substitute None for the unmarshallable type.");
1700
1701
Guido van Rossum79f25d91997-04-29 20:08:16 +00001702static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001703marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001704{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001705 PyObject *x;
1706 int version = Py_MARSHAL_VERSION;
1707 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
1708 return NULL;
1709 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001710}
1711
R. David Murraydd226ea2009-05-13 12:27:21 +00001712PyDoc_STRVAR(dumps_doc,
1713"dumps(value[, version])\n\
1714\n\
1715Return the string that would be written to a file by dump(value, file).\n\
1716The value must be a supported type. Raise a ValueError exception if\n\
1717value has (or contains an object that has) an unsupported type.\n\
1718\n\
1719The version argument indicates the data format that dumps should use.");
1720
1721
Guido van Rossum79f25d91997-04-29 20:08:16 +00001722static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001723marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001724{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001725 RFILE rf;
1726 Py_buffer p;
1727 char *s;
1728 Py_ssize_t n;
1729 PyObject* result;
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001730 if (!PyArg_ParseTuple(args, "y*:loads", &p))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001731 return NULL;
1732 s = p.buf;
1733 n = p.len;
1734 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001735 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001736 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737 rf.ptr = s;
1738 rf.end = s + n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001739 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001740 if ((rf.refs = PyList_New(0)) == NULL)
1741 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001742 result = read_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 PyBuffer_Release(&p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001744 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001746}
1747
R. David Murraydd226ea2009-05-13 12:27:21 +00001748PyDoc_STRVAR(loads_doc,
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001749"loads(bytes)\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001750\n\
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001751Convert the bytes object to a value. If no valid value is found, raise\n\
1752EOFError, ValueError or TypeError. Extra characters in the input are\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001753ignored.");
1754
Guido van Rossum79f25d91997-04-29 20:08:16 +00001755static PyMethodDef marshal_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1757 {"load", marshal_load, METH_O, load_doc},
1758 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1759 {"loads", marshal_loads, METH_VARARGS, loads_doc},
1760 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001761};
1762
R. David Murraydd226ea2009-05-13 12:27:21 +00001763
1764PyDoc_STRVAR(module_doc,
1765"This module contains functions that can read and write Python values in\n\
1766a binary format. The format is specific to Python, but independent of\n\
1767machine architecture issues.\n\
1768\n\
1769Not all Python object types are supported; in general, only objects\n\
1770whose value is independent from a particular invocation of Python can be\n\
1771written and read by this module. The following types are supported:\n\
1772None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1773tuples, lists, sets, dictionaries, and code objects, where it\n\
1774should be understood that tuples, lists and dictionaries are only\n\
1775supported as long as the values contained therein are themselves\n\
1776supported; and recursive lists and dictionaries should not be written\n\
1777(they will cause infinite loops).\n\
1778\n\
1779Variables:\n\
1780\n\
1781version -- indicates the format that the module uses. Version 0 is the\n\
1782 historical format, version 1 shares interned strings and version 2\n\
1783 uses a binary format for floating point numbers.\n\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001784 Version 3 shares common object references (New in version 3.4).\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001785\n\
1786Functions:\n\
1787\n\
1788dump() -- write value to a file\n\
1789load() -- read value from a file\n\
1790dumps() -- write value to a string\n\
1791loads() -- read value from a string");
1792
1793
1794
Brett Cannon429ef652008-06-27 00:35:35 +00001795static struct PyModuleDef marshalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001796 PyModuleDef_HEAD_INIT,
1797 "marshal",
1798 module_doc,
1799 0,
1800 marshal_methods,
1801 NULL,
1802 NULL,
1803 NULL,
1804 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001805};
1806
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001807PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001808PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001809{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 PyObject *mod = PyModule_Create(&marshalmodule);
1811 if (mod == NULL)
1812 return NULL;
1813 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
1814 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001815}