blob: bd889393d146d470e8ea960a8f64ad9ed1299976 [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ónssone1781872013-03-20 11:43:57 -0700746/* allocate the reflist index for a new object. Return -1 on failure */
747static Py_ssize_t
748r_ref_reserve(int flag, RFILE *p)
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700749{
750 if (flag) { /* currently only FLAG_REF is defined */
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700751 Py_ssize_t idx = PyList_Size(p->refs);
752 if (idx < 0)
753 return -1;
754 if (idx >= 0x7ffffffe) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700755 PyErr_SetString(PyExc_ValueError, "bad marshal data (index list too large)");
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700756 return -1;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700757 }
758 if (PyList_Append(p->refs, Py_None) < 0)
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700759 return -1;
760 return idx;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700761 } else
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700762 return 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700763}
764
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700765/* insert the new object 'o' to the reflist at previously
766 * allocated index 'idx'.
767 * 'o' can be NULL, in which case nothing is done.
768 * if 'o' was non-NULL, and the function succeeds, 'o' is returned.
769 * if 'o' was non-NULL, and the function fails, 'o' is released and
770 * NULL returned. This simplifies error checking at the call site since
771 * a single test for NULL for the function result is enough.
772 */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700773static PyObject *
774r_ref_insert(PyObject *o, Py_ssize_t idx, int flag, RFILE *p)
775{
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700776 if (o != NULL && flag) { /* currently only FLAG_REF is defined */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700777 if (PyList_SetItem(p->refs, idx, o) < 0) {
778 Py_DECREF(o); /* release the new object */
779 return NULL;
780 } else {
781 Py_INCREF(o); /* a reference for the list */
782 }
783 }
784 return o;
785}
786
787/* combination of both above, used when an object can be
788 * created whenever it is seen in the file, as opposed to
789 * after having loaded its sub-objects.
790 */
791static PyObject *
792r_ref(PyObject *o, int flag, RFILE *p)
793{
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700794 if (o != NULL && flag) { /* currently only FLAG_REF is defined */
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700795 if (PyList_Append(p->refs, o) < 0) {
796 Py_DECREF(o); /* release the new object */
797 return NULL;
798 }
799 }
800 return o;
801}
Mark Dickinsonbd792642009-03-18 20:06:12 +0000802
803static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000804r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000805{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000806 /* NULL is a valid return value, it does not necessarily means that
807 an exception is set. */
808 PyObject *v, *v2;
Benjamin Petersoneddb0a72013-03-20 00:40:07 -0500809 Py_ssize_t idx = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 long i, n;
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700811 int type, code = r_byte(p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700812 int flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000813 PyObject *retval;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000814
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700815 if (code == EOF) {
816 PyErr_SetString(PyExc_EOFError,
817 "EOF read where object expected");
818 return NULL;
819 }
820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000821 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000823 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
824 p->depth--;
825 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
826 return NULL;
827 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000828
Kristján Valur Jónsson61683622013-03-20 14:26:33 -0700829 flag = code & FLAG_REF;
830 type = code & ~FLAG_REF;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700831
832#define R_REF(O) do{\
Kristján Valur Jónssone1781872013-03-20 11:43:57 -0700833 if (flag) \
834 O = r_ref(O, flag, p);\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700835} while (0)
836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 case TYPE_NULL:
840 retval = NULL;
841 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000843 case TYPE_NONE:
844 Py_INCREF(Py_None);
845 retval = Py_None;
846 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 case TYPE_STOPITER:
849 Py_INCREF(PyExc_StopIteration);
850 retval = PyExc_StopIteration;
851 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000853 case TYPE_ELLIPSIS:
854 Py_INCREF(Py_Ellipsis);
855 retval = Py_Ellipsis;
856 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 case TYPE_FALSE:
859 Py_INCREF(Py_False);
860 retval = Py_False;
861 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000862
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 case TYPE_TRUE:
864 Py_INCREF(Py_True);
865 retval = Py_True;
866 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 case TYPE_INT:
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100869 n = r_long(p);
870 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700871 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 case TYPE_INT64:
875 retval = r_long64(p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700876 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 case TYPE_LONG:
880 retval = r_PyLong(p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700881 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000884 case TYPE_FLOAT:
885 {
886 char buf[256];
887 double dx;
888 retval = NULL;
889 n = r_byte(p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200890 if (n == EOF || r_string(buf, n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000891 PyErr_SetString(PyExc_EOFError,
892 "EOF read where object expected");
893 break;
894 }
895 buf[n] = '\0';
896 dx = PyOS_string_to_double(buf, NULL, NULL);
897 if (dx == -1.0 && PyErr_Occurred())
898 break;
899 retval = PyFloat_FromDouble(dx);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700900 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000901 break;
902 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000903
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 case TYPE_BINARY_FLOAT:
905 {
906 unsigned char buf[8];
907 double x;
908 if (r_string((char*)buf, 8, p) != 8) {
909 PyErr_SetString(PyExc_EOFError,
910 "EOF read where object expected");
911 retval = NULL;
912 break;
913 }
914 x = _PyFloat_Unpack8(buf, 1);
915 if (x == -1.0 && PyErr_Occurred()) {
916 retval = NULL;
917 break;
918 }
919 retval = PyFloat_FromDouble(x);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700920 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000921 break;
922 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000923
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000924 case TYPE_COMPLEX:
925 {
926 char buf[256];
927 Py_complex c;
928 retval = NULL;
929 n = r_byte(p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200930 if (n == EOF || r_string(buf, n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000931 PyErr_SetString(PyExc_EOFError,
932 "EOF read where object expected");
933 break;
934 }
935 buf[n] = '\0';
936 c.real = PyOS_string_to_double(buf, NULL, NULL);
937 if (c.real == -1.0 && PyErr_Occurred())
938 break;
939 n = r_byte(p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200940 if (n == EOF || r_string(buf, n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 PyErr_SetString(PyExc_EOFError,
942 "EOF read where object expected");
943 break;
944 }
945 buf[n] = '\0';
946 c.imag = PyOS_string_to_double(buf, NULL, NULL);
947 if (c.imag == -1.0 && PyErr_Occurred())
948 break;
949 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700950 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000951 break;
952 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 case TYPE_BINARY_COMPLEX:
955 {
956 unsigned char buf[8];
957 Py_complex c;
958 if (r_string((char*)buf, 8, p) != 8) {
959 PyErr_SetString(PyExc_EOFError,
960 "EOF read where object expected");
961 retval = NULL;
962 break;
963 }
964 c.real = _PyFloat_Unpack8(buf, 1);
965 if (c.real == -1.0 && PyErr_Occurred()) {
966 retval = NULL;
967 break;
968 }
969 if (r_string((char*)buf, 8, p) != 8) {
970 PyErr_SetString(PyExc_EOFError,
971 "EOF read where object expected");
972 retval = NULL;
973 break;
974 }
975 c.imag = _PyFloat_Unpack8(buf, 1);
976 if (c.imag == -1.0 && PyErr_Occurred()) {
977 retval = NULL;
978 break;
979 }
980 retval = PyComplex_FromCComplex(c);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -0700981 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000982 break;
983 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 case TYPE_STRING:
986 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100987 if (PyErr_Occurred()) {
988 retval = NULL;
989 break;
990 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200991 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
993 retval = NULL;
994 break;
995 }
996 v = PyBytes_FromStringAndSize((char *)NULL, n);
997 if (v == NULL) {
998 retval = NULL;
999 break;
1000 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001001 if (r_string(PyBytes_AS_STRING(v), n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001002 Py_DECREF(v);
1003 PyErr_SetString(PyExc_EOFError,
1004 "EOF read where object expected");
1005 retval = NULL;
1006 break;
1007 }
1008 retval = v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001009 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 case TYPE_UNICODE:
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001013 case TYPE_INTERNED:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 {
1015 char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +00001016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001017 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001018 if (PyErr_Occurred()) {
1019 retval = NULL;
1020 break;
1021 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001022 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
1024 retval = NULL;
1025 break;
1026 }
1027 buffer = PyMem_NEW(char, n);
1028 if (buffer == NULL) {
1029 retval = PyErr_NoMemory();
1030 break;
1031 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001032 if (r_string(buffer, n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001033 PyMem_DEL(buffer);
1034 PyErr_SetString(PyExc_EOFError,
1035 "EOF read where object expected");
1036 retval = NULL;
1037 break;
1038 }
1039 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
1040 PyMem_DEL(buffer);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001041 if (type == TYPE_INTERNED)
1042 PyUnicode_InternInPlace(&v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 retval = v;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001044 R_REF(retval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001045 break;
1046 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 case TYPE_TUPLE:
1049 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001050 if (PyErr_Occurred()) {
1051 retval = NULL;
1052 break;
1053 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001054 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
1056 retval = NULL;
1057 break;
1058 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001059 v = PyTuple_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001060 R_REF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 if (v == NULL) {
1062 retval = NULL;
1063 break;
1064 }
1065 for (i = 0; i < n; i++) {
1066 v2 = r_object(p);
1067 if ( v2 == NULL ) {
1068 if (!PyErr_Occurred())
1069 PyErr_SetString(PyExc_TypeError,
1070 "NULL object in marshal data for tuple");
1071 Py_DECREF(v);
1072 v = NULL;
1073 break;
1074 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001075 PyTuple_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001076 }
1077 retval = v;
1078 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 case TYPE_LIST:
1081 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001082 if (PyErr_Occurred()) {
1083 retval = NULL;
1084 break;
1085 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001086 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001087 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
1088 retval = NULL;
1089 break;
1090 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001091 v = PyList_New(n);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001092 R_REF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001093 if (v == NULL) {
1094 retval = NULL;
1095 break;
1096 }
1097 for (i = 0; i < n; i++) {
1098 v2 = r_object(p);
1099 if ( v2 == NULL ) {
1100 if (!PyErr_Occurred())
1101 PyErr_SetString(PyExc_TypeError,
1102 "NULL object in marshal data for list");
1103 Py_DECREF(v);
1104 v = NULL;
1105 break;
1106 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001107 PyList_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 }
1109 retval = v;
1110 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 case TYPE_DICT:
1113 v = PyDict_New();
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001114 R_REF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 if (v == NULL) {
1116 retval = NULL;
1117 break;
1118 }
1119 for (;;) {
1120 PyObject *key, *val;
1121 key = r_object(p);
1122 if (key == NULL)
1123 break;
1124 val = r_object(p);
1125 if (val != NULL)
1126 PyDict_SetItem(v, key, val);
1127 Py_DECREF(key);
1128 Py_XDECREF(val);
1129 }
1130 if (PyErr_Occurred()) {
1131 Py_DECREF(v);
1132 v = NULL;
1133 }
1134 retval = v;
1135 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 case TYPE_SET:
1138 case TYPE_FROZENSET:
1139 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001140 if (PyErr_Occurred()) {
1141 retval = NULL;
1142 break;
1143 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001144 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001145 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
1146 retval = NULL;
1147 break;
1148 }
1149 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001150 if (type == TYPE_SET) {
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001151 R_REF(v);
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001152 } else {
1153 /* must use delayed registration of frozensets because they must
1154 * be init with a refcount of 1
1155 */
1156 idx = r_ref_reserve(flag, p);
1157 if (idx < 0)
1158 Py_CLEAR(v); /* signal error */
1159 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 if (v == NULL) {
1161 retval = NULL;
1162 break;
1163 }
1164 for (i = 0; i < n; i++) {
1165 v2 = r_object(p);
1166 if ( v2 == NULL ) {
1167 if (!PyErr_Occurred())
1168 PyErr_SetString(PyExc_TypeError,
1169 "NULL object in marshal data for set");
1170 Py_DECREF(v);
1171 v = NULL;
1172 break;
1173 }
1174 if (PySet_Add(v, v2) == -1) {
1175 Py_DECREF(v);
1176 Py_DECREF(v2);
1177 v = NULL;
1178 break;
1179 }
1180 Py_DECREF(v2);
1181 }
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001182 if (type != TYPE_SET)
1183 v = r_ref_insert(v, idx, flag, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 retval = v;
1185 break;
Raymond Hettingera422c342005-01-11 03:03:27 +00001186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001187 case TYPE_CODE:
1188 {
1189 int argcount;
1190 int kwonlyargcount;
1191 int nlocals;
1192 int stacksize;
1193 int flags;
1194 PyObject *code = NULL;
1195 PyObject *consts = NULL;
1196 PyObject *names = NULL;
1197 PyObject *varnames = NULL;
1198 PyObject *freevars = NULL;
1199 PyObject *cellvars = NULL;
1200 PyObject *filename = NULL;
1201 PyObject *name = NULL;
1202 int firstlineno;
1203 PyObject *lnotab = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001204
Kristján Valur Jónssone1781872013-03-20 11:43:57 -07001205 idx = r_ref_reserve(flag, p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001206 if (idx < 0) {
1207 retval = NULL;
1208 break;
1209 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 /* XXX ignore long->int overflows for now */
1214 argcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001215 if (PyErr_Occurred())
1216 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 kwonlyargcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001218 if (PyErr_Occurred())
1219 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 nlocals = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001221 if (PyErr_Occurred())
1222 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 stacksize = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001224 if (PyErr_Occurred())
1225 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 flags = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001227 if (PyErr_Occurred())
1228 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001229 code = r_object(p);
1230 if (code == NULL)
1231 goto code_error;
1232 consts = r_object(p);
1233 if (consts == NULL)
1234 goto code_error;
1235 names = r_object(p);
1236 if (names == NULL)
1237 goto code_error;
1238 varnames = r_object(p);
1239 if (varnames == NULL)
1240 goto code_error;
1241 freevars = r_object(p);
1242 if (freevars == NULL)
1243 goto code_error;
1244 cellvars = r_object(p);
1245 if (cellvars == NULL)
1246 goto code_error;
1247 filename = r_object(p);
1248 if (filename == NULL)
1249 goto code_error;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001250 if (PyUnicode_CheckExact(filename)) {
1251 if (p->current_filename != NULL) {
1252 if (!PyUnicode_Compare(filename, p->current_filename)) {
1253 Py_DECREF(filename);
1254 Py_INCREF(p->current_filename);
1255 filename = p->current_filename;
1256 }
1257 }
1258 else {
1259 p->current_filename = filename;
1260 }
1261 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 name = r_object(p);
1263 if (name == NULL)
1264 goto code_error;
1265 firstlineno = (int)r_long(p);
1266 lnotab = r_object(p);
1267 if (lnotab == NULL)
1268 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 v = (PyObject *) PyCode_New(
1271 argcount, kwonlyargcount,
1272 nlocals, stacksize, flags,
1273 code, consts, names, varnames,
1274 freevars, cellvars, filename, name,
1275 firstlineno, lnotab);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001276 v = r_ref_insert(v, idx, flag, p);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 code_error:
1279 Py_XDECREF(code);
1280 Py_XDECREF(consts);
1281 Py_XDECREF(names);
1282 Py_XDECREF(varnames);
1283 Py_XDECREF(freevars);
1284 Py_XDECREF(cellvars);
1285 Py_XDECREF(filename);
1286 Py_XDECREF(name);
1287 Py_XDECREF(lnotab);
1288 }
1289 retval = v;
1290 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001291
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001292 case TYPE_REF:
1293 n = r_long(p);
1294 if (n < 0 || n >= PyList_GET_SIZE(p->refs)) {
1295 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
1296 retval = NULL;
1297 break;
1298 }
1299 v = PyList_GET_ITEM(p->refs, n);
1300 if (v == Py_None) {
1301 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)");
1302 retval = NULL;
1303 break;
1304 }
1305 Py_INCREF(v);
1306 retval = v;
1307 break;
1308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 default:
1310 /* Bogus data got written, which isn't ideal.
1311 This will let you keep working and recover. */
1312 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
1313 retval = NULL;
1314 break;
1315
1316 }
1317 p->depth--;
1318 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001319}
1320
Neal Norwitzd85c4522004-06-13 20:31:49 +00001321static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001322read_object(RFILE *p)
1323{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001324 PyObject *v;
1325 if (PyErr_Occurred()) {
1326 fprintf(stderr, "XXX readobject called with exception set\n");
1327 return NULL;
1328 }
1329 v = r_object(p);
1330 if (v == NULL && !PyErr_Occurred())
1331 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1332 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001333}
1334
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001335int
1336PyMarshal_ReadShortFromFile(FILE *fp)
1337{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001338 RFILE rf;
1339 assert(fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001340 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 rf.fp = fp;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001342 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 rf.end = rf.ptr = NULL;
1344 return r_short(&rf);
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001345}
1346
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001347long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001348PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001349{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 RFILE rf;
1351 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001352 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001353 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 rf.ptr = rf.end = NULL;
1355 return r_long(&rf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001356}
1357
Tim Peters691e0e92001-01-18 04:39:16 +00001358#ifdef HAVE_FSTAT
1359/* Return size of file in bytes; < 0 if unknown. */
1360static off_t
1361getfilesize(FILE *fp)
1362{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001363 struct stat st;
1364 if (fstat(fileno(fp), &st) != 0)
1365 return -1;
1366 else
1367 return st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001368}
1369#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001370
Tim Peters691e0e92001-01-18 04:39:16 +00001371/* If we can get the size of the file up-front, and it's reasonably small,
1372 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1373 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001374 * CAUTION: since this may read the entire remainder of the file, don't
1375 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001376 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001377PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001378PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001379{
Antoine Pitrou5bc7ec92010-04-21 22:56:22 +00001380/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
Tim Peters691e0e92001-01-18 04:39:16 +00001381#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001382#ifdef HAVE_FSTAT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 off_t filesize;
1384 filesize = getfilesize(fp);
1385 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1386 char* pBuf = (char *)PyMem_MALLOC(filesize);
1387 if (pBuf != NULL) {
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001388 size_t n = fread(pBuf, 1, (size_t)filesize, fp);
1389 PyObject* v = PyMarshal_ReadObjectFromString(pBuf, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 PyMem_FREE(pBuf);
1391 return v;
1392 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001394 }
Tim Peters691e0e92001-01-18 04:39:16 +00001395#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001396 /* We don't have fstat, or we do but the file is larger than
1397 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1398 */
1399 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001400
Tim Peters691e0e92001-01-18 04:39:16 +00001401#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001402}
1403
Guido van Rossum79f25d91997-04-29 20:08:16 +00001404PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001405PyMarshal_ReadObjectFromFile(FILE *fp)
1406{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001407 RFILE rf;
1408 PyObject *result;
1409 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001410 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001411 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 rf.depth = 0;
1413 rf.ptr = rf.end = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001414 rf.refs = PyList_New(0);
1415 if (rf.refs == NULL)
1416 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001417 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001418 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001419 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001420}
1421
1422PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001423PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001424{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 RFILE rf;
1426 PyObject *result;
1427 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001428 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001429 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430 rf.ptr = str;
1431 rf.end = str + len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001432 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001433 rf.refs = PyList_New(0);
1434 if (rf.refs == NULL)
1435 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001436 result = r_object(&rf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001437 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001438 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001439}
1440
Guido van Rossum79f25d91997-04-29 20:08:16 +00001441PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001442PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001443{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 WFILE wf;
Guido van Rossume6d39042007-05-09 00:01:30 +00001445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001446 wf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001447 wf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1449 if (wf.str == NULL)
1450 return NULL;
1451 wf.ptr = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1452 wf.end = wf.ptr + PyBytes_Size(wf.str);
1453 wf.error = WFERR_OK;
1454 wf.depth = 0;
1455 wf.version = version;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001456 if (version >= 3) {
1457 if ((wf.refs = PyDict_New()) == NULL)
1458 return NULL;
1459 } else
1460 wf.refs = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 w_object(x, &wf);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001462 Py_XDECREF(wf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 if (wf.str != NULL) {
1464 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1465 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1466 Py_DECREF(wf.str);
1467 PyErr_SetString(PyExc_OverflowError,
1468 "too much marshal data for a string");
1469 return NULL;
1470 }
1471 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1472 return NULL;
1473 }
1474 if (wf.error != WFERR_OK) {
1475 Py_XDECREF(wf.str);
1476 if (wf.error == WFERR_NOMEMORY)
1477 PyErr_NoMemory();
1478 else
1479 PyErr_SetString(PyExc_ValueError,
1480 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1481 :"object too deeply nested to marshal");
1482 return NULL;
1483 }
Antoine Pitrou1c13f842012-03-02 18:22:23 +01001484 return wf.str;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001485}
1486
Guido van Rossum64b45521991-06-07 13:58:22 +00001487/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001488
Guido van Rossum79f25d91997-04-29 20:08:16 +00001489static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001490marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001491{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001492 /* XXX Quick hack -- need to do this differently */
1493 PyObject *x;
1494 PyObject *f;
1495 int version = Py_MARSHAL_VERSION;
1496 PyObject *s;
1497 PyObject *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001498 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001500 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
1501 return NULL;
1502 s = PyMarshal_WriteObjectToString(x, version);
1503 if (s == NULL)
1504 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001505 res = _PyObject_CallMethodId(f, &PyId_write, "O", s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001506 Py_DECREF(s);
1507 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001508}
1509
R. David Murraydd226ea2009-05-13 12:27:21 +00001510PyDoc_STRVAR(dump_doc,
1511"dump(value, file[, version])\n\
1512\n\
1513Write the value on the open file. The value must be a supported type.\n\
1514The file must be an open file object such as sys.stdout or returned by\n\
1515open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1516\n\
1517If the value has (or contains an object that has) an unsupported type, a\n\
1518ValueError exception is raised but garbage data will also be written\n\
1519to the file. The object will not be properly read back by load()\n\
1520\n\
1521The version argument indicates the data format that dump should use.");
1522
Guido van Rossum79f25d91997-04-29 20:08:16 +00001523static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001524marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001525{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001526 PyObject *data, *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001527 _Py_IDENTIFIER(read);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001528 RFILE rf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001529
1530 /*
1531 * Make a call to the read method, but read zero bytes.
1532 * This is to ensure that the object passed in at least
1533 * has a read method which returns bytes.
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001534 * This can be removed if we guarantee good error handling
1535 * for r_string()
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001536 */
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001537 data = _PyObject_CallMethodId(f, &PyId_read, "i", 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001538 if (data == NULL)
1539 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001540 if (!PyBytes_Check(data)) {
1541 PyErr_Format(PyExc_TypeError,
1542 "f.read() returned not bytes but %.100s",
1543 data->ob_type->tp_name);
1544 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545 }
1546 else {
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001547 rf.depth = 0;
1548 rf.fp = NULL;
1549 rf.readable = f;
Vinay Sajipaac0f752011-07-02 18:42:21 +01001550 rf.current_filename = NULL;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001551 if ((rf.refs = PyList_New(0)) != NULL) {
1552 result = read_object(&rf);
1553 Py_DECREF(rf.refs);
1554 } else
1555 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 Py_DECREF(data);
1558 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001559}
1560
R. David Murraydd226ea2009-05-13 12:27:21 +00001561PyDoc_STRVAR(load_doc,
1562"load(file)\n\
1563\n\
1564Read one value from the open file and return it. If no valid value is\n\
1565read (e.g. because the data has a different Python versions\n\
1566incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1567The file must be an open file object opened in binary mode ('rb' or\n\
1568'r+b').\n\
1569\n\
1570Note: If an object containing an unsupported type was marshalled with\n\
1571dump(), load() will substitute None for the unmarshallable type.");
1572
1573
Guido van Rossum79f25d91997-04-29 20:08:16 +00001574static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001575marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001576{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 PyObject *x;
1578 int version = Py_MARSHAL_VERSION;
1579 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
1580 return NULL;
1581 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001582}
1583
R. David Murraydd226ea2009-05-13 12:27:21 +00001584PyDoc_STRVAR(dumps_doc,
1585"dumps(value[, version])\n\
1586\n\
1587Return the string that would be written to a file by dump(value, file).\n\
1588The value must be a supported type. Raise a ValueError exception if\n\
1589value has (or contains an object that has) an unsupported type.\n\
1590\n\
1591The version argument indicates the data format that dumps should use.");
1592
1593
Guido van Rossum79f25d91997-04-29 20:08:16 +00001594static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001595marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001596{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001597 RFILE rf;
1598 Py_buffer p;
1599 char *s;
1600 Py_ssize_t n;
1601 PyObject* result;
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001602 if (!PyArg_ParseTuple(args, "y*:loads", &p))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001603 return NULL;
1604 s = p.buf;
1605 n = p.len;
1606 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001607 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001608 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001609 rf.ptr = s;
1610 rf.end = s + n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001611 rf.depth = 0;
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001612 if ((rf.refs = PyList_New(0)) == NULL)
1613 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001614 result = read_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001615 PyBuffer_Release(&p);
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001616 Py_DECREF(rf.refs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001617 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001618}
1619
R. David Murraydd226ea2009-05-13 12:27:21 +00001620PyDoc_STRVAR(loads_doc,
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001621"loads(bytes)\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001622\n\
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001623Convert the bytes object to a value. If no valid value is found, raise\n\
1624EOFError, ValueError or TypeError. Extra characters in the input are\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001625ignored.");
1626
Guido van Rossum79f25d91997-04-29 20:08:16 +00001627static PyMethodDef marshal_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1629 {"load", marshal_load, METH_O, load_doc},
1630 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1631 {"loads", marshal_loads, METH_VARARGS, loads_doc},
1632 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001633};
1634
R. David Murraydd226ea2009-05-13 12:27:21 +00001635
1636PyDoc_STRVAR(module_doc,
1637"This module contains functions that can read and write Python values in\n\
1638a binary format. The format is specific to Python, but independent of\n\
1639machine architecture issues.\n\
1640\n\
1641Not all Python object types are supported; in general, only objects\n\
1642whose value is independent from a particular invocation of Python can be\n\
1643written and read by this module. The following types are supported:\n\
1644None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1645tuples, lists, sets, dictionaries, and code objects, where it\n\
1646should be understood that tuples, lists and dictionaries are only\n\
1647supported as long as the values contained therein are themselves\n\
1648supported; and recursive lists and dictionaries should not be written\n\
1649(they will cause infinite loops).\n\
1650\n\
1651Variables:\n\
1652\n\
1653version -- indicates the format that the module uses. Version 0 is the\n\
1654 historical format, version 1 shares interned strings and version 2\n\
1655 uses a binary format for floating point numbers.\n\
Kristján Valur Jónssond7009c62013-03-19 18:02:10 -07001656 Version 3 shares common object references (New in version 3.4).\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001657\n\
1658Functions:\n\
1659\n\
1660dump() -- write value to a file\n\
1661load() -- read value from a file\n\
1662dumps() -- write value to a string\n\
1663loads() -- read value from a string");
1664
1665
1666
Brett Cannon429ef652008-06-27 00:35:35 +00001667static struct PyModuleDef marshalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001668 PyModuleDef_HEAD_INIT,
1669 "marshal",
1670 module_doc,
1671 0,
1672 marshal_methods,
1673 NULL,
1674 NULL,
1675 NULL,
1676 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001677};
1678
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001679PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001680PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001681{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001682 PyObject *mod = PyModule_Create(&marshalmodule);
1683 if (mod == NULL)
1684 return NULL;
1685 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
1686 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001687}