blob: c3e75b145bdb213fe22f0ac5fdcae2d175adcda5 [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'
Martin v. Löwis7e395722012-07-28 19:44:05 +020036/* TYPE_INT64 is deprecated. It is not
37 generated anymore, and support for reading it
38 will be removed in Python 3.4. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000039#define TYPE_INT64 'I'
40#define TYPE_FLOAT 'f'
41#define TYPE_BINARY_FLOAT 'g'
42#define TYPE_COMPLEX 'x'
43#define TYPE_BINARY_COMPLEX 'y'
44#define TYPE_LONG 'l'
45#define TYPE_STRING 's'
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -070046#define TYPE_INTERNED 't'
47#define TYPE_REF 'r'
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000048#define TYPE_TUPLE '('
49#define TYPE_LIST '['
50#define TYPE_DICT '{'
51#define TYPE_CODE 'c'
52#define TYPE_UNICODE 'u'
53#define TYPE_UNKNOWN '?'
54#define TYPE_SET '<'
55#define TYPE_FROZENSET '>'
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -070056#define FLAG_REF '\x80' /* with a type, add obj to index */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000057
Eric Smithb1a03cf2009-04-21 11:57:38 +000058#define WFERR_OK 0
59#define WFERR_UNMARSHALLABLE 1
60#define WFERR_NESTEDTOODEEP 2
61#define WFERR_NOMEMORY 3
62
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000063typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 FILE *fp;
65 int error; /* see WFERR_* values */
66 int depth;
67 /* If fp == NULL, the following are valid: */
Éric Araujo6c0ba442011-07-26 17:23:57 +020068 PyObject *readable; /* Stream-like object being read from */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000069 PyObject *str;
Benjamin Peterson43b06862011-05-27 09:08:01 -050070 PyObject *current_filename;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000071 char *ptr;
72 char *end;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -070073 PyObject *refs; /* dict on marshal, list on unmarshal */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000074 int version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000075} WFILE;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000076
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000077#define w_byte(c, p) if (((p)->fp)) putc((c), (p)->fp); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000078 else if ((p)->ptr != (p)->end) *(p)->ptr++ = (c); \
79 else w_more(c, p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000080
81static void
Fredrik Lundh11534382000-07-23 18:24:06 +000082w_more(int c, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000083{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000084 Py_ssize_t size, newsize;
85 if (p->str == NULL)
86 return; /* An error already occurred */
87 size = PyBytes_Size(p->str);
88 newsize = size + size + 1024;
89 if (newsize > 32*1024*1024) {
90 newsize = size + (size >> 3); /* 12.5% overallocation */
91 }
92 if (_PyBytes_Resize(&p->str, newsize) != 0) {
93 p->ptr = p->end = NULL;
94 }
95 else {
96 p->ptr = PyBytes_AS_STRING((PyBytesObject *)p->str) + size;
97 p->end =
98 PyBytes_AS_STRING((PyBytesObject *)p->str) + newsize;
99 *p->ptr++ = Py_SAFE_DOWNCAST(c, int, char);
100 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000101}
102
103static void
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200104w_string(char *s, Py_ssize_t n, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000105{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000106 if (p->fp != NULL) {
107 fwrite(s, 1, n, p->fp);
108 }
109 else {
110 while (--n >= 0) {
111 w_byte(*s, p);
112 s++;
113 }
114 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000115}
116
117static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000118w_short(int x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000119{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000120 w_byte((char)( x & 0xff), p);
121 w_byte((char)((x>> 8) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000122}
123
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000124static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000125w_long(long x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000126{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000127 w_byte((char)( x & 0xff), p);
128 w_byte((char)((x>> 8) & 0xff), p);
129 w_byte((char)((x>>16) & 0xff), p);
130 w_byte((char)((x>>24) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000131}
132
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200133#define SIZE32_MAX 0x7FFFFFFF
134
135#if SIZEOF_SIZE_T > 4
136# define W_SIZE(n, p) do { \
137 if ((n) > SIZE32_MAX) { \
138 (p)->depth--; \
139 (p)->error = WFERR_UNMARSHALLABLE; \
140 return; \
141 } \
142 w_long((long)(n), p); \
143 } while(0)
144#else
145# define W_SIZE w_long
146#endif
147
Mark Dickinsonbd792642009-03-18 20:06:12 +0000148/* We assume that Python longs are stored internally in base some power of
149 2**15; for the sake of portability we'll always read and write them in base
150 exactly 2**15. */
151
152#define PyLong_MARSHAL_SHIFT 15
153#define PyLong_MARSHAL_BASE ((short)1 << PyLong_MARSHAL_SHIFT)
154#define PyLong_MARSHAL_MASK (PyLong_MARSHAL_BASE - 1)
155#if PyLong_SHIFT % PyLong_MARSHAL_SHIFT != 0
156#error "PyLong_SHIFT must be a multiple of PyLong_MARSHAL_SHIFT"
157#endif
158#define PyLong_MARSHAL_RATIO (PyLong_SHIFT / PyLong_MARSHAL_SHIFT)
159
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700160#define W_TYPE(t, p) do { \
161 w_byte((t) | flag, (p)); \
162} while(0)
163
Mark Dickinsonbd792642009-03-18 20:06:12 +0000164static void
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700165w_PyLong(const PyLongObject *ob, char flag, WFILE *p)
Mark Dickinsonbd792642009-03-18 20:06:12 +0000166{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000167 Py_ssize_t i, j, n, l;
168 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000169
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700170 W_TYPE(TYPE_LONG, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000171 if (Py_SIZE(ob) == 0) {
172 w_long((long)0, p);
173 return;
174 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000176 /* set l to number of base PyLong_MARSHAL_BASE digits */
177 n = ABS(Py_SIZE(ob));
178 l = (n-1) * PyLong_MARSHAL_RATIO;
179 d = ob->ob_digit[n-1];
180 assert(d != 0); /* a PyLong is always normalized */
181 do {
182 d >>= PyLong_MARSHAL_SHIFT;
183 l++;
184 } while (d != 0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200185 if (l > SIZE32_MAX) {
186 p->depth--;
187 p->error = WFERR_UNMARSHALLABLE;
188 return;
189 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000190 w_long((long)(Py_SIZE(ob) > 0 ? l : -l), p);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000192 for (i=0; i < n-1; i++) {
193 d = ob->ob_digit[i];
194 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
195 w_short(d & PyLong_MARSHAL_MASK, p);
196 d >>= PyLong_MARSHAL_SHIFT;
197 }
198 assert (d == 0);
199 }
200 d = ob->ob_digit[n-1];
201 do {
202 w_short(d & PyLong_MARSHAL_MASK, p);
203 d >>= PyLong_MARSHAL_SHIFT;
204 } while (d != 0);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000205}
206
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700207static int
208w_ref(PyObject *v, char *flag, WFILE *p)
209{
210 PyObject *id;
211 PyObject *idx;
212
213 if (p->version < 3 || p->refs == NULL)
214 return 0; /* not writing object references */
215
216 /* if it has only one reference, it definitely isn't shared */
217 if (Py_REFCNT(v) == 1)
218 return 0;
219
220 id = PyLong_FromVoidPtr((void*)v);
221 if (id == NULL)
222 goto err;
223 idx = PyDict_GetItem(p->refs, id);
224 if (idx != NULL) {
225 /* write the reference index to the stream */
226 long w = PyLong_AsLong(idx);
227 Py_DECREF(id);
228 if (w == -1 && PyErr_Occurred()) {
229 goto err;
230 }
231 /* we don't store "long" indices in the dict */
232 assert(0 <= w && w <= 0x7fffffff);
233 w_byte(TYPE_REF, p);
234 w_long(w, p);
235 return 1;
236 } else {
237 int ok;
238 Py_ssize_t s = PyDict_Size(p->refs);
239 /* we don't support long indices */
240 if (s >= 0x7fffffff) {
241 PyErr_SetString(PyExc_ValueError, "too many objects");
242 goto err;
243 }
244 idx = PyLong_FromSsize_t(s);
245 ok = idx && PyDict_SetItem(p->refs, id, idx) == 0;
246 Py_DECREF(id);
247 Py_XDECREF(idx);
248 if (!ok)
249 goto err;
250 *flag |= FLAG_REF;
251 return 0;
252 }
253err:
254 p->error = WFERR_UNMARSHALLABLE;
255 return 1;
256}
257
258static void
259w_complex_object(PyObject *v, char flag, WFILE *p);
260
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000261static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000262w_object(PyObject *v, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000263{
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700264 char flag = '\0';
Fred Drake6da0b912000-06-28 18:47:56 +0000265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000266 p->depth++;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000268 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
269 p->error = WFERR_NESTEDTOODEEP;
270 }
271 else if (v == NULL) {
272 w_byte(TYPE_NULL, p);
273 }
274 else if (v == Py_None) {
275 w_byte(TYPE_NONE, p);
276 }
277 else if (v == PyExc_StopIteration) {
278 w_byte(TYPE_STOPITER, p);
279 }
280 else if (v == Py_Ellipsis) {
281 w_byte(TYPE_ELLIPSIS, p);
282 }
283 else if (v == Py_False) {
284 w_byte(TYPE_FALSE, p);
285 }
286 else if (v == Py_True) {
287 w_byte(TYPE_TRUE, p);
288 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700289 else if (!w_ref(v, &flag, p))
290 w_complex_object(v, flag, p);
291
292 p->depth--;
293}
294
295static void
296w_complex_object(PyObject *v, char flag, WFILE *p)
297{
298 Py_ssize_t i, n;
299
300 if (PyLong_CheckExact(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000301 long x = PyLong_AsLong(v);
302 if ((x == -1) && PyErr_Occurred()) {
303 PyLongObject *ob = (PyLongObject *)v;
304 PyErr_Clear();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700305 w_PyLong(ob, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000306 }
307 else {
Guido van Rossumc1547d91996-12-10 15:39:04 +0000308#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
310 if (y && y != -1) {
Martin v. Löwis7e395722012-07-28 19:44:05 +0200311 /* Too large for TYPE_INT */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700312 w_PyLong((PyLongObject*)v, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 }
314 else
Guido van Rossumc1547d91996-12-10 15:39:04 +0000315#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000316 {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700317 W_TYPE(TYPE_INT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000318 w_long(x, p);
319 }
320 }
321 }
322 else if (PyFloat_CheckExact(v)) {
323 if (p->version > 1) {
324 unsigned char buf[8];
325 if (_PyFloat_Pack8(PyFloat_AsDouble(v),
326 buf, 1) < 0) {
327 p->error = WFERR_UNMARSHALLABLE;
328 return;
329 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700330 W_TYPE(TYPE_BINARY_FLOAT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000331 w_string((char*)buf, 8, p);
332 }
333 else {
334 char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
335 'g', 17, 0, NULL);
336 if (!buf) {
337 p->error = WFERR_NOMEMORY;
338 return;
339 }
340 n = strlen(buf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700341 W_TYPE(TYPE_FLOAT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000342 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200343 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 PyMem_Free(buf);
345 }
346 }
347 else if (PyComplex_CheckExact(v)) {
348 if (p->version > 1) {
349 unsigned char buf[8];
350 if (_PyFloat_Pack8(PyComplex_RealAsDouble(v),
351 buf, 1) < 0) {
352 p->error = WFERR_UNMARSHALLABLE;
353 return;
354 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700355 W_TYPE(TYPE_BINARY_COMPLEX, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000356 w_string((char*)buf, 8, p);
357 if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v),
358 buf, 1) < 0) {
359 p->error = WFERR_UNMARSHALLABLE;
360 return;
361 }
362 w_string((char*)buf, 8, p);
363 }
364 else {
365 char *buf;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700366 W_TYPE(TYPE_COMPLEX, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000367 buf = PyOS_double_to_string(PyComplex_RealAsDouble(v),
368 'g', 17, 0, NULL);
369 if (!buf) {
370 p->error = WFERR_NOMEMORY;
371 return;
372 }
373 n = strlen(buf);
374 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200375 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 PyMem_Free(buf);
377 buf = PyOS_double_to_string(PyComplex_ImagAsDouble(v),
378 'g', 17, 0, NULL);
379 if (!buf) {
380 p->error = WFERR_NOMEMORY;
381 return;
382 }
383 n = strlen(buf);
384 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200385 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 PyMem_Free(buf);
387 }
388 }
389 else if (PyBytes_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700390 W_TYPE(TYPE_STRING, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000391 n = PyBytes_GET_SIZE(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200392 W_SIZE(n, p);
393 w_string(PyBytes_AS_STRING(v), n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000394 }
395 else if (PyUnicode_CheckExact(v)) {
396 PyObject *utf8;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200397 utf8 = PyUnicode_AsEncodedString(v, "utf8", "surrogatepass");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000398 if (utf8 == NULL) {
399 p->depth--;
400 p->error = WFERR_UNMARSHALLABLE;
401 return;
402 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700403 if (p->version >= 3 && PyUnicode_CHECK_INTERNED(v))
404 W_TYPE(TYPE_INTERNED, p);
405 else
406 W_TYPE(TYPE_UNICODE, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000407 n = PyBytes_GET_SIZE(utf8);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200408 W_SIZE(n, p);
409 w_string(PyBytes_AS_STRING(utf8), n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000410 Py_DECREF(utf8);
411 }
412 else if (PyTuple_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700413 W_TYPE(TYPE_TUPLE, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000414 n = PyTuple_Size(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200415 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 for (i = 0; i < n; i++) {
417 w_object(PyTuple_GET_ITEM(v, i), p);
418 }
419 }
420 else if (PyList_CheckExact(v)) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700421 W_TYPE(TYPE_LIST, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000422 n = PyList_GET_SIZE(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200423 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000424 for (i = 0; i < n; i++) {
425 w_object(PyList_GET_ITEM(v, i), p);
426 }
427 }
428 else if (PyDict_CheckExact(v)) {
429 Py_ssize_t pos;
430 PyObject *key, *value;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700431 W_TYPE(TYPE_DICT, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000432 /* This one is NULL object terminated! */
433 pos = 0;
434 while (PyDict_Next(v, &pos, &key, &value)) {
435 w_object(key, p);
436 w_object(value, p);
437 }
438 w_object((PyObject *)NULL, p);
439 }
440 else if (PyAnySet_CheckExact(v)) {
441 PyObject *value, *it;
Raymond Hettingera422c342005-01-11 03:03:27 +0000442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 if (PyObject_TypeCheck(v, &PySet_Type))
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700444 W_TYPE(TYPE_SET, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000445 else
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700446 W_TYPE(TYPE_FROZENSET, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000447 n = PyObject_Size(v);
448 if (n == -1) {
449 p->depth--;
450 p->error = WFERR_UNMARSHALLABLE;
451 return;
452 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200453 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000454 it = PyObject_GetIter(v);
455 if (it == NULL) {
456 p->depth--;
457 p->error = WFERR_UNMARSHALLABLE;
458 return;
459 }
460 while ((value = PyIter_Next(it)) != NULL) {
461 w_object(value, p);
462 Py_DECREF(value);
463 }
464 Py_DECREF(it);
465 if (PyErr_Occurred()) {
466 p->depth--;
467 p->error = WFERR_UNMARSHALLABLE;
468 return;
469 }
470 }
471 else if (PyCode_Check(v)) {
472 PyCodeObject *co = (PyCodeObject *)v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700473 W_TYPE(TYPE_CODE, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000474 w_long(co->co_argcount, p);
475 w_long(co->co_kwonlyargcount, p);
476 w_long(co->co_nlocals, p);
477 w_long(co->co_stacksize, p);
478 w_long(co->co_flags, p);
479 w_object(co->co_code, p);
480 w_object(co->co_consts, p);
481 w_object(co->co_names, p);
482 w_object(co->co_varnames, p);
483 w_object(co->co_freevars, p);
484 w_object(co->co_cellvars, p);
485 w_object(co->co_filename, p);
486 w_object(co->co_name, p);
487 w_long(co->co_firstlineno, p);
488 w_object(co->co_lnotab, p);
489 }
490 else if (PyObject_CheckBuffer(v)) {
491 /* Write unknown buffer-style objects as a string */
492 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 Py_buffer view;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100494 if (PyObject_GetBuffer(v, &view, PyBUF_SIMPLE) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 w_byte(TYPE_UNKNOWN, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100496 p->depth--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000497 p->error = WFERR_UNMARSHALLABLE;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100498 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700500 W_TYPE(TYPE_STRING, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000501 n = view.len;
502 s = view.buf;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200503 W_SIZE(n, p);
504 w_string(s, n, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100505 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000506 }
507 else {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700508 W_TYPE(TYPE_UNKNOWN, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000509 p->error = WFERR_UNMARSHALLABLE;
510 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000511}
512
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000513/* version currently has no effect for writing longs. */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000514void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000515PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000516{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000517 WFILE wf;
518 wf.fp = fp;
519 wf.error = WFERR_OK;
520 wf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700521 wf.refs = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 wf.version = version;
523 w_long(x, &wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000524}
525
526void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000527PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000528{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000529 WFILE wf;
530 wf.fp = fp;
531 wf.error = WFERR_OK;
532 wf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700533 if (version >= 3) {
534 if ((wf.refs = PyDict_New()) == NULL)
535 return; /* caller mush check PyErr_Occurred() */
536 } else
537 wf.refs = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 wf.version = version;
539 w_object(x, &wf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700540 Py_XDECREF(wf.refs);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000541}
542
543typedef WFILE RFILE; /* Same struct with different invariants */
544
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000545#define rs_byte(p) (((p)->ptr < (p)->end) ? (unsigned char)*(p)->ptr++ : EOF)
Guido van Rossum8d617a61995-03-09 12:12:11 +0000546
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200547static Py_ssize_t
548r_string(char *s, Py_ssize_t n, RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000549{
Éric Araujo6c0ba442011-07-26 17:23:57 +0200550 char *ptr;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200551 Py_ssize_t read, left;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100552
553 if (!p->readable) {
554 if (p->fp != NULL)
555 /* The result fits into int because it must be <=n. */
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200556 read = fread(s, 1, n, p->fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100557 else {
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200558 left = p->end - p->ptr;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100559 read = (left < n) ? left : n;
560 memcpy(s, p->ptr, read);
561 p->ptr += read;
562 }
563 }
564 else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200565 _Py_IDENTIFIER(read);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200566
Serhiy Storchaka5a1f1522013-02-13 12:11:03 +0200567 PyObject *data = _PyObject_CallMethodId(p->readable, &PyId_read, "n", n);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100568 read = 0;
569 if (data != NULL) {
570 if (!PyBytes_Check(data)) {
571 PyErr_Format(PyExc_TypeError,
572 "f.read() returned not bytes but %.100s",
573 data->ob_type->tp_name);
574 }
575 else {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700576 read = (int)PyBytes_GET_SIZE(data);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100577 if (read > 0) {
578 ptr = PyBytes_AS_STRING(data);
579 memcpy(s, ptr, read);
580 }
581 }
582 Py_DECREF(data);
583 }
584 }
585 if (!PyErr_Occurred() && (read < n)) {
586 PyErr_SetString(PyExc_EOFError, "EOF read where not expected");
587 }
588 return read;
589}
590
591
592static int
593r_byte(RFILE *p)
594{
595 int c = EOF;
596 unsigned char ch;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200597 Py_ssize_t n;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100598
599 if (!p->readable)
600 c = p->fp ? getc(p->fp) : rs_byte(p);
601 else {
602 n = r_string((char *) &ch, 1, p);
603 if (n > 0)
604 c = ch;
605 }
606 return c;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000607}
608
609static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000610r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000611{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 register short x;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100613 unsigned char buffer[2];
614
615 r_string((char *) buffer, 2, p);
616 x = buffer[0];
617 x |= buffer[1] << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 /* Sign-extension, in case short greater than 16 bits */
619 x |= -(x & 0x8000);
620 return x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000621}
622
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000623static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000624r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000625{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 register long x;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100627 unsigned char buffer[4];
628
629 r_string((char *) buffer, 4, p);
630 x = buffer[0];
631 x |= (long)buffer[1] << 8;
632 x |= (long)buffer[2] << 16;
633 x |= (long)buffer[3] << 24;
Guido van Rossumc1547d91996-12-10 15:39:04 +0000634#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000635 /* Sign extension for 64-bit machines */
636 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000637#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000638 return x;
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000639}
640
Tim Peters82112372001-08-29 02:28:42 +0000641/* r_long64 deals with the TYPE_INT64 code. On a machine with
642 sizeof(long) > 4, it returns a Python int object, else a Python long
643 object. Note that w_long64 writes out TYPE_INT if 32 bits is enough,
644 so there's no inefficiency here in returning a PyLong on 32-bit boxes
645 for everything written via TYPE_INT64 (i.e., if an int is written via
646 TYPE_INT64, it *needs* more than 32 bits).
647*/
648static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000649r_long64(RFILE *p)
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000650{
Éric Araujo6c0ba442011-07-26 17:23:57 +0200651 PyObject *result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 long lo4 = r_long(p);
653 long hi4 = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100654
655 if (!PyErr_Occurred()) {
Guido van Rossumc1547d91996-12-10 15:39:04 +0000656#if SIZEOF_LONG > 4
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100657 long x = (hi4 << 32) | (lo4 & 0xFFFFFFFFL);
658 result = PyLong_FromLong(x);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000659#else
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100660 unsigned char buf[8];
661 int one = 1;
662 int is_little_endian = (int)*(char*)&one;
663 if (is_little_endian) {
664 memcpy(buf, &lo4, 4);
665 memcpy(buf+4, &hi4, 4);
666 }
667 else {
668 memcpy(buf, &hi4, 4);
669 memcpy(buf+4, &lo4, 4);
670 }
671 result = _PyLong_FromByteArray(buf, 8, is_little_endian, 1);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000672#endif
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100673 }
674 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000675}
676
Guido van Rossum79f25d91997-04-29 20:08:16 +0000677static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000678r_PyLong(RFILE *p)
679{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000680 PyLongObject *ob;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200681 long n, size, i;
682 int j, md, shorts_in_top_digit;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100686 if (PyErr_Occurred())
687 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000688 if (n == 0)
689 return (PyObject *)_PyLong_New(0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200690 if (n < -SIZE32_MAX || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000691 PyErr_SetString(PyExc_ValueError,
692 "bad marshal data (long size out of range)");
693 return NULL;
694 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000696 size = 1 + (ABS(n) - 1) / PyLong_MARSHAL_RATIO;
697 shorts_in_top_digit = 1 + (ABS(n) - 1) % PyLong_MARSHAL_RATIO;
698 ob = _PyLong_New(size);
699 if (ob == NULL)
700 return NULL;
701 Py_SIZE(ob) = n > 0 ? size : -size;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 for (i = 0; i < size-1; i++) {
704 d = 0;
705 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
706 md = r_short(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100707 if (PyErr_Occurred())
708 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000709 if (md < 0 || md > PyLong_MARSHAL_BASE)
710 goto bad_digit;
711 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
712 }
713 ob->ob_digit[i] = d;
714 }
715 d = 0;
716 for (j=0; j < shorts_in_top_digit; j++) {
717 md = r_short(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100718 if (PyErr_Occurred())
719 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000720 if (md < 0 || md > PyLong_MARSHAL_BASE)
721 goto bad_digit;
722 /* topmost marshal digit should be nonzero */
723 if (md == 0 && j == shorts_in_top_digit - 1) {
724 Py_DECREF(ob);
725 PyErr_SetString(PyExc_ValueError,
726 "bad marshal data (unnormalized long data)");
727 return NULL;
728 }
729 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
730 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100731 if (PyErr_Occurred()) {
732 Py_DECREF(ob);
733 return NULL;
734 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000735 /* top digit should be nonzero, else the resulting PyLong won't be
736 normalized */
737 ob->ob_digit[size-1] = d;
738 return (PyObject *)ob;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000739 bad_digit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000740 Py_DECREF(ob);
741 PyErr_SetString(PyExc_ValueError,
742 "bad marshal data (digit out of range in long)");
743 return NULL;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000744}
745
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700746/* allocate the reflist index */
747static PyObject *
748r_ref_reserve(PyObject *o, Py_ssize_t *idx, int flag, RFILE *p)
749{
750 if (flag) { /* currently only FLAG_REF is defined */
751 *idx = PyList_Size(p->refs);
752 if (*idx < 0)
753 goto err;
754 if (*idx >= 0x7ffffffe) {
755 PyErr_SetString(PyExc_ValueError, "bad marshal data (index list too large)");
756 goto err;
757 }
758 if (PyList_Append(p->refs, Py_None) < 0)
759 goto err;
760 } else
761 *idx = 0;
762 return o;
763err:
764 Py_XDECREF(o); /* release the new object */
765 *idx = -1;
766 return NULL;
767}
768
769/* insert actual object to the reflist */
770static PyObject *
771r_ref_insert(PyObject *o, Py_ssize_t idx, int flag, RFILE *p)
772{
773 if (o && (flag & FLAG_REF)) {
774 if (PyList_SetItem(p->refs, idx, o) < 0) {
775 Py_DECREF(o); /* release the new object */
776 return NULL;
777 } else {
778 Py_INCREF(o); /* a reference for the list */
779 }
780 }
781 return o;
782}
783
784/* combination of both above, used when an object can be
785 * created whenever it is seen in the file, as opposed to
786 * after having loaded its sub-objects.
787 */
788static PyObject *
789r_ref(PyObject *o, int flag, RFILE *p)
790{
791 if (o && (flag & FLAG_REF)) {
792 if (PyList_Append(p->refs, o) < 0) {
793 Py_DECREF(o); /* release the new object */
794 return NULL;
795 }
796 }
797 return o;
798}
Mark Dickinsonbd792642009-03-18 20:06:12 +0000799
800static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000801r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000802{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000803 /* NULL is a valid return value, it does not necessarily means that
804 an exception is set. */
805 PyObject *v, *v2;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700806 Py_ssize_t idx;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000807 long i, n;
808 int type = r_byte(p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700809 int flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 PyObject *retval;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000812 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000814 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
815 p->depth--;
816 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
817 return NULL;
818 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000819
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700820 flag = type & FLAG_REF;
821 type = type & ~FLAG_REF;
822
823#define R_REF(O) do{\
824 O = r_ref(O, flag, p);\
825} while (0)
826
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000827 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000829 case EOF:
830 PyErr_SetString(PyExc_EOFError,
831 "EOF read where object expected");
832 retval = NULL;
833 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000834
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000835 case TYPE_NULL:
836 retval = NULL;
837 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 case TYPE_NONE:
840 Py_INCREF(Py_None);
841 retval = Py_None;
842 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000843
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 case TYPE_STOPITER:
845 Py_INCREF(PyExc_StopIteration);
846 retval = PyExc_StopIteration;
847 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000848
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000849 case TYPE_ELLIPSIS:
850 Py_INCREF(Py_Ellipsis);
851 retval = Py_Ellipsis;
852 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 case TYPE_FALSE:
855 Py_INCREF(Py_False);
856 retval = Py_False;
857 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 case TYPE_TRUE:
860 Py_INCREF(Py_True);
861 retval = Py_True;
862 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000864 case TYPE_INT:
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100865 n = r_long(p);
866 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700867 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000870 case TYPE_INT64:
871 retval = r_long64(p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700872 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000873 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000875 case TYPE_LONG:
876 retval = r_PyLong(p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700877 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 case TYPE_FLOAT:
881 {
882 char buf[256];
883 double dx;
884 retval = NULL;
885 n = r_byte(p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200886 if (n == EOF || r_string(buf, n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 PyErr_SetString(PyExc_EOFError,
888 "EOF read where object expected");
889 break;
890 }
891 buf[n] = '\0';
892 dx = PyOS_string_to_double(buf, NULL, NULL);
893 if (dx == -1.0 && PyErr_Occurred())
894 break;
895 retval = PyFloat_FromDouble(dx);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700896 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 break;
898 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000899
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 case TYPE_BINARY_FLOAT:
901 {
902 unsigned char buf[8];
903 double x;
904 if (r_string((char*)buf, 8, p) != 8) {
905 PyErr_SetString(PyExc_EOFError,
906 "EOF read where object expected");
907 retval = NULL;
908 break;
909 }
910 x = _PyFloat_Unpack8(buf, 1);
911 if (x == -1.0 && PyErr_Occurred()) {
912 retval = NULL;
913 break;
914 }
915 retval = PyFloat_FromDouble(x);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700916 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 break;
918 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000919
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000920 case TYPE_COMPLEX:
921 {
922 char buf[256];
923 Py_complex c;
924 retval = NULL;
925 n = r_byte(p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200926 if (n == EOF || r_string(buf, n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000927 PyErr_SetString(PyExc_EOFError,
928 "EOF read where object expected");
929 break;
930 }
931 buf[n] = '\0';
932 c.real = PyOS_string_to_double(buf, NULL, NULL);
933 if (c.real == -1.0 && PyErr_Occurred())
934 break;
935 n = r_byte(p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200936 if (n == EOF || r_string(buf, n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 PyErr_SetString(PyExc_EOFError,
938 "EOF read where object expected");
939 break;
940 }
941 buf[n] = '\0';
942 c.imag = PyOS_string_to_double(buf, NULL, NULL);
943 if (c.imag == -1.0 && PyErr_Occurred())
944 break;
945 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700946 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 break;
948 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 case TYPE_BINARY_COMPLEX:
951 {
952 unsigned char buf[8];
953 Py_complex c;
954 if (r_string((char*)buf, 8, p) != 8) {
955 PyErr_SetString(PyExc_EOFError,
956 "EOF read where object expected");
957 retval = NULL;
958 break;
959 }
960 c.real = _PyFloat_Unpack8(buf, 1);
961 if (c.real == -1.0 && PyErr_Occurred()) {
962 retval = NULL;
963 break;
964 }
965 if (r_string((char*)buf, 8, p) != 8) {
966 PyErr_SetString(PyExc_EOFError,
967 "EOF read where object expected");
968 retval = NULL;
969 break;
970 }
971 c.imag = _PyFloat_Unpack8(buf, 1);
972 if (c.imag == -1.0 && PyErr_Occurred()) {
973 retval = NULL;
974 break;
975 }
976 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700977 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 break;
979 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 case TYPE_STRING:
982 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100983 if (PyErr_Occurred()) {
984 retval = NULL;
985 break;
986 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200987 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
989 retval = NULL;
990 break;
991 }
992 v = PyBytes_FromStringAndSize((char *)NULL, n);
993 if (v == NULL) {
994 retval = NULL;
995 break;
996 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200997 if (r_string(PyBytes_AS_STRING(v), n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 Py_DECREF(v);
999 PyErr_SetString(PyExc_EOFError,
1000 "EOF read where object expected");
1001 retval = NULL;
1002 break;
1003 }
1004 retval = v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001005 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001007
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001008 case TYPE_UNICODE:
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001009 case TYPE_INTERNED:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 {
1011 char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +00001012
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001014 if (PyErr_Occurred()) {
1015 retval = NULL;
1016 break;
1017 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001018 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
1020 retval = NULL;
1021 break;
1022 }
1023 buffer = PyMem_NEW(char, n);
1024 if (buffer == NULL) {
1025 retval = PyErr_NoMemory();
1026 break;
1027 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001028 if (r_string(buffer, n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 PyMem_DEL(buffer);
1030 PyErr_SetString(PyExc_EOFError,
1031 "EOF read where object expected");
1032 retval = NULL;
1033 break;
1034 }
1035 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
1036 PyMem_DEL(buffer);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001037 if (type == TYPE_INTERNED)
1038 PyUnicode_InternInPlace(&v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001039 retval = v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001040 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001041 break;
1042 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001044 case TYPE_TUPLE:
1045 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001046 if (PyErr_Occurred()) {
1047 retval = NULL;
1048 break;
1049 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001050 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
1052 retval = NULL;
1053 break;
1054 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001055 v = PyTuple_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001056 R_REF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 if (v == NULL) {
1058 retval = NULL;
1059 break;
1060 }
1061 for (i = 0; i < n; i++) {
1062 v2 = r_object(p);
1063 if ( v2 == NULL ) {
1064 if (!PyErr_Occurred())
1065 PyErr_SetString(PyExc_TypeError,
1066 "NULL object in marshal data for tuple");
1067 Py_DECREF(v);
1068 v = NULL;
1069 break;
1070 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001071 PyTuple_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001072 }
1073 retval = v;
1074 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001076 case TYPE_LIST:
1077 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001078 if (PyErr_Occurred()) {
1079 retval = NULL;
1080 break;
1081 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001082 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
1084 retval = NULL;
1085 break;
1086 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001087 v = PyList_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001088 R_REF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001089 if (v == NULL) {
1090 retval = NULL;
1091 break;
1092 }
1093 for (i = 0; i < n; i++) {
1094 v2 = r_object(p);
1095 if ( v2 == NULL ) {
1096 if (!PyErr_Occurred())
1097 PyErr_SetString(PyExc_TypeError,
1098 "NULL object in marshal data for list");
1099 Py_DECREF(v);
1100 v = NULL;
1101 break;
1102 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001103 PyList_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001104 }
1105 retval = v;
1106 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 case TYPE_DICT:
1109 v = PyDict_New();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001110 R_REF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 if (v == NULL) {
1112 retval = NULL;
1113 break;
1114 }
1115 for (;;) {
1116 PyObject *key, *val;
1117 key = r_object(p);
1118 if (key == NULL)
1119 break;
1120 val = r_object(p);
1121 if (val != NULL)
1122 PyDict_SetItem(v, key, val);
1123 Py_DECREF(key);
1124 Py_XDECREF(val);
1125 }
1126 if (PyErr_Occurred()) {
1127 Py_DECREF(v);
1128 v = NULL;
1129 }
1130 retval = v;
1131 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001133 case TYPE_SET:
1134 case TYPE_FROZENSET:
1135 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001136 if (PyErr_Occurred()) {
1137 retval = NULL;
1138 break;
1139 }
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 (set size out of range)");
1142 retval = NULL;
1143 break;
1144 }
1145 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001146 /* must use delayed registration of frozensets because they must
1147 * be init with a refcount of 1
1148 */
1149 if (type == TYPE_SET)
1150 R_REF(v);
1151 else
1152 v = r_ref_reserve(v, &idx, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 if (v == NULL) {
1154 retval = NULL;
1155 break;
1156 }
1157 for (i = 0; i < n; i++) {
1158 v2 = r_object(p);
1159 if ( v2 == NULL ) {
1160 if (!PyErr_Occurred())
1161 PyErr_SetString(PyExc_TypeError,
1162 "NULL object in marshal data for set");
1163 Py_DECREF(v);
1164 v = NULL;
1165 break;
1166 }
1167 if (PySet_Add(v, v2) == -1) {
1168 Py_DECREF(v);
1169 Py_DECREF(v2);
1170 v = NULL;
1171 break;
1172 }
1173 Py_DECREF(v2);
1174 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001175 if (type != TYPE_SET)
1176 v = r_ref_insert(v, idx, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 retval = v;
1178 break;
Raymond Hettingera422c342005-01-11 03:03:27 +00001179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 case TYPE_CODE:
1181 {
1182 int argcount;
1183 int kwonlyargcount;
1184 int nlocals;
1185 int stacksize;
1186 int flags;
1187 PyObject *code = NULL;
1188 PyObject *consts = NULL;
1189 PyObject *names = NULL;
1190 PyObject *varnames = NULL;
1191 PyObject *freevars = NULL;
1192 PyObject *cellvars = NULL;
1193 PyObject *filename = NULL;
1194 PyObject *name = NULL;
1195 int firstlineno;
1196 PyObject *lnotab = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001197
1198 r_ref_reserve(NULL, &idx, flag, p);
1199 if (idx < 0) {
1200 retval = NULL;
1201 break;
1202 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 /* XXX ignore long->int overflows for now */
1207 argcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001208 if (PyErr_Occurred())
1209 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 kwonlyargcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001211 if (PyErr_Occurred())
1212 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 nlocals = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001214 if (PyErr_Occurred())
1215 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 stacksize = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001217 if (PyErr_Occurred())
1218 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 flags = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001220 if (PyErr_Occurred())
1221 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 code = r_object(p);
1223 if (code == NULL)
1224 goto code_error;
1225 consts = r_object(p);
1226 if (consts == NULL)
1227 goto code_error;
1228 names = r_object(p);
1229 if (names == NULL)
1230 goto code_error;
1231 varnames = r_object(p);
1232 if (varnames == NULL)
1233 goto code_error;
1234 freevars = r_object(p);
1235 if (freevars == NULL)
1236 goto code_error;
1237 cellvars = r_object(p);
1238 if (cellvars == NULL)
1239 goto code_error;
1240 filename = r_object(p);
1241 if (filename == NULL)
1242 goto code_error;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001243 if (PyUnicode_CheckExact(filename)) {
1244 if (p->current_filename != NULL) {
1245 if (!PyUnicode_Compare(filename, p->current_filename)) {
1246 Py_DECREF(filename);
1247 Py_INCREF(p->current_filename);
1248 filename = p->current_filename;
1249 }
1250 }
1251 else {
1252 p->current_filename = filename;
1253 }
1254 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 name = r_object(p);
1256 if (name == NULL)
1257 goto code_error;
1258 firstlineno = (int)r_long(p);
1259 lnotab = r_object(p);
1260 if (lnotab == NULL)
1261 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001263 v = (PyObject *) PyCode_New(
1264 argcount, kwonlyargcount,
1265 nlocals, stacksize, flags,
1266 code, consts, names, varnames,
1267 freevars, cellvars, filename, name,
1268 firstlineno, lnotab);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001269 v = r_ref_insert(v, idx, flag, p);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271 code_error:
1272 Py_XDECREF(code);
1273 Py_XDECREF(consts);
1274 Py_XDECREF(names);
1275 Py_XDECREF(varnames);
1276 Py_XDECREF(freevars);
1277 Py_XDECREF(cellvars);
1278 Py_XDECREF(filename);
1279 Py_XDECREF(name);
1280 Py_XDECREF(lnotab);
1281 }
1282 retval = v;
1283 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001284
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001285 case TYPE_REF:
1286 n = r_long(p);
1287 if (n < 0 || n >= PyList_GET_SIZE(p->refs)) {
1288 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
1289 retval = NULL;
1290 break;
1291 }
1292 v = PyList_GET_ITEM(p->refs, n);
1293 if (v == Py_None) {
1294 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
1295 retval = NULL;
1296 break;
1297 }
1298 Py_INCREF(v);
1299 retval = v;
1300 break;
1301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 default:
1303 /* Bogus data got written, which isn't ideal.
1304 This will let you keep working and recover. */
1305 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
1306 retval = NULL;
1307 break;
1308
1309 }
1310 p->depth--;
1311 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001312}
1313
Neal Norwitzd85c4522004-06-13 20:31:49 +00001314static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001315read_object(RFILE *p)
1316{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 PyObject *v;
1318 if (PyErr_Occurred()) {
1319 fprintf(stderr, "XXX readobject called with exception set\n");
1320 return NULL;
1321 }
1322 v = r_object(p);
1323 if (v == NULL && !PyErr_Occurred())
1324 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1325 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001326}
1327
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001328int
1329PyMarshal_ReadShortFromFile(FILE *fp)
1330{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 RFILE rf;
1332 assert(fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001333 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 rf.fp = fp;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001335 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 rf.end = rf.ptr = NULL;
1337 return r_short(&rf);
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001338}
1339
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001340long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001341PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001342{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 RFILE rf;
1344 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001345 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001346 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001347 rf.ptr = rf.end = NULL;
1348 return r_long(&rf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001349}
1350
Tim Peters691e0e92001-01-18 04:39:16 +00001351#ifdef HAVE_FSTAT
1352/* Return size of file in bytes; < 0 if unknown. */
1353static off_t
1354getfilesize(FILE *fp)
1355{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001356 struct stat st;
1357 if (fstat(fileno(fp), &st) != 0)
1358 return -1;
1359 else
1360 return st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001361}
1362#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001363
Tim Peters691e0e92001-01-18 04:39:16 +00001364/* If we can get the size of the file up-front, and it's reasonably small,
1365 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1366 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001367 * CAUTION: since this may read the entire remainder of the file, don't
1368 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001369 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001370PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001371PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001372{
Antoine Pitrou5bc7ec92010-04-21 22:56:22 +00001373/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
Tim Peters691e0e92001-01-18 04:39:16 +00001374#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001375#ifdef HAVE_FSTAT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001376 off_t filesize;
1377 filesize = getfilesize(fp);
1378 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1379 char* pBuf = (char *)PyMem_MALLOC(filesize);
1380 if (pBuf != NULL) {
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001381 size_t n = fread(pBuf, 1, (size_t)filesize, fp);
1382 PyObject* v = PyMarshal_ReadObjectFromString(pBuf, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 PyMem_FREE(pBuf);
1384 return v;
1385 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001387 }
Tim Peters691e0e92001-01-18 04:39:16 +00001388#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001389 /* We don't have fstat, or we do but the file is larger than
1390 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1391 */
1392 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001393
Tim Peters691e0e92001-01-18 04:39:16 +00001394#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001395}
1396
Guido van Rossum79f25d91997-04-29 20:08:16 +00001397PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001398PyMarshal_ReadObjectFromFile(FILE *fp)
1399{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001400 RFILE rf;
1401 PyObject *result;
1402 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001403 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001404 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001405 rf.depth = 0;
1406 rf.ptr = rf.end = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001407 rf.refs = PyList_New(0);
1408 if (rf.refs == NULL)
1409 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001410 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001411 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001413}
1414
1415PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001416PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001417{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001418 RFILE rf;
1419 PyObject *result;
1420 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001421 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001422 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 rf.ptr = str;
1424 rf.end = str + len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001426 rf.refs = PyList_New(0);
1427 if (rf.refs == NULL)
1428 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001429 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001430 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001431 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001432}
1433
Guido van Rossum79f25d91997-04-29 20:08:16 +00001434PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001435PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001436{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437 WFILE wf;
Guido van Rossume6d39042007-05-09 00:01:30 +00001438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439 wf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001440 wf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001441 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1442 if (wf.str == NULL)
1443 return NULL;
1444 wf.ptr = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1445 wf.end = wf.ptr + PyBytes_Size(wf.str);
1446 wf.error = WFERR_OK;
1447 wf.depth = 0;
1448 wf.version = version;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001449 if (version >= 3) {
1450 if ((wf.refs = PyDict_New()) == NULL)
1451 return NULL;
1452 } else
1453 wf.refs = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 w_object(x, &wf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001455 Py_XDECREF(wf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456 if (wf.str != NULL) {
1457 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1458 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1459 Py_DECREF(wf.str);
1460 PyErr_SetString(PyExc_OverflowError,
1461 "too much marshal data for a string");
1462 return NULL;
1463 }
1464 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1465 return NULL;
1466 }
1467 if (wf.error != WFERR_OK) {
1468 Py_XDECREF(wf.str);
1469 if (wf.error == WFERR_NOMEMORY)
1470 PyErr_NoMemory();
1471 else
1472 PyErr_SetString(PyExc_ValueError,
1473 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1474 :"object too deeply nested to marshal");
1475 return NULL;
1476 }
Antoine Pitrou1c13f842012-03-02 18:22:23 +01001477 return wf.str;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001478}
1479
Guido van Rossum64b45521991-06-07 13:58:22 +00001480/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001481
Guido van Rossum79f25d91997-04-29 20:08:16 +00001482static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001483marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001484{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 /* XXX Quick hack -- need to do this differently */
1486 PyObject *x;
1487 PyObject *f;
1488 int version = Py_MARSHAL_VERSION;
1489 PyObject *s;
1490 PyObject *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001491 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001493 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
1494 return NULL;
1495 s = PyMarshal_WriteObjectToString(x, version);
1496 if (s == NULL)
1497 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001498 res = _PyObject_CallMethodId(f, &PyId_write, "O", s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001499 Py_DECREF(s);
1500 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001501}
1502
R. David Murraydd226ea2009-05-13 12:27:21 +00001503PyDoc_STRVAR(dump_doc,
1504"dump(value, file[, version])\n\
1505\n\
1506Write the value on the open file. The value must be a supported type.\n\
1507The file must be an open file object such as sys.stdout or returned by\n\
1508open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1509\n\
1510If the value has (or contains an object that has) an unsupported type, a\n\
1511ValueError exception is raised but garbage data will also be written\n\
1512to the file. The object will not be properly read back by load()\n\
1513\n\
1514The version argument indicates the data format that dump should use.");
1515
Guido van Rossum79f25d91997-04-29 20:08:16 +00001516static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001517marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001518{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519 PyObject *data, *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001520 _Py_IDENTIFIER(read);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001521 RFILE rf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001522
1523 /*
1524 * Make a call to the read method, but read zero bytes.
1525 * This is to ensure that the object passed in at least
1526 * has a read method which returns bytes.
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001527 * This can be removed if we guarantee good error handling
1528 * for r_string()
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001529 */
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001530 data = _PyObject_CallMethodId(f, &PyId_read, "i", 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 if (data == NULL)
1532 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001533 if (!PyBytes_Check(data)) {
1534 PyErr_Format(PyExc_TypeError,
1535 "f.read() returned not bytes but %.100s",
1536 data->ob_type->tp_name);
1537 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001538 }
1539 else {
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001540 rf.depth = 0;
1541 rf.fp = NULL;
1542 rf.readable = f;
Vinay Sajipaac0f752011-07-02 18:42:21 +01001543 rf.current_filename = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001544 if ((rf.refs = PyList_New(0)) != NULL) {
1545 result = read_object(&rf);
1546 Py_DECREF(rf.refs);
1547 } else
1548 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001550 Py_DECREF(data);
1551 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001552}
1553
R. David Murraydd226ea2009-05-13 12:27:21 +00001554PyDoc_STRVAR(load_doc,
1555"load(file)\n\
1556\n\
1557Read one value from the open file and return it. If no valid value is\n\
1558read (e.g. because the data has a different Python versions\n\
1559incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1560The file must be an open file object opened in binary mode ('rb' or\n\
1561'r+b').\n\
1562\n\
1563Note: If an object containing an unsupported type was marshalled with\n\
1564dump(), load() will substitute None for the unmarshallable type.");
1565
1566
Guido van Rossum79f25d91997-04-29 20:08:16 +00001567static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001568marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001569{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001570 PyObject *x;
1571 int version = Py_MARSHAL_VERSION;
1572 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
1573 return NULL;
1574 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001575}
1576
R. David Murraydd226ea2009-05-13 12:27:21 +00001577PyDoc_STRVAR(dumps_doc,
1578"dumps(value[, version])\n\
1579\n\
1580Return the string that would be written to a file by dump(value, file).\n\
1581The value must be a supported type. Raise a ValueError exception if\n\
1582value has (or contains an object that has) an unsupported type.\n\
1583\n\
1584The version argument indicates the data format that dumps should use.");
1585
1586
Guido van Rossum79f25d91997-04-29 20:08:16 +00001587static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001588marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001589{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001590 RFILE rf;
1591 Py_buffer p;
1592 char *s;
1593 Py_ssize_t n;
1594 PyObject* result;
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001595 if (!PyArg_ParseTuple(args, "y*:loads", &p))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001596 return NULL;
1597 s = p.buf;
1598 n = p.len;
1599 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001600 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001601 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001602 rf.ptr = s;
1603 rf.end = s + n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001605 if ((rf.refs = PyList_New(0)) == NULL)
1606 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001607 result = read_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001608 PyBuffer_Release(&p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001609 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001611}
1612
R. David Murraydd226ea2009-05-13 12:27:21 +00001613PyDoc_STRVAR(loads_doc,
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001614"loads(bytes)\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001615\n\
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001616Convert the bytes object to a value. If no valid value is found, raise\n\
1617EOFError, ValueError or TypeError. Extra characters in the input are\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001618ignored.");
1619
Guido van Rossum79f25d91997-04-29 20:08:16 +00001620static PyMethodDef marshal_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001621 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1622 {"load", marshal_load, METH_O, load_doc},
1623 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1624 {"loads", marshal_loads, METH_VARARGS, loads_doc},
1625 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001626};
1627
R. David Murraydd226ea2009-05-13 12:27:21 +00001628
1629PyDoc_STRVAR(module_doc,
1630"This module contains functions that can read and write Python values in\n\
1631a binary format. The format is specific to Python, but independent of\n\
1632machine architecture issues.\n\
1633\n\
1634Not all Python object types are supported; in general, only objects\n\
1635whose value is independent from a particular invocation of Python can be\n\
1636written and read by this module. The following types are supported:\n\
1637None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1638tuples, lists, sets, dictionaries, and code objects, where it\n\
1639should be understood that tuples, lists and dictionaries are only\n\
1640supported as long as the values contained therein are themselves\n\
1641supported; and recursive lists and dictionaries should not be written\n\
1642(they will cause infinite loops).\n\
1643\n\
1644Variables:\n\
1645\n\
1646version -- indicates the format that the module uses. Version 0 is the\n\
1647 historical format, version 1 shares interned strings and version 2\n\
1648 uses a binary format for floating point numbers.\n\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001649 Version 3 shares common object references (New in version 3.4).\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001650\n\
1651Functions:\n\
1652\n\
1653dump() -- write value to a file\n\
1654load() -- read value from a file\n\
1655dumps() -- write value to a string\n\
1656loads() -- read value from a string");
1657
1658
1659
Brett Cannon429ef652008-06-27 00:35:35 +00001660static struct PyModuleDef marshalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001661 PyModuleDef_HEAD_INIT,
1662 "marshal",
1663 module_doc,
1664 0,
1665 marshal_methods,
1666 NULL,
1667 NULL,
1668 NULL,
1669 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001670};
1671
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001672PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001673PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001674{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675 PyObject *mod = PyModule_Create(&marshalmodule);
1676 if (mod == NULL)
1677 return NULL;
1678 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
1679 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001680}