blob: 094f732382127f1aab2f36fe99c1bc2d2b4305ae [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
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000095w_string(char *s, int 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
Mark Dickinsonbd792642009-03-18 20:06:12 +0000133/* We assume that Python longs are stored internally in base some power of
134 2**15; for the sake of portability we'll always read and write them in base
135 exactly 2**15. */
136
137#define PyLong_MARSHAL_SHIFT 15
138#define PyLong_MARSHAL_BASE ((short)1 << PyLong_MARSHAL_SHIFT)
139#define PyLong_MARSHAL_MASK (PyLong_MARSHAL_BASE - 1)
140#if PyLong_SHIFT % PyLong_MARSHAL_SHIFT != 0
141#error "PyLong_SHIFT must be a multiple of PyLong_MARSHAL_SHIFT"
142#endif
143#define PyLong_MARSHAL_RATIO (PyLong_SHIFT / PyLong_MARSHAL_SHIFT)
144
145static void
146w_PyLong(const PyLongObject *ob, WFILE *p)
147{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000148 Py_ssize_t i, j, n, l;
149 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 w_byte(TYPE_LONG, p);
152 if (Py_SIZE(ob) == 0) {
153 w_long((long)0, p);
154 return;
155 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000156
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000157 /* set l to number of base PyLong_MARSHAL_BASE digits */
158 n = ABS(Py_SIZE(ob));
159 l = (n-1) * PyLong_MARSHAL_RATIO;
160 d = ob->ob_digit[n-1];
161 assert(d != 0); /* a PyLong is always normalized */
162 do {
163 d >>= PyLong_MARSHAL_SHIFT;
164 l++;
165 } while (d != 0);
166 w_long((long)(Py_SIZE(ob) > 0 ? l : -l), p);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000168 for (i=0; i < n-1; i++) {
169 d = ob->ob_digit[i];
170 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
171 w_short(d & PyLong_MARSHAL_MASK, p);
172 d >>= PyLong_MARSHAL_SHIFT;
173 }
174 assert (d == 0);
175 }
176 d = ob->ob_digit[n-1];
177 do {
178 w_short(d & PyLong_MARSHAL_MASK, p);
179 d >>= PyLong_MARSHAL_SHIFT;
180 } while (d != 0);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000181}
182
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000183static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000184w_object(PyObject *v, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000185{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000186 Py_ssize_t i, n;
Fred Drake6da0b912000-06-28 18:47:56 +0000187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000188 p->depth++;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000189
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000190 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
191 p->error = WFERR_NESTEDTOODEEP;
192 }
193 else if (v == NULL) {
194 w_byte(TYPE_NULL, p);
195 }
196 else if (v == Py_None) {
197 w_byte(TYPE_NONE, p);
198 }
199 else if (v == PyExc_StopIteration) {
200 w_byte(TYPE_STOPITER, p);
201 }
202 else if (v == Py_Ellipsis) {
203 w_byte(TYPE_ELLIPSIS, p);
204 }
205 else if (v == Py_False) {
206 w_byte(TYPE_FALSE, p);
207 }
208 else if (v == Py_True) {
209 w_byte(TYPE_TRUE, p);
210 }
211 else if (PyLong_CheckExact(v)) {
212 long x = PyLong_AsLong(v);
213 if ((x == -1) && PyErr_Occurred()) {
214 PyLongObject *ob = (PyLongObject *)v;
215 PyErr_Clear();
216 w_PyLong(ob, p);
217 }
218 else {
Guido van Rossumc1547d91996-12-10 15:39:04 +0000219#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000220 long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
221 if (y && y != -1) {
222 w_byte(TYPE_INT64, p);
223 w_long64(x, p);
224 }
225 else
Guido van Rossumc1547d91996-12-10 15:39:04 +0000226#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 {
228 w_byte(TYPE_INT, p);
229 w_long(x, p);
230 }
231 }
232 }
233 else if (PyFloat_CheckExact(v)) {
234 if (p->version > 1) {
235 unsigned char buf[8];
236 if (_PyFloat_Pack8(PyFloat_AsDouble(v),
237 buf, 1) < 0) {
238 p->error = WFERR_UNMARSHALLABLE;
239 return;
240 }
241 w_byte(TYPE_BINARY_FLOAT, p);
242 w_string((char*)buf, 8, p);
243 }
244 else {
245 char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
246 'g', 17, 0, NULL);
247 if (!buf) {
248 p->error = WFERR_NOMEMORY;
249 return;
250 }
251 n = strlen(buf);
252 w_byte(TYPE_FLOAT, p);
253 w_byte((int)n, p);
254 w_string(buf, (int)n, p);
255 PyMem_Free(buf);
256 }
257 }
258 else if (PyComplex_CheckExact(v)) {
259 if (p->version > 1) {
260 unsigned char buf[8];
261 if (_PyFloat_Pack8(PyComplex_RealAsDouble(v),
262 buf, 1) < 0) {
263 p->error = WFERR_UNMARSHALLABLE;
264 return;
265 }
266 w_byte(TYPE_BINARY_COMPLEX, p);
267 w_string((char*)buf, 8, p);
268 if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v),
269 buf, 1) < 0) {
270 p->error = WFERR_UNMARSHALLABLE;
271 return;
272 }
273 w_string((char*)buf, 8, p);
274 }
275 else {
276 char *buf;
277 w_byte(TYPE_COMPLEX, p);
278 buf = PyOS_double_to_string(PyComplex_RealAsDouble(v),
279 'g', 17, 0, NULL);
280 if (!buf) {
281 p->error = WFERR_NOMEMORY;
282 return;
283 }
284 n = strlen(buf);
285 w_byte((int)n, p);
286 w_string(buf, (int)n, p);
287 PyMem_Free(buf);
288 buf = PyOS_double_to_string(PyComplex_ImagAsDouble(v),
289 'g', 17, 0, NULL);
290 if (!buf) {
291 p->error = WFERR_NOMEMORY;
292 return;
293 }
294 n = strlen(buf);
295 w_byte((int)n, p);
296 w_string(buf, (int)n, p);
297 PyMem_Free(buf);
298 }
299 }
300 else if (PyBytes_CheckExact(v)) {
301 w_byte(TYPE_STRING, p);
302 n = PyBytes_GET_SIZE(v);
303 if (n > INT_MAX) {
304 /* huge strings are not supported */
305 p->depth--;
306 p->error = WFERR_UNMARSHALLABLE;
307 return;
308 }
309 w_long((long)n, p);
310 w_string(PyBytes_AS_STRING(v), (int)n, p);
311 }
312 else if (PyUnicode_CheckExact(v)) {
313 PyObject *utf8;
314 utf8 = PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(v),
315 PyUnicode_GET_SIZE(v),
316 "surrogatepass");
317 if (utf8 == NULL) {
318 p->depth--;
319 p->error = WFERR_UNMARSHALLABLE;
320 return;
321 }
322 w_byte(TYPE_UNICODE, p);
323 n = PyBytes_GET_SIZE(utf8);
324 if (n > INT_MAX) {
325 p->depth--;
326 p->error = WFERR_UNMARSHALLABLE;
327 return;
328 }
329 w_long((long)n, p);
330 w_string(PyBytes_AS_STRING(utf8), (int)n, p);
331 Py_DECREF(utf8);
332 }
333 else if (PyTuple_CheckExact(v)) {
334 w_byte(TYPE_TUPLE, p);
335 n = PyTuple_Size(v);
336 w_long((long)n, p);
337 for (i = 0; i < n; i++) {
338 w_object(PyTuple_GET_ITEM(v, i), p);
339 }
340 }
341 else if (PyList_CheckExact(v)) {
342 w_byte(TYPE_LIST, p);
343 n = PyList_GET_SIZE(v);
344 w_long((long)n, p);
345 for (i = 0; i < n; i++) {
346 w_object(PyList_GET_ITEM(v, i), p);
347 }
348 }
349 else if (PyDict_CheckExact(v)) {
350 Py_ssize_t pos;
351 PyObject *key, *value;
352 w_byte(TYPE_DICT, p);
353 /* This one is NULL object terminated! */
354 pos = 0;
355 while (PyDict_Next(v, &pos, &key, &value)) {
356 w_object(key, p);
357 w_object(value, p);
358 }
359 w_object((PyObject *)NULL, p);
360 }
361 else if (PyAnySet_CheckExact(v)) {
362 PyObject *value, *it;
Raymond Hettingera422c342005-01-11 03:03:27 +0000363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000364 if (PyObject_TypeCheck(v, &PySet_Type))
365 w_byte(TYPE_SET, p);
366 else
367 w_byte(TYPE_FROZENSET, p);
368 n = PyObject_Size(v);
369 if (n == -1) {
370 p->depth--;
371 p->error = WFERR_UNMARSHALLABLE;
372 return;
373 }
374 w_long((long)n, p);
375 it = PyObject_GetIter(v);
376 if (it == NULL) {
377 p->depth--;
378 p->error = WFERR_UNMARSHALLABLE;
379 return;
380 }
381 while ((value = PyIter_Next(it)) != NULL) {
382 w_object(value, p);
383 Py_DECREF(value);
384 }
385 Py_DECREF(it);
386 if (PyErr_Occurred()) {
387 p->depth--;
388 p->error = WFERR_UNMARSHALLABLE;
389 return;
390 }
391 }
392 else if (PyCode_Check(v)) {
393 PyCodeObject *co = (PyCodeObject *)v;
394 w_byte(TYPE_CODE, p);
395 w_long(co->co_argcount, p);
396 w_long(co->co_kwonlyargcount, p);
397 w_long(co->co_nlocals, p);
398 w_long(co->co_stacksize, p);
399 w_long(co->co_flags, p);
400 w_object(co->co_code, p);
401 w_object(co->co_consts, p);
402 w_object(co->co_names, p);
403 w_object(co->co_varnames, p);
404 w_object(co->co_freevars, p);
405 w_object(co->co_cellvars, p);
406 w_object(co->co_filename, p);
407 w_object(co->co_name, p);
408 w_long(co->co_firstlineno, p);
409 w_object(co->co_lnotab, p);
410 }
411 else if (PyObject_CheckBuffer(v)) {
412 /* Write unknown buffer-style objects as a string */
413 char *s;
414 PyBufferProcs *pb = v->ob_type->tp_as_buffer;
415 Py_buffer view;
416 if ((*pb->bf_getbuffer)(v, &view, PyBUF_SIMPLE) != 0) {
417 w_byte(TYPE_UNKNOWN, p);
418 p->error = WFERR_UNMARSHALLABLE;
419 }
420 w_byte(TYPE_STRING, p);
421 n = view.len;
422 s = view.buf;
423 if (n > INT_MAX) {
424 p->depth--;
425 p->error = WFERR_UNMARSHALLABLE;
426 return;
427 }
428 w_long((long)n, p);
429 w_string(s, (int)n, p);
430 if (pb->bf_releasebuffer != NULL)
431 (*pb->bf_releasebuffer)(v, &view);
432 }
433 else {
434 w_byte(TYPE_UNKNOWN, p);
435 p->error = WFERR_UNMARSHALLABLE;
436 }
437 p->depth--;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000438}
439
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000440/* version currently has no effect for writing longs. */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000441void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000442PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000443{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000444 WFILE wf;
445 wf.fp = fp;
446 wf.error = WFERR_OK;
447 wf.depth = 0;
448 wf.strings = NULL;
449 wf.version = version;
450 w_long(x, &wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000451}
452
453void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000454PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000455{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000456 WFILE wf;
457 wf.fp = fp;
458 wf.error = WFERR_OK;
459 wf.depth = 0;
460 wf.strings = (version > 0) ? PyDict_New() : NULL;
461 wf.version = version;
462 w_object(x, &wf);
463 Py_XDECREF(wf.strings);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000464}
465
466typedef WFILE RFILE; /* Same struct with different invariants */
467
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000468#define rs_byte(p) (((p)->ptr < (p)->end) ? (unsigned char)*(p)->ptr++ : EOF)
Guido van Rossum8d617a61995-03-09 12:12:11 +0000469
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000470static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000471r_string(char *s, int n, RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000472{
Éric Araujo6c0ba442011-07-26 17:23:57 +0200473 char *ptr;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100474 int read, left;
475
476 if (!p->readable) {
477 if (p->fp != NULL)
478 /* The result fits into int because it must be <=n. */
479 read = (int) fread(s, 1, n, p->fp);
480 else {
481 left = (int)(p->end - p->ptr);
482 read = (left < n) ? left : n;
483 memcpy(s, p->ptr, read);
484 p->ptr += read;
485 }
486 }
487 else {
488 PyObject *data = PyObject_CallMethod(p->readable, "read", "i", n);
489 read = 0;
490 if (data != NULL) {
491 if (!PyBytes_Check(data)) {
492 PyErr_Format(PyExc_TypeError,
493 "f.read() returned not bytes but %.100s",
494 data->ob_type->tp_name);
495 }
496 else {
497 read = PyBytes_GET_SIZE(data);
498 if (read > 0) {
499 ptr = PyBytes_AS_STRING(data);
500 memcpy(s, ptr, read);
501 }
502 }
503 Py_DECREF(data);
504 }
505 }
506 if (!PyErr_Occurred() && (read < n)) {
507 PyErr_SetString(PyExc_EOFError, "EOF read where not expected");
508 }
509 return read;
510}
511
512
513static int
514r_byte(RFILE *p)
515{
516 int c = EOF;
517 unsigned char ch;
518 int n;
519
520 if (!p->readable)
521 c = p->fp ? getc(p->fp) : rs_byte(p);
522 else {
523 n = r_string((char *) &ch, 1, p);
524 if (n > 0)
525 c = ch;
526 }
527 return c;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000528}
529
530static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000531r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000532{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 register short x;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100534 unsigned char buffer[2];
535
536 r_string((char *) buffer, 2, p);
537 x = buffer[0];
538 x |= buffer[1] << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 /* Sign-extension, in case short greater than 16 bits */
540 x |= -(x & 0x8000);
541 return x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000542}
543
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000544static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000545r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000546{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000547 register long x;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100548 unsigned char buffer[4];
549
550 r_string((char *) buffer, 4, p);
551 x = buffer[0];
552 x |= (long)buffer[1] << 8;
553 x |= (long)buffer[2] << 16;
554 x |= (long)buffer[3] << 24;
Guido van Rossumc1547d91996-12-10 15:39:04 +0000555#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 /* Sign extension for 64-bit machines */
557 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000558#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 return x;
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000560}
561
Tim Peters82112372001-08-29 02:28:42 +0000562/* r_long64 deals with the TYPE_INT64 code. On a machine with
563 sizeof(long) > 4, it returns a Python int object, else a Python long
564 object. Note that w_long64 writes out TYPE_INT if 32 bits is enough,
565 so there's no inefficiency here in returning a PyLong on 32-bit boxes
566 for everything written via TYPE_INT64 (i.e., if an int is written via
567 TYPE_INT64, it *needs* more than 32 bits).
568*/
569static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000570r_long64(RFILE *p)
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000571{
Éric Araujo6c0ba442011-07-26 17:23:57 +0200572 PyObject *result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 long lo4 = r_long(p);
574 long hi4 = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100575
576 if (!PyErr_Occurred()) {
Guido van Rossumc1547d91996-12-10 15:39:04 +0000577#if SIZEOF_LONG > 4
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100578 long x = (hi4 << 32) | (lo4 & 0xFFFFFFFFL);
579 result = PyLong_FromLong(x);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000580#else
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100581 unsigned char buf[8];
582 int one = 1;
583 int is_little_endian = (int)*(char*)&one;
584 if (is_little_endian) {
585 memcpy(buf, &lo4, 4);
586 memcpy(buf+4, &hi4, 4);
587 }
588 else {
589 memcpy(buf, &hi4, 4);
590 memcpy(buf+4, &lo4, 4);
591 }
592 result = _PyLong_FromByteArray(buf, 8, is_little_endian, 1);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000593#endif
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100594 }
595 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000596}
597
Guido van Rossum79f25d91997-04-29 20:08:16 +0000598static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000599r_PyLong(RFILE *p)
600{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 PyLongObject *ob;
602 int size, i, j, md, shorts_in_top_digit;
603 long n;
604 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100607 if (PyErr_Occurred())
608 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 if (n == 0)
610 return (PyObject *)_PyLong_New(0);
611 if (n < -INT_MAX || n > INT_MAX) {
612 PyErr_SetString(PyExc_ValueError,
613 "bad marshal data (long size out of range)");
614 return NULL;
615 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 size = 1 + (ABS(n) - 1) / PyLong_MARSHAL_RATIO;
618 shorts_in_top_digit = 1 + (ABS(n) - 1) % PyLong_MARSHAL_RATIO;
619 ob = _PyLong_New(size);
620 if (ob == NULL)
621 return NULL;
622 Py_SIZE(ob) = n > 0 ? size : -size;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000623
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 for (i = 0; i < size-1; i++) {
625 d = 0;
626 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
627 md = r_short(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100628 if (PyErr_Occurred())
629 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 if (md < 0 || md > PyLong_MARSHAL_BASE)
631 goto bad_digit;
632 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
633 }
634 ob->ob_digit[i] = d;
635 }
636 d = 0;
637 for (j=0; j < shorts_in_top_digit; j++) {
638 md = r_short(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100639 if (PyErr_Occurred())
640 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 if (md < 0 || md > PyLong_MARSHAL_BASE)
642 goto bad_digit;
643 /* topmost marshal digit should be nonzero */
644 if (md == 0 && j == shorts_in_top_digit - 1) {
645 Py_DECREF(ob);
646 PyErr_SetString(PyExc_ValueError,
647 "bad marshal data (unnormalized long data)");
648 return NULL;
649 }
650 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
651 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100652 if (PyErr_Occurred()) {
653 Py_DECREF(ob);
654 return NULL;
655 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 /* top digit should be nonzero, else the resulting PyLong won't be
657 normalized */
658 ob->ob_digit[size-1] = d;
659 return (PyObject *)ob;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000660 bad_digit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 Py_DECREF(ob);
662 PyErr_SetString(PyExc_ValueError,
663 "bad marshal data (digit out of range in long)");
664 return NULL;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000665}
666
667
668static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000669r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000670{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 /* NULL is a valid return value, it does not necessarily means that
672 an exception is set. */
673 PyObject *v, *v2;
674 long i, n;
675 int type = r_byte(p);
676 PyObject *retval;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000677
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000678 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000679
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000680 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
681 p->depth--;
682 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
683 return NULL;
684 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000688 case EOF:
689 PyErr_SetString(PyExc_EOFError,
690 "EOF read where object expected");
691 retval = NULL;
692 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000694 case TYPE_NULL:
695 retval = NULL;
696 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000698 case TYPE_NONE:
699 Py_INCREF(Py_None);
700 retval = Py_None;
701 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 case TYPE_STOPITER:
704 Py_INCREF(PyExc_StopIteration);
705 retval = PyExc_StopIteration;
706 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708 case TYPE_ELLIPSIS:
709 Py_INCREF(Py_Ellipsis);
710 retval = Py_Ellipsis;
711 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 case TYPE_FALSE:
714 Py_INCREF(Py_False);
715 retval = Py_False;
716 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 case TYPE_TRUE:
719 Py_INCREF(Py_True);
720 retval = Py_True;
721 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 case TYPE_INT:
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100724 n = r_long(p);
725 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000726 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 case TYPE_INT64:
729 retval = r_long64(p);
730 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 case TYPE_LONG:
733 retval = r_PyLong(p);
734 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000736 case TYPE_FLOAT:
737 {
738 char buf[256];
739 double dx;
740 retval = NULL;
741 n = r_byte(p);
742 if (n == EOF || r_string(buf, (int)n, p) != n) {
743 PyErr_SetString(PyExc_EOFError,
744 "EOF read where object expected");
745 break;
746 }
747 buf[n] = '\0';
748 dx = PyOS_string_to_double(buf, NULL, NULL);
749 if (dx == -1.0 && PyErr_Occurred())
750 break;
751 retval = PyFloat_FromDouble(dx);
752 break;
753 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000755 case TYPE_BINARY_FLOAT:
756 {
757 unsigned char buf[8];
758 double x;
759 if (r_string((char*)buf, 8, p) != 8) {
760 PyErr_SetString(PyExc_EOFError,
761 "EOF read where object expected");
762 retval = NULL;
763 break;
764 }
765 x = _PyFloat_Unpack8(buf, 1);
766 if (x == -1.0 && PyErr_Occurred()) {
767 retval = NULL;
768 break;
769 }
770 retval = PyFloat_FromDouble(x);
771 break;
772 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000774 case TYPE_COMPLEX:
775 {
776 char buf[256];
777 Py_complex c;
778 retval = NULL;
779 n = r_byte(p);
780 if (n == EOF || r_string(buf, (int)n, p) != n) {
781 PyErr_SetString(PyExc_EOFError,
782 "EOF read where object expected");
783 break;
784 }
785 buf[n] = '\0';
786 c.real = PyOS_string_to_double(buf, NULL, NULL);
787 if (c.real == -1.0 && PyErr_Occurred())
788 break;
789 n = r_byte(p);
790 if (n == EOF || r_string(buf, (int)n, p) != n) {
791 PyErr_SetString(PyExc_EOFError,
792 "EOF read where object expected");
793 break;
794 }
795 buf[n] = '\0';
796 c.imag = PyOS_string_to_double(buf, NULL, NULL);
797 if (c.imag == -1.0 && PyErr_Occurred())
798 break;
799 retval = PyComplex_FromCComplex(c);
800 break;
801 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000803 case TYPE_BINARY_COMPLEX:
804 {
805 unsigned char buf[8];
806 Py_complex c;
807 if (r_string((char*)buf, 8, p) != 8) {
808 PyErr_SetString(PyExc_EOFError,
809 "EOF read where object expected");
810 retval = NULL;
811 break;
812 }
813 c.real = _PyFloat_Unpack8(buf, 1);
814 if (c.real == -1.0 && PyErr_Occurred()) {
815 retval = NULL;
816 break;
817 }
818 if (r_string((char*)buf, 8, p) != 8) {
819 PyErr_SetString(PyExc_EOFError,
820 "EOF read where object expected");
821 retval = NULL;
822 break;
823 }
824 c.imag = _PyFloat_Unpack8(buf, 1);
825 if (c.imag == -1.0 && PyErr_Occurred()) {
826 retval = NULL;
827 break;
828 }
829 retval = PyComplex_FromCComplex(c);
830 break;
831 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000832
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000833 case TYPE_STRING:
834 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100835 if (PyErr_Occurred()) {
836 retval = NULL;
837 break;
838 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 if (n < 0 || n > INT_MAX) {
840 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
841 retval = NULL;
842 break;
843 }
844 v = PyBytes_FromStringAndSize((char *)NULL, n);
845 if (v == NULL) {
846 retval = NULL;
847 break;
848 }
849 if (r_string(PyBytes_AS_STRING(v), (int)n, p) != n) {
850 Py_DECREF(v);
851 PyErr_SetString(PyExc_EOFError,
852 "EOF read where object expected");
853 retval = NULL;
854 break;
855 }
856 retval = v;
857 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 case TYPE_UNICODE:
860 {
861 char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +0000862
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100864 if (PyErr_Occurred()) {
865 retval = NULL;
866 break;
867 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 if (n < 0 || n > INT_MAX) {
869 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
870 retval = NULL;
871 break;
872 }
873 buffer = PyMem_NEW(char, n);
874 if (buffer == NULL) {
875 retval = PyErr_NoMemory();
876 break;
877 }
878 if (r_string(buffer, (int)n, p) != n) {
879 PyMem_DEL(buffer);
880 PyErr_SetString(PyExc_EOFError,
881 "EOF read where object expected");
882 retval = NULL;
883 break;
884 }
885 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
886 PyMem_DEL(buffer);
887 retval = v;
888 break;
889 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000891 case TYPE_TUPLE:
892 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100893 if (PyErr_Occurred()) {
894 retval = NULL;
895 break;
896 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 if (n < 0 || n > INT_MAX) {
898 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
899 retval = NULL;
900 break;
901 }
902 v = PyTuple_New((int)n);
903 if (v == NULL) {
904 retval = NULL;
905 break;
906 }
907 for (i = 0; i < n; i++) {
908 v2 = r_object(p);
909 if ( v2 == NULL ) {
910 if (!PyErr_Occurred())
911 PyErr_SetString(PyExc_TypeError,
912 "NULL object in marshal data for tuple");
913 Py_DECREF(v);
914 v = NULL;
915 break;
916 }
917 PyTuple_SET_ITEM(v, (int)i, v2);
918 }
919 retval = v;
920 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000922 case TYPE_LIST:
923 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100924 if (PyErr_Occurred()) {
925 retval = NULL;
926 break;
927 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 if (n < 0 || n > INT_MAX) {
929 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
930 retval = NULL;
931 break;
932 }
933 v = PyList_New((int)n);
934 if (v == NULL) {
935 retval = NULL;
936 break;
937 }
938 for (i = 0; i < n; i++) {
939 v2 = r_object(p);
940 if ( v2 == NULL ) {
941 if (!PyErr_Occurred())
942 PyErr_SetString(PyExc_TypeError,
943 "NULL object in marshal data for list");
944 Py_DECREF(v);
945 v = NULL;
946 break;
947 }
948 PyList_SET_ITEM(v, (int)i, v2);
949 }
950 retval = v;
951 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 case TYPE_DICT:
954 v = PyDict_New();
955 if (v == NULL) {
956 retval = NULL;
957 break;
958 }
959 for (;;) {
960 PyObject *key, *val;
961 key = r_object(p);
962 if (key == NULL)
963 break;
964 val = r_object(p);
965 if (val != NULL)
966 PyDict_SetItem(v, key, val);
967 Py_DECREF(key);
968 Py_XDECREF(val);
969 }
970 if (PyErr_Occurred()) {
971 Py_DECREF(v);
972 v = NULL;
973 }
974 retval = v;
975 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000976
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 case TYPE_SET:
978 case TYPE_FROZENSET:
979 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100980 if (PyErr_Occurred()) {
981 retval = NULL;
982 break;
983 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 if (n < 0 || n > INT_MAX) {
985 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
986 retval = NULL;
987 break;
988 }
989 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
990 if (v == NULL) {
991 retval = NULL;
992 break;
993 }
994 for (i = 0; i < n; i++) {
995 v2 = r_object(p);
996 if ( v2 == NULL ) {
997 if (!PyErr_Occurred())
998 PyErr_SetString(PyExc_TypeError,
999 "NULL object in marshal data for set");
1000 Py_DECREF(v);
1001 v = NULL;
1002 break;
1003 }
1004 if (PySet_Add(v, v2) == -1) {
1005 Py_DECREF(v);
1006 Py_DECREF(v2);
1007 v = NULL;
1008 break;
1009 }
1010 Py_DECREF(v2);
1011 }
1012 retval = v;
1013 break;
Raymond Hettingera422c342005-01-11 03:03:27 +00001014
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 case TYPE_CODE:
1016 {
1017 int argcount;
1018 int kwonlyargcount;
1019 int nlocals;
1020 int stacksize;
1021 int flags;
1022 PyObject *code = NULL;
1023 PyObject *consts = NULL;
1024 PyObject *names = NULL;
1025 PyObject *varnames = NULL;
1026 PyObject *freevars = NULL;
1027 PyObject *cellvars = NULL;
1028 PyObject *filename = NULL;
1029 PyObject *name = NULL;
1030 int firstlineno;
1031 PyObject *lnotab = NULL;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001032
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001033 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001034
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001035 /* XXX ignore long->int overflows for now */
1036 argcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001037 if (PyErr_Occurred())
1038 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001039 kwonlyargcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001040 if (PyErr_Occurred())
1041 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001042 nlocals = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001043 if (PyErr_Occurred())
1044 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001045 stacksize = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001046 if (PyErr_Occurred())
1047 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 flags = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001049 if (PyErr_Occurred())
1050 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 code = r_object(p);
1052 if (code == NULL)
1053 goto code_error;
1054 consts = r_object(p);
1055 if (consts == NULL)
1056 goto code_error;
1057 names = r_object(p);
1058 if (names == NULL)
1059 goto code_error;
1060 varnames = r_object(p);
1061 if (varnames == NULL)
1062 goto code_error;
1063 freevars = r_object(p);
1064 if (freevars == NULL)
1065 goto code_error;
1066 cellvars = r_object(p);
1067 if (cellvars == NULL)
1068 goto code_error;
1069 filename = r_object(p);
1070 if (filename == NULL)
1071 goto code_error;
1072 name = r_object(p);
1073 if (name == NULL)
1074 goto code_error;
1075 firstlineno = (int)r_long(p);
1076 lnotab = r_object(p);
1077 if (lnotab == NULL)
1078 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 v = (PyObject *) PyCode_New(
1081 argcount, kwonlyargcount,
1082 nlocals, stacksize, flags,
1083 code, consts, names, varnames,
1084 freevars, cellvars, filename, name,
1085 firstlineno, lnotab);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001087 code_error:
1088 Py_XDECREF(code);
1089 Py_XDECREF(consts);
1090 Py_XDECREF(names);
1091 Py_XDECREF(varnames);
1092 Py_XDECREF(freevars);
1093 Py_XDECREF(cellvars);
1094 Py_XDECREF(filename);
1095 Py_XDECREF(name);
1096 Py_XDECREF(lnotab);
1097 }
1098 retval = v;
1099 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001100
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 default:
1102 /* Bogus data got written, which isn't ideal.
1103 This will let you keep working and recover. */
1104 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
1105 retval = NULL;
1106 break;
1107
1108 }
1109 p->depth--;
1110 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001111}
1112
Neal Norwitzd85c4522004-06-13 20:31:49 +00001113static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001114read_object(RFILE *p)
1115{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 PyObject *v;
1117 if (PyErr_Occurred()) {
1118 fprintf(stderr, "XXX readobject called with exception set\n");
1119 return NULL;
1120 }
1121 v = r_object(p);
1122 if (v == NULL && !PyErr_Occurred())
1123 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1124 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001125}
1126
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001127int
1128PyMarshal_ReadShortFromFile(FILE *fp)
1129{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 RFILE rf;
1131 assert(fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001132 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001133 rf.fp = fp;
1134 rf.strings = NULL;
1135 rf.end = rf.ptr = NULL;
1136 return r_short(&rf);
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001137}
1138
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001139long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001140PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001141{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 RFILE rf;
1143 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001144 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001145 rf.strings = NULL;
1146 rf.ptr = rf.end = NULL;
1147 return r_long(&rf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001148}
1149
Tim Peters691e0e92001-01-18 04:39:16 +00001150#ifdef HAVE_FSTAT
1151/* Return size of file in bytes; < 0 if unknown. */
1152static off_t
1153getfilesize(FILE *fp)
1154{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 struct stat st;
1156 if (fstat(fileno(fp), &st) != 0)
1157 return -1;
1158 else
1159 return st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001160}
1161#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001162
Tim Peters691e0e92001-01-18 04:39:16 +00001163/* If we can get the size of the file up-front, and it's reasonably small,
1164 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1165 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001166 * CAUTION: since this may read the entire remainder of the file, don't
1167 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001168 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001169PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001170PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001171{
Antoine Pitrou5bc7ec92010-04-21 22:56:22 +00001172/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
Tim Peters691e0e92001-01-18 04:39:16 +00001173#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001174#ifdef HAVE_FSTAT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 off_t filesize;
1176 filesize = getfilesize(fp);
1177 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1178 char* pBuf = (char *)PyMem_MALLOC(filesize);
1179 if (pBuf != NULL) {
1180 PyObject* v;
1181 size_t n;
1182 /* filesize must fit into an int, because it
1183 is smaller than REASONABLE_FILE_LIMIT */
1184 n = fread(pBuf, 1, (int)filesize, fp);
1185 v = PyMarshal_ReadObjectFromString(pBuf, n);
1186 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;
1386 if (!PyArg_ParseTuple(args, "s*:loads", &p))
1387 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,
1403"loads(string)\n\
1404\n\
1405Convert the string to a value. If no valid value is found, raise\n\
1406EOFError, ValueError or TypeError. Extra characters in the string are\n\
1407ignored.");
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}