blob: b94e8d86118fe9f57be9810c77ce63254d345458 [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;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000412 Py_buffer view;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100413 if (PyObject_GetBuffer(v, &view, PyBUF_SIMPLE) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000414 w_byte(TYPE_UNKNOWN, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100415 p->depth--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 p->error = WFERR_UNMARSHALLABLE;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100417 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000418 }
419 w_byte(TYPE_STRING, p);
420 n = view.len;
421 s = view.buf;
422 if (n > INT_MAX) {
423 p->depth--;
424 p->error = WFERR_UNMARSHALLABLE;
425 return;
426 }
427 w_long((long)n, p);
428 w_string(s, (int)n, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100429 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000430 }
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 {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200483 _Py_IDENTIFIER(read);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200484
485 PyObject *data = _PyObject_CallMethodId(p->readable, &PyId_read, "i", n);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100486 read = 0;
487 if (data != NULL) {
488 if (!PyBytes_Check(data)) {
489 PyErr_Format(PyExc_TypeError,
490 "f.read() returned not bytes but %.100s",
491 data->ob_type->tp_name);
492 }
493 else {
494 read = PyBytes_GET_SIZE(data);
495 if (read > 0) {
496 ptr = PyBytes_AS_STRING(data);
497 memcpy(s, ptr, read);
498 }
499 }
500 Py_DECREF(data);
501 }
502 }
503 if (!PyErr_Occurred() && (read < n)) {
504 PyErr_SetString(PyExc_EOFError, "EOF read where not expected");
505 }
506 return read;
507}
508
509
510static int
511r_byte(RFILE *p)
512{
513 int c = EOF;
514 unsigned char ch;
515 int n;
516
517 if (!p->readable)
518 c = p->fp ? getc(p->fp) : rs_byte(p);
519 else {
520 n = r_string((char *) &ch, 1, p);
521 if (n > 0)
522 c = ch;
523 }
524 return c;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000525}
526
527static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000528r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000529{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000530 register short x;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100531 unsigned char buffer[2];
532
533 r_string((char *) buffer, 2, p);
534 x = buffer[0];
535 x |= buffer[1] << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 /* Sign-extension, in case short greater than 16 bits */
537 x |= -(x & 0x8000);
538 return x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000539}
540
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000541static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000542r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000543{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000544 register long x;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100545 unsigned char buffer[4];
546
547 r_string((char *) buffer, 4, p);
548 x = buffer[0];
549 x |= (long)buffer[1] << 8;
550 x |= (long)buffer[2] << 16;
551 x |= (long)buffer[3] << 24;
Guido van Rossumc1547d91996-12-10 15:39:04 +0000552#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 /* Sign extension for 64-bit machines */
554 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000555#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 return x;
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000557}
558
Tim Peters82112372001-08-29 02:28:42 +0000559/* r_long64 deals with the TYPE_INT64 code. On a machine with
560 sizeof(long) > 4, it returns a Python int object, else a Python long
561 object. Note that w_long64 writes out TYPE_INT if 32 bits is enough,
562 so there's no inefficiency here in returning a PyLong on 32-bit boxes
563 for everything written via TYPE_INT64 (i.e., if an int is written via
564 TYPE_INT64, it *needs* more than 32 bits).
565*/
566static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000567r_long64(RFILE *p)
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000568{
Éric Araujo6c0ba442011-07-26 17:23:57 +0200569 PyObject *result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 long lo4 = r_long(p);
571 long hi4 = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100572
573 if (!PyErr_Occurred()) {
Guido van Rossumc1547d91996-12-10 15:39:04 +0000574#if SIZEOF_LONG > 4
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100575 long x = (hi4 << 32) | (lo4 & 0xFFFFFFFFL);
576 result = PyLong_FromLong(x);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000577#else
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100578 unsigned char buf[8];
579 int one = 1;
580 int is_little_endian = (int)*(char*)&one;
581 if (is_little_endian) {
582 memcpy(buf, &lo4, 4);
583 memcpy(buf+4, &hi4, 4);
584 }
585 else {
586 memcpy(buf, &hi4, 4);
587 memcpy(buf+4, &lo4, 4);
588 }
589 result = _PyLong_FromByteArray(buf, 8, is_little_endian, 1);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000590#endif
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100591 }
592 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000593}
594
Guido van Rossum79f25d91997-04-29 20:08:16 +0000595static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000596r_PyLong(RFILE *p)
597{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 PyLongObject *ob;
599 int size, i, j, md, shorts_in_top_digit;
600 long n;
601 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100604 if (PyErr_Occurred())
605 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 if (n == 0)
607 return (PyObject *)_PyLong_New(0);
608 if (n < -INT_MAX || n > INT_MAX) {
609 PyErr_SetString(PyExc_ValueError,
610 "bad marshal data (long size out of range)");
611 return NULL;
612 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 size = 1 + (ABS(n) - 1) / PyLong_MARSHAL_RATIO;
615 shorts_in_top_digit = 1 + (ABS(n) - 1) % PyLong_MARSHAL_RATIO;
616 ob = _PyLong_New(size);
617 if (ob == NULL)
618 return NULL;
619 Py_SIZE(ob) = n > 0 ? size : -size;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 for (i = 0; i < size-1; i++) {
622 d = 0;
623 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
624 md = r_short(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100625 if (PyErr_Occurred())
626 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 if (md < 0 || md > PyLong_MARSHAL_BASE)
628 goto bad_digit;
629 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
630 }
631 ob->ob_digit[i] = d;
632 }
633 d = 0;
634 for (j=0; j < shorts_in_top_digit; j++) {
635 md = r_short(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100636 if (PyErr_Occurred())
637 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000638 if (md < 0 || md > PyLong_MARSHAL_BASE)
639 goto bad_digit;
640 /* topmost marshal digit should be nonzero */
641 if (md == 0 && j == shorts_in_top_digit - 1) {
642 Py_DECREF(ob);
643 PyErr_SetString(PyExc_ValueError,
644 "bad marshal data (unnormalized long data)");
645 return NULL;
646 }
647 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
648 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100649 if (PyErr_Occurred()) {
650 Py_DECREF(ob);
651 return NULL;
652 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000653 /* top digit should be nonzero, else the resulting PyLong won't be
654 normalized */
655 ob->ob_digit[size-1] = d;
656 return (PyObject *)ob;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000657 bad_digit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 Py_DECREF(ob);
659 PyErr_SetString(PyExc_ValueError,
660 "bad marshal data (digit out of range in long)");
661 return NULL;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000662}
663
664
665static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000666r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000667{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 /* NULL is a valid return value, it does not necessarily means that
669 an exception is set. */
670 PyObject *v, *v2;
671 long i, n;
672 int type = r_byte(p);
673 PyObject *retval;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
678 p->depth--;
679 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
680 return NULL;
681 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 case EOF:
686 PyErr_SetString(PyExc_EOFError,
687 "EOF read where object expected");
688 retval = NULL;
689 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000691 case TYPE_NULL:
692 retval = NULL;
693 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 case TYPE_NONE:
696 Py_INCREF(Py_None);
697 retval = Py_None;
698 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000700 case TYPE_STOPITER:
701 Py_INCREF(PyExc_StopIteration);
702 retval = PyExc_StopIteration;
703 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000705 case TYPE_ELLIPSIS:
706 Py_INCREF(Py_Ellipsis);
707 retval = Py_Ellipsis;
708 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 case TYPE_FALSE:
711 Py_INCREF(Py_False);
712 retval = Py_False;
713 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 case TYPE_TRUE:
716 Py_INCREF(Py_True);
717 retval = Py_True;
718 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000720 case TYPE_INT:
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100721 n = r_long(p);
722 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000724
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 case TYPE_INT64:
726 retval = r_long64(p);
727 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000729 case TYPE_LONG:
730 retval = r_PyLong(p);
731 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000733 case TYPE_FLOAT:
734 {
735 char buf[256];
736 double dx;
737 retval = NULL;
738 n = r_byte(p);
739 if (n == EOF || r_string(buf, (int)n, p) != n) {
740 PyErr_SetString(PyExc_EOFError,
741 "EOF read where object expected");
742 break;
743 }
744 buf[n] = '\0';
745 dx = PyOS_string_to_double(buf, NULL, NULL);
746 if (dx == -1.0 && PyErr_Occurred())
747 break;
748 retval = PyFloat_FromDouble(dx);
749 break;
750 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000752 case TYPE_BINARY_FLOAT:
753 {
754 unsigned char buf[8];
755 double x;
756 if (r_string((char*)buf, 8, p) != 8) {
757 PyErr_SetString(PyExc_EOFError,
758 "EOF read where object expected");
759 retval = NULL;
760 break;
761 }
762 x = _PyFloat_Unpack8(buf, 1);
763 if (x == -1.0 && PyErr_Occurred()) {
764 retval = NULL;
765 break;
766 }
767 retval = PyFloat_FromDouble(x);
768 break;
769 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 case TYPE_COMPLEX:
772 {
773 char buf[256];
774 Py_complex c;
775 retval = NULL;
776 n = r_byte(p);
777 if (n == EOF || r_string(buf, (int)n, p) != n) {
778 PyErr_SetString(PyExc_EOFError,
779 "EOF read where object expected");
780 break;
781 }
782 buf[n] = '\0';
783 c.real = PyOS_string_to_double(buf, NULL, NULL);
784 if (c.real == -1.0 && PyErr_Occurred())
785 break;
786 n = r_byte(p);
787 if (n == EOF || r_string(buf, (int)n, p) != n) {
788 PyErr_SetString(PyExc_EOFError,
789 "EOF read where object expected");
790 break;
791 }
792 buf[n] = '\0';
793 c.imag = PyOS_string_to_double(buf, NULL, NULL);
794 if (c.imag == -1.0 && PyErr_Occurred())
795 break;
796 retval = PyComplex_FromCComplex(c);
797 break;
798 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000800 case TYPE_BINARY_COMPLEX:
801 {
802 unsigned char buf[8];
803 Py_complex c;
804 if (r_string((char*)buf, 8, p) != 8) {
805 PyErr_SetString(PyExc_EOFError,
806 "EOF read where object expected");
807 retval = NULL;
808 break;
809 }
810 c.real = _PyFloat_Unpack8(buf, 1);
811 if (c.real == -1.0 && PyErr_Occurred()) {
812 retval = NULL;
813 break;
814 }
815 if (r_string((char*)buf, 8, p) != 8) {
816 PyErr_SetString(PyExc_EOFError,
817 "EOF read where object expected");
818 retval = NULL;
819 break;
820 }
821 c.imag = _PyFloat_Unpack8(buf, 1);
822 if (c.imag == -1.0 && PyErr_Occurred()) {
823 retval = NULL;
824 break;
825 }
826 retval = PyComplex_FromCComplex(c);
827 break;
828 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 case TYPE_STRING:
831 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100832 if (PyErr_Occurred()) {
833 retval = NULL;
834 break;
835 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 if (n < 0 || n > INT_MAX) {
837 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
838 retval = NULL;
839 break;
840 }
841 v = PyBytes_FromStringAndSize((char *)NULL, n);
842 if (v == NULL) {
843 retval = NULL;
844 break;
845 }
846 if (r_string(PyBytes_AS_STRING(v), (int)n, p) != n) {
847 Py_DECREF(v);
848 PyErr_SetString(PyExc_EOFError,
849 "EOF read where object expected");
850 retval = NULL;
851 break;
852 }
853 retval = v;
854 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 case TYPE_UNICODE:
857 {
858 char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +0000859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000860 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100861 if (PyErr_Occurred()) {
862 retval = NULL;
863 break;
864 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000865 if (n < 0 || n > INT_MAX) {
866 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
867 retval = NULL;
868 break;
869 }
870 buffer = PyMem_NEW(char, n);
871 if (buffer == NULL) {
872 retval = PyErr_NoMemory();
873 break;
874 }
875 if (r_string(buffer, (int)n, p) != n) {
876 PyMem_DEL(buffer);
877 PyErr_SetString(PyExc_EOFError,
878 "EOF read where object expected");
879 retval = NULL;
880 break;
881 }
882 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
883 PyMem_DEL(buffer);
884 retval = v;
885 break;
886 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 case TYPE_TUPLE:
889 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100890 if (PyErr_Occurred()) {
891 retval = NULL;
892 break;
893 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000894 if (n < 0 || n > INT_MAX) {
895 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
896 retval = NULL;
897 break;
898 }
899 v = PyTuple_New((int)n);
900 if (v == NULL) {
901 retval = NULL;
902 break;
903 }
904 for (i = 0; i < n; i++) {
905 v2 = r_object(p);
906 if ( v2 == NULL ) {
907 if (!PyErr_Occurred())
908 PyErr_SetString(PyExc_TypeError,
909 "NULL object in marshal data for tuple");
910 Py_DECREF(v);
911 v = NULL;
912 break;
913 }
914 PyTuple_SET_ITEM(v, (int)i, v2);
915 }
916 retval = v;
917 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000918
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000919 case TYPE_LIST:
920 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100921 if (PyErr_Occurred()) {
922 retval = NULL;
923 break;
924 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 if (n < 0 || n > INT_MAX) {
926 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
927 retval = NULL;
928 break;
929 }
930 v = PyList_New((int)n);
931 if (v == NULL) {
932 retval = NULL;
933 break;
934 }
935 for (i = 0; i < n; i++) {
936 v2 = r_object(p);
937 if ( v2 == NULL ) {
938 if (!PyErr_Occurred())
939 PyErr_SetString(PyExc_TypeError,
940 "NULL object in marshal data for list");
941 Py_DECREF(v);
942 v = NULL;
943 break;
944 }
945 PyList_SET_ITEM(v, (int)i, v2);
946 }
947 retval = v;
948 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 case TYPE_DICT:
951 v = PyDict_New();
952 if (v == NULL) {
953 retval = NULL;
954 break;
955 }
956 for (;;) {
957 PyObject *key, *val;
958 key = r_object(p);
959 if (key == NULL)
960 break;
961 val = r_object(p);
962 if (val != NULL)
963 PyDict_SetItem(v, key, val);
964 Py_DECREF(key);
965 Py_XDECREF(val);
966 }
967 if (PyErr_Occurred()) {
968 Py_DECREF(v);
969 v = NULL;
970 }
971 retval = v;
972 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000973
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974 case TYPE_SET:
975 case TYPE_FROZENSET:
976 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100977 if (PyErr_Occurred()) {
978 retval = NULL;
979 break;
980 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 if (n < 0 || n > INT_MAX) {
982 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
983 retval = NULL;
984 break;
985 }
986 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
987 if (v == NULL) {
988 retval = NULL;
989 break;
990 }
991 for (i = 0; i < n; i++) {
992 v2 = r_object(p);
993 if ( v2 == NULL ) {
994 if (!PyErr_Occurred())
995 PyErr_SetString(PyExc_TypeError,
996 "NULL object in marshal data for set");
997 Py_DECREF(v);
998 v = NULL;
999 break;
1000 }
1001 if (PySet_Add(v, v2) == -1) {
1002 Py_DECREF(v);
1003 Py_DECREF(v2);
1004 v = NULL;
1005 break;
1006 }
1007 Py_DECREF(v2);
1008 }
1009 retval = v;
1010 break;
Raymond Hettingera422c342005-01-11 03:03:27 +00001011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 case TYPE_CODE:
1013 {
1014 int argcount;
1015 int kwonlyargcount;
1016 int nlocals;
1017 int stacksize;
1018 int flags;
1019 PyObject *code = NULL;
1020 PyObject *consts = NULL;
1021 PyObject *names = NULL;
1022 PyObject *varnames = NULL;
1023 PyObject *freevars = NULL;
1024 PyObject *cellvars = NULL;
1025 PyObject *filename = NULL;
1026 PyObject *name = NULL;
1027 int firstlineno;
1028 PyObject *lnotab = NULL;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001030 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 /* XXX ignore long->int overflows for now */
1033 argcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001034 if (PyErr_Occurred())
1035 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 kwonlyargcount = (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 nlocals = (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 stacksize = (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 flags = (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 code = r_object(p);
1049 if (code == NULL)
1050 goto code_error;
1051 consts = r_object(p);
1052 if (consts == NULL)
1053 goto code_error;
1054 names = r_object(p);
1055 if (names == NULL)
1056 goto code_error;
1057 varnames = r_object(p);
1058 if (varnames == NULL)
1059 goto code_error;
1060 freevars = r_object(p);
1061 if (freevars == NULL)
1062 goto code_error;
1063 cellvars = r_object(p);
1064 if (cellvars == NULL)
1065 goto code_error;
1066 filename = r_object(p);
1067 if (filename == NULL)
1068 goto code_error;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001069 if (PyUnicode_CheckExact(filename)) {
1070 if (p->current_filename != NULL) {
1071 if (!PyUnicode_Compare(filename, p->current_filename)) {
1072 Py_DECREF(filename);
1073 Py_INCREF(p->current_filename);
1074 filename = p->current_filename;
1075 }
1076 }
1077 else {
1078 p->current_filename = filename;
1079 }
1080 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 name = r_object(p);
1082 if (name == NULL)
1083 goto code_error;
1084 firstlineno = (int)r_long(p);
1085 lnotab = r_object(p);
1086 if (lnotab == NULL)
1087 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001089 v = (PyObject *) PyCode_New(
1090 argcount, kwonlyargcount,
1091 nlocals, stacksize, flags,
1092 code, consts, names, varnames,
1093 freevars, cellvars, filename, name,
1094 firstlineno, lnotab);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001095
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001096 code_error:
1097 Py_XDECREF(code);
1098 Py_XDECREF(consts);
1099 Py_XDECREF(names);
1100 Py_XDECREF(varnames);
1101 Py_XDECREF(freevars);
1102 Py_XDECREF(cellvars);
1103 Py_XDECREF(filename);
1104 Py_XDECREF(name);
1105 Py_XDECREF(lnotab);
1106 }
1107 retval = v;
1108 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 default:
1111 /* Bogus data got written, which isn't ideal.
1112 This will let you keep working and recover. */
1113 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
1114 retval = NULL;
1115 break;
1116
1117 }
1118 p->depth--;
1119 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001120}
1121
Neal Norwitzd85c4522004-06-13 20:31:49 +00001122static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001123read_object(RFILE *p)
1124{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 PyObject *v;
1126 if (PyErr_Occurred()) {
1127 fprintf(stderr, "XXX readobject called with exception set\n");
1128 return NULL;
1129 }
1130 v = r_object(p);
1131 if (v == NULL && !PyErr_Occurred())
1132 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1133 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001134}
1135
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001136int
1137PyMarshal_ReadShortFromFile(FILE *fp)
1138{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 RFILE rf;
1140 assert(fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001141 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 rf.fp = fp;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001143 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 rf.end = rf.ptr = NULL;
1145 return r_short(&rf);
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001146}
1147
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001148long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001149PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001151 RFILE rf;
1152 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001153 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001154 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 rf.ptr = rf.end = NULL;
1156 return r_long(&rf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001157}
1158
Tim Peters691e0e92001-01-18 04:39:16 +00001159#ifdef HAVE_FSTAT
1160/* Return size of file in bytes; < 0 if unknown. */
1161static off_t
1162getfilesize(FILE *fp)
1163{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 struct stat st;
1165 if (fstat(fileno(fp), &st) != 0)
1166 return -1;
1167 else
1168 return st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001169}
1170#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001171
Tim Peters691e0e92001-01-18 04:39:16 +00001172/* If we can get the size of the file up-front, and it's reasonably small,
1173 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1174 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001175 * CAUTION: since this may read the entire remainder of the file, don't
1176 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001177 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001178PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001179PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001180{
Antoine Pitrou5bc7ec92010-04-21 22:56:22 +00001181/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
Tim Peters691e0e92001-01-18 04:39:16 +00001182#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001183#ifdef HAVE_FSTAT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 off_t filesize;
1185 filesize = getfilesize(fp);
1186 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1187 char* pBuf = (char *)PyMem_MALLOC(filesize);
1188 if (pBuf != NULL) {
1189 PyObject* v;
1190 size_t n;
1191 /* filesize must fit into an int, because it
1192 is smaller than REASONABLE_FILE_LIMIT */
1193 n = fread(pBuf, 1, (int)filesize, fp);
1194 v = PyMarshal_ReadObjectFromString(pBuf, n);
1195 PyMem_FREE(pBuf);
1196 return v;
1197 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 }
Tim Peters691e0e92001-01-18 04:39:16 +00001200#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001201 /* We don't have fstat, or we do but the file is larger than
1202 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1203 */
1204 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001205
Tim Peters691e0e92001-01-18 04:39:16 +00001206#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001207}
1208
Guido van Rossum79f25d91997-04-29 20:08:16 +00001209PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001210PyMarshal_ReadObjectFromFile(FILE *fp)
1211{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001212 RFILE rf;
1213 PyObject *result;
1214 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001215 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001216 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 rf.depth = 0;
1218 rf.ptr = rf.end = NULL;
1219 result = r_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001221}
1222
1223PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001224PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001225{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 RFILE rf;
1227 PyObject *result;
1228 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001229 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001230 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 rf.ptr = str;
1232 rf.end = str + len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001233 rf.depth = 0;
1234 result = r_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001236}
1237
Guido van Rossum79f25d91997-04-29 20:08:16 +00001238PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001239PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001240{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 WFILE wf;
Guido van Rossume6d39042007-05-09 00:01:30 +00001242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001243 wf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001244 wf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1246 if (wf.str == NULL)
1247 return NULL;
1248 wf.ptr = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1249 wf.end = wf.ptr + PyBytes_Size(wf.str);
1250 wf.error = WFERR_OK;
1251 wf.depth = 0;
1252 wf.version = version;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 w_object(x, &wf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 if (wf.str != NULL) {
1255 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1256 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1257 Py_DECREF(wf.str);
1258 PyErr_SetString(PyExc_OverflowError,
1259 "too much marshal data for a string");
1260 return NULL;
1261 }
1262 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1263 return NULL;
1264 }
1265 if (wf.error != WFERR_OK) {
1266 Py_XDECREF(wf.str);
1267 if (wf.error == WFERR_NOMEMORY)
1268 PyErr_NoMemory();
1269 else
1270 PyErr_SetString(PyExc_ValueError,
1271 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1272 :"object too deeply nested to marshal");
1273 return NULL;
1274 }
Antoine Pitrou1c13f842012-03-02 18:22:23 +01001275 return wf.str;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001276}
1277
Guido van Rossum64b45521991-06-07 13:58:22 +00001278/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001279
Guido van Rossum79f25d91997-04-29 20:08:16 +00001280static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001281marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001282{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 /* XXX Quick hack -- need to do this differently */
1284 PyObject *x;
1285 PyObject *f;
1286 int version = Py_MARSHAL_VERSION;
1287 PyObject *s;
1288 PyObject *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001289 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
1292 return NULL;
1293 s = PyMarshal_WriteObjectToString(x, version);
1294 if (s == NULL)
1295 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001296 res = _PyObject_CallMethodId(f, &PyId_write, "O", s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297 Py_DECREF(s);
1298 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001299}
1300
R. David Murraydd226ea2009-05-13 12:27:21 +00001301PyDoc_STRVAR(dump_doc,
1302"dump(value, file[, version])\n\
1303\n\
1304Write the value on the open file. The value must be a supported type.\n\
1305The file must be an open file object such as sys.stdout or returned by\n\
1306open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1307\n\
1308If the value has (or contains an object that has) an unsupported type, a\n\
1309ValueError exception is raised but garbage data will also be written\n\
1310to the file. The object will not be properly read back by load()\n\
1311\n\
1312The version argument indicates the data format that dump should use.");
1313
Guido van Rossum79f25d91997-04-29 20:08:16 +00001314static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001315marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001316{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 PyObject *data, *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001318 _Py_IDENTIFIER(read);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 RFILE rf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001320
1321 /*
1322 * Make a call to the read method, but read zero bytes.
1323 * This is to ensure that the object passed in at least
1324 * has a read method which returns bytes.
1325 */
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001326 data = _PyObject_CallMethodId(f, &PyId_read, "i", 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 if (data == NULL)
1328 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001329 if (!PyBytes_Check(data)) {
1330 PyErr_Format(PyExc_TypeError,
1331 "f.read() returned not bytes but %.100s",
1332 data->ob_type->tp_name);
1333 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 }
1335 else {
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001336 rf.depth = 0;
1337 rf.fp = NULL;
1338 rf.readable = f;
Vinay Sajipaac0f752011-07-02 18:42:21 +01001339 rf.current_filename = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001340 result = read_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001342 Py_DECREF(data);
1343 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001344}
1345
R. David Murraydd226ea2009-05-13 12:27:21 +00001346PyDoc_STRVAR(load_doc,
1347"load(file)\n\
1348\n\
1349Read one value from the open file and return it. If no valid value is\n\
1350read (e.g. because the data has a different Python versions\n\
1351incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1352The file must be an open file object opened in binary mode ('rb' or\n\
1353'r+b').\n\
1354\n\
1355Note: If an object containing an unsupported type was marshalled with\n\
1356dump(), load() will substitute None for the unmarshallable type.");
1357
1358
Guido van Rossum79f25d91997-04-29 20:08:16 +00001359static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001360marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001361{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001362 PyObject *x;
1363 int version = Py_MARSHAL_VERSION;
1364 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
1365 return NULL;
1366 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001367}
1368
R. David Murraydd226ea2009-05-13 12:27:21 +00001369PyDoc_STRVAR(dumps_doc,
1370"dumps(value[, version])\n\
1371\n\
1372Return the string that would be written to a file by dump(value, file).\n\
1373The value must be a supported type. Raise a ValueError exception if\n\
1374value has (or contains an object that has) an unsupported type.\n\
1375\n\
1376The version argument indicates the data format that dumps should use.");
1377
1378
Guido van Rossum79f25d91997-04-29 20:08:16 +00001379static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001380marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001381{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001382 RFILE rf;
1383 Py_buffer p;
1384 char *s;
1385 Py_ssize_t n;
1386 PyObject* result;
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001387 if (!PyArg_ParseTuple(args, "y*:loads", &p))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001388 return NULL;
1389 s = p.buf;
1390 n = p.len;
1391 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001392 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001393 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001394 rf.ptr = s;
1395 rf.end = s + n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001396 rf.depth = 0;
1397 result = read_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001398 PyBuffer_Release(&p);
1399 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001400}
1401
R. David Murraydd226ea2009-05-13 12:27:21 +00001402PyDoc_STRVAR(loads_doc,
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001403"loads(bytes)\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001404\n\
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001405Convert the bytes object to a value. If no valid value is found, raise\n\
1406EOFError, ValueError or TypeError. Extra characters in the input are\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001407ignored.");
1408
Guido van Rossum79f25d91997-04-29 20:08:16 +00001409static PyMethodDef marshal_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001410 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1411 {"load", marshal_load, METH_O, load_doc},
1412 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1413 {"loads", marshal_loads, METH_VARARGS, loads_doc},
1414 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001415};
1416
R. David Murraydd226ea2009-05-13 12:27:21 +00001417
1418PyDoc_STRVAR(module_doc,
1419"This module contains functions that can read and write Python values in\n\
1420a binary format. The format is specific to Python, but independent of\n\
1421machine architecture issues.\n\
1422\n\
1423Not all Python object types are supported; in general, only objects\n\
1424whose value is independent from a particular invocation of Python can be\n\
1425written and read by this module. The following types are supported:\n\
1426None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1427tuples, lists, sets, dictionaries, and code objects, where it\n\
1428should be understood that tuples, lists and dictionaries are only\n\
1429supported as long as the values contained therein are themselves\n\
1430supported; and recursive lists and dictionaries should not be written\n\
1431(they will cause infinite loops).\n\
1432\n\
1433Variables:\n\
1434\n\
1435version -- indicates the format that the module uses. Version 0 is the\n\
1436 historical format, version 1 shares interned strings and version 2\n\
1437 uses a binary format for floating point numbers.\n\
1438\n\
1439Functions:\n\
1440\n\
1441dump() -- write value to a file\n\
1442load() -- read value from a file\n\
1443dumps() -- write value to a string\n\
1444loads() -- read value from a string");
1445
1446
1447
Brett Cannon429ef652008-06-27 00:35:35 +00001448static struct PyModuleDef marshalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001449 PyModuleDef_HEAD_INIT,
1450 "marshal",
1451 module_doc,
1452 0,
1453 marshal_methods,
1454 NULL,
1455 NULL,
1456 NULL,
1457 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001458};
1459
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001460PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001461PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001462{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 PyObject *mod = PyModule_Create(&marshalmodule);
1464 if (mod == NULL)
1465 return NULL;
1466 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
1467 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001468}