blob: 7b327ade01d97dd2f042c1f332464056e145ea95 [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: */
60 PyObject *str;
Benjamin Peterson43b06862011-05-27 09:08:01 -050061 PyObject *current_filename;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 char *ptr;
63 char *end;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 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 Pitrouf95a1b32010-05-09 15:52:27 +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 Pitrouf95a1b32010-05-09 15:52:27 +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 Pitrouf95a1b32010-05-09 15:52:27 +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 Pitrouf95a1b32010-05-09 15:52:27 +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 Pitrouf95a1b32010-05-09 15:52:27 +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 Pitrouf95a1b32010-05-09 15:52:27 +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 Pitrouf95a1b32010-05-09 15:52:27 +0000147 Py_ssize_t i, j, n, l;
148 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +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 Pitrouf95a1b32010-05-09 15:52:27 +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 Pitrouf95a1b32010-05-09 15:52:27 +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 Pitrouf95a1b32010-05-09 15:52:27 +0000185 Py_ssize_t i, n;
Fred Drake6da0b912000-06-28 18:47:56 +0000186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000187 p->depth++;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +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 Pitrouf95a1b32010-05-09 15:52:27 +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 Pitrouf95a1b32010-05-09 15:52:27 +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 }
257 else if (PyComplex_CheckExact(v)) {
258 if (p->version > 1) {
259 unsigned char buf[8];
260 if (_PyFloat_Pack8(PyComplex_RealAsDouble(v),
261 buf, 1) < 0) {
262 p->error = WFERR_UNMARSHALLABLE;
263 return;
264 }
265 w_byte(TYPE_BINARY_COMPLEX, p);
266 w_string((char*)buf, 8, p);
267 if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v),
268 buf, 1) < 0) {
269 p->error = WFERR_UNMARSHALLABLE;
270 return;
271 }
272 w_string((char*)buf, 8, p);
273 }
274 else {
275 char *buf;
276 w_byte(TYPE_COMPLEX, p);
277 buf = PyOS_double_to_string(PyComplex_RealAsDouble(v),
278 'g', 17, 0, NULL);
279 if (!buf) {
280 p->error = WFERR_NOMEMORY;
281 return;
282 }
283 n = strlen(buf);
284 w_byte((int)n, p);
285 w_string(buf, (int)n, p);
286 PyMem_Free(buf);
287 buf = PyOS_double_to_string(PyComplex_ImagAsDouble(v),
288 'g', 17, 0, NULL);
289 if (!buf) {
290 p->error = WFERR_NOMEMORY;
291 return;
292 }
293 n = strlen(buf);
294 w_byte((int)n, p);
295 w_string(buf, (int)n, p);
296 PyMem_Free(buf);
297 }
298 }
299 else if (PyBytes_CheckExact(v)) {
300 w_byte(TYPE_STRING, p);
301 n = PyBytes_GET_SIZE(v);
302 if (n > INT_MAX) {
303 /* huge strings are not supported */
304 p->depth--;
305 p->error = WFERR_UNMARSHALLABLE;
306 return;
307 }
308 w_long((long)n, p);
309 w_string(PyBytes_AS_STRING(v), (int)n, p);
310 }
311 else if (PyUnicode_CheckExact(v)) {
312 PyObject *utf8;
313 utf8 = PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(v),
314 PyUnicode_GET_SIZE(v),
315 "surrogatepass");
316 if (utf8 == NULL) {
317 p->depth--;
318 p->error = WFERR_UNMARSHALLABLE;
319 return;
320 }
321 w_byte(TYPE_UNICODE, p);
322 n = PyBytes_GET_SIZE(utf8);
323 if (n > INT_MAX) {
324 p->depth--;
325 p->error = WFERR_UNMARSHALLABLE;
326 return;
327 }
328 w_long((long)n, p);
329 w_string(PyBytes_AS_STRING(utf8), (int)n, p);
330 Py_DECREF(utf8);
331 }
332 else if (PyTuple_CheckExact(v)) {
333 w_byte(TYPE_TUPLE, p);
334 n = PyTuple_Size(v);
335 w_long((long)n, p);
336 for (i = 0; i < n; i++) {
337 w_object(PyTuple_GET_ITEM(v, i), p);
338 }
339 }
340 else if (PyList_CheckExact(v)) {
341 w_byte(TYPE_LIST, p);
342 n = PyList_GET_SIZE(v);
343 w_long((long)n, p);
344 for (i = 0; i < n; i++) {
345 w_object(PyList_GET_ITEM(v, i), p);
346 }
347 }
348 else if (PyDict_CheckExact(v)) {
349 Py_ssize_t pos;
350 PyObject *key, *value;
351 w_byte(TYPE_DICT, p);
352 /* This one is NULL object terminated! */
353 pos = 0;
354 while (PyDict_Next(v, &pos, &key, &value)) {
355 w_object(key, p);
356 w_object(value, p);
357 }
358 w_object((PyObject *)NULL, p);
359 }
360 else if (PyAnySet_CheckExact(v)) {
361 PyObject *value, *it;
Raymond Hettingera422c342005-01-11 03:03:27 +0000362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000363 if (PyObject_TypeCheck(v, &PySet_Type))
364 w_byte(TYPE_SET, p);
365 else
366 w_byte(TYPE_FROZENSET, p);
367 n = PyObject_Size(v);
368 if (n == -1) {
369 p->depth--;
370 p->error = WFERR_UNMARSHALLABLE;
371 return;
372 }
373 w_long((long)n, p);
374 it = PyObject_GetIter(v);
375 if (it == NULL) {
376 p->depth--;
377 p->error = WFERR_UNMARSHALLABLE;
378 return;
379 }
380 while ((value = PyIter_Next(it)) != NULL) {
381 w_object(value, p);
382 Py_DECREF(value);
383 }
384 Py_DECREF(it);
385 if (PyErr_Occurred()) {
386 p->depth--;
387 p->error = WFERR_UNMARSHALLABLE;
388 return;
389 }
390 }
391 else if (PyCode_Check(v)) {
392 PyCodeObject *co = (PyCodeObject *)v;
393 w_byte(TYPE_CODE, p);
394 w_long(co->co_argcount, p);
395 w_long(co->co_kwonlyargcount, p);
396 w_long(co->co_nlocals, p);
397 w_long(co->co_stacksize, p);
398 w_long(co->co_flags, p);
399 w_object(co->co_code, p);
400 w_object(co->co_consts, p);
401 w_object(co->co_names, p);
402 w_object(co->co_varnames, p);
403 w_object(co->co_freevars, p);
404 w_object(co->co_cellvars, p);
405 w_object(co->co_filename, p);
406 w_object(co->co_name, p);
407 w_long(co->co_firstlineno, p);
408 w_object(co->co_lnotab, p);
409 }
410 else if (PyObject_CheckBuffer(v)) {
411 /* Write unknown buffer-style objects as a string */
412 char *s;
413 PyBufferProcs *pb = v->ob_type->tp_as_buffer;
414 Py_buffer view;
415 if ((*pb->bf_getbuffer)(v, &view, PyBUF_SIMPLE) != 0) {
416 w_byte(TYPE_UNKNOWN, p);
417 p->error = WFERR_UNMARSHALLABLE;
418 }
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);
429 if (pb->bf_releasebuffer != NULL)
430 (*pb->bf_releasebuffer)(v, &view);
431 }
432 else {
433 w_byte(TYPE_UNKNOWN, p);
434 p->error = WFERR_UNMARSHALLABLE;
435 }
436 p->depth--;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000437}
438
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000439/* version currently has no effect for writing longs. */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000440void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000441PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000442{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 WFILE wf;
444 wf.fp = fp;
445 wf.error = WFERR_OK;
446 wf.depth = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000447 wf.version = version;
448 w_long(x, &wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000449}
450
451void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000452PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000453{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000454 WFILE wf;
455 wf.fp = fp;
456 wf.error = WFERR_OK;
457 wf.depth = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000458 wf.version = version;
459 w_object(x, &wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000460}
461
462typedef WFILE RFILE; /* Same struct with different invariants */
463
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000464#define rs_byte(p) (((p)->ptr < (p)->end) ? (unsigned char)*(p)->ptr++ : EOF)
Guido van Rossum8d617a61995-03-09 12:12:11 +0000465
466#define r_byte(p) ((p)->fp ? getc((p)->fp) : rs_byte(p))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000467
468static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000469r_string(char *s, int n, RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000470{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000471 if (p->fp != NULL)
472 /* The result fits into int because it must be <=n. */
473 return (int)fread(s, 1, n, p->fp);
474 if (p->end - p->ptr < n)
475 n = (int)(p->end - p->ptr);
476 memcpy(s, p->ptr, n);
477 p->ptr += n;
478 return n;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000479}
480
481static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000482r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000483{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 register short x;
485 x = r_byte(p);
486 x |= r_byte(p) << 8;
487 /* Sign-extension, in case short greater than 16 bits */
488 x |= -(x & 0x8000);
489 return x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000490}
491
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000492static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000493r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000494{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 register long x;
496 register FILE *fp = p->fp;
497 if (fp) {
498 x = getc(fp);
499 x |= (long)getc(fp) << 8;
500 x |= (long)getc(fp) << 16;
501 x |= (long)getc(fp) << 24;
502 }
503 else {
504 x = rs_byte(p);
505 x |= (long)rs_byte(p) << 8;
506 x |= (long)rs_byte(p) << 16;
507 x |= (long)rs_byte(p) << 24;
508 }
Guido van Rossumc1547d91996-12-10 15:39:04 +0000509#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 /* Sign extension for 64-bit machines */
511 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000512#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 return x;
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000514}
515
Tim Peters82112372001-08-29 02:28:42 +0000516/* r_long64 deals with the TYPE_INT64 code. On a machine with
517 sizeof(long) > 4, it returns a Python int object, else a Python long
518 object. Note that w_long64 writes out TYPE_INT if 32 bits is enough,
519 so there's no inefficiency here in returning a PyLong on 32-bit boxes
520 for everything written via TYPE_INT64 (i.e., if an int is written via
521 TYPE_INT64, it *needs* more than 32 bits).
522*/
523static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000524r_long64(RFILE *p)
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000525{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 long lo4 = r_long(p);
527 long hi4 = r_long(p);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000528#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000529 long x = (hi4 << 32) | (lo4 & 0xFFFFFFFFL);
530 return PyLong_FromLong(x);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000531#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 unsigned char buf[8];
533 int one = 1;
534 int is_little_endian = (int)*(char*)&one;
535 if (is_little_endian) {
536 memcpy(buf, &lo4, 4);
537 memcpy(buf+4, &hi4, 4);
538 }
539 else {
540 memcpy(buf, &hi4, 4);
541 memcpy(buf+4, &lo4, 4);
542 }
543 return _PyLong_FromByteArray(buf, 8, is_little_endian, 1);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000544#endif
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000545}
546
Guido van Rossum79f25d91997-04-29 20:08:16 +0000547static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000548r_PyLong(RFILE *p)
549{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000550 PyLongObject *ob;
551 int size, i, j, md, shorts_in_top_digit;
552 long n;
553 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000555 n = r_long(p);
556 if (n == 0)
557 return (PyObject *)_PyLong_New(0);
558 if (n < -INT_MAX || n > INT_MAX) {
559 PyErr_SetString(PyExc_ValueError,
560 "bad marshal data (long size out of range)");
561 return NULL;
562 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 size = 1 + (ABS(n) - 1) / PyLong_MARSHAL_RATIO;
565 shorts_in_top_digit = 1 + (ABS(n) - 1) % PyLong_MARSHAL_RATIO;
566 ob = _PyLong_New(size);
567 if (ob == NULL)
568 return NULL;
569 Py_SIZE(ob) = n > 0 ? size : -size;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000570
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000571 for (i = 0; i < size-1; i++) {
572 d = 0;
573 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
574 md = r_short(p);
575 if (md < 0 || md > PyLong_MARSHAL_BASE)
576 goto bad_digit;
577 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
578 }
579 ob->ob_digit[i] = d;
580 }
581 d = 0;
582 for (j=0; j < shorts_in_top_digit; j++) {
583 md = r_short(p);
584 if (md < 0 || md > PyLong_MARSHAL_BASE)
585 goto bad_digit;
586 /* topmost marshal digit should be nonzero */
587 if (md == 0 && j == shorts_in_top_digit - 1) {
588 Py_DECREF(ob);
589 PyErr_SetString(PyExc_ValueError,
590 "bad marshal data (unnormalized long data)");
591 return NULL;
592 }
593 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
594 }
595 /* top digit should be nonzero, else the resulting PyLong won't be
596 normalized */
597 ob->ob_digit[size-1] = d;
598 return (PyObject *)ob;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000599 bad_digit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000600 Py_DECREF(ob);
601 PyErr_SetString(PyExc_ValueError,
602 "bad marshal data (digit out of range in long)");
603 return NULL;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000604}
605
606
607static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000608r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000609{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 /* NULL is a valid return value, it does not necessarily means that
611 an exception is set. */
612 PyObject *v, *v2;
613 long i, n;
614 int type = r_byte(p);
615 PyObject *retval;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
620 p->depth--;
621 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
622 return NULL;
623 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 case EOF:
628 PyErr_SetString(PyExc_EOFError,
629 "EOF read where object expected");
630 retval = NULL;
631 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 case TYPE_NULL:
634 retval = NULL;
635 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 case TYPE_NONE:
638 Py_INCREF(Py_None);
639 retval = Py_None;
640 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 case TYPE_STOPITER:
643 Py_INCREF(PyExc_StopIteration);
644 retval = PyExc_StopIteration;
645 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 case TYPE_ELLIPSIS:
648 Py_INCREF(Py_Ellipsis);
649 retval = Py_Ellipsis;
650 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 case TYPE_FALSE:
653 Py_INCREF(Py_False);
654 retval = Py_False;
655 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000657 case TYPE_TRUE:
658 Py_INCREF(Py_True);
659 retval = Py_True;
660 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 case TYPE_INT:
663 retval = PyLong_FromLong(r_long(p));
664 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000666 case TYPE_INT64:
667 retval = r_long64(p);
668 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000670 case TYPE_LONG:
671 retval = r_PyLong(p);
672 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 case TYPE_FLOAT:
675 {
676 char buf[256];
677 double dx;
678 retval = NULL;
679 n = r_byte(p);
680 if (n == EOF || r_string(buf, (int)n, p) != n) {
681 PyErr_SetString(PyExc_EOFError,
682 "EOF read where object expected");
683 break;
684 }
685 buf[n] = '\0';
686 dx = PyOS_string_to_double(buf, NULL, NULL);
687 if (dx == -1.0 && PyErr_Occurred())
688 break;
689 retval = PyFloat_FromDouble(dx);
690 break;
691 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 case TYPE_BINARY_FLOAT:
694 {
695 unsigned char buf[8];
696 double x;
697 if (r_string((char*)buf, 8, p) != 8) {
698 PyErr_SetString(PyExc_EOFError,
699 "EOF read where object expected");
700 retval = NULL;
701 break;
702 }
703 x = _PyFloat_Unpack8(buf, 1);
704 if (x == -1.0 && PyErr_Occurred()) {
705 retval = NULL;
706 break;
707 }
708 retval = PyFloat_FromDouble(x);
709 break;
710 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 case TYPE_COMPLEX:
713 {
714 char buf[256];
715 Py_complex c;
716 retval = NULL;
717 n = r_byte(p);
718 if (n == EOF || r_string(buf, (int)n, p) != n) {
719 PyErr_SetString(PyExc_EOFError,
720 "EOF read where object expected");
721 break;
722 }
723 buf[n] = '\0';
724 c.real = PyOS_string_to_double(buf, NULL, NULL);
725 if (c.real == -1.0 && PyErr_Occurred())
726 break;
727 n = r_byte(p);
728 if (n == EOF || r_string(buf, (int)n, p) != n) {
729 PyErr_SetString(PyExc_EOFError,
730 "EOF read where object expected");
731 break;
732 }
733 buf[n] = '\0';
734 c.imag = PyOS_string_to_double(buf, NULL, NULL);
735 if (c.imag == -1.0 && PyErr_Occurred())
736 break;
737 retval = PyComplex_FromCComplex(c);
738 break;
739 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000741 case TYPE_BINARY_COMPLEX:
742 {
743 unsigned char buf[8];
744 Py_complex c;
745 if (r_string((char*)buf, 8, p) != 8) {
746 PyErr_SetString(PyExc_EOFError,
747 "EOF read where object expected");
748 retval = NULL;
749 break;
750 }
751 c.real = _PyFloat_Unpack8(buf, 1);
752 if (c.real == -1.0 && PyErr_Occurred()) {
753 retval = NULL;
754 break;
755 }
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 c.imag = _PyFloat_Unpack8(buf, 1);
763 if (c.imag == -1.0 && PyErr_Occurred()) {
764 retval = NULL;
765 break;
766 }
767 retval = PyComplex_FromCComplex(c);
768 break;
769 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 case TYPE_STRING:
772 n = r_long(p);
773 if (n < 0 || n > INT_MAX) {
774 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
775 retval = NULL;
776 break;
777 }
778 v = PyBytes_FromStringAndSize((char *)NULL, n);
779 if (v == NULL) {
780 retval = NULL;
781 break;
782 }
783 if (r_string(PyBytes_AS_STRING(v), (int)n, p) != n) {
784 Py_DECREF(v);
785 PyErr_SetString(PyExc_EOFError,
786 "EOF read where object expected");
787 retval = NULL;
788 break;
789 }
790 retval = v;
791 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000793 case TYPE_UNICODE:
794 {
795 char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +0000796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 n = r_long(p);
798 if (n < 0 || n > INT_MAX) {
799 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
800 retval = NULL;
801 break;
802 }
803 buffer = PyMem_NEW(char, n);
804 if (buffer == NULL) {
805 retval = PyErr_NoMemory();
806 break;
807 }
808 if (r_string(buffer, (int)n, p) != n) {
809 PyMem_DEL(buffer);
810 PyErr_SetString(PyExc_EOFError,
811 "EOF read where object expected");
812 retval = NULL;
813 break;
814 }
815 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
816 PyMem_DEL(buffer);
817 retval = v;
818 break;
819 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000821 case TYPE_TUPLE:
822 n = r_long(p);
823 if (n < 0 || n > INT_MAX) {
824 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
825 retval = NULL;
826 break;
827 }
828 v = PyTuple_New((int)n);
829 if (v == NULL) {
830 retval = NULL;
831 break;
832 }
833 for (i = 0; i < n; i++) {
834 v2 = r_object(p);
835 if ( v2 == NULL ) {
836 if (!PyErr_Occurred())
837 PyErr_SetString(PyExc_TypeError,
838 "NULL object in marshal data for tuple");
839 Py_DECREF(v);
840 v = NULL;
841 break;
842 }
843 PyTuple_SET_ITEM(v, (int)i, v2);
844 }
845 retval = v;
846 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 case TYPE_LIST:
849 n = r_long(p);
850 if (n < 0 || n > INT_MAX) {
851 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
852 retval = NULL;
853 break;
854 }
855 v = PyList_New((int)n);
856 if (v == NULL) {
857 retval = NULL;
858 break;
859 }
860 for (i = 0; i < n; i++) {
861 v2 = r_object(p);
862 if ( v2 == NULL ) {
863 if (!PyErr_Occurred())
864 PyErr_SetString(PyExc_TypeError,
865 "NULL object in marshal data for list");
866 Py_DECREF(v);
867 v = NULL;
868 break;
869 }
870 PyList_SET_ITEM(v, (int)i, v2);
871 }
872 retval = v;
873 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000875 case TYPE_DICT:
876 v = PyDict_New();
877 if (v == NULL) {
878 retval = NULL;
879 break;
880 }
881 for (;;) {
882 PyObject *key, *val;
883 key = r_object(p);
884 if (key == NULL)
885 break;
886 val = r_object(p);
887 if (val != NULL)
888 PyDict_SetItem(v, key, val);
889 Py_DECREF(key);
890 Py_XDECREF(val);
891 }
892 if (PyErr_Occurred()) {
893 Py_DECREF(v);
894 v = NULL;
895 }
896 retval = v;
897 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 case TYPE_SET:
900 case TYPE_FROZENSET:
901 n = r_long(p);
902 if (n < 0 || n > INT_MAX) {
903 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
904 retval = NULL;
905 break;
906 }
907 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
908 if (v == NULL) {
909 retval = NULL;
910 break;
911 }
912 for (i = 0; i < n; i++) {
913 v2 = r_object(p);
914 if ( v2 == NULL ) {
915 if (!PyErr_Occurred())
916 PyErr_SetString(PyExc_TypeError,
917 "NULL object in marshal data for set");
918 Py_DECREF(v);
919 v = NULL;
920 break;
921 }
922 if (PySet_Add(v, v2) == -1) {
923 Py_DECREF(v);
924 Py_DECREF(v2);
925 v = NULL;
926 break;
927 }
928 Py_DECREF(v2);
929 }
930 retval = v;
931 break;
Raymond Hettingera422c342005-01-11 03:03:27 +0000932
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 case TYPE_CODE:
934 {
935 int argcount;
936 int kwonlyargcount;
937 int nlocals;
938 int stacksize;
939 int flags;
940 PyObject *code = NULL;
941 PyObject *consts = NULL;
942 PyObject *names = NULL;
943 PyObject *varnames = NULL;
944 PyObject *freevars = NULL;
945 PyObject *cellvars = NULL;
946 PyObject *filename = NULL;
947 PyObject *name = NULL;
948 int firstlineno;
949 PyObject *lnotab = NULL;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000951 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 /* XXX ignore long->int overflows for now */
954 argcount = (int)r_long(p);
955 kwonlyargcount = (int)r_long(p);
956 nlocals = (int)r_long(p);
957 stacksize = (int)r_long(p);
958 flags = (int)r_long(p);
959 code = r_object(p);
960 if (code == NULL)
961 goto code_error;
962 consts = r_object(p);
963 if (consts == NULL)
964 goto code_error;
965 names = r_object(p);
966 if (names == NULL)
967 goto code_error;
968 varnames = r_object(p);
969 if (varnames == NULL)
970 goto code_error;
971 freevars = r_object(p);
972 if (freevars == NULL)
973 goto code_error;
974 cellvars = r_object(p);
975 if (cellvars == NULL)
976 goto code_error;
977 filename = r_object(p);
978 if (filename == NULL)
979 goto code_error;
Benjamin Peterson43b06862011-05-27 09:08:01 -0500980 if (PyUnicode_CheckExact(filename)) {
981 if (p->current_filename != NULL) {
982 if (!PyUnicode_Compare(filename, p->current_filename)) {
983 Py_DECREF(filename);
984 Py_INCREF(p->current_filename);
985 filename = p->current_filename;
986 }
987 }
988 else {
989 p->current_filename = filename;
990 }
991 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 name = r_object(p);
993 if (name == NULL)
994 goto code_error;
995 firstlineno = (int)r_long(p);
996 lnotab = r_object(p);
997 if (lnotab == NULL)
998 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 v = (PyObject *) PyCode_New(
1001 argcount, kwonlyargcount,
1002 nlocals, stacksize, flags,
1003 code, consts, names, varnames,
1004 freevars, cellvars, filename, name,
1005 firstlineno, lnotab);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001006
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007 code_error:
1008 Py_XDECREF(code);
1009 Py_XDECREF(consts);
1010 Py_XDECREF(names);
1011 Py_XDECREF(varnames);
1012 Py_XDECREF(freevars);
1013 Py_XDECREF(cellvars);
1014 Py_XDECREF(filename);
1015 Py_XDECREF(name);
1016 Py_XDECREF(lnotab);
1017 }
1018 retval = v;
1019 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 default:
1022 /* Bogus data got written, which isn't ideal.
1023 This will let you keep working and recover. */
1024 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
1025 retval = NULL;
1026 break;
1027
1028 }
1029 p->depth--;
1030 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001031}
1032
Neal Norwitzd85c4522004-06-13 20:31:49 +00001033static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001034read_object(RFILE *p)
1035{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 PyObject *v;
1037 if (PyErr_Occurred()) {
1038 fprintf(stderr, "XXX readobject called with exception set\n");
1039 return NULL;
1040 }
1041 v = r_object(p);
1042 if (v == NULL && !PyErr_Occurred())
1043 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1044 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001045}
1046
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001047int
1048PyMarshal_ReadShortFromFile(FILE *fp)
1049{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 RFILE rf;
1051 assert(fp);
1052 rf.fp = fp;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001053 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 rf.end = rf.ptr = NULL;
1055 return r_short(&rf);
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001056}
1057
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001058long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001059PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001060{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 RFILE rf;
1062 rf.fp = fp;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001063 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 rf.ptr = rf.end = NULL;
1065 return r_long(&rf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001066}
1067
Tim Peters691e0e92001-01-18 04:39:16 +00001068#ifdef HAVE_FSTAT
1069/* Return size of file in bytes; < 0 if unknown. */
1070static off_t
1071getfilesize(FILE *fp)
1072{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 struct stat st;
1074 if (fstat(fileno(fp), &st) != 0)
1075 return -1;
1076 else
1077 return st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001078}
1079#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001080
Tim Peters691e0e92001-01-18 04:39:16 +00001081/* If we can get the size of the file up-front, and it's reasonably small,
1082 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1083 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001084 * CAUTION: since this may read the entire remainder of the file, don't
1085 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001086 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001087PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001088PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001089{
Antoine Pitrou5bc7ec92010-04-21 22:56:22 +00001090/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
Tim Peters691e0e92001-01-18 04:39:16 +00001091#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001092#ifdef HAVE_FSTAT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001093 off_t filesize;
1094 filesize = getfilesize(fp);
1095 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1096 char* pBuf = (char *)PyMem_MALLOC(filesize);
1097 if (pBuf != NULL) {
1098 PyObject* v;
1099 size_t n;
1100 /* filesize must fit into an int, because it
1101 is smaller than REASONABLE_FILE_LIMIT */
1102 n = fread(pBuf, 1, (int)filesize, fp);
1103 v = PyMarshal_ReadObjectFromString(pBuf, n);
1104 PyMem_FREE(pBuf);
1105 return v;
1106 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 }
Tim Peters691e0e92001-01-18 04:39:16 +00001109#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 /* We don't have fstat, or we do but the file is larger than
1111 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1112 */
1113 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001114
Tim Peters691e0e92001-01-18 04:39:16 +00001115#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001116}
1117
Guido van Rossum79f25d91997-04-29 20:08:16 +00001118PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001119PyMarshal_ReadObjectFromFile(FILE *fp)
1120{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001121 RFILE rf;
1122 PyObject *result;
1123 rf.fp = fp;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001124 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 rf.depth = 0;
1126 rf.ptr = rf.end = NULL;
1127 result = r_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001128 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001129}
1130
1131PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001132PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001133{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001134 RFILE rf;
1135 PyObject *result;
1136 rf.fp = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001137 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001138 rf.ptr = str;
1139 rf.end = str + len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 rf.depth = 0;
1141 result = r_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001143}
1144
Guido van Rossum79f25d91997-04-29 20:08:16 +00001145PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001146PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001147{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001148 WFILE wf;
1149 PyObject *res = NULL;
Guido van Rossume6d39042007-05-09 00:01:30 +00001150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001151 wf.fp = NULL;
1152 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1153 if (wf.str == NULL)
1154 return NULL;
1155 wf.ptr = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1156 wf.end = wf.ptr + PyBytes_Size(wf.str);
1157 wf.error = WFERR_OK;
1158 wf.depth = 0;
1159 wf.version = version;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 w_object(x, &wf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001161 if (wf.str != NULL) {
1162 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1163 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1164 Py_DECREF(wf.str);
1165 PyErr_SetString(PyExc_OverflowError,
1166 "too much marshal data for a string");
1167 return NULL;
1168 }
1169 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1170 return NULL;
1171 }
1172 if (wf.error != WFERR_OK) {
1173 Py_XDECREF(wf.str);
1174 if (wf.error == WFERR_NOMEMORY)
1175 PyErr_NoMemory();
1176 else
1177 PyErr_SetString(PyExc_ValueError,
1178 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1179 :"object too deeply nested to marshal");
1180 return NULL;
1181 }
1182 if (wf.str != NULL) {
1183 /* XXX Quick hack -- need to do this differently */
1184 res = PyBytes_FromObject(wf.str);
1185 Py_DECREF(wf.str);
1186 }
1187 return res;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001188}
1189
Guido van Rossum64b45521991-06-07 13:58:22 +00001190/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001191
Guido van Rossum79f25d91997-04-29 20:08:16 +00001192static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001193marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001194{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 /* XXX Quick hack -- need to do this differently */
1196 PyObject *x;
1197 PyObject *f;
1198 int version = Py_MARSHAL_VERSION;
1199 PyObject *s;
1200 PyObject *res;
1201 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
1202 return NULL;
1203 s = PyMarshal_WriteObjectToString(x, version);
1204 if (s == NULL)
1205 return NULL;
1206 res = PyObject_CallMethod(f, "write", "O", s);
1207 Py_DECREF(s);
1208 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001209}
1210
R. David Murraydd226ea2009-05-13 12:27:21 +00001211PyDoc_STRVAR(dump_doc,
1212"dump(value, file[, version])\n\
1213\n\
1214Write the value on the open file. The value must be a supported type.\n\
1215The file must be an open file object such as sys.stdout or returned by\n\
1216open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1217\n\
1218If the value has (or contains an object that has) an unsupported type, a\n\
1219ValueError exception is raised but garbage data will also be written\n\
1220to the file. The object will not be properly read back by load()\n\
1221\n\
1222The version argument indicates the data format that dump should use.");
1223
Guido van Rossum79f25d91997-04-29 20:08:16 +00001224static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001225marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001226{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 /* XXX Quick hack -- need to do this differently */
1228 PyObject *data, *result;
1229 RFILE rf;
1230 data = PyObject_CallMethod(f, "read", "");
1231 if (data == NULL)
1232 return NULL;
1233 rf.fp = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001234 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 if (PyBytes_Check(data)) {
1236 rf.ptr = PyBytes_AS_STRING(data);
1237 rf.end = rf.ptr + PyBytes_GET_SIZE(data);
1238 }
1239 else if (PyBytes_Check(data)) {
1240 rf.ptr = PyBytes_AS_STRING(data);
1241 rf.end = rf.ptr + PyBytes_GET_SIZE(data);
1242 }
1243 else {
1244 PyErr_Format(PyExc_TypeError,
1245 "f.read() returned neither string "
1246 "nor bytes but %.100s",
1247 data->ob_type->tp_name);
1248 Py_DECREF(data);
1249 return NULL;
1250 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 rf.depth = 0;
1252 result = read_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 Py_DECREF(data);
1254 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001255}
1256
R. David Murraydd226ea2009-05-13 12:27:21 +00001257PyDoc_STRVAR(load_doc,
1258"load(file)\n\
1259\n\
1260Read one value from the open file and return it. If no valid value is\n\
1261read (e.g. because the data has a different Python versions\n\
1262incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1263The file must be an open file object opened in binary mode ('rb' or\n\
1264'r+b').\n\
1265\n\
1266Note: If an object containing an unsupported type was marshalled with\n\
1267dump(), load() will substitute None for the unmarshallable type.");
1268
1269
Guido van Rossum79f25d91997-04-29 20:08:16 +00001270static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001271marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001272{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001273 PyObject *x;
1274 int version = Py_MARSHAL_VERSION;
1275 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
1276 return NULL;
1277 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001278}
1279
R. David Murraydd226ea2009-05-13 12:27:21 +00001280PyDoc_STRVAR(dumps_doc,
1281"dumps(value[, version])\n\
1282\n\
1283Return the string that would be written to a file by dump(value, file).\n\
1284The value must be a supported type. Raise a ValueError exception if\n\
1285value has (or contains an object that has) an unsupported type.\n\
1286\n\
1287The version argument indicates the data format that dumps should use.");
1288
1289
Guido van Rossum79f25d91997-04-29 20:08:16 +00001290static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001291marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001292{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 RFILE rf;
1294 Py_buffer p;
1295 char *s;
1296 Py_ssize_t n;
1297 PyObject* result;
1298 if (!PyArg_ParseTuple(args, "s*:loads", &p))
1299 return NULL;
1300 s = p.buf;
1301 n = p.len;
1302 rf.fp = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001303 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 rf.ptr = s;
1305 rf.end = s + n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306 rf.depth = 0;
1307 result = read_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 PyBuffer_Release(&p);
1309 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001310}
1311
R. David Murraydd226ea2009-05-13 12:27:21 +00001312PyDoc_STRVAR(loads_doc,
1313"loads(string)\n\
1314\n\
1315Convert the string to a value. If no valid value is found, raise\n\
1316EOFError, ValueError or TypeError. Extra characters in the string are\n\
1317ignored.");
1318
Guido van Rossum79f25d91997-04-29 20:08:16 +00001319static PyMethodDef marshal_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001320 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1321 {"load", marshal_load, METH_O, load_doc},
1322 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1323 {"loads", marshal_loads, METH_VARARGS, loads_doc},
1324 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001325};
1326
R. David Murraydd226ea2009-05-13 12:27:21 +00001327
1328PyDoc_STRVAR(module_doc,
1329"This module contains functions that can read and write Python values in\n\
1330a binary format. The format is specific to Python, but independent of\n\
1331machine architecture issues.\n\
1332\n\
1333Not all Python object types are supported; in general, only objects\n\
1334whose value is independent from a particular invocation of Python can be\n\
1335written and read by this module. The following types are supported:\n\
1336None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1337tuples, lists, sets, dictionaries, and code objects, where it\n\
1338should be understood that tuples, lists and dictionaries are only\n\
1339supported as long as the values contained therein are themselves\n\
1340supported; and recursive lists and dictionaries should not be written\n\
1341(they will cause infinite loops).\n\
1342\n\
1343Variables:\n\
1344\n\
1345version -- indicates the format that the module uses. Version 0 is the\n\
1346 historical format, version 1 shares interned strings and version 2\n\
1347 uses a binary format for floating point numbers.\n\
1348\n\
1349Functions:\n\
1350\n\
1351dump() -- write value to a file\n\
1352load() -- read value from a file\n\
1353dumps() -- write value to a string\n\
1354loads() -- read value from a string");
1355
1356
1357
Brett Cannon429ef652008-06-27 00:35:35 +00001358static struct PyModuleDef marshalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001359 PyModuleDef_HEAD_INIT,
1360 "marshal",
1361 module_doc,
1362 0,
1363 marshal_methods,
1364 NULL,
1365 NULL,
1366 NULL,
1367 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001368};
1369
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001370PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001371PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001372{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001373 PyObject *mod = PyModule_Create(&marshalmodule);
1374 if (mod == NULL)
1375 return NULL;
1376 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
1377 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001378}