blob: 31fe66b08f95c3b46473f57f6b82ad414952ca0d [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;
Benjamin Peterson43b06862011-05-27 09:08:01 -050062 PyObject *current_filename;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000063 char *ptr;
64 char *end;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000065 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;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200314 utf8 = PyUnicode_AsEncodedString(v, "utf8", "surrogatepass");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000315 if (utf8 == NULL) {
316 p->depth--;
317 p->error = WFERR_UNMARSHALLABLE;
318 return;
319 }
320 w_byte(TYPE_UNICODE, p);
321 n = PyBytes_GET_SIZE(utf8);
322 if (n > INT_MAX) {
323 p->depth--;
324 p->error = WFERR_UNMARSHALLABLE;
325 return;
326 }
327 w_long((long)n, p);
328 w_string(PyBytes_AS_STRING(utf8), (int)n, p);
329 Py_DECREF(utf8);
330 }
331 else if (PyTuple_CheckExact(v)) {
332 w_byte(TYPE_TUPLE, p);
333 n = PyTuple_Size(v);
334 w_long((long)n, p);
335 for (i = 0; i < n; i++) {
336 w_object(PyTuple_GET_ITEM(v, i), p);
337 }
338 }
339 else if (PyList_CheckExact(v)) {
340 w_byte(TYPE_LIST, p);
341 n = PyList_GET_SIZE(v);
342 w_long((long)n, p);
343 for (i = 0; i < n; i++) {
344 w_object(PyList_GET_ITEM(v, i), p);
345 }
346 }
347 else if (PyDict_CheckExact(v)) {
348 Py_ssize_t pos;
349 PyObject *key, *value;
350 w_byte(TYPE_DICT, p);
351 /* This one is NULL object terminated! */
352 pos = 0;
353 while (PyDict_Next(v, &pos, &key, &value)) {
354 w_object(key, p);
355 w_object(value, p);
356 }
357 w_object((PyObject *)NULL, p);
358 }
359 else if (PyAnySet_CheckExact(v)) {
360 PyObject *value, *it;
Raymond Hettingera422c342005-01-11 03:03:27 +0000361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000362 if (PyObject_TypeCheck(v, &PySet_Type))
363 w_byte(TYPE_SET, p);
364 else
365 w_byte(TYPE_FROZENSET, p);
366 n = PyObject_Size(v);
367 if (n == -1) {
368 p->depth--;
369 p->error = WFERR_UNMARSHALLABLE;
370 return;
371 }
372 w_long((long)n, p);
373 it = PyObject_GetIter(v);
374 if (it == NULL) {
375 p->depth--;
376 p->error = WFERR_UNMARSHALLABLE;
377 return;
378 }
379 while ((value = PyIter_Next(it)) != NULL) {
380 w_object(value, p);
381 Py_DECREF(value);
382 }
383 Py_DECREF(it);
384 if (PyErr_Occurred()) {
385 p->depth--;
386 p->error = WFERR_UNMARSHALLABLE;
387 return;
388 }
389 }
390 else if (PyCode_Check(v)) {
391 PyCodeObject *co = (PyCodeObject *)v;
392 w_byte(TYPE_CODE, p);
393 w_long(co->co_argcount, p);
394 w_long(co->co_kwonlyargcount, p);
395 w_long(co->co_nlocals, p);
396 w_long(co->co_stacksize, p);
397 w_long(co->co_flags, p);
398 w_object(co->co_code, p);
399 w_object(co->co_consts, p);
400 w_object(co->co_names, p);
401 w_object(co->co_varnames, p);
402 w_object(co->co_freevars, p);
403 w_object(co->co_cellvars, p);
404 w_object(co->co_filename, p);
405 w_object(co->co_name, p);
406 w_long(co->co_firstlineno, p);
407 w_object(co->co_lnotab, p);
408 }
409 else if (PyObject_CheckBuffer(v)) {
410 /* Write unknown buffer-style objects as a string */
411 char *s;
412 PyBufferProcs *pb = v->ob_type->tp_as_buffer;
413 Py_buffer view;
414 if ((*pb->bf_getbuffer)(v, &view, PyBUF_SIMPLE) != 0) {
415 w_byte(TYPE_UNKNOWN, p);
416 p->error = WFERR_UNMARSHALLABLE;
417 }
418 w_byte(TYPE_STRING, p);
419 n = view.len;
420 s = view.buf;
421 if (n > INT_MAX) {
422 p->depth--;
423 p->error = WFERR_UNMARSHALLABLE;
424 return;
425 }
426 w_long((long)n, p);
427 w_string(s, (int)n, p);
428 if (pb->bf_releasebuffer != NULL)
429 (*pb->bf_releasebuffer)(v, &view);
430 }
431 else {
432 w_byte(TYPE_UNKNOWN, p);
433 p->error = WFERR_UNMARSHALLABLE;
434 }
435 p->depth--;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000436}
437
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000438/* version currently has no effect for writing longs. */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000439void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000440PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000441{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000442 WFILE wf;
443 wf.fp = fp;
444 wf.error = WFERR_OK;
445 wf.depth = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000446 wf.version = version;
447 w_long(x, &wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000448}
449
450void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000451PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000452{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453 WFILE wf;
454 wf.fp = fp;
455 wf.error = WFERR_OK;
456 wf.depth = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000457 wf.version = version;
458 w_object(x, &wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000459}
460
461typedef WFILE RFILE; /* Same struct with different invariants */
462
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000463#define rs_byte(p) (((p)->ptr < (p)->end) ? (unsigned char)*(p)->ptr++ : EOF)
Guido van Rossum8d617a61995-03-09 12:12:11 +0000464
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000465static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000466r_string(char *s, int n, RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000467{
Éric Araujo6c0ba442011-07-26 17:23:57 +0200468 char *ptr;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100469 int read, left;
470
471 if (!p->readable) {
472 if (p->fp != NULL)
473 /* The result fits into int because it must be <=n. */
474 read = (int) fread(s, 1, n, p->fp);
475 else {
476 left = (int)(p->end - p->ptr);
477 read = (left < n) ? left : n;
478 memcpy(s, p->ptr, read);
479 p->ptr += read;
480 }
481 }
482 else {
483 PyObject *data = PyObject_CallMethod(p->readable, "read", "i", n);
484 read = 0;
485 if (data != NULL) {
486 if (!PyBytes_Check(data)) {
487 PyErr_Format(PyExc_TypeError,
488 "f.read() returned not bytes but %.100s",
489 data->ob_type->tp_name);
490 }
491 else {
492 read = PyBytes_GET_SIZE(data);
493 if (read > 0) {
494 ptr = PyBytes_AS_STRING(data);
495 memcpy(s, ptr, read);
496 }
497 }
498 Py_DECREF(data);
499 }
500 }
501 if (!PyErr_Occurred() && (read < n)) {
502 PyErr_SetString(PyExc_EOFError, "EOF read where not expected");
503 }
504 return read;
505}
506
507
508static int
509r_byte(RFILE *p)
510{
511 int c = EOF;
512 unsigned char ch;
513 int n;
514
515 if (!p->readable)
516 c = p->fp ? getc(p->fp) : rs_byte(p);
517 else {
518 n = r_string((char *) &ch, 1, p);
519 if (n > 0)
520 c = ch;
521 }
522 return c;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000523}
524
525static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000526r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000527{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000528 register short x;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100529 unsigned char buffer[2];
530
531 r_string((char *) buffer, 2, p);
532 x = buffer[0];
533 x |= buffer[1] << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 /* Sign-extension, in case short greater than 16 bits */
535 x |= -(x & 0x8000);
536 return x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000537}
538
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000539static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000540r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000541{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000542 register long x;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100543 unsigned char buffer[4];
544
545 r_string((char *) buffer, 4, p);
546 x = buffer[0];
547 x |= (long)buffer[1] << 8;
548 x |= (long)buffer[2] << 16;
549 x |= (long)buffer[3] << 24;
Guido van Rossumc1547d91996-12-10 15:39:04 +0000550#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 /* Sign extension for 64-bit machines */
552 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000553#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 return x;
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000555}
556
Tim Peters82112372001-08-29 02:28:42 +0000557/* r_long64 deals with the TYPE_INT64 code. On a machine with
558 sizeof(long) > 4, it returns a Python int object, else a Python long
559 object. Note that w_long64 writes out TYPE_INT if 32 bits is enough,
560 so there's no inefficiency here in returning a PyLong on 32-bit boxes
561 for everything written via TYPE_INT64 (i.e., if an int is written via
562 TYPE_INT64, it *needs* more than 32 bits).
563*/
564static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000565r_long64(RFILE *p)
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000566{
Éric Araujo6c0ba442011-07-26 17:23:57 +0200567 PyObject *result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 long lo4 = r_long(p);
569 long hi4 = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100570
571 if (!PyErr_Occurred()) {
Guido van Rossumc1547d91996-12-10 15:39:04 +0000572#if SIZEOF_LONG > 4
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100573 long x = (hi4 << 32) | (lo4 & 0xFFFFFFFFL);
574 result = PyLong_FromLong(x);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000575#else
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100576 unsigned char buf[8];
577 int one = 1;
578 int is_little_endian = (int)*(char*)&one;
579 if (is_little_endian) {
580 memcpy(buf, &lo4, 4);
581 memcpy(buf+4, &hi4, 4);
582 }
583 else {
584 memcpy(buf, &hi4, 4);
585 memcpy(buf+4, &lo4, 4);
586 }
587 result = _PyLong_FromByteArray(buf, 8, is_little_endian, 1);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000588#endif
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100589 }
590 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000591}
592
Guido van Rossum79f25d91997-04-29 20:08:16 +0000593static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000594r_PyLong(RFILE *p)
595{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 PyLongObject *ob;
597 int size, i, j, md, shorts_in_top_digit;
598 long n;
599 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100602 if (PyErr_Occurred())
603 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 if (n == 0)
605 return (PyObject *)_PyLong_New(0);
606 if (n < -INT_MAX || n > INT_MAX) {
607 PyErr_SetString(PyExc_ValueError,
608 "bad marshal data (long size out of range)");
609 return NULL;
610 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000611
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 size = 1 + (ABS(n) - 1) / PyLong_MARSHAL_RATIO;
613 shorts_in_top_digit = 1 + (ABS(n) - 1) % PyLong_MARSHAL_RATIO;
614 ob = _PyLong_New(size);
615 if (ob == NULL)
616 return NULL;
617 Py_SIZE(ob) = n > 0 ? size : -size;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 for (i = 0; i < size-1; i++) {
620 d = 0;
621 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
622 md = r_short(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100623 if (PyErr_Occurred())
624 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 if (md < 0 || md > PyLong_MARSHAL_BASE)
626 goto bad_digit;
627 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
628 }
629 ob->ob_digit[i] = d;
630 }
631 d = 0;
632 for (j=0; j < shorts_in_top_digit; j++) {
633 md = r_short(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100634 if (PyErr_Occurred())
635 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 if (md < 0 || md > PyLong_MARSHAL_BASE)
637 goto bad_digit;
638 /* topmost marshal digit should be nonzero */
639 if (md == 0 && j == shorts_in_top_digit - 1) {
640 Py_DECREF(ob);
641 PyErr_SetString(PyExc_ValueError,
642 "bad marshal data (unnormalized long data)");
643 return NULL;
644 }
645 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
646 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100647 if (PyErr_Occurred()) {
648 Py_DECREF(ob);
649 return NULL;
650 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000651 /* top digit should be nonzero, else the resulting PyLong won't be
652 normalized */
653 ob->ob_digit[size-1] = d;
654 return (PyObject *)ob;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000655 bad_digit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 Py_DECREF(ob);
657 PyErr_SetString(PyExc_ValueError,
658 "bad marshal data (digit out of range in long)");
659 return NULL;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000660}
661
662
663static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000664r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000665{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000666 /* NULL is a valid return value, it does not necessarily means that
667 an exception is set. */
668 PyObject *v, *v2;
669 long i, n;
670 int type = r_byte(p);
671 PyObject *retval;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
676 p->depth--;
677 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
678 return NULL;
679 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 case EOF:
684 PyErr_SetString(PyExc_EOFError,
685 "EOF read where object expected");
686 retval = NULL;
687 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 case TYPE_NULL:
690 retval = NULL;
691 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 case TYPE_NONE:
694 Py_INCREF(Py_None);
695 retval = Py_None;
696 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000698 case TYPE_STOPITER:
699 Py_INCREF(PyExc_StopIteration);
700 retval = PyExc_StopIteration;
701 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 case TYPE_ELLIPSIS:
704 Py_INCREF(Py_Ellipsis);
705 retval = Py_Ellipsis;
706 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708 case TYPE_FALSE:
709 Py_INCREF(Py_False);
710 retval = Py_False;
711 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 case TYPE_TRUE:
714 Py_INCREF(Py_True);
715 retval = Py_True;
716 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 case TYPE_INT:
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100719 n = r_long(p);
720 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 case TYPE_INT64:
724 retval = r_long64(p);
725 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000726
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000727 case TYPE_LONG:
728 retval = r_PyLong(p);
729 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000731 case TYPE_FLOAT:
732 {
733 char buf[256];
734 double dx;
735 retval = NULL;
736 n = r_byte(p);
737 if (n == EOF || r_string(buf, (int)n, p) != n) {
738 PyErr_SetString(PyExc_EOFError,
739 "EOF read where object expected");
740 break;
741 }
742 buf[n] = '\0';
743 dx = PyOS_string_to_double(buf, NULL, NULL);
744 if (dx == -1.0 && PyErr_Occurred())
745 break;
746 retval = PyFloat_FromDouble(dx);
747 break;
748 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000750 case TYPE_BINARY_FLOAT:
751 {
752 unsigned char buf[8];
753 double x;
754 if (r_string((char*)buf, 8, p) != 8) {
755 PyErr_SetString(PyExc_EOFError,
756 "EOF read where object expected");
757 retval = NULL;
758 break;
759 }
760 x = _PyFloat_Unpack8(buf, 1);
761 if (x == -1.0 && PyErr_Occurred()) {
762 retval = NULL;
763 break;
764 }
765 retval = PyFloat_FromDouble(x);
766 break;
767 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 case TYPE_COMPLEX:
770 {
771 char buf[256];
772 Py_complex c;
773 retval = NULL;
774 n = r_byte(p);
775 if (n == EOF || r_string(buf, (int)n, p) != n) {
776 PyErr_SetString(PyExc_EOFError,
777 "EOF read where object expected");
778 break;
779 }
780 buf[n] = '\0';
781 c.real = PyOS_string_to_double(buf, NULL, NULL);
782 if (c.real == -1.0 && PyErr_Occurred())
783 break;
784 n = r_byte(p);
785 if (n == EOF || r_string(buf, (int)n, p) != n) {
786 PyErr_SetString(PyExc_EOFError,
787 "EOF read where object expected");
788 break;
789 }
790 buf[n] = '\0';
791 c.imag = PyOS_string_to_double(buf, NULL, NULL);
792 if (c.imag == -1.0 && PyErr_Occurred())
793 break;
794 retval = PyComplex_FromCComplex(c);
795 break;
796 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000797
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000798 case TYPE_BINARY_COMPLEX:
799 {
800 unsigned char buf[8];
801 Py_complex c;
802 if (r_string((char*)buf, 8, p) != 8) {
803 PyErr_SetString(PyExc_EOFError,
804 "EOF read where object expected");
805 retval = NULL;
806 break;
807 }
808 c.real = _PyFloat_Unpack8(buf, 1);
809 if (c.real == -1.0 && PyErr_Occurred()) {
810 retval = NULL;
811 break;
812 }
813 if (r_string((char*)buf, 8, p) != 8) {
814 PyErr_SetString(PyExc_EOFError,
815 "EOF read where object expected");
816 retval = NULL;
817 break;
818 }
819 c.imag = _PyFloat_Unpack8(buf, 1);
820 if (c.imag == -1.0 && PyErr_Occurred()) {
821 retval = NULL;
822 break;
823 }
824 retval = PyComplex_FromCComplex(c);
825 break;
826 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000828 case TYPE_STRING:
829 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100830 if (PyErr_Occurred()) {
831 retval = NULL;
832 break;
833 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 if (n < 0 || n > INT_MAX) {
835 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
836 retval = NULL;
837 break;
838 }
839 v = PyBytes_FromStringAndSize((char *)NULL, n);
840 if (v == NULL) {
841 retval = NULL;
842 break;
843 }
844 if (r_string(PyBytes_AS_STRING(v), (int)n, p) != n) {
845 Py_DECREF(v);
846 PyErr_SetString(PyExc_EOFError,
847 "EOF read where object expected");
848 retval = NULL;
849 break;
850 }
851 retval = v;
852 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 case TYPE_UNICODE:
855 {
856 char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +0000857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100859 if (PyErr_Occurred()) {
860 retval = NULL;
861 break;
862 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 if (n < 0 || n > INT_MAX) {
864 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
865 retval = NULL;
866 break;
867 }
868 buffer = PyMem_NEW(char, n);
869 if (buffer == NULL) {
870 retval = PyErr_NoMemory();
871 break;
872 }
873 if (r_string(buffer, (int)n, p) != n) {
874 PyMem_DEL(buffer);
875 PyErr_SetString(PyExc_EOFError,
876 "EOF read where object expected");
877 retval = NULL;
878 break;
879 }
880 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
881 PyMem_DEL(buffer);
882 retval = v;
883 break;
884 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886 case TYPE_TUPLE:
887 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100888 if (PyErr_Occurred()) {
889 retval = NULL;
890 break;
891 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000892 if (n < 0 || n > INT_MAX) {
893 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
894 retval = NULL;
895 break;
896 }
897 v = PyTuple_New((int)n);
898 if (v == NULL) {
899 retval = NULL;
900 break;
901 }
902 for (i = 0; i < n; i++) {
903 v2 = r_object(p);
904 if ( v2 == NULL ) {
905 if (!PyErr_Occurred())
906 PyErr_SetString(PyExc_TypeError,
907 "NULL object in marshal data for tuple");
908 Py_DECREF(v);
909 v = NULL;
910 break;
911 }
912 PyTuple_SET_ITEM(v, (int)i, v2);
913 }
914 retval = v;
915 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 case TYPE_LIST:
918 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100919 if (PyErr_Occurred()) {
920 retval = NULL;
921 break;
922 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 if (n < 0 || n > INT_MAX) {
924 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
925 retval = NULL;
926 break;
927 }
928 v = PyList_New((int)n);
929 if (v == NULL) {
930 retval = NULL;
931 break;
932 }
933 for (i = 0; i < n; i++) {
934 v2 = r_object(p);
935 if ( v2 == NULL ) {
936 if (!PyErr_Occurred())
937 PyErr_SetString(PyExc_TypeError,
938 "NULL object in marshal data for list");
939 Py_DECREF(v);
940 v = NULL;
941 break;
942 }
943 PyList_SET_ITEM(v, (int)i, v2);
944 }
945 retval = v;
946 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000948 case TYPE_DICT:
949 v = PyDict_New();
950 if (v == NULL) {
951 retval = NULL;
952 break;
953 }
954 for (;;) {
955 PyObject *key, *val;
956 key = r_object(p);
957 if (key == NULL)
958 break;
959 val = r_object(p);
960 if (val != NULL)
961 PyDict_SetItem(v, key, val);
962 Py_DECREF(key);
963 Py_XDECREF(val);
964 }
965 if (PyErr_Occurred()) {
966 Py_DECREF(v);
967 v = NULL;
968 }
969 retval = v;
970 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000971
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 case TYPE_SET:
973 case TYPE_FROZENSET:
974 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100975 if (PyErr_Occurred()) {
976 retval = NULL;
977 break;
978 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 if (n < 0 || n > INT_MAX) {
980 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
981 retval = NULL;
982 break;
983 }
984 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
985 if (v == NULL) {
986 retval = NULL;
987 break;
988 }
989 for (i = 0; i < n; i++) {
990 v2 = r_object(p);
991 if ( v2 == NULL ) {
992 if (!PyErr_Occurred())
993 PyErr_SetString(PyExc_TypeError,
994 "NULL object in marshal data for set");
995 Py_DECREF(v);
996 v = NULL;
997 break;
998 }
999 if (PySet_Add(v, v2) == -1) {
1000 Py_DECREF(v);
1001 Py_DECREF(v2);
1002 v = NULL;
1003 break;
1004 }
1005 Py_DECREF(v2);
1006 }
1007 retval = v;
1008 break;
Raymond Hettingera422c342005-01-11 03:03:27 +00001009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 case TYPE_CODE:
1011 {
1012 int argcount;
1013 int kwonlyargcount;
1014 int nlocals;
1015 int stacksize;
1016 int flags;
1017 PyObject *code = NULL;
1018 PyObject *consts = NULL;
1019 PyObject *names = NULL;
1020 PyObject *varnames = NULL;
1021 PyObject *freevars = NULL;
1022 PyObject *cellvars = NULL;
1023 PyObject *filename = NULL;
1024 PyObject *name = NULL;
1025 int firstlineno;
1026 PyObject *lnotab = NULL;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001028 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001030 /* XXX ignore long->int overflows for now */
1031 argcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001032 if (PyErr_Occurred())
1033 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 kwonlyargcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001035 if (PyErr_Occurred())
1036 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001037 nlocals = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001038 if (PyErr_Occurred())
1039 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 stacksize = (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 flags = (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 code = r_object(p);
1047 if (code == NULL)
1048 goto code_error;
1049 consts = r_object(p);
1050 if (consts == NULL)
1051 goto code_error;
1052 names = r_object(p);
1053 if (names == NULL)
1054 goto code_error;
1055 varnames = r_object(p);
1056 if (varnames == NULL)
1057 goto code_error;
1058 freevars = r_object(p);
1059 if (freevars == NULL)
1060 goto code_error;
1061 cellvars = r_object(p);
1062 if (cellvars == NULL)
1063 goto code_error;
1064 filename = r_object(p);
1065 if (filename == NULL)
1066 goto code_error;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001067 if (PyUnicode_CheckExact(filename)) {
1068 if (p->current_filename != NULL) {
1069 if (!PyUnicode_Compare(filename, p->current_filename)) {
1070 Py_DECREF(filename);
1071 Py_INCREF(p->current_filename);
1072 filename = p->current_filename;
1073 }
1074 }
1075 else {
1076 p->current_filename = filename;
1077 }
1078 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 name = r_object(p);
1080 if (name == NULL)
1081 goto code_error;
1082 firstlineno = (int)r_long(p);
1083 lnotab = r_object(p);
1084 if (lnotab == NULL)
1085 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001087 v = (PyObject *) PyCode_New(
1088 argcount, kwonlyargcount,
1089 nlocals, stacksize, flags,
1090 code, consts, names, varnames,
1091 freevars, cellvars, filename, name,
1092 firstlineno, lnotab);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 code_error:
1095 Py_XDECREF(code);
1096 Py_XDECREF(consts);
1097 Py_XDECREF(names);
1098 Py_XDECREF(varnames);
1099 Py_XDECREF(freevars);
1100 Py_XDECREF(cellvars);
1101 Py_XDECREF(filename);
1102 Py_XDECREF(name);
1103 Py_XDECREF(lnotab);
1104 }
1105 retval = v;
1106 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 default:
1109 /* Bogus data got written, which isn't ideal.
1110 This will let you keep working and recover. */
1111 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
1112 retval = NULL;
1113 break;
1114
1115 }
1116 p->depth--;
1117 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001118}
1119
Neal Norwitzd85c4522004-06-13 20:31:49 +00001120static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001121read_object(RFILE *p)
1122{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001123 PyObject *v;
1124 if (PyErr_Occurred()) {
1125 fprintf(stderr, "XXX readobject called with exception set\n");
1126 return NULL;
1127 }
1128 v = r_object(p);
1129 if (v == NULL && !PyErr_Occurred())
1130 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1131 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001132}
1133
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001134int
1135PyMarshal_ReadShortFromFile(FILE *fp)
1136{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 RFILE rf;
1138 assert(fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001139 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 rf.fp = fp;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001141 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 rf.end = rf.ptr = NULL;
1143 return r_short(&rf);
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001144}
1145
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001146long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001147PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001148{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 RFILE rf;
1150 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001151 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001152 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 rf.ptr = rf.end = NULL;
1154 return r_long(&rf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001155}
1156
Tim Peters691e0e92001-01-18 04:39:16 +00001157#ifdef HAVE_FSTAT
1158/* Return size of file in bytes; < 0 if unknown. */
1159static off_t
1160getfilesize(FILE *fp)
1161{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 struct stat st;
1163 if (fstat(fileno(fp), &st) != 0)
1164 return -1;
1165 else
1166 return st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001167}
1168#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001169
Tim Peters691e0e92001-01-18 04:39:16 +00001170/* If we can get the size of the file up-front, and it's reasonably small,
1171 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1172 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001173 * CAUTION: since this may read the entire remainder of the file, don't
1174 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001175 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001176PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001177PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001178{
Antoine Pitrou5bc7ec92010-04-21 22:56:22 +00001179/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
Tim Peters691e0e92001-01-18 04:39:16 +00001180#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001181#ifdef HAVE_FSTAT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001182 off_t filesize;
1183 filesize = getfilesize(fp);
1184 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1185 char* pBuf = (char *)PyMem_MALLOC(filesize);
1186 if (pBuf != NULL) {
1187 PyObject* v;
1188 size_t n;
1189 /* filesize must fit into an int, because it
1190 is smaller than REASONABLE_FILE_LIMIT */
1191 n = fread(pBuf, 1, (int)filesize, fp);
1192 v = PyMarshal_ReadObjectFromString(pBuf, n);
1193 PyMem_FREE(pBuf);
1194 return v;
1195 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 }
Tim Peters691e0e92001-01-18 04:39:16 +00001198#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 /* We don't have fstat, or we do but the file is larger than
1200 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1201 */
1202 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001203
Tim Peters691e0e92001-01-18 04:39:16 +00001204#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001205}
1206
Guido van Rossum79f25d91997-04-29 20:08:16 +00001207PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001208PyMarshal_ReadObjectFromFile(FILE *fp)
1209{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 RFILE rf;
1211 PyObject *result;
1212 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001213 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001214 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001215 rf.depth = 0;
1216 rf.ptr = rf.end = NULL;
1217 result = r_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001219}
1220
1221PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001222PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001223{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001224 RFILE rf;
1225 PyObject *result;
1226 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001227 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001228 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001229 rf.ptr = str;
1230 rf.end = str + len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 rf.depth = 0;
1232 result = r_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001233 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001234}
1235
Guido van Rossum79f25d91997-04-29 20:08:16 +00001236PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001237PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001238{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 WFILE wf;
1240 PyObject *res = NULL;
Guido van Rossume6d39042007-05-09 00:01:30 +00001241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 wf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001243 wf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1245 if (wf.str == NULL)
1246 return NULL;
1247 wf.ptr = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1248 wf.end = wf.ptr + PyBytes_Size(wf.str);
1249 wf.error = WFERR_OK;
1250 wf.depth = 0;
1251 wf.version = version;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 w_object(x, &wf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 if (wf.str != NULL) {
1254 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1255 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1256 Py_DECREF(wf.str);
1257 PyErr_SetString(PyExc_OverflowError,
1258 "too much marshal data for a string");
1259 return NULL;
1260 }
1261 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1262 return NULL;
1263 }
1264 if (wf.error != WFERR_OK) {
1265 Py_XDECREF(wf.str);
1266 if (wf.error == WFERR_NOMEMORY)
1267 PyErr_NoMemory();
1268 else
1269 PyErr_SetString(PyExc_ValueError,
1270 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1271 :"object too deeply nested to marshal");
1272 return NULL;
1273 }
1274 if (wf.str != NULL) {
1275 /* XXX Quick hack -- need to do this differently */
1276 res = PyBytes_FromObject(wf.str);
1277 Py_DECREF(wf.str);
1278 }
1279 return res;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001280}
1281
Guido van Rossum64b45521991-06-07 13:58:22 +00001282/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001283
Guido van Rossum79f25d91997-04-29 20:08:16 +00001284static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001285marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001286{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 /* XXX Quick hack -- need to do this differently */
1288 PyObject *x;
1289 PyObject *f;
1290 int version = Py_MARSHAL_VERSION;
1291 PyObject *s;
1292 PyObject *res;
1293 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
1294 return NULL;
1295 s = PyMarshal_WriteObjectToString(x, version);
1296 if (s == NULL)
1297 return NULL;
1298 res = PyObject_CallMethod(f, "write", "O", s);
1299 Py_DECREF(s);
1300 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001301}
1302
R. David Murraydd226ea2009-05-13 12:27:21 +00001303PyDoc_STRVAR(dump_doc,
1304"dump(value, file[, version])\n\
1305\n\
1306Write the value on the open file. The value must be a supported type.\n\
1307The file must be an open file object such as sys.stdout or returned by\n\
1308open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1309\n\
1310If the value has (or contains an object that has) an unsupported type, a\n\
1311ValueError exception is raised but garbage data will also be written\n\
1312to the file. The object will not be properly read back by load()\n\
1313\n\
1314The version argument indicates the data format that dump should use.");
1315
Guido van Rossum79f25d91997-04-29 20:08:16 +00001316static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001317marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001318{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 PyObject *data, *result;
1320 RFILE rf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001321
1322 /*
1323 * Make a call to the read method, but read zero bytes.
1324 * This is to ensure that the object passed in at least
1325 * has a read method which returns bytes.
1326 */
1327 data = PyObject_CallMethod(f, "read", "i", 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001328 if (data == NULL)
1329 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001330 if (!PyBytes_Check(data)) {
1331 PyErr_Format(PyExc_TypeError,
1332 "f.read() returned not bytes but %.100s",
1333 data->ob_type->tp_name);
1334 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001335 }
1336 else {
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001337 rf.depth = 0;
1338 rf.fp = NULL;
1339 rf.readable = f;
Vinay Sajipaac0f752011-07-02 18:42:21 +01001340 rf.current_filename = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001341 result = read_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001342 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 Py_DECREF(data);
1344 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001345}
1346
R. David Murraydd226ea2009-05-13 12:27:21 +00001347PyDoc_STRVAR(load_doc,
1348"load(file)\n\
1349\n\
1350Read one value from the open file and return it. If no valid value is\n\
1351read (e.g. because the data has a different Python versions\n\
1352incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1353The file must be an open file object opened in binary mode ('rb' or\n\
1354'r+b').\n\
1355\n\
1356Note: If an object containing an unsupported type was marshalled with\n\
1357dump(), load() will substitute None for the unmarshallable type.");
1358
1359
Guido van Rossum79f25d91997-04-29 20:08:16 +00001360static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001361marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001362{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001363 PyObject *x;
1364 int version = Py_MARSHAL_VERSION;
1365 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
1366 return NULL;
1367 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001368}
1369
R. David Murraydd226ea2009-05-13 12:27:21 +00001370PyDoc_STRVAR(dumps_doc,
1371"dumps(value[, version])\n\
1372\n\
1373Return the string that would be written to a file by dump(value, file).\n\
1374The value must be a supported type. Raise a ValueError exception if\n\
1375value has (or contains an object that has) an unsupported type.\n\
1376\n\
1377The version argument indicates the data format that dumps should use.");
1378
1379
Guido van Rossum79f25d91997-04-29 20:08:16 +00001380static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001381marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001382{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 RFILE rf;
1384 Py_buffer p;
1385 char *s;
1386 Py_ssize_t n;
1387 PyObject* result;
1388 if (!PyArg_ParseTuple(args, "s*:loads", &p))
1389 return NULL;
1390 s = p.buf;
1391 n = p.len;
1392 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001393 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001394 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001395 rf.ptr = s;
1396 rf.end = s + n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001397 rf.depth = 0;
1398 result = read_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001399 PyBuffer_Release(&p);
1400 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001401}
1402
R. David Murraydd226ea2009-05-13 12:27:21 +00001403PyDoc_STRVAR(loads_doc,
1404"loads(string)\n\
1405\n\
1406Convert the string to a value. If no valid value is found, raise\n\
1407EOFError, ValueError or TypeError. Extra characters in the string are\n\
1408ignored.");
1409
Guido van Rossum79f25d91997-04-29 20:08:16 +00001410static PyMethodDef marshal_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001411 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1412 {"load", marshal_load, METH_O, load_doc},
1413 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1414 {"loads", marshal_loads, METH_VARARGS, loads_doc},
1415 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001416};
1417
R. David Murraydd226ea2009-05-13 12:27:21 +00001418
1419PyDoc_STRVAR(module_doc,
1420"This module contains functions that can read and write Python values in\n\
1421a binary format. The format is specific to Python, but independent of\n\
1422machine architecture issues.\n\
1423\n\
1424Not all Python object types are supported; in general, only objects\n\
1425whose value is independent from a particular invocation of Python can be\n\
1426written and read by this module. The following types are supported:\n\
1427None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1428tuples, lists, sets, dictionaries, and code objects, where it\n\
1429should be understood that tuples, lists and dictionaries are only\n\
1430supported as long as the values contained therein are themselves\n\
1431supported; and recursive lists and dictionaries should not be written\n\
1432(they will cause infinite loops).\n\
1433\n\
1434Variables:\n\
1435\n\
1436version -- indicates the format that the module uses. Version 0 is the\n\
1437 historical format, version 1 shares interned strings and version 2\n\
1438 uses a binary format for floating point numbers.\n\
1439\n\
1440Functions:\n\
1441\n\
1442dump() -- write value to a file\n\
1443load() -- read value from a file\n\
1444dumps() -- write value to a string\n\
1445loads() -- read value from a string");
1446
1447
1448
Brett Cannon429ef652008-06-27 00:35:35 +00001449static struct PyModuleDef marshalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450 PyModuleDef_HEAD_INIT,
1451 "marshal",
1452 module_doc,
1453 0,
1454 marshal_methods,
1455 NULL,
1456 NULL,
1457 NULL,
1458 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001459};
1460
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001461PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001462PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001463{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001464 PyObject *mod = PyModule_Create(&marshalmodule);
1465 if (mod == NULL)
1466 return NULL;
1467 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
1468 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001469}