blob: 1edb696fd970f687ef1d2b22f59ed0a596966259 [file] [log] [blame]
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001
2/* Write Python objects to files and read them back.
3 This is intended for writing and reading compiled Python code only;
4 a true persistent storage facility would be much harder, since
5 it would have to take circular links and sharing into account. */
6
Thomas Wouters695934a2006-03-01 23:49:13 +00007#define PY_SSIZE_T_CLEAN
8
Guido van Rossum79f25d91997-04-29 20:08:16 +00009#include "Python.h"
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000010#include "longintrepr.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011#include "code.h"
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000012#include "marshal.h"
13
Mark Dickinsonbd792642009-03-18 20:06:12 +000014#define ABS(x) ((x) < 0 ? -(x) : (x))
15
Fred Drake6da0b912000-06-28 18:47:56 +000016/* High water mark to determine when the marshalled object is dangerously deep
17 * and risks coring the interpreter. When the object stack gets this deep,
18 * raise an exception instead of continuing.
Guido van Rossum63175a12007-08-29 20:39:13 +000019 * On Windows debug builds, reduce this value.
Fred Drake6da0b912000-06-28 18:47:56 +000020 */
Guido van Rossum63175a12007-08-29 20:39:13 +000021#if defined(MS_WINDOWS) && defined(_DEBUG)
22#define MAX_MARSHAL_STACK_DEPTH 1500
23#else
Guido van Rossumd59da4b2007-05-22 18:11:13 +000024#define MAX_MARSHAL_STACK_DEPTH 2000
Guido van Rossum63175a12007-08-29 20:39:13 +000025#endif
Fred Drake6da0b912000-06-28 18:47:56 +000026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000027#define TYPE_NULL '0'
28#define TYPE_NONE 'N'
29#define TYPE_FALSE 'F'
30#define TYPE_TRUE 'T'
31#define TYPE_STOPITER 'S'
32#define TYPE_ELLIPSIS '.'
33#define TYPE_INT 'i'
34#define TYPE_INT64 'I'
35#define TYPE_FLOAT 'f'
36#define TYPE_BINARY_FLOAT 'g'
37#define TYPE_COMPLEX 'x'
38#define TYPE_BINARY_COMPLEX 'y'
39#define TYPE_LONG 'l'
40#define TYPE_STRING 's'
41#define TYPE_TUPLE '('
42#define TYPE_LIST '['
43#define TYPE_DICT '{'
44#define TYPE_CODE 'c'
45#define TYPE_UNICODE 'u'
46#define TYPE_UNKNOWN '?'
47#define TYPE_SET '<'
48#define TYPE_FROZENSET '>'
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000049
Eric Smithb1a03cf2009-04-21 11:57:38 +000050#define WFERR_OK 0
51#define WFERR_UNMARSHALLABLE 1
52#define WFERR_NESTEDTOODEEP 2
53#define WFERR_NOMEMORY 3
54
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000055typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000056 FILE *fp;
57 int error; /* see WFERR_* values */
58 int depth;
59 /* If fp == NULL, the following are valid: */
Éric Araujo6c0ba442011-07-26 17:23:57 +020060 PyObject *readable; /* Stream-like object being read from */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 PyObject *str;
62 char *ptr;
63 char *end;
64 PyObject *strings; /* dict on marshal, list on unmarshal */
65 int version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000066} WFILE;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000067
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000068#define w_byte(c, p) if (((p)->fp)) putc((c), (p)->fp); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000069 else if ((p)->ptr != (p)->end) *(p)->ptr++ = (c); \
70 else w_more(c, p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000071
72static void
Fredrik Lundh11534382000-07-23 18:24:06 +000073w_more(int c, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000074{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000075 Py_ssize_t size, newsize;
76 if (p->str == NULL)
77 return; /* An error already occurred */
78 size = PyBytes_Size(p->str);
79 newsize = size + size + 1024;
80 if (newsize > 32*1024*1024) {
81 newsize = size + (size >> 3); /* 12.5% overallocation */
82 }
83 if (_PyBytes_Resize(&p->str, newsize) != 0) {
84 p->ptr = p->end = NULL;
85 }
86 else {
87 p->ptr = PyBytes_AS_STRING((PyBytesObject *)p->str) + size;
88 p->end =
89 PyBytes_AS_STRING((PyBytesObject *)p->str) + newsize;
90 *p->ptr++ = Py_SAFE_DOWNCAST(c, int, char);
91 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000092}
93
94static void
Serhiy Storchaka7e019112013-02-13 12:08:15 +020095w_string(char *s, Py_ssize_t n, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000096{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000097 if (p->fp != NULL) {
98 fwrite(s, 1, n, p->fp);
99 }
100 else {
101 while (--n >= 0) {
102 w_byte(*s, p);
103 s++;
104 }
105 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000106}
107
108static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000109w_short(int x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000110{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000111 w_byte((char)( x & 0xff), p);
112 w_byte((char)((x>> 8) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000113}
114
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000115static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000116w_long(long x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000117{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000118 w_byte((char)( x & 0xff), p);
119 w_byte((char)((x>> 8) & 0xff), p);
120 w_byte((char)((x>>16) & 0xff), p);
121 w_byte((char)((x>>24) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000122}
123
Guido van Rossumc1547d91996-12-10 15:39:04 +0000124#if SIZEOF_LONG > 4
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000125static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000126w_long64(long x, WFILE *p)
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000127{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128 w_long(x, p);
129 w_long(x>>32, p);
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000130}
Guido van Rossumc1547d91996-12-10 15:39:04 +0000131#endif
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000132
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
160static void
161w_PyLong(const PyLongObject *ob, WFILE *p)
162{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000163 Py_ssize_t i, j, n, l;
164 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000166 w_byte(TYPE_LONG, p);
167 if (Py_SIZE(ob) == 0) {
168 w_long((long)0, p);
169 return;
170 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000172 /* set l to number of base PyLong_MARSHAL_BASE digits */
173 n = ABS(Py_SIZE(ob));
174 l = (n-1) * PyLong_MARSHAL_RATIO;
175 d = ob->ob_digit[n-1];
176 assert(d != 0); /* a PyLong is always normalized */
177 do {
178 d >>= PyLong_MARSHAL_SHIFT;
179 l++;
180 } while (d != 0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200181 if (l > SIZE32_MAX) {
182 p->depth--;
183 p->error = WFERR_UNMARSHALLABLE;
184 return;
185 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000186 w_long((long)(Py_SIZE(ob) > 0 ? l : -l), p);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000188 for (i=0; i < n-1; i++) {
189 d = ob->ob_digit[i];
190 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
191 w_short(d & PyLong_MARSHAL_MASK, p);
192 d >>= PyLong_MARSHAL_SHIFT;
193 }
194 assert (d == 0);
195 }
196 d = ob->ob_digit[n-1];
197 do {
198 w_short(d & PyLong_MARSHAL_MASK, p);
199 d >>= PyLong_MARSHAL_SHIFT;
200 } while (d != 0);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000201}
202
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000203static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000204w_object(PyObject *v, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000205{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000206 Py_ssize_t i, n;
Fred Drake6da0b912000-06-28 18:47:56 +0000207
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000208 p->depth++;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000210 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
211 p->error = WFERR_NESTEDTOODEEP;
212 }
213 else if (v == NULL) {
214 w_byte(TYPE_NULL, p);
215 }
216 else if (v == Py_None) {
217 w_byte(TYPE_NONE, p);
218 }
219 else if (v == PyExc_StopIteration) {
220 w_byte(TYPE_STOPITER, p);
221 }
222 else if (v == Py_Ellipsis) {
223 w_byte(TYPE_ELLIPSIS, p);
224 }
225 else if (v == Py_False) {
226 w_byte(TYPE_FALSE, p);
227 }
228 else if (v == Py_True) {
229 w_byte(TYPE_TRUE, p);
230 }
231 else if (PyLong_CheckExact(v)) {
232 long x = PyLong_AsLong(v);
233 if ((x == -1) && PyErr_Occurred()) {
234 PyLongObject *ob = (PyLongObject *)v;
235 PyErr_Clear();
236 w_PyLong(ob, p);
237 }
238 else {
Guido van Rossumc1547d91996-12-10 15:39:04 +0000239#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000240 long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
241 if (y && y != -1) {
242 w_byte(TYPE_INT64, p);
243 w_long64(x, p);
244 }
245 else
Guido van Rossumc1547d91996-12-10 15:39:04 +0000246#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000247 {
248 w_byte(TYPE_INT, p);
249 w_long(x, p);
250 }
251 }
252 }
253 else if (PyFloat_CheckExact(v)) {
254 if (p->version > 1) {
255 unsigned char buf[8];
256 if (_PyFloat_Pack8(PyFloat_AsDouble(v),
257 buf, 1) < 0) {
258 p->error = WFERR_UNMARSHALLABLE;
259 return;
260 }
261 w_byte(TYPE_BINARY_FLOAT, p);
262 w_string((char*)buf, 8, p);
263 }
264 else {
265 char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
266 'g', 17, 0, NULL);
267 if (!buf) {
268 p->error = WFERR_NOMEMORY;
269 return;
270 }
271 n = strlen(buf);
272 w_byte(TYPE_FLOAT, p);
273 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200274 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000275 PyMem_Free(buf);
276 }
277 }
278 else if (PyComplex_CheckExact(v)) {
279 if (p->version > 1) {
280 unsigned char buf[8];
281 if (_PyFloat_Pack8(PyComplex_RealAsDouble(v),
282 buf, 1) < 0) {
283 p->error = WFERR_UNMARSHALLABLE;
284 return;
285 }
286 w_byte(TYPE_BINARY_COMPLEX, p);
287 w_string((char*)buf, 8, p);
288 if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v),
289 buf, 1) < 0) {
290 p->error = WFERR_UNMARSHALLABLE;
291 return;
292 }
293 w_string((char*)buf, 8, p);
294 }
295 else {
296 char *buf;
297 w_byte(TYPE_COMPLEX, p);
298 buf = PyOS_double_to_string(PyComplex_RealAsDouble(v),
299 'g', 17, 0, NULL);
300 if (!buf) {
301 p->error = WFERR_NOMEMORY;
302 return;
303 }
304 n = strlen(buf);
305 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200306 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000307 PyMem_Free(buf);
308 buf = PyOS_double_to_string(PyComplex_ImagAsDouble(v),
309 'g', 17, 0, NULL);
310 if (!buf) {
311 p->error = WFERR_NOMEMORY;
312 return;
313 }
314 n = strlen(buf);
315 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200316 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000317 PyMem_Free(buf);
318 }
319 }
320 else if (PyBytes_CheckExact(v)) {
321 w_byte(TYPE_STRING, p);
322 n = PyBytes_GET_SIZE(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200323 W_SIZE(n, p);
324 w_string(PyBytes_AS_STRING(v), n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000325 }
326 else if (PyUnicode_CheckExact(v)) {
327 PyObject *utf8;
328 utf8 = PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(v),
329 PyUnicode_GET_SIZE(v),
330 "surrogatepass");
331 if (utf8 == NULL) {
332 p->depth--;
333 p->error = WFERR_UNMARSHALLABLE;
334 return;
335 }
336 w_byte(TYPE_UNICODE, p);
337 n = PyBytes_GET_SIZE(utf8);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200338 W_SIZE(n, p);
339 w_string(PyBytes_AS_STRING(utf8), n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000340 Py_DECREF(utf8);
341 }
342 else if (PyTuple_CheckExact(v)) {
343 w_byte(TYPE_TUPLE, p);
344 n = PyTuple_Size(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200345 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000346 for (i = 0; i < n; i++) {
347 w_object(PyTuple_GET_ITEM(v, i), p);
348 }
349 }
350 else if (PyList_CheckExact(v)) {
351 w_byte(TYPE_LIST, p);
352 n = PyList_GET_SIZE(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200353 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 for (i = 0; i < n; i++) {
355 w_object(PyList_GET_ITEM(v, i), p);
356 }
357 }
358 else if (PyDict_CheckExact(v)) {
359 Py_ssize_t pos;
360 PyObject *key, *value;
361 w_byte(TYPE_DICT, p);
362 /* This one is NULL object terminated! */
363 pos = 0;
364 while (PyDict_Next(v, &pos, &key, &value)) {
365 w_object(key, p);
366 w_object(value, p);
367 }
368 w_object((PyObject *)NULL, p);
369 }
370 else if (PyAnySet_CheckExact(v)) {
371 PyObject *value, *it;
Raymond Hettingera422c342005-01-11 03:03:27 +0000372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000373 if (PyObject_TypeCheck(v, &PySet_Type))
374 w_byte(TYPE_SET, p);
375 else
376 w_byte(TYPE_FROZENSET, p);
377 n = PyObject_Size(v);
378 if (n == -1) {
379 p->depth--;
380 p->error = WFERR_UNMARSHALLABLE;
381 return;
382 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200383 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000384 it = PyObject_GetIter(v);
385 if (it == NULL) {
386 p->depth--;
387 p->error = WFERR_UNMARSHALLABLE;
388 return;
389 }
390 while ((value = PyIter_Next(it)) != NULL) {
391 w_object(value, p);
392 Py_DECREF(value);
393 }
394 Py_DECREF(it);
395 if (PyErr_Occurred()) {
396 p->depth--;
397 p->error = WFERR_UNMARSHALLABLE;
398 return;
399 }
400 }
401 else if (PyCode_Check(v)) {
402 PyCodeObject *co = (PyCodeObject *)v;
403 w_byte(TYPE_CODE, p);
404 w_long(co->co_argcount, p);
405 w_long(co->co_kwonlyargcount, p);
406 w_long(co->co_nlocals, p);
407 w_long(co->co_stacksize, p);
408 w_long(co->co_flags, p);
409 w_object(co->co_code, p);
410 w_object(co->co_consts, p);
411 w_object(co->co_names, p);
412 w_object(co->co_varnames, p);
413 w_object(co->co_freevars, p);
414 w_object(co->co_cellvars, p);
415 w_object(co->co_filename, p);
416 w_object(co->co_name, p);
417 w_long(co->co_firstlineno, p);
418 w_object(co->co_lnotab, p);
419 }
420 else if (PyObject_CheckBuffer(v)) {
421 /* Write unknown buffer-style objects as a string */
422 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000423 Py_buffer view;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100424 if (PyObject_GetBuffer(v, &view, PyBUF_SIMPLE) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425 w_byte(TYPE_UNKNOWN, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100426 p->depth--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000427 p->error = WFERR_UNMARSHALLABLE;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100428 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429 }
430 w_byte(TYPE_STRING, p);
431 n = view.len;
432 s = view.buf;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200433 W_SIZE(n, p);
434 w_string(s, n, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100435 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000436 }
437 else {
438 w_byte(TYPE_UNKNOWN, p);
439 p->error = WFERR_UNMARSHALLABLE;
440 }
441 p->depth--;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000442}
443
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000444/* version currently has no effect for writing longs. */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000445void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000446PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000447{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000448 WFILE wf;
449 wf.fp = fp;
450 wf.error = WFERR_OK;
451 wf.depth = 0;
452 wf.strings = NULL;
453 wf.version = version;
454 w_long(x, &wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000455}
456
457void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000458PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000459{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000460 WFILE wf;
461 wf.fp = fp;
462 wf.error = WFERR_OK;
463 wf.depth = 0;
464 wf.strings = (version > 0) ? PyDict_New() : NULL;
465 wf.version = version;
466 w_object(x, &wf);
467 Py_XDECREF(wf.strings);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000468}
469
470typedef WFILE RFILE; /* Same struct with different invariants */
471
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000472#define rs_byte(p) (((p)->ptr < (p)->end) ? (unsigned char)*(p)->ptr++ : EOF)
Guido van Rossum8d617a61995-03-09 12:12:11 +0000473
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200474static Py_ssize_t
475r_string(char *s, Py_ssize_t n, RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000476{
Éric Araujo6c0ba442011-07-26 17:23:57 +0200477 char *ptr;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200478 Py_ssize_t read, left;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100479
480 if (!p->readable) {
481 if (p->fp != NULL)
482 /* The result fits into int because it must be <=n. */
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200483 read = fread(s, 1, n, p->fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100484 else {
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200485 left = p->end - p->ptr;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100486 read = (left < n) ? left : n;
487 memcpy(s, p->ptr, read);
488 p->ptr += read;
489 }
490 }
491 else {
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200492 PyObject *data = PyObject_CallMethod(p->readable, "read", "n", n);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100493 read = 0;
494 if (data != NULL) {
495 if (!PyBytes_Check(data)) {
496 PyErr_Format(PyExc_TypeError,
497 "f.read() returned not bytes but %.100s",
498 data->ob_type->tp_name);
499 }
500 else {
501 read = PyBytes_GET_SIZE(data);
502 if (read > 0) {
503 ptr = PyBytes_AS_STRING(data);
504 memcpy(s, ptr, read);
505 }
506 }
507 Py_DECREF(data);
508 }
509 }
510 if (!PyErr_Occurred() && (read < n)) {
511 PyErr_SetString(PyExc_EOFError, "EOF read where not expected");
512 }
513 return read;
514}
515
516
517static int
518r_byte(RFILE *p)
519{
520 int c = EOF;
521 unsigned char ch;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200522 Py_ssize_t n;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100523
524 if (!p->readable)
525 c = p->fp ? getc(p->fp) : rs_byte(p);
526 else {
527 n = r_string((char *) &ch, 1, p);
528 if (n > 0)
529 c = ch;
530 }
531 return c;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000532}
533
534static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000535r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000536{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 register short x;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100538 unsigned char buffer[2];
539
540 r_string((char *) buffer, 2, p);
541 x = buffer[0];
542 x |= buffer[1] << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 /* Sign-extension, in case short greater than 16 bits */
544 x |= -(x & 0x8000);
545 return x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000546}
547
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000548static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000549r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000550{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 register long x;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100552 unsigned char buffer[4];
553
554 r_string((char *) buffer, 4, p);
555 x = buffer[0];
556 x |= (long)buffer[1] << 8;
557 x |= (long)buffer[2] << 16;
558 x |= (long)buffer[3] << 24;
Guido van Rossumc1547d91996-12-10 15:39:04 +0000559#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 /* Sign extension for 64-bit machines */
561 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000562#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000563 return x;
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000564}
565
Tim Peters82112372001-08-29 02:28:42 +0000566/* r_long64 deals with the TYPE_INT64 code. On a machine with
567 sizeof(long) > 4, it returns a Python int object, else a Python long
568 object. Note that w_long64 writes out TYPE_INT if 32 bits is enough,
569 so there's no inefficiency here in returning a PyLong on 32-bit boxes
570 for everything written via TYPE_INT64 (i.e., if an int is written via
571 TYPE_INT64, it *needs* more than 32 bits).
572*/
573static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000574r_long64(RFILE *p)
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000575{
Éric Araujo6c0ba442011-07-26 17:23:57 +0200576 PyObject *result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 long lo4 = r_long(p);
578 long hi4 = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100579
580 if (!PyErr_Occurred()) {
Guido van Rossumc1547d91996-12-10 15:39:04 +0000581#if SIZEOF_LONG > 4
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100582 long x = (hi4 << 32) | (lo4 & 0xFFFFFFFFL);
583 result = PyLong_FromLong(x);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000584#else
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100585 unsigned char buf[8];
586 int one = 1;
587 int is_little_endian = (int)*(char*)&one;
588 if (is_little_endian) {
589 memcpy(buf, &lo4, 4);
590 memcpy(buf+4, &hi4, 4);
591 }
592 else {
593 memcpy(buf, &hi4, 4);
594 memcpy(buf+4, &lo4, 4);
595 }
596 result = _PyLong_FromByteArray(buf, 8, is_little_endian, 1);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000597#endif
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100598 }
599 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000600}
601
Guido van Rossum79f25d91997-04-29 20:08:16 +0000602static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000603r_PyLong(RFILE *p)
604{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 PyLongObject *ob;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200606 long n, size, i;
607 int j, md, shorts_in_top_digit;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100611 if (PyErr_Occurred())
612 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000613 if (n == 0)
614 return (PyObject *)_PyLong_New(0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200615 if (n < -SIZE32_MAX || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 PyErr_SetString(PyExc_ValueError,
617 "bad marshal data (long size out of range)");
618 return NULL;
619 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 size = 1 + (ABS(n) - 1) / PyLong_MARSHAL_RATIO;
622 shorts_in_top_digit = 1 + (ABS(n) - 1) % PyLong_MARSHAL_RATIO;
623 ob = _PyLong_New(size);
624 if (ob == NULL)
625 return NULL;
626 Py_SIZE(ob) = n > 0 ? size : -size;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 for (i = 0; i < size-1; i++) {
629 d = 0;
630 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
631 md = r_short(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100632 if (PyErr_Occurred())
633 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 if (md < 0 || md > PyLong_MARSHAL_BASE)
635 goto bad_digit;
636 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
637 }
638 ob->ob_digit[i] = d;
639 }
640 d = 0;
641 for (j=0; j < shorts_in_top_digit; j++) {
642 md = r_short(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100643 if (PyErr_Occurred())
644 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 if (md < 0 || md > PyLong_MARSHAL_BASE)
646 goto bad_digit;
647 /* topmost marshal digit should be nonzero */
648 if (md == 0 && j == shorts_in_top_digit - 1) {
649 Py_DECREF(ob);
650 PyErr_SetString(PyExc_ValueError,
651 "bad marshal data (unnormalized long data)");
652 return NULL;
653 }
654 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
655 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100656 if (PyErr_Occurred()) {
657 Py_DECREF(ob);
658 return NULL;
659 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000660 /* top digit should be nonzero, else the resulting PyLong won't be
661 normalized */
662 ob->ob_digit[size-1] = d;
663 return (PyObject *)ob;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000664 bad_digit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000665 Py_DECREF(ob);
666 PyErr_SetString(PyExc_ValueError,
667 "bad marshal data (digit out of range in long)");
668 return NULL;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000669}
670
671
672static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000673r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000674{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 /* NULL is a valid return value, it does not necessarily means that
676 an exception is set. */
677 PyObject *v, *v2;
678 long i, n;
679 int type = r_byte(p);
680 PyObject *retval;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000683
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000684 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
685 p->depth--;
686 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
687 return NULL;
688 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000690 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 case EOF:
693 PyErr_SetString(PyExc_EOFError,
694 "EOF read where object expected");
695 retval = NULL;
696 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000698 case TYPE_NULL:
699 retval = NULL;
700 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000702 case TYPE_NONE:
703 Py_INCREF(Py_None);
704 retval = Py_None;
705 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707 case TYPE_STOPITER:
708 Py_INCREF(PyExc_StopIteration);
709 retval = PyExc_StopIteration;
710 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 case TYPE_ELLIPSIS:
713 Py_INCREF(Py_Ellipsis);
714 retval = Py_Ellipsis;
715 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 case TYPE_FALSE:
718 Py_INCREF(Py_False);
719 retval = Py_False;
720 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000722 case TYPE_TRUE:
723 Py_INCREF(Py_True);
724 retval = Py_True;
725 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000726
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000727 case TYPE_INT:
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100728 n = r_long(p);
729 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 case TYPE_INT64:
733 retval = r_long64(p);
734 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000736 case TYPE_LONG:
737 retval = r_PyLong(p);
738 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000740 case TYPE_FLOAT:
741 {
742 char buf[256];
743 double dx;
744 retval = NULL;
745 n = r_byte(p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200746 if (n == EOF || r_string(buf, n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000747 PyErr_SetString(PyExc_EOFError,
748 "EOF read where object expected");
749 break;
750 }
751 buf[n] = '\0';
752 dx = PyOS_string_to_double(buf, NULL, NULL);
753 if (dx == -1.0 && PyErr_Occurred())
754 break;
755 retval = PyFloat_FromDouble(dx);
756 break;
757 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000759 case TYPE_BINARY_FLOAT:
760 {
761 unsigned char buf[8];
762 double x;
763 if (r_string((char*)buf, 8, p) != 8) {
764 PyErr_SetString(PyExc_EOFError,
765 "EOF read where object expected");
766 retval = NULL;
767 break;
768 }
769 x = _PyFloat_Unpack8(buf, 1);
770 if (x == -1.0 && PyErr_Occurred()) {
771 retval = NULL;
772 break;
773 }
774 retval = PyFloat_FromDouble(x);
775 break;
776 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 case TYPE_COMPLEX:
779 {
780 char buf[256];
781 Py_complex c;
782 retval = NULL;
783 n = r_byte(p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200784 if (n == EOF || r_string(buf, n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000785 PyErr_SetString(PyExc_EOFError,
786 "EOF read where object expected");
787 break;
788 }
789 buf[n] = '\0';
790 c.real = PyOS_string_to_double(buf, NULL, NULL);
791 if (c.real == -1.0 && PyErr_Occurred())
792 break;
793 n = r_byte(p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200794 if (n == EOF || r_string(buf, n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000795 PyErr_SetString(PyExc_EOFError,
796 "EOF read where object expected");
797 break;
798 }
799 buf[n] = '\0';
800 c.imag = PyOS_string_to_double(buf, NULL, NULL);
801 if (c.imag == -1.0 && PyErr_Occurred())
802 break;
803 retval = PyComplex_FromCComplex(c);
804 break;
805 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000807 case TYPE_BINARY_COMPLEX:
808 {
809 unsigned char buf[8];
810 Py_complex c;
811 if (r_string((char*)buf, 8, p) != 8) {
812 PyErr_SetString(PyExc_EOFError,
813 "EOF read where object expected");
814 retval = NULL;
815 break;
816 }
817 c.real = _PyFloat_Unpack8(buf, 1);
818 if (c.real == -1.0 && PyErr_Occurred()) {
819 retval = NULL;
820 break;
821 }
822 if (r_string((char*)buf, 8, p) != 8) {
823 PyErr_SetString(PyExc_EOFError,
824 "EOF read where object expected");
825 retval = NULL;
826 break;
827 }
828 c.imag = _PyFloat_Unpack8(buf, 1);
829 if (c.imag == -1.0 && PyErr_Occurred()) {
830 retval = NULL;
831 break;
832 }
833 retval = PyComplex_FromCComplex(c);
834 break;
835 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 case TYPE_STRING:
838 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100839 if (PyErr_Occurred()) {
840 retval = NULL;
841 break;
842 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200843 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
845 retval = NULL;
846 break;
847 }
848 v = PyBytes_FromStringAndSize((char *)NULL, n);
849 if (v == NULL) {
850 retval = NULL;
851 break;
852 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200853 if (r_string(PyBytes_AS_STRING(v), n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 Py_DECREF(v);
855 PyErr_SetString(PyExc_EOFError,
856 "EOF read where object expected");
857 retval = NULL;
858 break;
859 }
860 retval = v;
861 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000862
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 case TYPE_UNICODE:
864 {
865 char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +0000866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100868 if (PyErr_Occurred()) {
869 retval = NULL;
870 break;
871 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200872 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000873 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
874 retval = NULL;
875 break;
876 }
877 buffer = PyMem_NEW(char, n);
878 if (buffer == NULL) {
879 retval = PyErr_NoMemory();
880 break;
881 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200882 if (r_string(buffer, n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 PyMem_DEL(buffer);
884 PyErr_SetString(PyExc_EOFError,
885 "EOF read where object expected");
886 retval = NULL;
887 break;
888 }
889 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
890 PyMem_DEL(buffer);
891 retval = v;
892 break;
893 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 case TYPE_TUPLE:
896 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100897 if (PyErr_Occurred()) {
898 retval = NULL;
899 break;
900 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200901 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
903 retval = NULL;
904 break;
905 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200906 v = PyTuple_New(n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 if (v == NULL) {
908 retval = NULL;
909 break;
910 }
911 for (i = 0; i < n; i++) {
912 v2 = r_object(p);
913 if ( v2 == NULL ) {
914 if (!PyErr_Occurred())
915 PyErr_SetString(PyExc_TypeError,
916 "NULL object in marshal data for tuple");
917 Py_DECREF(v);
918 v = NULL;
919 break;
920 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200921 PyTuple_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000922 }
923 retval = v;
924 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000926 case TYPE_LIST:
927 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100928 if (PyErr_Occurred()) {
929 retval = NULL;
930 break;
931 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200932 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
934 retval = NULL;
935 break;
936 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200937 v = PyList_New(n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 if (v == NULL) {
939 retval = NULL;
940 break;
941 }
942 for (i = 0; i < n; i++) {
943 v2 = r_object(p);
944 if ( v2 == NULL ) {
945 if (!PyErr_Occurred())
946 PyErr_SetString(PyExc_TypeError,
947 "NULL object in marshal data for list");
948 Py_DECREF(v);
949 v = NULL;
950 break;
951 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200952 PyList_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 }
954 retval = v;
955 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000956
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 case TYPE_DICT:
958 v = PyDict_New();
959 if (v == NULL) {
960 retval = NULL;
961 break;
962 }
963 for (;;) {
964 PyObject *key, *val;
965 key = r_object(p);
966 if (key == NULL)
967 break;
968 val = r_object(p);
969 if (val != NULL)
970 PyDict_SetItem(v, key, val);
971 Py_DECREF(key);
972 Py_XDECREF(val);
973 }
974 if (PyErr_Occurred()) {
975 Py_DECREF(v);
976 v = NULL;
977 }
978 retval = v;
979 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 case TYPE_SET:
982 case TYPE_FROZENSET:
983 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100984 if (PyErr_Occurred()) {
985 retval = NULL;
986 break;
987 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200988 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
990 retval = NULL;
991 break;
992 }
993 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
994 if (v == NULL) {
995 retval = NULL;
996 break;
997 }
998 for (i = 0; i < n; i++) {
999 v2 = r_object(p);
1000 if ( v2 == NULL ) {
1001 if (!PyErr_Occurred())
1002 PyErr_SetString(PyExc_TypeError,
1003 "NULL object in marshal data for set");
1004 Py_DECREF(v);
1005 v = NULL;
1006 break;
1007 }
1008 if (PySet_Add(v, v2) == -1) {
1009 Py_DECREF(v);
1010 Py_DECREF(v2);
1011 v = NULL;
1012 break;
1013 }
1014 Py_DECREF(v2);
1015 }
1016 retval = v;
1017 break;
Raymond Hettingera422c342005-01-11 03:03:27 +00001018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 case TYPE_CODE:
1020 {
1021 int argcount;
1022 int kwonlyargcount;
1023 int nlocals;
1024 int stacksize;
1025 int flags;
1026 PyObject *code = NULL;
1027 PyObject *consts = NULL;
1028 PyObject *names = NULL;
1029 PyObject *varnames = NULL;
1030 PyObject *freevars = NULL;
1031 PyObject *cellvars = NULL;
1032 PyObject *filename = NULL;
1033 PyObject *name = NULL;
1034 int firstlineno;
1035 PyObject *lnotab = NULL;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001036
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001037 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001039 /* XXX ignore long->int overflows for now */
1040 argcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001041 if (PyErr_Occurred())
1042 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 kwonlyargcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001044 if (PyErr_Occurred())
1045 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 nlocals = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001047 if (PyErr_Occurred())
1048 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 stacksize = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001050 if (PyErr_Occurred())
1051 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 flags = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001053 if (PyErr_Occurred())
1054 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 code = r_object(p);
1056 if (code == NULL)
1057 goto code_error;
1058 consts = r_object(p);
1059 if (consts == NULL)
1060 goto code_error;
1061 names = r_object(p);
1062 if (names == NULL)
1063 goto code_error;
1064 varnames = r_object(p);
1065 if (varnames == NULL)
1066 goto code_error;
1067 freevars = r_object(p);
1068 if (freevars == NULL)
1069 goto code_error;
1070 cellvars = r_object(p);
1071 if (cellvars == NULL)
1072 goto code_error;
1073 filename = r_object(p);
1074 if (filename == NULL)
1075 goto code_error;
1076 name = r_object(p);
1077 if (name == NULL)
1078 goto code_error;
1079 firstlineno = (int)r_long(p);
1080 lnotab = r_object(p);
1081 if (lnotab == NULL)
1082 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 v = (PyObject *) PyCode_New(
1085 argcount, kwonlyargcount,
1086 nlocals, stacksize, flags,
1087 code, consts, names, varnames,
1088 freevars, cellvars, filename, name,
1089 firstlineno, lnotab);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 code_error:
1092 Py_XDECREF(code);
1093 Py_XDECREF(consts);
1094 Py_XDECREF(names);
1095 Py_XDECREF(varnames);
1096 Py_XDECREF(freevars);
1097 Py_XDECREF(cellvars);
1098 Py_XDECREF(filename);
1099 Py_XDECREF(name);
1100 Py_XDECREF(lnotab);
1101 }
1102 retval = v;
1103 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 default:
1106 /* Bogus data got written, which isn't ideal.
1107 This will let you keep working and recover. */
1108 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
1109 retval = NULL;
1110 break;
1111
1112 }
1113 p->depth--;
1114 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001115}
1116
Neal Norwitzd85c4522004-06-13 20:31:49 +00001117static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001118read_object(RFILE *p)
1119{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 PyObject *v;
1121 if (PyErr_Occurred()) {
1122 fprintf(stderr, "XXX readobject called with exception set\n");
1123 return NULL;
1124 }
1125 v = r_object(p);
1126 if (v == NULL && !PyErr_Occurred())
1127 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1128 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001129}
1130
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001131int
1132PyMarshal_ReadShortFromFile(FILE *fp)
1133{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001134 RFILE rf;
1135 assert(fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001136 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 rf.fp = fp;
1138 rf.strings = NULL;
1139 rf.end = rf.ptr = NULL;
1140 return r_short(&rf);
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001141}
1142
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001143long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001144PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001145{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 RFILE rf;
1147 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001148 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 rf.strings = NULL;
1150 rf.ptr = rf.end = NULL;
1151 return r_long(&rf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001152}
1153
Tim Peters691e0e92001-01-18 04:39:16 +00001154#ifdef HAVE_FSTAT
1155/* Return size of file in bytes; < 0 if unknown. */
1156static off_t
1157getfilesize(FILE *fp)
1158{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 struct stat st;
1160 if (fstat(fileno(fp), &st) != 0)
1161 return -1;
1162 else
1163 return st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001164}
1165#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001166
Tim Peters691e0e92001-01-18 04:39:16 +00001167/* If we can get the size of the file up-front, and it's reasonably small,
1168 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1169 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001170 * CAUTION: since this may read the entire remainder of the file, don't
1171 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001172 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001173PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001174PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001175{
Antoine Pitrou5bc7ec92010-04-21 22:56:22 +00001176/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
Tim Peters691e0e92001-01-18 04:39:16 +00001177#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001178#ifdef HAVE_FSTAT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 off_t filesize;
1180 filesize = getfilesize(fp);
1181 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1182 char* pBuf = (char *)PyMem_MALLOC(filesize);
1183 if (pBuf != NULL) {
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001184 size_t n = fread(pBuf, 1, (size_t)filesize, fp);
1185 PyObject* v = PyMarshal_ReadObjectFromString(pBuf, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 PyMem_FREE(pBuf);
1187 return v;
1188 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001189
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 }
Tim Peters691e0e92001-01-18 04:39:16 +00001191#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001192 /* We don't have fstat, or we do but the file is larger than
1193 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1194 */
1195 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001196
Tim Peters691e0e92001-01-18 04:39:16 +00001197#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001198}
1199
Guido van Rossum79f25d91997-04-29 20:08:16 +00001200PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001201PyMarshal_ReadObjectFromFile(FILE *fp)
1202{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001203 RFILE rf;
1204 PyObject *result;
1205 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001206 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001207 rf.strings = PyList_New(0);
1208 rf.depth = 0;
1209 rf.ptr = rf.end = NULL;
1210 result = r_object(&rf);
1211 Py_DECREF(rf.strings);
1212 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001213}
1214
1215PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001216PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001217{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 RFILE rf;
1219 PyObject *result;
1220 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001221 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 rf.ptr = str;
1223 rf.end = str + len;
1224 rf.strings = PyList_New(0);
1225 rf.depth = 0;
1226 result = r_object(&rf);
1227 Py_DECREF(rf.strings);
1228 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001229}
1230
Guido van Rossum79f25d91997-04-29 20:08:16 +00001231PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001232PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001233{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 WFILE wf;
1235 PyObject *res = NULL;
Guido van Rossume6d39042007-05-09 00:01:30 +00001236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 wf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001238 wf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1240 if (wf.str == NULL)
1241 return NULL;
1242 wf.ptr = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1243 wf.end = wf.ptr + PyBytes_Size(wf.str);
1244 wf.error = WFERR_OK;
1245 wf.depth = 0;
1246 wf.version = version;
1247 wf.strings = (version > 0) ? PyDict_New() : NULL;
1248 w_object(x, &wf);
1249 Py_XDECREF(wf.strings);
1250 if (wf.str != NULL) {
1251 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1252 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1253 Py_DECREF(wf.str);
1254 PyErr_SetString(PyExc_OverflowError,
1255 "too much marshal data for a string");
1256 return NULL;
1257 }
1258 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1259 return NULL;
1260 }
1261 if (wf.error != WFERR_OK) {
1262 Py_XDECREF(wf.str);
1263 if (wf.error == WFERR_NOMEMORY)
1264 PyErr_NoMemory();
1265 else
1266 PyErr_SetString(PyExc_ValueError,
1267 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1268 :"object too deeply nested to marshal");
1269 return NULL;
1270 }
1271 if (wf.str != NULL) {
1272 /* XXX Quick hack -- need to do this differently */
1273 res = PyBytes_FromObject(wf.str);
1274 Py_DECREF(wf.str);
1275 }
1276 return res;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001277}
1278
Guido van Rossum64b45521991-06-07 13:58:22 +00001279/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001280
Guido van Rossum79f25d91997-04-29 20:08:16 +00001281static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001282marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001283{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 /* XXX Quick hack -- need to do this differently */
1285 PyObject *x;
1286 PyObject *f;
1287 int version = Py_MARSHAL_VERSION;
1288 PyObject *s;
1289 PyObject *res;
1290 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
1291 return NULL;
1292 s = PyMarshal_WriteObjectToString(x, version);
1293 if (s == NULL)
1294 return NULL;
1295 res = PyObject_CallMethod(f, "write", "O", s);
1296 Py_DECREF(s);
1297 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001298}
1299
R. David Murraydd226ea2009-05-13 12:27:21 +00001300PyDoc_STRVAR(dump_doc,
1301"dump(value, file[, version])\n\
1302\n\
1303Write the value on the open file. The value must be a supported type.\n\
1304The file must be an open file object such as sys.stdout or returned by\n\
1305open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1306\n\
1307If the value has (or contains an object that has) an unsupported type, a\n\
1308ValueError exception is raised but garbage data will also be written\n\
1309to the file. The object will not be properly read back by load()\n\
1310\n\
1311The version argument indicates the data format that dump should use.");
1312
Guido van Rossum79f25d91997-04-29 20:08:16 +00001313static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001314marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001315{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001316 PyObject *data, *result;
1317 RFILE rf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001318
1319 /*
1320 * Make a call to the read method, but read zero bytes.
1321 * This is to ensure that the object passed in at least
1322 * has a read method which returns bytes.
1323 */
1324 data = PyObject_CallMethod(f, "read", "i", 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001325 if (data == NULL)
1326 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001327 if (!PyBytes_Check(data)) {
1328 PyErr_Format(PyExc_TypeError,
1329 "f.read() returned not bytes but %.100s",
1330 data->ob_type->tp_name);
1331 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001332 }
1333 else {
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001334 rf.strings = PyList_New(0);
1335 rf.depth = 0;
1336 rf.fp = NULL;
1337 rf.readable = f;
1338 result = read_object(&rf);
1339 Py_DECREF(rf.strings);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001340 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 Py_DECREF(data);
1342 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001343}
1344
R. David Murraydd226ea2009-05-13 12:27:21 +00001345PyDoc_STRVAR(load_doc,
1346"load(file)\n\
1347\n\
1348Read one value from the open file and return it. If no valid value is\n\
1349read (e.g. because the data has a different Python versions\n\
1350incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1351The file must be an open file object opened in binary mode ('rb' or\n\
1352'r+b').\n\
1353\n\
1354Note: If an object containing an unsupported type was marshalled with\n\
1355dump(), load() will substitute None for the unmarshallable type.");
1356
1357
Guido van Rossum79f25d91997-04-29 20:08:16 +00001358static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001359marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001360{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001361 PyObject *x;
1362 int version = Py_MARSHAL_VERSION;
1363 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
1364 return NULL;
1365 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001366}
1367
R. David Murraydd226ea2009-05-13 12:27:21 +00001368PyDoc_STRVAR(dumps_doc,
1369"dumps(value[, version])\n\
1370\n\
1371Return the string that would be written to a file by dump(value, file).\n\
1372The value must be a supported type. Raise a ValueError exception if\n\
1373value has (or contains an object that has) an unsupported type.\n\
1374\n\
1375The version argument indicates the data format that dumps should use.");
1376
1377
Guido van Rossum79f25d91997-04-29 20:08:16 +00001378static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001379marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001380{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001381 RFILE rf;
1382 Py_buffer p;
1383 char *s;
1384 Py_ssize_t n;
1385 PyObject* result;
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001386 if (!PyArg_ParseTuple(args, "y*:loads", &p))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001387 return NULL;
1388 s = p.buf;
1389 n = p.len;
1390 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001391 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 rf.ptr = s;
1393 rf.end = s + n;
1394 rf.strings = PyList_New(0);
1395 rf.depth = 0;
1396 result = read_object(&rf);
1397 Py_DECREF(rf.strings);
1398 PyBuffer_Release(&p);
1399 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001400}
1401
R. David Murraydd226ea2009-05-13 12:27:21 +00001402PyDoc_STRVAR(loads_doc,
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001403"loads(bytes)\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001404\n\
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001405Convert the bytes object to a value. If no valid value is found, raise\n\
1406EOFError, ValueError or TypeError. Extra characters in the input are\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001407ignored.");
1408
Guido van Rossum79f25d91997-04-29 20:08:16 +00001409static PyMethodDef marshal_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001410 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1411 {"load", marshal_load, METH_O, load_doc},
1412 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1413 {"loads", marshal_loads, METH_VARARGS, loads_doc},
1414 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001415};
1416
R. David Murraydd226ea2009-05-13 12:27:21 +00001417
1418PyDoc_STRVAR(module_doc,
1419"This module contains functions that can read and write Python values in\n\
1420a binary format. The format is specific to Python, but independent of\n\
1421machine architecture issues.\n\
1422\n\
1423Not all Python object types are supported; in general, only objects\n\
1424whose value is independent from a particular invocation of Python can be\n\
1425written and read by this module. The following types are supported:\n\
1426None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1427tuples, lists, sets, dictionaries, and code objects, where it\n\
1428should be understood that tuples, lists and dictionaries are only\n\
1429supported as long as the values contained therein are themselves\n\
1430supported; and recursive lists and dictionaries should not be written\n\
1431(they will cause infinite loops).\n\
1432\n\
1433Variables:\n\
1434\n\
1435version -- indicates the format that the module uses. Version 0 is the\n\
1436 historical format, version 1 shares interned strings and version 2\n\
1437 uses a binary format for floating point numbers.\n\
1438\n\
1439Functions:\n\
1440\n\
1441dump() -- write value to a file\n\
1442load() -- read value from a file\n\
1443dumps() -- write value to a string\n\
1444loads() -- read value from a string");
1445
1446
1447
Brett Cannon429ef652008-06-27 00:35:35 +00001448static struct PyModuleDef marshalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001449 PyModuleDef_HEAD_INIT,
1450 "marshal",
1451 module_doc,
1452 0,
1453 marshal_methods,
1454 NULL,
1455 NULL,
1456 NULL,
1457 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001458};
1459
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001460PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001461PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001462{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 PyObject *mod = PyModule_Create(&marshalmodule);
1464 if (mod == NULL)
1465 return NULL;
1466 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
1467 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001468}