blob: 3e13851704801efa08c1b0b2a1f5350589ed1ffb [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
Eric Smithb1a03cf2009-04-21 11:57:38 +000054#define WFERR_OK 0
55#define WFERR_UNMARSHALLABLE 1
56#define WFERR_NESTEDTOODEEP 2
57#define WFERR_NOMEMORY 3
58
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000059typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 FILE *fp;
61 int error; /* see WFERR_* values */
62 int depth;
63 /* If fp == NULL, the following are valid: */
Éric Araujo6c0ba442011-07-26 17:23:57 +020064 PyObject *readable; /* Stream-like object being read from */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000065 PyObject *str;
Benjamin Peterson43b06862011-05-27 09:08:01 -050066 PyObject *current_filename;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000067 char *ptr;
68 char *end;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -070069 PyObject *refs; /* dict on marshal, list on unmarshal */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000070 int version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000071} WFILE;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000072
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000073#define w_byte(c, p) if (((p)->fp)) putc((c), (p)->fp); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000074 else if ((p)->ptr != (p)->end) *(p)->ptr++ = (c); \
75 else w_more(c, p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000076
77static void
Fredrik Lundh11534382000-07-23 18:24:06 +000078w_more(int c, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000079{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000080 Py_ssize_t size, newsize;
81 if (p->str == NULL)
82 return; /* An error already occurred */
83 size = PyBytes_Size(p->str);
84 newsize = size + size + 1024;
85 if (newsize > 32*1024*1024) {
86 newsize = size + (size >> 3); /* 12.5% overallocation */
87 }
88 if (_PyBytes_Resize(&p->str, newsize) != 0) {
89 p->ptr = p->end = NULL;
90 }
91 else {
92 p->ptr = PyBytes_AS_STRING((PyBytesObject *)p->str) + size;
93 p->end =
94 PyBytes_AS_STRING((PyBytesObject *)p->str) + newsize;
95 *p->ptr++ = Py_SAFE_DOWNCAST(c, int, char);
96 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000097}
98
99static void
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200100w_string(char *s, Py_ssize_t n, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000101{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000102 if (p->fp != NULL) {
103 fwrite(s, 1, n, p->fp);
104 }
105 else {
106 while (--n >= 0) {
107 w_byte(*s, p);
108 s++;
109 }
110 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000111}
112
113static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000114w_short(int x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000115{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000116 w_byte((char)( x & 0xff), p);
117 w_byte((char)((x>> 8) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000118}
119
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000120static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000121w_long(long x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000122{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000123 w_byte((char)( x & 0xff), p);
124 w_byte((char)((x>> 8) & 0xff), p);
125 w_byte((char)((x>>16) & 0xff), p);
126 w_byte((char)((x>>24) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000127}
128
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200129#define SIZE32_MAX 0x7FFFFFFF
130
131#if SIZEOF_SIZE_T > 4
132# define W_SIZE(n, p) do { \
133 if ((n) > SIZE32_MAX) { \
134 (p)->depth--; \
135 (p)->error = WFERR_UNMARSHALLABLE; \
136 return; \
137 } \
138 w_long((long)(n), p); \
139 } while(0)
140#else
141# define W_SIZE w_long
142#endif
143
Mark Dickinsonbd792642009-03-18 20:06:12 +0000144/* We assume that Python longs are stored internally in base some power of
145 2**15; for the sake of portability we'll always read and write them in base
146 exactly 2**15. */
147
148#define PyLong_MARSHAL_SHIFT 15
149#define PyLong_MARSHAL_BASE ((short)1 << PyLong_MARSHAL_SHIFT)
150#define PyLong_MARSHAL_MASK (PyLong_MARSHAL_BASE - 1)
151#if PyLong_SHIFT % PyLong_MARSHAL_SHIFT != 0
152#error "PyLong_SHIFT must be a multiple of PyLong_MARSHAL_SHIFT"
153#endif
154#define PyLong_MARSHAL_RATIO (PyLong_SHIFT / PyLong_MARSHAL_SHIFT)
155
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700156#define W_TYPE(t, p) do { \
157 w_byte((t) | flag, (p)); \
158} while(0)
159
Mark Dickinsonbd792642009-03-18 20:06:12 +0000160static void
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700161w_PyLong(const PyLongObject *ob, char flag, WFILE *p)
Mark Dickinsonbd792642009-03-18 20:06:12 +0000162{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000163 Py_ssize_t i, j, n, l;
164 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000165
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700166 W_TYPE(TYPE_LONG, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000167 if (Py_SIZE(ob) == 0) {
168 w_long((long)0, p);
169 return;
170 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000172 /* set l to number of base PyLong_MARSHAL_BASE digits */
173 n = ABS(Py_SIZE(ob));
174 l = (n-1) * PyLong_MARSHAL_RATIO;
175 d = ob->ob_digit[n-1];
176 assert(d != 0); /* a PyLong is always normalized */
177 do {
178 d >>= PyLong_MARSHAL_SHIFT;
179 l++;
180 } while (d != 0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200181 if (l > SIZE32_MAX) {
182 p->depth--;
183 p->error = WFERR_UNMARSHALLABLE;
184 return;
185 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000186 w_long((long)(Py_SIZE(ob) > 0 ? l : -l), p);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000188 for (i=0; i < n-1; i++) {
189 d = ob->ob_digit[i];
190 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
191 w_short(d & PyLong_MARSHAL_MASK, p);
192 d >>= PyLong_MARSHAL_SHIFT;
193 }
194 assert (d == 0);
195 }
196 d = ob->ob_digit[n-1];
197 do {
198 w_short(d & PyLong_MARSHAL_MASK, p);
199 d >>= PyLong_MARSHAL_SHIFT;
200 } while (d != 0);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000201}
202
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700203static int
204w_ref(PyObject *v, char *flag, WFILE *p)
205{
206 PyObject *id;
207 PyObject *idx;
208
209 if (p->version < 3 || p->refs == NULL)
210 return 0; /* not writing object references */
211
212 /* if it has only one reference, it definitely isn't shared */
213 if (Py_REFCNT(v) == 1)
214 return 0;
215
216 id = PyLong_FromVoidPtr((void*)v);
217 if (id == NULL)
218 goto err;
219 idx = PyDict_GetItem(p->refs, id);
220 if (idx != NULL) {
221 /* write the reference index to the stream */
222 long w = PyLong_AsLong(idx);
223 Py_DECREF(id);
224 if (w == -1 && PyErr_Occurred()) {
225 goto err;
226 }
227 /* we don't store "long" indices in the dict */
228 assert(0 <= w && w <= 0x7fffffff);
229 w_byte(TYPE_REF, p);
230 w_long(w, p);
231 return 1;
232 } else {
233 int ok;
234 Py_ssize_t s = PyDict_Size(p->refs);
235 /* we don't support long indices */
236 if (s >= 0x7fffffff) {
237 PyErr_SetString(PyExc_ValueError, "too many objects");
238 goto err;
239 }
240 idx = PyLong_FromSsize_t(s);
241 ok = idx && PyDict_SetItem(p->refs, id, idx) == 0;
242 Py_DECREF(id);
243 Py_XDECREF(idx);
244 if (!ok)
245 goto err;
246 *flag |= FLAG_REF;
247 return 0;
248 }
249err:
250 p->error = WFERR_UNMARSHALLABLE;
251 return 1;
252}
253
254static void
255w_complex_object(PyObject *v, char flag, WFILE *p);
256
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000257static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000258w_object(PyObject *v, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000259{
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700260 char flag = '\0';
Fred Drake6da0b912000-06-28 18:47:56 +0000261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000262 p->depth++;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000264 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
265 p->error = WFERR_NESTEDTOODEEP;
266 }
267 else if (v == NULL) {
268 w_byte(TYPE_NULL, p);
269 }
270 else if (v == Py_None) {
271 w_byte(TYPE_NONE, p);
272 }
273 else if (v == PyExc_StopIteration) {
274 w_byte(TYPE_STOPITER, p);
275 }
276 else if (v == Py_Ellipsis) {
277 w_byte(TYPE_ELLIPSIS, p);
278 }
279 else if (v == Py_False) {
280 w_byte(TYPE_FALSE, p);
281 }
282 else if (v == Py_True) {
283 w_byte(TYPE_TRUE, p);
284 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700285 else if (!w_ref(v, &flag, p))
286 w_complex_object(v, flag, p);
287
288 p->depth--;
289}
290
291static void
292w_complex_object(PyObject *v, char flag, WFILE *p)
293{
294 Py_ssize_t i, n;
295
296 if (PyLong_CheckExact(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000297 long x = PyLong_AsLong(v);
298 if ((x == -1) && PyErr_Occurred()) {
299 PyLongObject *ob = (PyLongObject *)v;
300 PyErr_Clear();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700301 w_PyLong(ob, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000302 }
303 else {
Guido van Rossumc1547d91996-12-10 15:39:04 +0000304#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
306 if (y && y != -1) {
Martin v. Löwis7e395722012-07-28 19:44:05 +0200307 /* Too large for TYPE_INT */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700308 w_PyLong((PyLongObject*)v, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 }
310 else
Guido van Rossumc1547d91996-12-10 15:39:04 +0000311#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000312 {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700313 W_TYPE(TYPE_INT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000314 w_long(x, p);
315 }
316 }
317 }
318 else if (PyFloat_CheckExact(v)) {
319 if (p->version > 1) {
320 unsigned char buf[8];
321 if (_PyFloat_Pack8(PyFloat_AsDouble(v),
322 buf, 1) < 0) {
323 p->error = WFERR_UNMARSHALLABLE;
324 return;
325 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700326 W_TYPE(TYPE_BINARY_FLOAT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000327 w_string((char*)buf, 8, p);
328 }
329 else {
330 char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
331 'g', 17, 0, NULL);
332 if (!buf) {
333 p->error = WFERR_NOMEMORY;
334 return;
335 }
336 n = strlen(buf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700337 W_TYPE(TYPE_FLOAT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000338 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200339 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000340 PyMem_Free(buf);
341 }
342 }
343 else if (PyComplex_CheckExact(v)) {
344 if (p->version > 1) {
345 unsigned char buf[8];
346 if (_PyFloat_Pack8(PyComplex_RealAsDouble(v),
347 buf, 1) < 0) {
348 p->error = WFERR_UNMARSHALLABLE;
349 return;
350 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700351 W_TYPE(TYPE_BINARY_COMPLEX, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000352 w_string((char*)buf, 8, p);
353 if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v),
354 buf, 1) < 0) {
355 p->error = WFERR_UNMARSHALLABLE;
356 return;
357 }
358 w_string((char*)buf, 8, p);
359 }
360 else {
361 char *buf;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700362 W_TYPE(TYPE_COMPLEX, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000363 buf = PyOS_double_to_string(PyComplex_RealAsDouble(v),
364 'g', 17, 0, NULL);
365 if (!buf) {
366 p->error = WFERR_NOMEMORY;
367 return;
368 }
369 n = strlen(buf);
370 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200371 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000372 PyMem_Free(buf);
373 buf = PyOS_double_to_string(PyComplex_ImagAsDouble(v),
374 'g', 17, 0, NULL);
375 if (!buf) {
376 p->error = WFERR_NOMEMORY;
377 return;
378 }
379 n = strlen(buf);
380 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200381 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 PyMem_Free(buf);
383 }
384 }
385 else if (PyBytes_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700386 W_TYPE(TYPE_STRING, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000387 n = PyBytes_GET_SIZE(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200388 W_SIZE(n, p);
389 w_string(PyBytes_AS_STRING(v), n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000390 }
391 else if (PyUnicode_CheckExact(v)) {
392 PyObject *utf8;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200393 utf8 = PyUnicode_AsEncodedString(v, "utf8", "surrogatepass");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000394 if (utf8 == NULL) {
395 p->depth--;
396 p->error = WFERR_UNMARSHALLABLE;
397 return;
398 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700399 if (p->version >= 3 && PyUnicode_CHECK_INTERNED(v))
400 W_TYPE(TYPE_INTERNED, p);
401 else
402 W_TYPE(TYPE_UNICODE, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000403 n = PyBytes_GET_SIZE(utf8);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200404 W_SIZE(n, p);
405 w_string(PyBytes_AS_STRING(utf8), n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000406 Py_DECREF(utf8);
407 }
408 else if (PyTuple_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700409 W_TYPE(TYPE_TUPLE, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000410 n = PyTuple_Size(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200411 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000412 for (i = 0; i < n; i++) {
413 w_object(PyTuple_GET_ITEM(v, i), p);
414 }
415 }
416 else if (PyList_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700417 W_TYPE(TYPE_LIST, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000418 n = PyList_GET_SIZE(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200419 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000420 for (i = 0; i < n; i++) {
421 w_object(PyList_GET_ITEM(v, i), p);
422 }
423 }
424 else if (PyDict_CheckExact(v)) {
425 Py_ssize_t pos;
426 PyObject *key, *value;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700427 W_TYPE(TYPE_DICT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000428 /* This one is NULL object terminated! */
429 pos = 0;
430 while (PyDict_Next(v, &pos, &key, &value)) {
431 w_object(key, p);
432 w_object(value, p);
433 }
434 w_object((PyObject *)NULL, p);
435 }
436 else if (PyAnySet_CheckExact(v)) {
437 PyObject *value, *it;
Raymond Hettingera422c342005-01-11 03:03:27 +0000438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000439 if (PyObject_TypeCheck(v, &PySet_Type))
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700440 W_TYPE(TYPE_SET, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000441 else
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700442 W_TYPE(TYPE_FROZENSET, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 n = PyObject_Size(v);
444 if (n == -1) {
445 p->depth--;
446 p->error = WFERR_UNMARSHALLABLE;
447 return;
448 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200449 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000450 it = PyObject_GetIter(v);
451 if (it == NULL) {
452 p->depth--;
453 p->error = WFERR_UNMARSHALLABLE;
454 return;
455 }
456 while ((value = PyIter_Next(it)) != NULL) {
457 w_object(value, p);
458 Py_DECREF(value);
459 }
460 Py_DECREF(it);
461 if (PyErr_Occurred()) {
462 p->depth--;
463 p->error = WFERR_UNMARSHALLABLE;
464 return;
465 }
466 }
467 else if (PyCode_Check(v)) {
468 PyCodeObject *co = (PyCodeObject *)v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700469 W_TYPE(TYPE_CODE, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000470 w_long(co->co_argcount, p);
471 w_long(co->co_kwonlyargcount, p);
472 w_long(co->co_nlocals, p);
473 w_long(co->co_stacksize, p);
474 w_long(co->co_flags, p);
475 w_object(co->co_code, p);
476 w_object(co->co_consts, p);
477 w_object(co->co_names, p);
478 w_object(co->co_varnames, p);
479 w_object(co->co_freevars, p);
480 w_object(co->co_cellvars, p);
481 w_object(co->co_filename, p);
482 w_object(co->co_name, p);
483 w_long(co->co_firstlineno, p);
484 w_object(co->co_lnotab, p);
485 }
486 else if (PyObject_CheckBuffer(v)) {
487 /* Write unknown buffer-style objects as a string */
488 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000489 Py_buffer view;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100490 if (PyObject_GetBuffer(v, &view, PyBUF_SIMPLE) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 w_byte(TYPE_UNKNOWN, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100492 p->depth--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 p->error = WFERR_UNMARSHALLABLE;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100494 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700496 W_TYPE(TYPE_STRING, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000497 n = view.len;
498 s = view.buf;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200499 W_SIZE(n, p);
500 w_string(s, n, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100501 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000502 }
503 else {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700504 W_TYPE(TYPE_UNKNOWN, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000505 p->error = WFERR_UNMARSHALLABLE;
506 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000507}
508
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000509/* version currently has no effect for writing longs. */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000510void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000511PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000512{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 WFILE wf;
514 wf.fp = fp;
515 wf.error = WFERR_OK;
516 wf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700517 wf.refs = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 wf.version = version;
519 w_long(x, &wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000520}
521
522void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000523PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000524{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000525 WFILE wf;
526 wf.fp = fp;
527 wf.error = WFERR_OK;
528 wf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700529 if (version >= 3) {
530 if ((wf.refs = PyDict_New()) == NULL)
531 return; /* caller mush check PyErr_Occurred() */
532 } else
533 wf.refs = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 wf.version = version;
535 w_object(x, &wf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700536 Py_XDECREF(wf.refs);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000537}
538
539typedef WFILE RFILE; /* Same struct with different invariants */
540
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000541#define rs_byte(p) (((p)->ptr < (p)->end) ? (unsigned char)*(p)->ptr++ : EOF)
Guido van Rossum8d617a61995-03-09 12:12:11 +0000542
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200543static Py_ssize_t
544r_string(char *s, Py_ssize_t n, RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000545{
Éric Araujo6c0ba442011-07-26 17:23:57 +0200546 char *ptr;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200547 Py_ssize_t read, left;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100548
549 if (!p->readable) {
550 if (p->fp != NULL)
551 /* The result fits into int because it must be <=n. */
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200552 read = fread(s, 1, n, p->fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100553 else {
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200554 left = p->end - p->ptr;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100555 read = (left < n) ? left : n;
556 memcpy(s, p->ptr, read);
557 p->ptr += read;
558 }
559 }
560 else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200561 _Py_IDENTIFIER(read);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200562
Serhiy Storchaka5a1f1522013-02-13 12:11:03 +0200563 PyObject *data = _PyObject_CallMethodId(p->readable, &PyId_read, "n", n);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100564 read = 0;
565 if (data != NULL) {
566 if (!PyBytes_Check(data)) {
567 PyErr_Format(PyExc_TypeError,
568 "f.read() returned not bytes but %.100s",
569 data->ob_type->tp_name);
570 }
571 else {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700572 read = (int)PyBytes_GET_SIZE(data);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100573 if (read > 0) {
574 ptr = PyBytes_AS_STRING(data);
575 memcpy(s, ptr, read);
576 }
577 }
578 Py_DECREF(data);
579 }
580 }
581 if (!PyErr_Occurred() && (read < n)) {
582 PyErr_SetString(PyExc_EOFError, "EOF read where not expected");
583 }
584 return read;
585}
586
587
588static int
589r_byte(RFILE *p)
590{
591 int c = EOF;
592 unsigned char ch;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200593 Py_ssize_t n;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100594
595 if (!p->readable)
596 c = p->fp ? getc(p->fp) : rs_byte(p);
597 else {
598 n = r_string((char *) &ch, 1, p);
599 if (n > 0)
600 c = ch;
601 }
602 return c;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000603}
604
605static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000606r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000607{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 register short x;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100609 unsigned char buffer[2];
610
611 r_string((char *) buffer, 2, p);
612 x = buffer[0];
613 x |= buffer[1] << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 /* Sign-extension, in case short greater than 16 bits */
615 x |= -(x & 0x8000);
616 return x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000617}
618
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000619static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000620r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000621{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 register long x;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100623 unsigned char buffer[4];
624
625 r_string((char *) buffer, 4, p);
626 x = buffer[0];
627 x |= (long)buffer[1] << 8;
628 x |= (long)buffer[2] << 16;
629 x |= (long)buffer[3] << 24;
Guido van Rossumc1547d91996-12-10 15:39:04 +0000630#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 /* Sign extension for 64-bit machines */
632 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000633#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 return x;
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000635}
636
Guido van Rossum79f25d91997-04-29 20:08:16 +0000637static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000638r_PyLong(RFILE *p)
639{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 PyLongObject *ob;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200641 long n, size, i;
642 int j, md, shorts_in_top_digit;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100646 if (PyErr_Occurred())
647 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 if (n == 0)
649 return (PyObject *)_PyLong_New(0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200650 if (n < -SIZE32_MAX || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000651 PyErr_SetString(PyExc_ValueError,
652 "bad marshal data (long size out of range)");
653 return NULL;
654 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 size = 1 + (ABS(n) - 1) / PyLong_MARSHAL_RATIO;
657 shorts_in_top_digit = 1 + (ABS(n) - 1) % PyLong_MARSHAL_RATIO;
658 ob = _PyLong_New(size);
659 if (ob == NULL)
660 return NULL;
661 Py_SIZE(ob) = n > 0 ? size : -size;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000663 for (i = 0; i < size-1; i++) {
664 d = 0;
665 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
666 md = r_short(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100667 if (PyErr_Occurred())
668 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 if (md < 0 || md > PyLong_MARSHAL_BASE)
670 goto bad_digit;
671 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
672 }
673 ob->ob_digit[i] = d;
674 }
675 d = 0;
676 for (j=0; j < shorts_in_top_digit; j++) {
677 md = r_short(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100678 if (PyErr_Occurred())
679 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000680 if (md < 0 || md > PyLong_MARSHAL_BASE)
681 goto bad_digit;
682 /* topmost marshal digit should be nonzero */
683 if (md == 0 && j == shorts_in_top_digit - 1) {
684 Py_DECREF(ob);
685 PyErr_SetString(PyExc_ValueError,
686 "bad marshal data (unnormalized long data)");
687 return NULL;
688 }
689 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
690 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100691 if (PyErr_Occurred()) {
692 Py_DECREF(ob);
693 return NULL;
694 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 /* top digit should be nonzero, else the resulting PyLong won't be
696 normalized */
697 ob->ob_digit[size-1] = d;
698 return (PyObject *)ob;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000699 bad_digit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000700 Py_DECREF(ob);
701 PyErr_SetString(PyExc_ValueError,
702 "bad marshal data (digit out of range in long)");
703 return NULL;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000704}
705
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700706/* allocate the reflist index for a new object. Return -1 on failure */
707static Py_ssize_t
708r_ref_reserve(int flag, RFILE *p)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700709{
710 if (flag) { /* currently only FLAG_REF is defined */
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700711 Py_ssize_t idx = PyList_Size(p->refs);
712 if (idx < 0)
713 return -1;
714 if (idx >= 0x7ffffffe) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700715 PyErr_SetString(PyExc_ValueError, "bad marshal data (index list too large)");
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700716 return -1;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700717 }
718 if (PyList_Append(p->refs, Py_None) < 0)
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700719 return -1;
720 return idx;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700721 } else
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700722 return 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700723}
724
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700725/* insert the new object 'o' to the reflist at previously
726 * allocated index 'idx'.
727 * 'o' can be NULL, in which case nothing is done.
728 * if 'o' was non-NULL, and the function succeeds, 'o' is returned.
729 * if 'o' was non-NULL, and the function fails, 'o' is released and
730 * NULL returned. This simplifies error checking at the call site since
731 * a single test for NULL for the function result is enough.
732 */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700733static PyObject *
734r_ref_insert(PyObject *o, Py_ssize_t idx, int flag, RFILE *p)
735{
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700736 if (o != NULL && flag) { /* currently only FLAG_REF is defined */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700737 if (PyList_SetItem(p->refs, idx, o) < 0) {
738 Py_DECREF(o); /* release the new object */
739 return NULL;
740 } else {
741 Py_INCREF(o); /* a reference for the list */
742 }
743 }
744 return o;
745}
746
747/* combination of both above, used when an object can be
748 * created whenever it is seen in the file, as opposed to
749 * after having loaded its sub-objects.
750 */
751static PyObject *
752r_ref(PyObject *o, int flag, RFILE *p)
753{
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700754 if (o != NULL && flag) { /* currently only FLAG_REF is defined */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700755 if (PyList_Append(p->refs, o) < 0) {
756 Py_DECREF(o); /* release the new object */
757 return NULL;
758 }
759 }
760 return o;
761}
Mark Dickinsonbd792642009-03-18 20:06:12 +0000762
763static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000764r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000765{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 /* NULL is a valid return value, it does not necessarily means that
767 an exception is set. */
768 PyObject *v, *v2;
Benjamin Petersoneddb0a72013-03-20 00:40:07 -0500769 Py_ssize_t idx = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 long i, n;
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700771 int type, code = r_byte(p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700772 int flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 PyObject *retval;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000774
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700775 if (code == EOF) {
776 PyErr_SetString(PyExc_EOFError,
777 "EOF read where object expected");
778 return NULL;
779 }
780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000781 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000783 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
784 p->depth--;
785 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
786 return NULL;
787 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000788
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700789 flag = code & FLAG_REF;
790 type = code & ~FLAG_REF;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700791
792#define R_REF(O) do{\
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700793 if (flag) \
794 O = r_ref(O, flag, p);\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700795} while (0)
796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000799 case TYPE_NULL:
800 retval = NULL;
801 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000803 case TYPE_NONE:
804 Py_INCREF(Py_None);
805 retval = Py_None;
806 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000807
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000808 case TYPE_STOPITER:
809 Py_INCREF(PyExc_StopIteration);
810 retval = PyExc_StopIteration;
811 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000813 case TYPE_ELLIPSIS:
814 Py_INCREF(Py_Ellipsis);
815 retval = Py_Ellipsis;
816 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000818 case TYPE_FALSE:
819 Py_INCREF(Py_False);
820 retval = Py_False;
821 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000823 case TYPE_TRUE:
824 Py_INCREF(Py_True);
825 retval = Py_True;
826 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000828 case TYPE_INT:
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100829 n = r_long(p);
830 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700831 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000832 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 case TYPE_LONG:
835 retval = r_PyLong(p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700836 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 case TYPE_FLOAT:
840 {
841 char buf[256];
842 double dx;
843 retval = NULL;
844 n = r_byte(p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200845 if (n == EOF || r_string(buf, n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 PyErr_SetString(PyExc_EOFError,
847 "EOF read where object expected");
848 break;
849 }
850 buf[n] = '\0';
851 dx = PyOS_string_to_double(buf, NULL, NULL);
852 if (dx == -1.0 && PyErr_Occurred())
853 break;
854 retval = PyFloat_FromDouble(dx);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700855 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 break;
857 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 case TYPE_BINARY_FLOAT:
860 {
861 unsigned char buf[8];
862 double x;
863 if (r_string((char*)buf, 8, p) != 8) {
864 PyErr_SetString(PyExc_EOFError,
865 "EOF read where object expected");
866 retval = NULL;
867 break;
868 }
869 x = _PyFloat_Unpack8(buf, 1);
870 if (x == -1.0 && PyErr_Occurred()) {
871 retval = NULL;
872 break;
873 }
874 retval = PyFloat_FromDouble(x);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700875 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 break;
877 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 case TYPE_COMPLEX:
880 {
881 char buf[256];
882 Py_complex c;
883 retval = NULL;
884 n = r_byte(p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200885 if (n == EOF || r_string(buf, n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886 PyErr_SetString(PyExc_EOFError,
887 "EOF read where object expected");
888 break;
889 }
890 buf[n] = '\0';
891 c.real = PyOS_string_to_double(buf, NULL, NULL);
892 if (c.real == -1.0 && PyErr_Occurred())
893 break;
894 n = r_byte(p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200895 if (n == EOF || r_string(buf, n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000896 PyErr_SetString(PyExc_EOFError,
897 "EOF read where object expected");
898 break;
899 }
900 buf[n] = '\0';
901 c.imag = PyOS_string_to_double(buf, NULL, NULL);
902 if (c.imag == -1.0 && PyErr_Occurred())
903 break;
904 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700905 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 break;
907 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000908
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 case TYPE_BINARY_COMPLEX:
910 {
911 unsigned char buf[8];
912 Py_complex c;
913 if (r_string((char*)buf, 8, p) != 8) {
914 PyErr_SetString(PyExc_EOFError,
915 "EOF read where object expected");
916 retval = NULL;
917 break;
918 }
919 c.real = _PyFloat_Unpack8(buf, 1);
920 if (c.real == -1.0 && PyErr_Occurred()) {
921 retval = NULL;
922 break;
923 }
924 if (r_string((char*)buf, 8, p) != 8) {
925 PyErr_SetString(PyExc_EOFError,
926 "EOF read where object expected");
927 retval = NULL;
928 break;
929 }
930 c.imag = _PyFloat_Unpack8(buf, 1);
931 if (c.imag == -1.0 && PyErr_Occurred()) {
932 retval = NULL;
933 break;
934 }
935 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700936 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 break;
938 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000939
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 case TYPE_STRING:
941 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100942 if (PyErr_Occurred()) {
943 retval = NULL;
944 break;
945 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200946 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
948 retval = NULL;
949 break;
950 }
951 v = PyBytes_FromStringAndSize((char *)NULL, n);
952 if (v == NULL) {
953 retval = NULL;
954 break;
955 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200956 if (r_string(PyBytes_AS_STRING(v), n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 Py_DECREF(v);
958 PyErr_SetString(PyExc_EOFError,
959 "EOF read where object expected");
960 retval = NULL;
961 break;
962 }
963 retval = v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700964 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 case TYPE_UNICODE:
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700968 case TYPE_INTERNED:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 {
970 char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +0000971
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100973 if (PyErr_Occurred()) {
974 retval = NULL;
975 break;
976 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200977 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
979 retval = NULL;
980 break;
981 }
982 buffer = PyMem_NEW(char, n);
983 if (buffer == NULL) {
984 retval = PyErr_NoMemory();
985 break;
986 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200987 if (r_string(buffer, n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 PyMem_DEL(buffer);
989 PyErr_SetString(PyExc_EOFError,
990 "EOF read where object expected");
991 retval = NULL;
992 break;
993 }
994 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
995 PyMem_DEL(buffer);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700996 if (type == TYPE_INTERNED)
997 PyUnicode_InternInPlace(&v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 retval = v;
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_TUPLE:
1004 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001005 if (PyErr_Occurred()) {
1006 retval = NULL;
1007 break;
1008 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001009 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
1011 retval = NULL;
1012 break;
1013 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001014 v = PyTuple_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001015 R_REF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 if (v == NULL) {
1017 retval = NULL;
1018 break;
1019 }
1020 for (i = 0; i < n; i++) {
1021 v2 = r_object(p);
1022 if ( v2 == NULL ) {
1023 if (!PyErr_Occurred())
1024 PyErr_SetString(PyExc_TypeError,
1025 "NULL object in marshal data for tuple");
1026 Py_DECREF(v);
1027 v = NULL;
1028 break;
1029 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001030 PyTuple_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001031 }
1032 retval = v;
1033 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001034
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001035 case TYPE_LIST:
1036 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001037 if (PyErr_Occurred()) {
1038 retval = NULL;
1039 break;
1040 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001041 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001042 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
1043 retval = NULL;
1044 break;
1045 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001046 v = PyList_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001047 R_REF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 if (v == NULL) {
1049 retval = NULL;
1050 break;
1051 }
1052 for (i = 0; i < n; i++) {
1053 v2 = r_object(p);
1054 if ( v2 == NULL ) {
1055 if (!PyErr_Occurred())
1056 PyErr_SetString(PyExc_TypeError,
1057 "NULL object in marshal data for list");
1058 Py_DECREF(v);
1059 v = NULL;
1060 break;
1061 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001062 PyList_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001063 }
1064 retval = v;
1065 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001067 case TYPE_DICT:
1068 v = PyDict_New();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001069 R_REF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 if (v == NULL) {
1071 retval = NULL;
1072 break;
1073 }
1074 for (;;) {
1075 PyObject *key, *val;
1076 key = r_object(p);
1077 if (key == NULL)
1078 break;
1079 val = r_object(p);
1080 if (val != NULL)
1081 PyDict_SetItem(v, key, val);
1082 Py_DECREF(key);
1083 Py_XDECREF(val);
1084 }
1085 if (PyErr_Occurred()) {
1086 Py_DECREF(v);
1087 v = NULL;
1088 }
1089 retval = v;
1090 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001091
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001092 case TYPE_SET:
1093 case TYPE_FROZENSET:
1094 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001095 if (PyErr_Occurred()) {
1096 retval = NULL;
1097 break;
1098 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001099 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
1101 retval = NULL;
1102 break;
1103 }
1104 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001105 if (type == TYPE_SET) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001106 R_REF(v);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001107 } else {
1108 /* must use delayed registration of frozensets because they must
1109 * be init with a refcount of 1
1110 */
1111 idx = r_ref_reserve(flag, p);
1112 if (idx < 0)
1113 Py_CLEAR(v); /* signal error */
1114 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 if (v == NULL) {
1116 retval = NULL;
1117 break;
1118 }
1119 for (i = 0; i < n; i++) {
1120 v2 = r_object(p);
1121 if ( v2 == NULL ) {
1122 if (!PyErr_Occurred())
1123 PyErr_SetString(PyExc_TypeError,
1124 "NULL object in marshal data for set");
1125 Py_DECREF(v);
1126 v = NULL;
1127 break;
1128 }
1129 if (PySet_Add(v, v2) == -1) {
1130 Py_DECREF(v);
1131 Py_DECREF(v2);
1132 v = NULL;
1133 break;
1134 }
1135 Py_DECREF(v2);
1136 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001137 if (type != TYPE_SET)
1138 v = r_ref_insert(v, idx, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 retval = v;
1140 break;
Raymond Hettingera422c342005-01-11 03:03:27 +00001141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 case TYPE_CODE:
1143 {
1144 int argcount;
1145 int kwonlyargcount;
1146 int nlocals;
1147 int stacksize;
1148 int flags;
1149 PyObject *code = NULL;
1150 PyObject *consts = NULL;
1151 PyObject *names = NULL;
1152 PyObject *varnames = NULL;
1153 PyObject *freevars = NULL;
1154 PyObject *cellvars = NULL;
1155 PyObject *filename = NULL;
1156 PyObject *name = NULL;
1157 int firstlineno;
1158 PyObject *lnotab = NULL;
Antoine Pitroue9bbe8b2013-04-13 22:41:09 +02001159
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001160 idx = r_ref_reserve(flag, p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001161 if (idx < 0) {
1162 retval = NULL;
1163 break;
1164 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 /* XXX ignore long->int overflows for now */
1169 argcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001170 if (PyErr_Occurred())
1171 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001172 kwonlyargcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001173 if (PyErr_Occurred())
1174 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 nlocals = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001176 if (PyErr_Occurred())
1177 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001178 stacksize = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001179 if (PyErr_Occurred())
1180 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 flags = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001182 if (PyErr_Occurred())
1183 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 code = r_object(p);
1185 if (code == NULL)
1186 goto code_error;
1187 consts = r_object(p);
1188 if (consts == NULL)
1189 goto code_error;
1190 names = r_object(p);
1191 if (names == NULL)
1192 goto code_error;
1193 varnames = r_object(p);
1194 if (varnames == NULL)
1195 goto code_error;
1196 freevars = r_object(p);
1197 if (freevars == NULL)
1198 goto code_error;
1199 cellvars = r_object(p);
1200 if (cellvars == NULL)
1201 goto code_error;
1202 filename = r_object(p);
1203 if (filename == NULL)
1204 goto code_error;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001205 if (PyUnicode_CheckExact(filename)) {
1206 if (p->current_filename != NULL) {
1207 if (!PyUnicode_Compare(filename, p->current_filename)) {
1208 Py_DECREF(filename);
1209 Py_INCREF(p->current_filename);
1210 filename = p->current_filename;
1211 }
1212 }
1213 else {
1214 p->current_filename = filename;
1215 }
1216 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 name = r_object(p);
1218 if (name == NULL)
1219 goto code_error;
1220 firstlineno = (int)r_long(p);
1221 lnotab = r_object(p);
1222 if (lnotab == NULL)
1223 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 v = (PyObject *) PyCode_New(
1226 argcount, kwonlyargcount,
1227 nlocals, stacksize, flags,
1228 code, consts, names, varnames,
1229 freevars, cellvars, filename, name,
1230 firstlineno, lnotab);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001231 v = r_ref_insert(v, idx, flag, p);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001233 code_error:
1234 Py_XDECREF(code);
1235 Py_XDECREF(consts);
1236 Py_XDECREF(names);
1237 Py_XDECREF(varnames);
1238 Py_XDECREF(freevars);
1239 Py_XDECREF(cellvars);
1240 Py_XDECREF(filename);
1241 Py_XDECREF(name);
1242 Py_XDECREF(lnotab);
1243 }
1244 retval = v;
1245 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001246
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001247 case TYPE_REF:
1248 n = r_long(p);
1249 if (n < 0 || n >= PyList_GET_SIZE(p->refs)) {
1250 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
1251 retval = NULL;
1252 break;
1253 }
1254 v = PyList_GET_ITEM(p->refs, n);
1255 if (v == Py_None) {
1256 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
1257 retval = NULL;
1258 break;
1259 }
1260 Py_INCREF(v);
1261 retval = v;
1262 break;
1263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 default:
1265 /* Bogus data got written, which isn't ideal.
1266 This will let you keep working and recover. */
1267 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
1268 retval = NULL;
1269 break;
1270
1271 }
1272 p->depth--;
1273 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001274}
1275
Neal Norwitzd85c4522004-06-13 20:31:49 +00001276static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001277read_object(RFILE *p)
1278{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001279 PyObject *v;
1280 if (PyErr_Occurred()) {
1281 fprintf(stderr, "XXX readobject called with exception set\n");
1282 return NULL;
1283 }
1284 v = r_object(p);
1285 if (v == NULL && !PyErr_Occurred())
1286 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1287 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001288}
1289
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001290int
1291PyMarshal_ReadShortFromFile(FILE *fp)
1292{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 RFILE rf;
1294 assert(fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001295 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 rf.fp = fp;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001297 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001298 rf.end = rf.ptr = NULL;
1299 return r_short(&rf);
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001300}
1301
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001302long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001303PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001304{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 RFILE rf;
1306 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001307 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001308 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 rf.ptr = rf.end = NULL;
1310 return r_long(&rf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001311}
1312
Tim Peters691e0e92001-01-18 04:39:16 +00001313#ifdef HAVE_FSTAT
1314/* Return size of file in bytes; < 0 if unknown. */
1315static off_t
1316getfilesize(FILE *fp)
1317{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 struct stat st;
1319 if (fstat(fileno(fp), &st) != 0)
1320 return -1;
1321 else
1322 return st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001323}
1324#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001325
Tim Peters691e0e92001-01-18 04:39:16 +00001326/* If we can get the size of the file up-front, and it's reasonably small,
1327 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1328 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001329 * CAUTION: since this may read the entire remainder of the file, don't
1330 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001331 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001332PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001333PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001334{
Antoine Pitrou5bc7ec92010-04-21 22:56:22 +00001335/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
Tim Peters691e0e92001-01-18 04:39:16 +00001336#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001337#ifdef HAVE_FSTAT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001338 off_t filesize;
1339 filesize = getfilesize(fp);
1340 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1341 char* pBuf = (char *)PyMem_MALLOC(filesize);
1342 if (pBuf != NULL) {
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001343 size_t n = fread(pBuf, 1, (size_t)filesize, fp);
1344 PyObject* v = PyMarshal_ReadObjectFromString(pBuf, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001345 PyMem_FREE(pBuf);
1346 return v;
1347 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 }
Tim Peters691e0e92001-01-18 04:39:16 +00001350#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 /* We don't have fstat, or we do but the file is larger than
1352 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1353 */
1354 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001355
Tim Peters691e0e92001-01-18 04:39:16 +00001356#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001357}
1358
Guido van Rossum79f25d91997-04-29 20:08:16 +00001359PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001360PyMarshal_ReadObjectFromFile(FILE *fp)
1361{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001362 RFILE rf;
1363 PyObject *result;
1364 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001365 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001366 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001367 rf.depth = 0;
1368 rf.ptr = rf.end = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001369 rf.refs = PyList_New(0);
1370 if (rf.refs == NULL)
1371 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001372 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001373 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001375}
1376
1377PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001378PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001379{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001380 RFILE rf;
1381 PyObject *result;
1382 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001383 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001384 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001385 rf.ptr = str;
1386 rf.end = str + len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001387 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001388 rf.refs = PyList_New(0);
1389 if (rf.refs == NULL)
1390 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001391 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001392 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001393 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001394}
1395
Guido van Rossum79f25d91997-04-29 20:08:16 +00001396PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001397PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001398{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001399 WFILE wf;
Guido van Rossume6d39042007-05-09 00:01:30 +00001400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401 wf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001402 wf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001403 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1404 if (wf.str == NULL)
1405 return NULL;
1406 wf.ptr = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1407 wf.end = wf.ptr + PyBytes_Size(wf.str);
1408 wf.error = WFERR_OK;
1409 wf.depth = 0;
1410 wf.version = version;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001411 if (version >= 3) {
1412 if ((wf.refs = PyDict_New()) == NULL)
1413 return NULL;
1414 } else
1415 wf.refs = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001416 w_object(x, &wf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001417 Py_XDECREF(wf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001418 if (wf.str != NULL) {
1419 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1420 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1421 Py_DECREF(wf.str);
1422 PyErr_SetString(PyExc_OverflowError,
1423 "too much marshal data for a string");
1424 return NULL;
1425 }
1426 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1427 return NULL;
1428 }
1429 if (wf.error != WFERR_OK) {
1430 Py_XDECREF(wf.str);
1431 if (wf.error == WFERR_NOMEMORY)
1432 PyErr_NoMemory();
1433 else
1434 PyErr_SetString(PyExc_ValueError,
1435 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1436 :"object too deeply nested to marshal");
1437 return NULL;
1438 }
Antoine Pitrou1c13f842012-03-02 18:22:23 +01001439 return wf.str;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001440}
1441
Guido van Rossum64b45521991-06-07 13:58:22 +00001442/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001443
Guido van Rossum79f25d91997-04-29 20:08:16 +00001444static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001445marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001446{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001447 /* XXX Quick hack -- need to do this differently */
1448 PyObject *x;
1449 PyObject *f;
1450 int version = Py_MARSHAL_VERSION;
1451 PyObject *s;
1452 PyObject *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001453 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
1456 return NULL;
1457 s = PyMarshal_WriteObjectToString(x, version);
1458 if (s == NULL)
1459 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001460 res = _PyObject_CallMethodId(f, &PyId_write, "O", s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 Py_DECREF(s);
1462 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001463}
1464
R. David Murraydd226ea2009-05-13 12:27:21 +00001465PyDoc_STRVAR(dump_doc,
1466"dump(value, file[, version])\n\
1467\n\
1468Write the value on the open file. The value must be a supported type.\n\
1469The file must be an open file object such as sys.stdout or returned by\n\
1470open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1471\n\
1472If the value has (or contains an object that has) an unsupported type, a\n\
1473ValueError exception is raised but garbage data will also be written\n\
1474to the file. The object will not be properly read back by load()\n\
1475\n\
1476The version argument indicates the data format that dump should use.");
1477
Guido van Rossum79f25d91997-04-29 20:08:16 +00001478static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001479marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001480{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001481 PyObject *data, *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001482 _Py_IDENTIFIER(read);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001483 RFILE rf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001484
1485 /*
1486 * Make a call to the read method, but read zero bytes.
1487 * This is to ensure that the object passed in at least
1488 * has a read method which returns bytes.
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001489 * This can be removed if we guarantee good error handling
1490 * for r_string()
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001491 */
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001492 data = _PyObject_CallMethodId(f, &PyId_read, "i", 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001493 if (data == NULL)
1494 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001495 if (!PyBytes_Check(data)) {
1496 PyErr_Format(PyExc_TypeError,
1497 "f.read() returned not bytes but %.100s",
1498 data->ob_type->tp_name);
1499 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001500 }
1501 else {
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001502 rf.depth = 0;
1503 rf.fp = NULL;
1504 rf.readable = f;
Vinay Sajipaac0f752011-07-02 18:42:21 +01001505 rf.current_filename = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001506 if ((rf.refs = PyList_New(0)) != NULL) {
1507 result = read_object(&rf);
1508 Py_DECREF(rf.refs);
1509 } else
1510 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001511 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 Py_DECREF(data);
1513 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001514}
1515
R. David Murraydd226ea2009-05-13 12:27:21 +00001516PyDoc_STRVAR(load_doc,
1517"load(file)\n\
1518\n\
1519Read one value from the open file and return it. If no valid value is\n\
1520read (e.g. because the data has a different Python versions\n\
1521incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1522The file must be an open file object opened in binary mode ('rb' or\n\
1523'r+b').\n\
1524\n\
1525Note: If an object containing an unsupported type was marshalled with\n\
1526dump(), load() will substitute None for the unmarshallable type.");
1527
1528
Guido van Rossum79f25d91997-04-29 20:08:16 +00001529static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001530marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001531{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001532 PyObject *x;
1533 int version = Py_MARSHAL_VERSION;
1534 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
1535 return NULL;
1536 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001537}
1538
R. David Murraydd226ea2009-05-13 12:27:21 +00001539PyDoc_STRVAR(dumps_doc,
1540"dumps(value[, version])\n\
1541\n\
1542Return the string that would be written to a file by dump(value, file).\n\
1543The value must be a supported type. Raise a ValueError exception if\n\
1544value has (or contains an object that has) an unsupported type.\n\
1545\n\
1546The version argument indicates the data format that dumps should use.");
1547
1548
Guido van Rossum79f25d91997-04-29 20:08:16 +00001549static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001550marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001551{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 RFILE rf;
1553 Py_buffer p;
1554 char *s;
1555 Py_ssize_t n;
1556 PyObject* result;
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001557 if (!PyArg_ParseTuple(args, "y*:loads", &p))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001558 return NULL;
1559 s = p.buf;
1560 n = p.len;
1561 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001562 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001563 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 rf.ptr = s;
1565 rf.end = s + n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001567 if ((rf.refs = PyList_New(0)) == NULL)
1568 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001569 result = read_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001570 PyBuffer_Release(&p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001571 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001572 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001573}
1574
R. David Murraydd226ea2009-05-13 12:27:21 +00001575PyDoc_STRVAR(loads_doc,
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001576"loads(bytes)\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001577\n\
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001578Convert the bytes object to a value. If no valid value is found, raise\n\
1579EOFError, ValueError or TypeError. Extra characters in the input are\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001580ignored.");
1581
Guido van Rossum79f25d91997-04-29 20:08:16 +00001582static PyMethodDef marshal_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001583 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1584 {"load", marshal_load, METH_O, load_doc},
1585 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1586 {"loads", marshal_loads, METH_VARARGS, loads_doc},
1587 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001588};
1589
R. David Murraydd226ea2009-05-13 12:27:21 +00001590
1591PyDoc_STRVAR(module_doc,
1592"This module contains functions that can read and write Python values in\n\
1593a binary format. The format is specific to Python, but independent of\n\
1594machine architecture issues.\n\
1595\n\
1596Not all Python object types are supported; in general, only objects\n\
1597whose value is independent from a particular invocation of Python can be\n\
1598written and read by this module. The following types are supported:\n\
1599None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1600tuples, lists, sets, dictionaries, and code objects, where it\n\
1601should be understood that tuples, lists and dictionaries are only\n\
1602supported as long as the values contained therein are themselves\n\
1603supported; and recursive lists and dictionaries should not be written\n\
1604(they will cause infinite loops).\n\
1605\n\
1606Variables:\n\
1607\n\
1608version -- indicates the format that the module uses. Version 0 is the\n\
1609 historical format, version 1 shares interned strings and version 2\n\
1610 uses a binary format for floating point numbers.\n\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001611 Version 3 shares common object references (New in version 3.4).\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001612\n\
1613Functions:\n\
1614\n\
1615dump() -- write value to a file\n\
1616load() -- read value from a file\n\
1617dumps() -- write value to a string\n\
1618loads() -- read value from a string");
1619
1620
1621
Brett Cannon429ef652008-06-27 00:35:35 +00001622static struct PyModuleDef marshalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001623 PyModuleDef_HEAD_INIT,
1624 "marshal",
1625 module_doc,
1626 0,
1627 marshal_methods,
1628 NULL,
1629 NULL,
1630 NULL,
1631 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001632};
1633
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001634PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001635PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001636{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 PyObject *mod = PyModule_Create(&marshalmodule);
1638 if (mod == NULL)
1639 return NULL;
1640 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
1641 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001642}