blob: 21093eec45eadcd344a9744c978709314925cd31 [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 Pitrou7f14f0d2010-05-09 16:14:21 +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 Pitrou7f14f0d2010-05-09 16:14:21 +000056 FILE *fp;
57 int error; /* see WFERR_* values */
58 int depth;
59 /* If fp == NULL, the following are valid: */
60 PyObject *str;
61 char *ptr;
62 char *end;
63 PyObject *strings; /* dict on marshal, list on unmarshal */
64 int version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000065} WFILE;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000066
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000067#define w_byte(c, p) if (((p)->fp)) putc((c), (p)->fp); \
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000068 else if ((p)->ptr != (p)->end) *(p)->ptr++ = (c); \
69 else w_more(c, p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000070
71static void
Fredrik Lundh11534382000-07-23 18:24:06 +000072w_more(int c, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000073{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000074 Py_ssize_t size, newsize;
75 if (p->str == NULL)
76 return; /* An error already occurred */
77 size = PyBytes_Size(p->str);
78 newsize = size + size + 1024;
79 if (newsize > 32*1024*1024) {
80 newsize = size + (size >> 3); /* 12.5% overallocation */
81 }
82 if (_PyBytes_Resize(&p->str, newsize) != 0) {
83 p->ptr = p->end = NULL;
84 }
85 else {
86 p->ptr = PyBytes_AS_STRING((PyBytesObject *)p->str) + size;
87 p->end =
88 PyBytes_AS_STRING((PyBytesObject *)p->str) + newsize;
89 *p->ptr++ = Py_SAFE_DOWNCAST(c, int, char);
90 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000091}
92
93static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000094w_string(char *s, int n, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000095{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000096 if (p->fp != NULL) {
97 fwrite(s, 1, n, p->fp);
98 }
99 else {
100 while (--n >= 0) {
101 w_byte(*s, p);
102 s++;
103 }
104 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000105}
106
107static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000108w_short(int x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000109{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000110 w_byte((char)( x & 0xff), p);
111 w_byte((char)((x>> 8) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000112}
113
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000114static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000115w_long(long x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000116{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000117 w_byte((char)( x & 0xff), p);
118 w_byte((char)((x>> 8) & 0xff), p);
119 w_byte((char)((x>>16) & 0xff), p);
120 w_byte((char)((x>>24) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000121}
122
Guido van Rossumc1547d91996-12-10 15:39:04 +0000123#if SIZEOF_LONG > 4
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000124static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000125w_long64(long x, WFILE *p)
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000126{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000127 w_long(x, p);
128 w_long(x>>32, p);
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000129}
Guido van Rossumc1547d91996-12-10 15:39:04 +0000130#endif
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000131
Mark Dickinsonbd792642009-03-18 20:06:12 +0000132/* We assume that Python longs are stored internally in base some power of
133 2**15; for the sake of portability we'll always read and write them in base
134 exactly 2**15. */
135
136#define PyLong_MARSHAL_SHIFT 15
137#define PyLong_MARSHAL_BASE ((short)1 << PyLong_MARSHAL_SHIFT)
138#define PyLong_MARSHAL_MASK (PyLong_MARSHAL_BASE - 1)
139#if PyLong_SHIFT % PyLong_MARSHAL_SHIFT != 0
140#error "PyLong_SHIFT must be a multiple of PyLong_MARSHAL_SHIFT"
141#endif
142#define PyLong_MARSHAL_RATIO (PyLong_SHIFT / PyLong_MARSHAL_SHIFT)
143
144static void
145w_PyLong(const PyLongObject *ob, WFILE *p)
146{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000147 Py_ssize_t i, j, n, l;
148 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000149
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000150 w_byte(TYPE_LONG, p);
151 if (Py_SIZE(ob) == 0) {
152 w_long((long)0, p);
153 return;
154 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000155
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000156 /* set l to number of base PyLong_MARSHAL_BASE digits */
157 n = ABS(Py_SIZE(ob));
158 l = (n-1) * PyLong_MARSHAL_RATIO;
159 d = ob->ob_digit[n-1];
160 assert(d != 0); /* a PyLong is always normalized */
161 do {
162 d >>= PyLong_MARSHAL_SHIFT;
163 l++;
164 } while (d != 0);
165 w_long((long)(Py_SIZE(ob) > 0 ? l : -l), p);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000166
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000167 for (i=0; i < n-1; i++) {
168 d = ob->ob_digit[i];
169 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
170 w_short(d & PyLong_MARSHAL_MASK, p);
171 d >>= PyLong_MARSHAL_SHIFT;
172 }
173 assert (d == 0);
174 }
175 d = ob->ob_digit[n-1];
176 do {
177 w_short(d & PyLong_MARSHAL_MASK, p);
178 d >>= PyLong_MARSHAL_SHIFT;
179 } while (d != 0);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000180}
181
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000182static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000183w_object(PyObject *v, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000184{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000185 Py_ssize_t i, n;
Fred Drake6da0b912000-06-28 18:47:56 +0000186
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000187 p->depth++;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000188
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000189 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
190 p->error = WFERR_NESTEDTOODEEP;
191 }
192 else if (v == NULL) {
193 w_byte(TYPE_NULL, p);
194 }
195 else if (v == Py_None) {
196 w_byte(TYPE_NONE, p);
197 }
198 else if (v == PyExc_StopIteration) {
199 w_byte(TYPE_STOPITER, p);
200 }
201 else if (v == Py_Ellipsis) {
202 w_byte(TYPE_ELLIPSIS, p);
203 }
204 else if (v == Py_False) {
205 w_byte(TYPE_FALSE, p);
206 }
207 else if (v == Py_True) {
208 w_byte(TYPE_TRUE, p);
209 }
210 else if (PyLong_CheckExact(v)) {
211 long x = PyLong_AsLong(v);
212 if ((x == -1) && PyErr_Occurred()) {
213 PyLongObject *ob = (PyLongObject *)v;
214 PyErr_Clear();
215 w_PyLong(ob, p);
216 }
217 else {
Guido van Rossumc1547d91996-12-10 15:39:04 +0000218#if SIZEOF_LONG > 4
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000219 long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
220 if (y && y != -1) {
221 w_byte(TYPE_INT64, p);
222 w_long64(x, p);
223 }
224 else
Guido van Rossumc1547d91996-12-10 15:39:04 +0000225#endif
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000226 {
227 w_byte(TYPE_INT, p);
228 w_long(x, p);
229 }
230 }
231 }
232 else if (PyFloat_CheckExact(v)) {
233 if (p->version > 1) {
234 unsigned char buf[8];
235 if (_PyFloat_Pack8(PyFloat_AsDouble(v),
236 buf, 1) < 0) {
237 p->error = WFERR_UNMARSHALLABLE;
238 return;
239 }
240 w_byte(TYPE_BINARY_FLOAT, p);
241 w_string((char*)buf, 8, p);
242 }
243 else {
244 char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
245 'g', 17, 0, NULL);
246 if (!buf) {
247 p->error = WFERR_NOMEMORY;
248 return;
249 }
250 n = strlen(buf);
251 w_byte(TYPE_FLOAT, p);
252 w_byte((int)n, p);
253 w_string(buf, (int)n, p);
254 PyMem_Free(buf);
255 }
256 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000257#ifndef WITHOUT_COMPLEX
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000258 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 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000300#endif
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000301 else if (PyBytes_CheckExact(v)) {
302 w_byte(TYPE_STRING, p);
303 n = PyBytes_GET_SIZE(v);
304 if (n > INT_MAX) {
305 /* huge strings are not supported */
306 p->depth--;
307 p->error = WFERR_UNMARSHALLABLE;
308 return;
309 }
310 w_long((long)n, p);
311 w_string(PyBytes_AS_STRING(v), (int)n, p);
312 }
313 else if (PyUnicode_CheckExact(v)) {
314 PyObject *utf8;
315 utf8 = PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(v),
316 PyUnicode_GET_SIZE(v),
317 "surrogatepass");
318 if (utf8 == NULL) {
319 p->depth--;
320 p->error = WFERR_UNMARSHALLABLE;
321 return;
322 }
323 w_byte(TYPE_UNICODE, p);
324 n = PyBytes_GET_SIZE(utf8);
325 if (n > INT_MAX) {
326 p->depth--;
327 p->error = WFERR_UNMARSHALLABLE;
328 return;
329 }
330 w_long((long)n, p);
331 w_string(PyBytes_AS_STRING(utf8), (int)n, p);
332 Py_DECREF(utf8);
333 }
334 else if (PyTuple_CheckExact(v)) {
335 w_byte(TYPE_TUPLE, p);
336 n = PyTuple_Size(v);
337 w_long((long)n, p);
338 for (i = 0; i < n; i++) {
339 w_object(PyTuple_GET_ITEM(v, i), p);
340 }
341 }
342 else if (PyList_CheckExact(v)) {
343 w_byte(TYPE_LIST, p);
344 n = PyList_GET_SIZE(v);
345 w_long((long)n, p);
346 for (i = 0; i < n; i++) {
347 w_object(PyList_GET_ITEM(v, i), p);
348 }
349 }
350 else if (PyDict_CheckExact(v)) {
351 Py_ssize_t pos;
352 PyObject *key, *value;
353 w_byte(TYPE_DICT, p);
354 /* This one is NULL object terminated! */
355 pos = 0;
356 while (PyDict_Next(v, &pos, &key, &value)) {
357 w_object(key, p);
358 w_object(value, p);
359 }
360 w_object((PyObject *)NULL, p);
361 }
362 else if (PyAnySet_CheckExact(v)) {
363 PyObject *value, *it;
Raymond Hettingera422c342005-01-11 03:03:27 +0000364
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000365 if (PyObject_TypeCheck(v, &PySet_Type))
366 w_byte(TYPE_SET, p);
367 else
368 w_byte(TYPE_FROZENSET, p);
369 n = PyObject_Size(v);
370 if (n == -1) {
371 p->depth--;
372 p->error = WFERR_UNMARSHALLABLE;
373 return;
374 }
375 w_long((long)n, p);
376 it = PyObject_GetIter(v);
377 if (it == NULL) {
378 p->depth--;
379 p->error = WFERR_UNMARSHALLABLE;
380 return;
381 }
382 while ((value = PyIter_Next(it)) != NULL) {
383 w_object(value, p);
384 Py_DECREF(value);
385 }
386 Py_DECREF(it);
387 if (PyErr_Occurred()) {
388 p->depth--;
389 p->error = WFERR_UNMARSHALLABLE;
390 return;
391 }
392 }
393 else if (PyCode_Check(v)) {
394 PyCodeObject *co = (PyCodeObject *)v;
395 w_byte(TYPE_CODE, p);
396 w_long(co->co_argcount, p);
397 w_long(co->co_kwonlyargcount, p);
398 w_long(co->co_nlocals, p);
399 w_long(co->co_stacksize, p);
400 w_long(co->co_flags, p);
401 w_object(co->co_code, p);
402 w_object(co->co_consts, p);
403 w_object(co->co_names, p);
404 w_object(co->co_varnames, p);
405 w_object(co->co_freevars, p);
406 w_object(co->co_cellvars, p);
407 w_object(co->co_filename, p);
408 w_object(co->co_name, p);
409 w_long(co->co_firstlineno, p);
410 w_object(co->co_lnotab, p);
411 }
412 else if (PyObject_CheckBuffer(v)) {
413 /* Write unknown buffer-style objects as a string */
414 char *s;
415 PyBufferProcs *pb = v->ob_type->tp_as_buffer;
416 Py_buffer view;
417 if ((*pb->bf_getbuffer)(v, &view, PyBUF_SIMPLE) != 0) {
418 w_byte(TYPE_UNKNOWN, p);
419 p->error = WFERR_UNMARSHALLABLE;
420 }
421 w_byte(TYPE_STRING, p);
422 n = view.len;
423 s = view.buf;
424 if (n > INT_MAX) {
425 p->depth--;
426 p->error = WFERR_UNMARSHALLABLE;
427 return;
428 }
429 w_long((long)n, p);
430 w_string(s, (int)n, p);
431 if (pb->bf_releasebuffer != NULL)
432 (*pb->bf_releasebuffer)(v, &view);
433 }
434 else {
435 w_byte(TYPE_UNKNOWN, p);
436 p->error = WFERR_UNMARSHALLABLE;
437 }
438 p->depth--;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000439}
440
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000441/* version currently has no effect for writing longs. */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000442void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000443PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000444{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000445 WFILE wf;
446 wf.fp = fp;
447 wf.error = WFERR_OK;
448 wf.depth = 0;
449 wf.strings = NULL;
450 wf.version = version;
451 w_long(x, &wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000452}
453
454void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000455PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000456{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000457 WFILE wf;
458 wf.fp = fp;
459 wf.error = WFERR_OK;
460 wf.depth = 0;
461 wf.strings = (version > 0) ? PyDict_New() : NULL;
462 wf.version = version;
463 w_object(x, &wf);
464 Py_XDECREF(wf.strings);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000465}
466
467typedef WFILE RFILE; /* Same struct with different invariants */
468
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000469#define rs_byte(p) (((p)->ptr < (p)->end) ? (unsigned char)*(p)->ptr++ : EOF)
Guido van Rossum8d617a61995-03-09 12:12:11 +0000470
471#define r_byte(p) ((p)->fp ? getc((p)->fp) : rs_byte(p))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000472
473static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000474r_string(char *s, int n, RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000475{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000476 if (p->fp != NULL)
477 /* The result fits into int because it must be <=n. */
478 return (int)fread(s, 1, n, p->fp);
479 if (p->end - p->ptr < n)
480 n = (int)(p->end - p->ptr);
481 memcpy(s, p->ptr, n);
482 p->ptr += n;
483 return n;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000484}
485
486static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000487r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000488{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000489 register short x;
490 x = r_byte(p);
491 x |= r_byte(p) << 8;
492 /* Sign-extension, in case short greater than 16 bits */
493 x |= -(x & 0x8000);
494 return x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000495}
496
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000497static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000498r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000499{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000500 register long x;
501 register FILE *fp = p->fp;
502 if (fp) {
503 x = getc(fp);
504 x |= (long)getc(fp) << 8;
505 x |= (long)getc(fp) << 16;
506 x |= (long)getc(fp) << 24;
507 }
508 else {
509 x = rs_byte(p);
510 x |= (long)rs_byte(p) << 8;
511 x |= (long)rs_byte(p) << 16;
512 x |= (long)rs_byte(p) << 24;
513 }
Guido van Rossumc1547d91996-12-10 15:39:04 +0000514#if SIZEOF_LONG > 4
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000515 /* Sign extension for 64-bit machines */
516 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000517#endif
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000518 return x;
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000519}
520
Tim Peters82112372001-08-29 02:28:42 +0000521/* r_long64 deals with the TYPE_INT64 code. On a machine with
522 sizeof(long) > 4, it returns a Python int object, else a Python long
523 object. Note that w_long64 writes out TYPE_INT if 32 bits is enough,
524 so there's no inefficiency here in returning a PyLong on 32-bit boxes
525 for everything written via TYPE_INT64 (i.e., if an int is written via
526 TYPE_INT64, it *needs* more than 32 bits).
527*/
528static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000529r_long64(RFILE *p)
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000530{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000531 long lo4 = r_long(p);
532 long hi4 = r_long(p);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000533#if SIZEOF_LONG > 4
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000534 long x = (hi4 << 32) | (lo4 & 0xFFFFFFFFL);
535 return PyLong_FromLong(x);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000536#else
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000537 unsigned char buf[8];
538 int one = 1;
539 int is_little_endian = (int)*(char*)&one;
540 if (is_little_endian) {
541 memcpy(buf, &lo4, 4);
542 memcpy(buf+4, &hi4, 4);
543 }
544 else {
545 memcpy(buf, &hi4, 4);
546 memcpy(buf+4, &lo4, 4);
547 }
548 return _PyLong_FromByteArray(buf, 8, is_little_endian, 1);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000549#endif
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000550}
551
Guido van Rossum79f25d91997-04-29 20:08:16 +0000552static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000553r_PyLong(RFILE *p)
554{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000555 PyLongObject *ob;
556 int size, i, j, md, shorts_in_top_digit;
557 long n;
558 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000559
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000560 n = r_long(p);
561 if (n == 0)
562 return (PyObject *)_PyLong_New(0);
563 if (n < -INT_MAX || n > INT_MAX) {
564 PyErr_SetString(PyExc_ValueError,
565 "bad marshal data (long size out of range)");
566 return NULL;
567 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000568
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000569 size = 1 + (ABS(n) - 1) / PyLong_MARSHAL_RATIO;
570 shorts_in_top_digit = 1 + (ABS(n) - 1) % PyLong_MARSHAL_RATIO;
571 ob = _PyLong_New(size);
572 if (ob == NULL)
573 return NULL;
574 Py_SIZE(ob) = n > 0 ? size : -size;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000575
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000576 for (i = 0; i < size-1; i++) {
577 d = 0;
578 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
579 md = r_short(p);
580 if (md < 0 || md > PyLong_MARSHAL_BASE)
581 goto bad_digit;
582 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
583 }
584 ob->ob_digit[i] = d;
585 }
586 d = 0;
587 for (j=0; j < shorts_in_top_digit; j++) {
588 md = r_short(p);
589 if (md < 0 || md > PyLong_MARSHAL_BASE)
590 goto bad_digit;
591 /* topmost marshal digit should be nonzero */
592 if (md == 0 && j == shorts_in_top_digit - 1) {
593 Py_DECREF(ob);
594 PyErr_SetString(PyExc_ValueError,
595 "bad marshal data (unnormalized long data)");
596 return NULL;
597 }
598 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
599 }
600 /* top digit should be nonzero, else the resulting PyLong won't be
601 normalized */
602 ob->ob_digit[size-1] = d;
603 return (PyObject *)ob;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000604 bad_digit:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000605 Py_DECREF(ob);
606 PyErr_SetString(PyExc_ValueError,
607 "bad marshal data (digit out of range in long)");
608 return NULL;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000609}
610
611
612static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000613r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000614{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000615 /* NULL is a valid return value, it does not necessarily means that
616 an exception is set. */
617 PyObject *v, *v2;
618 long i, n;
619 int type = r_byte(p);
620 PyObject *retval;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000621
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000622 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000623
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000624 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
625 p->depth--;
626 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
627 return NULL;
628 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000629
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000630 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000631
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000632 case EOF:
633 PyErr_SetString(PyExc_EOFError,
634 "EOF read where object expected");
635 retval = NULL;
636 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000637
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000638 case TYPE_NULL:
639 retval = NULL;
640 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000641
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000642 case TYPE_NONE:
643 Py_INCREF(Py_None);
644 retval = Py_None;
645 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000646
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000647 case TYPE_STOPITER:
648 Py_INCREF(PyExc_StopIteration);
649 retval = PyExc_StopIteration;
650 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000651
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000652 case TYPE_ELLIPSIS:
653 Py_INCREF(Py_Ellipsis);
654 retval = Py_Ellipsis;
655 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000656
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000657 case TYPE_FALSE:
658 Py_INCREF(Py_False);
659 retval = Py_False;
660 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000661
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000662 case TYPE_TRUE:
663 Py_INCREF(Py_True);
664 retval = Py_True;
665 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000666
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000667 case TYPE_INT:
668 retval = PyLong_FromLong(r_long(p));
669 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000670
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000671 case TYPE_INT64:
672 retval = r_long64(p);
673 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000674
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000675 case TYPE_LONG:
676 retval = r_PyLong(p);
677 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000678
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000679 case TYPE_FLOAT:
680 {
681 char buf[256];
682 double dx;
683 retval = NULL;
684 n = r_byte(p);
685 if (n == EOF || r_string(buf, (int)n, p) != n) {
686 PyErr_SetString(PyExc_EOFError,
687 "EOF read where object expected");
688 break;
689 }
690 buf[n] = '\0';
691 dx = PyOS_string_to_double(buf, NULL, NULL);
692 if (dx == -1.0 && PyErr_Occurred())
693 break;
694 retval = PyFloat_FromDouble(dx);
695 break;
696 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000697
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000698 case TYPE_BINARY_FLOAT:
699 {
700 unsigned char buf[8];
701 double x;
702 if (r_string((char*)buf, 8, p) != 8) {
703 PyErr_SetString(PyExc_EOFError,
704 "EOF read where object expected");
705 retval = NULL;
706 break;
707 }
708 x = _PyFloat_Unpack8(buf, 1);
709 if (x == -1.0 && PyErr_Occurred()) {
710 retval = NULL;
711 break;
712 }
713 retval = PyFloat_FromDouble(x);
714 break;
715 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000716
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000717#ifndef WITHOUT_COMPLEX
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000718 case TYPE_COMPLEX:
719 {
720 char buf[256];
721 Py_complex c;
722 retval = NULL;
723 n = r_byte(p);
724 if (n == EOF || r_string(buf, (int)n, p) != n) {
725 PyErr_SetString(PyExc_EOFError,
726 "EOF read where object expected");
727 break;
728 }
729 buf[n] = '\0';
730 c.real = PyOS_string_to_double(buf, NULL, NULL);
731 if (c.real == -1.0 && PyErr_Occurred())
732 break;
733 n = r_byte(p);
734 if (n == EOF || r_string(buf, (int)n, p) != n) {
735 PyErr_SetString(PyExc_EOFError,
736 "EOF read where object expected");
737 break;
738 }
739 buf[n] = '\0';
740 c.imag = PyOS_string_to_double(buf, NULL, NULL);
741 if (c.imag == -1.0 && PyErr_Occurred())
742 break;
743 retval = PyComplex_FromCComplex(c);
744 break;
745 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000746
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000747 case TYPE_BINARY_COMPLEX:
748 {
749 unsigned char buf[8];
750 Py_complex c;
751 if (r_string((char*)buf, 8, p) != 8) {
752 PyErr_SetString(PyExc_EOFError,
753 "EOF read where object expected");
754 retval = NULL;
755 break;
756 }
757 c.real = _PyFloat_Unpack8(buf, 1);
758 if (c.real == -1.0 && PyErr_Occurred()) {
759 retval = NULL;
760 break;
761 }
762 if (r_string((char*)buf, 8, p) != 8) {
763 PyErr_SetString(PyExc_EOFError,
764 "EOF read where object expected");
765 retval = NULL;
766 break;
767 }
768 c.imag = _PyFloat_Unpack8(buf, 1);
769 if (c.imag == -1.0 && PyErr_Occurred()) {
770 retval = NULL;
771 break;
772 }
773 retval = PyComplex_FromCComplex(c);
774 break;
775 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000776#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +0000777
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000778 case TYPE_STRING:
779 n = r_long(p);
780 if (n < 0 || n > INT_MAX) {
781 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
782 retval = NULL;
783 break;
784 }
785 v = PyBytes_FromStringAndSize((char *)NULL, n);
786 if (v == NULL) {
787 retval = NULL;
788 break;
789 }
790 if (r_string(PyBytes_AS_STRING(v), (int)n, p) != n) {
791 Py_DECREF(v);
792 PyErr_SetString(PyExc_EOFError,
793 "EOF read where object expected");
794 retval = NULL;
795 break;
796 }
797 retval = v;
798 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000799
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000800 case TYPE_UNICODE:
801 {
802 char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +0000803
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000804 n = r_long(p);
805 if (n < 0 || n > INT_MAX) {
806 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
807 retval = NULL;
808 break;
809 }
810 buffer = PyMem_NEW(char, n);
811 if (buffer == NULL) {
812 retval = PyErr_NoMemory();
813 break;
814 }
815 if (r_string(buffer, (int)n, p) != n) {
816 PyMem_DEL(buffer);
817 PyErr_SetString(PyExc_EOFError,
818 "EOF read where object expected");
819 retval = NULL;
820 break;
821 }
822 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
823 PyMem_DEL(buffer);
824 retval = v;
825 break;
826 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000827
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000828 case TYPE_TUPLE:
829 n = r_long(p);
830 if (n < 0 || n > INT_MAX) {
831 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
832 retval = NULL;
833 break;
834 }
835 v = PyTuple_New((int)n);
836 if (v == NULL) {
837 retval = NULL;
838 break;
839 }
840 for (i = 0; i < n; i++) {
841 v2 = r_object(p);
842 if ( v2 == NULL ) {
843 if (!PyErr_Occurred())
844 PyErr_SetString(PyExc_TypeError,
845 "NULL object in marshal data for tuple");
846 Py_DECREF(v);
847 v = NULL;
848 break;
849 }
850 PyTuple_SET_ITEM(v, (int)i, v2);
851 }
852 retval = v;
853 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000854
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000855 case TYPE_LIST:
856 n = r_long(p);
857 if (n < 0 || n > INT_MAX) {
858 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
859 retval = NULL;
860 break;
861 }
862 v = PyList_New((int)n);
863 if (v == NULL) {
864 retval = NULL;
865 break;
866 }
867 for (i = 0; i < n; i++) {
868 v2 = r_object(p);
869 if ( v2 == NULL ) {
870 if (!PyErr_Occurred())
871 PyErr_SetString(PyExc_TypeError,
872 "NULL object in marshal data for list");
873 Py_DECREF(v);
874 v = NULL;
875 break;
876 }
877 PyList_SET_ITEM(v, (int)i, v2);
878 }
879 retval = v;
880 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000881
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000882 case TYPE_DICT:
883 v = PyDict_New();
884 if (v == NULL) {
885 retval = NULL;
886 break;
887 }
888 for (;;) {
889 PyObject *key, *val;
890 key = r_object(p);
891 if (key == NULL)
892 break;
893 val = r_object(p);
894 if (val != NULL)
895 PyDict_SetItem(v, key, val);
896 Py_DECREF(key);
897 Py_XDECREF(val);
898 }
899 if (PyErr_Occurred()) {
900 Py_DECREF(v);
901 v = NULL;
902 }
903 retval = v;
904 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000905
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000906 case TYPE_SET:
907 case TYPE_FROZENSET:
908 n = r_long(p);
909 if (n < 0 || n > INT_MAX) {
910 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
911 retval = NULL;
912 break;
913 }
914 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
915 if (v == NULL) {
916 retval = NULL;
917 break;
918 }
919 for (i = 0; i < n; i++) {
920 v2 = r_object(p);
921 if ( v2 == NULL ) {
922 if (!PyErr_Occurred())
923 PyErr_SetString(PyExc_TypeError,
924 "NULL object in marshal data for set");
925 Py_DECREF(v);
926 v = NULL;
927 break;
928 }
929 if (PySet_Add(v, v2) == -1) {
930 Py_DECREF(v);
931 Py_DECREF(v2);
932 v = NULL;
933 break;
934 }
935 Py_DECREF(v2);
936 }
937 retval = v;
938 break;
Raymond Hettingera422c342005-01-11 03:03:27 +0000939
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000940 case TYPE_CODE:
941 {
942 int argcount;
943 int kwonlyargcount;
944 int nlocals;
945 int stacksize;
946 int flags;
947 PyObject *code = NULL;
948 PyObject *consts = NULL;
949 PyObject *names = NULL;
950 PyObject *varnames = NULL;
951 PyObject *freevars = NULL;
952 PyObject *cellvars = NULL;
953 PyObject *filename = NULL;
954 PyObject *name = NULL;
955 int firstlineno;
956 PyObject *lnotab = NULL;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000957
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000958 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000959
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000960 /* XXX ignore long->int overflows for now */
961 argcount = (int)r_long(p);
962 kwonlyargcount = (int)r_long(p);
963 nlocals = (int)r_long(p);
964 stacksize = (int)r_long(p);
965 flags = (int)r_long(p);
966 code = r_object(p);
967 if (code == NULL)
968 goto code_error;
969 consts = r_object(p);
970 if (consts == NULL)
971 goto code_error;
972 names = r_object(p);
973 if (names == NULL)
974 goto code_error;
975 varnames = r_object(p);
976 if (varnames == NULL)
977 goto code_error;
978 freevars = r_object(p);
979 if (freevars == NULL)
980 goto code_error;
981 cellvars = r_object(p);
982 if (cellvars == NULL)
983 goto code_error;
984 filename = r_object(p);
985 if (filename == NULL)
986 goto code_error;
987 name = r_object(p);
988 if (name == NULL)
989 goto code_error;
990 firstlineno = (int)r_long(p);
991 lnotab = r_object(p);
992 if (lnotab == NULL)
993 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000994
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000995 v = (PyObject *) PyCode_New(
996 argcount, kwonlyargcount,
997 nlocals, stacksize, flags,
998 code, consts, names, varnames,
999 freevars, cellvars, filename, name,
1000 firstlineno, lnotab);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001001
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001002 code_error:
1003 Py_XDECREF(code);
1004 Py_XDECREF(consts);
1005 Py_XDECREF(names);
1006 Py_XDECREF(varnames);
1007 Py_XDECREF(freevars);
1008 Py_XDECREF(cellvars);
1009 Py_XDECREF(filename);
1010 Py_XDECREF(name);
1011 Py_XDECREF(lnotab);
1012 }
1013 retval = v;
1014 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001015
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001016 default:
1017 /* Bogus data got written, which isn't ideal.
1018 This will let you keep working and recover. */
1019 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
1020 retval = NULL;
1021 break;
1022
1023 }
1024 p->depth--;
1025 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001026}
1027
Neal Norwitzd85c4522004-06-13 20:31:49 +00001028static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001029read_object(RFILE *p)
1030{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001031 PyObject *v;
1032 if (PyErr_Occurred()) {
1033 fprintf(stderr, "XXX readobject called with exception set\n");
1034 return NULL;
1035 }
1036 v = r_object(p);
1037 if (v == NULL && !PyErr_Occurred())
1038 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1039 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001040}
1041
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001042int
1043PyMarshal_ReadShortFromFile(FILE *fp)
1044{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001045 RFILE rf;
1046 assert(fp);
1047 rf.fp = fp;
1048 rf.strings = NULL;
1049 rf.end = rf.ptr = NULL;
1050 return r_short(&rf);
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001051}
1052
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001053long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001054PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001055{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001056 RFILE rf;
1057 rf.fp = fp;
1058 rf.strings = NULL;
1059 rf.ptr = rf.end = NULL;
1060 return r_long(&rf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001061}
1062
Tim Peters691e0e92001-01-18 04:39:16 +00001063#ifdef HAVE_FSTAT
1064/* Return size of file in bytes; < 0 if unknown. */
1065static off_t
1066getfilesize(FILE *fp)
1067{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001068 struct stat st;
1069 if (fstat(fileno(fp), &st) != 0)
1070 return -1;
1071 else
1072 return st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001073}
1074#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001075
Tim Peters691e0e92001-01-18 04:39:16 +00001076/* If we can get the size of the file up-front, and it's reasonably small,
1077 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1078 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001079 * CAUTION: since this may read the entire remainder of the file, don't
1080 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001081 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001082PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001083PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001084{
Tim Peters691e0e92001-01-18 04:39:16 +00001085/* 75% of 2.1's .pyc files can exploit SMALL_FILE_LIMIT.
1086 * REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc.
1087 */
1088#define SMALL_FILE_LIMIT (1L << 14)
1089#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001090#ifdef HAVE_FSTAT
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001091 off_t filesize;
Tim Peters691e0e92001-01-18 04:39:16 +00001092#endif
Tim Peters691e0e92001-01-18 04:39:16 +00001093#ifdef HAVE_FSTAT
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001094 filesize = getfilesize(fp);
1095 if (filesize > 0) {
1096 char buf[SMALL_FILE_LIMIT];
1097 char* pBuf = NULL;
1098 if (filesize <= SMALL_FILE_LIMIT)
1099 pBuf = buf;
1100 else if (filesize <= REASONABLE_FILE_LIMIT)
1101 pBuf = (char *)PyMem_MALLOC(filesize);
1102 if (pBuf != NULL) {
1103 PyObject* v;
1104 size_t n;
1105 /* filesize must fit into an int, because it
1106 is smaller than REASONABLE_FILE_LIMIT */
1107 n = fread(pBuf, 1, (int)filesize, fp);
1108 v = PyMarshal_ReadObjectFromString(pBuf, n);
1109 if (pBuf != buf)
1110 PyMem_FREE(pBuf);
1111 return v;
1112 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001113
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001114 }
Tim Peters691e0e92001-01-18 04:39:16 +00001115#endif
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001116 /* We don't have fstat, or we do but the file is larger than
1117 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1118 */
1119 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001120
Tim Peters691e0e92001-01-18 04:39:16 +00001121#undef SMALL_FILE_LIMIT
1122#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001123}
1124
Guido van Rossum79f25d91997-04-29 20:08:16 +00001125PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001126PyMarshal_ReadObjectFromFile(FILE *fp)
1127{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001128 RFILE rf;
1129 PyObject *result;
1130 rf.fp = fp;
1131 rf.strings = PyList_New(0);
1132 rf.depth = 0;
1133 rf.ptr = rf.end = NULL;
1134 result = r_object(&rf);
1135 Py_DECREF(rf.strings);
1136 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001137}
1138
1139PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001140PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001141{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001142 RFILE rf;
1143 PyObject *result;
1144 rf.fp = NULL;
1145 rf.ptr = str;
1146 rf.end = str + len;
1147 rf.strings = PyList_New(0);
1148 rf.depth = 0;
1149 result = r_object(&rf);
1150 Py_DECREF(rf.strings);
1151 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001152}
1153
Guido van Rossum79f25d91997-04-29 20:08:16 +00001154PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001155PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001156{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001157 WFILE wf;
1158 PyObject *res = NULL;
Guido van Rossume6d39042007-05-09 00:01:30 +00001159
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001160 wf.fp = NULL;
1161 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1162 if (wf.str == NULL)
1163 return NULL;
1164 wf.ptr = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1165 wf.end = wf.ptr + PyBytes_Size(wf.str);
1166 wf.error = WFERR_OK;
1167 wf.depth = 0;
1168 wf.version = version;
1169 wf.strings = (version > 0) ? PyDict_New() : NULL;
1170 w_object(x, &wf);
1171 Py_XDECREF(wf.strings);
1172 if (wf.str != NULL) {
1173 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1174 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1175 Py_DECREF(wf.str);
1176 PyErr_SetString(PyExc_OverflowError,
1177 "too much marshal data for a string");
1178 return NULL;
1179 }
1180 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1181 return NULL;
1182 }
1183 if (wf.error != WFERR_OK) {
1184 Py_XDECREF(wf.str);
1185 if (wf.error == WFERR_NOMEMORY)
1186 PyErr_NoMemory();
1187 else
1188 PyErr_SetString(PyExc_ValueError,
1189 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1190 :"object too deeply nested to marshal");
1191 return NULL;
1192 }
1193 if (wf.str != NULL) {
1194 /* XXX Quick hack -- need to do this differently */
1195 res = PyBytes_FromObject(wf.str);
1196 Py_DECREF(wf.str);
1197 }
1198 return res;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001199}
1200
Guido van Rossum64b45521991-06-07 13:58:22 +00001201/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001202
Guido van Rossum79f25d91997-04-29 20:08:16 +00001203static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001204marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001205{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001206 /* XXX Quick hack -- need to do this differently */
1207 PyObject *x;
1208 PyObject *f;
1209 int version = Py_MARSHAL_VERSION;
1210 PyObject *s;
1211 PyObject *res;
1212 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
1213 return NULL;
1214 s = PyMarshal_WriteObjectToString(x, version);
1215 if (s == NULL)
1216 return NULL;
1217 res = PyObject_CallMethod(f, "write", "O", s);
1218 Py_DECREF(s);
1219 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001220}
1221
R. David Murraydd226ea2009-05-13 12:27:21 +00001222PyDoc_STRVAR(dump_doc,
1223"dump(value, file[, version])\n\
1224\n\
1225Write the value on the open file. The value must be a supported type.\n\
1226The file must be an open file object such as sys.stdout or returned by\n\
1227open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1228\n\
1229If the value has (or contains an object that has) an unsupported type, a\n\
1230ValueError exception is raised but garbage data will also be written\n\
1231to the file. The object will not be properly read back by load()\n\
1232\n\
1233The version argument indicates the data format that dump should use.");
1234
Guido van Rossum79f25d91997-04-29 20:08:16 +00001235static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001236marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001237{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001238 /* XXX Quick hack -- need to do this differently */
1239 PyObject *data, *result;
1240 RFILE rf;
1241 data = PyObject_CallMethod(f, "read", "");
1242 if (data == NULL)
1243 return NULL;
1244 rf.fp = NULL;
1245 if (PyBytes_Check(data)) {
1246 rf.ptr = PyBytes_AS_STRING(data);
1247 rf.end = rf.ptr + PyBytes_GET_SIZE(data);
1248 }
1249 else if (PyBytes_Check(data)) {
1250 rf.ptr = PyBytes_AS_STRING(data);
1251 rf.end = rf.ptr + PyBytes_GET_SIZE(data);
1252 }
1253 else {
1254 PyErr_Format(PyExc_TypeError,
1255 "f.read() returned neither string "
1256 "nor bytes but %.100s",
1257 data->ob_type->tp_name);
1258 Py_DECREF(data);
1259 return NULL;
1260 }
1261 rf.strings = PyList_New(0);
1262 rf.depth = 0;
1263 result = read_object(&rf);
1264 Py_DECREF(rf.strings);
1265 Py_DECREF(data);
1266 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001267}
1268
R. David Murraydd226ea2009-05-13 12:27:21 +00001269PyDoc_STRVAR(load_doc,
1270"load(file)\n\
1271\n\
1272Read one value from the open file and return it. If no valid value is\n\
1273read (e.g. because the data has a different Python versions\n\
1274incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1275The file must be an open file object opened in binary mode ('rb' or\n\
1276'r+b').\n\
1277\n\
1278Note: If an object containing an unsupported type was marshalled with\n\
1279dump(), load() will substitute None for the unmarshallable type.");
1280
1281
Guido van Rossum79f25d91997-04-29 20:08:16 +00001282static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001283marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001284{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001285 PyObject *x;
1286 int version = Py_MARSHAL_VERSION;
1287 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
1288 return NULL;
1289 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001290}
1291
R. David Murraydd226ea2009-05-13 12:27:21 +00001292PyDoc_STRVAR(dumps_doc,
1293"dumps(value[, version])\n\
1294\n\
1295Return the string that would be written to a file by dump(value, file).\n\
1296The value must be a supported type. Raise a ValueError exception if\n\
1297value has (or contains an object that has) an unsupported type.\n\
1298\n\
1299The version argument indicates the data format that dumps should use.");
1300
1301
Guido van Rossum79f25d91997-04-29 20:08:16 +00001302static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001303marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001304{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001305 RFILE rf;
1306 Py_buffer p;
1307 char *s;
1308 Py_ssize_t n;
1309 PyObject* result;
1310 if (!PyArg_ParseTuple(args, "s*:loads", &p))
1311 return NULL;
1312 s = p.buf;
1313 n = p.len;
1314 rf.fp = NULL;
1315 rf.ptr = s;
1316 rf.end = s + n;
1317 rf.strings = PyList_New(0);
1318 rf.depth = 0;
1319 result = read_object(&rf);
1320 Py_DECREF(rf.strings);
1321 PyBuffer_Release(&p);
1322 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001323}
1324
R. David Murraydd226ea2009-05-13 12:27:21 +00001325PyDoc_STRVAR(loads_doc,
1326"loads(string)\n\
1327\n\
1328Convert the string to a value. If no valid value is found, raise\n\
1329EOFError, ValueError or TypeError. Extra characters in the string are\n\
1330ignored.");
1331
Guido van Rossum79f25d91997-04-29 20:08:16 +00001332static PyMethodDef marshal_methods[] = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001333 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1334 {"load", marshal_load, METH_O, load_doc},
1335 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1336 {"loads", marshal_loads, METH_VARARGS, loads_doc},
1337 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001338};
1339
R. David Murraydd226ea2009-05-13 12:27:21 +00001340
1341PyDoc_STRVAR(module_doc,
1342"This module contains functions that can read and write Python values in\n\
1343a binary format. The format is specific to Python, but independent of\n\
1344machine architecture issues.\n\
1345\n\
1346Not all Python object types are supported; in general, only objects\n\
1347whose value is independent from a particular invocation of Python can be\n\
1348written and read by this module. The following types are supported:\n\
1349None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1350tuples, lists, sets, dictionaries, and code objects, where it\n\
1351should be understood that tuples, lists and dictionaries are only\n\
1352supported as long as the values contained therein are themselves\n\
1353supported; and recursive lists and dictionaries should not be written\n\
1354(they will cause infinite loops).\n\
1355\n\
1356Variables:\n\
1357\n\
1358version -- indicates the format that the module uses. Version 0 is the\n\
1359 historical format, version 1 shares interned strings and version 2\n\
1360 uses a binary format for floating point numbers.\n\
1361\n\
1362Functions:\n\
1363\n\
1364dump() -- write value to a file\n\
1365load() -- read value from a file\n\
1366dumps() -- write value to a string\n\
1367loads() -- read value from a string");
1368
1369
1370
Brett Cannon429ef652008-06-27 00:35:35 +00001371static struct PyModuleDef marshalmodule = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001372 PyModuleDef_HEAD_INIT,
1373 "marshal",
1374 module_doc,
1375 0,
1376 marshal_methods,
1377 NULL,
1378 NULL,
1379 NULL,
1380 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001381};
1382
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001383PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001384PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001385{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001386 PyObject *mod = PyModule_Create(&marshalmodule);
1387 if (mod == NULL)
1388 return NULL;
1389 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
1390 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001391}