blob: 73d4f374cd0652e6a7761977c56aa03e6dc20f32 [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;
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 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;
447 wf.strings = NULL;
448 wf.version = version;
449 w_long(x, &wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000450}
451
452void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000453PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000454{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000455 WFILE wf;
456 wf.fp = fp;
457 wf.error = WFERR_OK;
458 wf.depth = 0;
459 wf.strings = (version > 0) ? PyDict_New() : NULL;
460 wf.version = version;
461 w_object(x, &wf);
462 Py_XDECREF(wf.strings);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000463}
464
465typedef WFILE RFILE; /* Same struct with different invariants */
466
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000467#define rs_byte(p) (((p)->ptr < (p)->end) ? (unsigned char)*(p)->ptr++ : EOF)
Guido van Rossum8d617a61995-03-09 12:12:11 +0000468
469#define r_byte(p) ((p)->fp ? getc((p)->fp) : rs_byte(p))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000470
471static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000472r_string(char *s, int n, RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000473{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000474 if (p->fp != NULL)
475 /* The result fits into int because it must be <=n. */
476 return (int)fread(s, 1, n, p->fp);
477 if (p->end - p->ptr < n)
478 n = (int)(p->end - p->ptr);
479 memcpy(s, p->ptr, n);
480 p->ptr += n;
481 return n;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000482}
483
484static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000485r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000486{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000487 register short x;
488 x = r_byte(p);
489 x |= r_byte(p) << 8;
490 /* Sign-extension, in case short greater than 16 bits */
491 x |= -(x & 0x8000);
492 return x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000493}
494
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000495static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000496r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000497{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 register long x;
499 register FILE *fp = p->fp;
500 if (fp) {
501 x = getc(fp);
502 x |= (long)getc(fp) << 8;
503 x |= (long)getc(fp) << 16;
504 x |= (long)getc(fp) << 24;
505 }
506 else {
507 x = rs_byte(p);
508 x |= (long)rs_byte(p) << 8;
509 x |= (long)rs_byte(p) << 16;
510 x |= (long)rs_byte(p) << 24;
511 }
Guido van Rossumc1547d91996-12-10 15:39:04 +0000512#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 /* Sign extension for 64-bit machines */
514 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000515#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 return x;
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000517}
518
Tim Peters82112372001-08-29 02:28:42 +0000519/* r_long64 deals with the TYPE_INT64 code. On a machine with
520 sizeof(long) > 4, it returns a Python int object, else a Python long
521 object. Note that w_long64 writes out TYPE_INT if 32 bits is enough,
522 so there's no inefficiency here in returning a PyLong on 32-bit boxes
523 for everything written via TYPE_INT64 (i.e., if an int is written via
524 TYPE_INT64, it *needs* more than 32 bits).
525*/
526static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000527r_long64(RFILE *p)
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000528{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000529 long lo4 = r_long(p);
530 long hi4 = r_long(p);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000531#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 long x = (hi4 << 32) | (lo4 & 0xFFFFFFFFL);
533 return PyLong_FromLong(x);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000534#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 unsigned char buf[8];
536 int one = 1;
537 int is_little_endian = (int)*(char*)&one;
538 if (is_little_endian) {
539 memcpy(buf, &lo4, 4);
540 memcpy(buf+4, &hi4, 4);
541 }
542 else {
543 memcpy(buf, &hi4, 4);
544 memcpy(buf+4, &lo4, 4);
545 }
546 return _PyLong_FromByteArray(buf, 8, is_little_endian, 1);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000547#endif
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000548}
549
Guido van Rossum79f25d91997-04-29 20:08:16 +0000550static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000551r_PyLong(RFILE *p)
552{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 PyLongObject *ob;
554 int size, i, j, md, shorts_in_top_digit;
555 long n;
556 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 n = r_long(p);
559 if (n == 0)
560 return (PyObject *)_PyLong_New(0);
561 if (n < -INT_MAX || n > INT_MAX) {
562 PyErr_SetString(PyExc_ValueError,
563 "bad marshal data (long size out of range)");
564 return NULL;
565 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 size = 1 + (ABS(n) - 1) / PyLong_MARSHAL_RATIO;
568 shorts_in_top_digit = 1 + (ABS(n) - 1) % PyLong_MARSHAL_RATIO;
569 ob = _PyLong_New(size);
570 if (ob == NULL)
571 return NULL;
572 Py_SIZE(ob) = n > 0 ? size : -size;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 for (i = 0; i < size-1; i++) {
575 d = 0;
576 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
577 md = r_short(p);
578 if (md < 0 || md > PyLong_MARSHAL_BASE)
579 goto bad_digit;
580 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
581 }
582 ob->ob_digit[i] = d;
583 }
584 d = 0;
585 for (j=0; j < shorts_in_top_digit; j++) {
586 md = r_short(p);
587 if (md < 0 || md > PyLong_MARSHAL_BASE)
588 goto bad_digit;
589 /* topmost marshal digit should be nonzero */
590 if (md == 0 && j == shorts_in_top_digit - 1) {
591 Py_DECREF(ob);
592 PyErr_SetString(PyExc_ValueError,
593 "bad marshal data (unnormalized long data)");
594 return NULL;
595 }
596 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
597 }
598 /* top digit should be nonzero, else the resulting PyLong won't be
599 normalized */
600 ob->ob_digit[size-1] = d;
601 return (PyObject *)ob;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000602 bad_digit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 Py_DECREF(ob);
604 PyErr_SetString(PyExc_ValueError,
605 "bad marshal data (digit out of range in long)");
606 return NULL;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000607}
608
609
610static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000611r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000612{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000613 /* NULL is a valid return value, it does not necessarily means that
614 an exception is set. */
615 PyObject *v, *v2;
616 long i, n;
617 int type = r_byte(p);
618 PyObject *retval;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
623 p->depth--;
624 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
625 return NULL;
626 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 case EOF:
631 PyErr_SetString(PyExc_EOFError,
632 "EOF read where object expected");
633 retval = NULL;
634 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000635
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 case TYPE_NULL:
637 retval = NULL;
638 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 case TYPE_NONE:
641 Py_INCREF(Py_None);
642 retval = Py_None;
643 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 case TYPE_STOPITER:
646 Py_INCREF(PyExc_StopIteration);
647 retval = PyExc_StopIteration;
648 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 case TYPE_ELLIPSIS:
651 Py_INCREF(Py_Ellipsis);
652 retval = Py_Ellipsis;
653 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 case TYPE_FALSE:
656 Py_INCREF(Py_False);
657 retval = Py_False;
658 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000660 case TYPE_TRUE:
661 Py_INCREF(Py_True);
662 retval = Py_True;
663 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000665 case TYPE_INT:
666 retval = PyLong_FromLong(r_long(p));
667 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 case TYPE_INT64:
670 retval = r_long64(p);
671 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 case TYPE_LONG:
674 retval = r_PyLong(p);
675 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 case TYPE_FLOAT:
678 {
679 char buf[256];
680 double dx;
681 retval = NULL;
682 n = r_byte(p);
683 if (n == EOF || r_string(buf, (int)n, p) != n) {
684 PyErr_SetString(PyExc_EOFError,
685 "EOF read where object expected");
686 break;
687 }
688 buf[n] = '\0';
689 dx = PyOS_string_to_double(buf, NULL, NULL);
690 if (dx == -1.0 && PyErr_Occurred())
691 break;
692 retval = PyFloat_FromDouble(dx);
693 break;
694 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000696 case TYPE_BINARY_FLOAT:
697 {
698 unsigned char buf[8];
699 double x;
700 if (r_string((char*)buf, 8, p) != 8) {
701 PyErr_SetString(PyExc_EOFError,
702 "EOF read where object expected");
703 retval = NULL;
704 break;
705 }
706 x = _PyFloat_Unpack8(buf, 1);
707 if (x == -1.0 && PyErr_Occurred()) {
708 retval = NULL;
709 break;
710 }
711 retval = PyFloat_FromDouble(x);
712 break;
713 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 case TYPE_COMPLEX:
716 {
717 char buf[256];
718 Py_complex c;
719 retval = NULL;
720 n = r_byte(p);
721 if (n == EOF || r_string(buf, (int)n, p) != n) {
722 PyErr_SetString(PyExc_EOFError,
723 "EOF read where object expected");
724 break;
725 }
726 buf[n] = '\0';
727 c.real = PyOS_string_to_double(buf, NULL, NULL);
728 if (c.real == -1.0 && PyErr_Occurred())
729 break;
730 n = r_byte(p);
731 if (n == EOF || r_string(buf, (int)n, p) != n) {
732 PyErr_SetString(PyExc_EOFError,
733 "EOF read where object expected");
734 break;
735 }
736 buf[n] = '\0';
737 c.imag = PyOS_string_to_double(buf, NULL, NULL);
738 if (c.imag == -1.0 && PyErr_Occurred())
739 break;
740 retval = PyComplex_FromCComplex(c);
741 break;
742 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000743
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000744 case TYPE_BINARY_COMPLEX:
745 {
746 unsigned char buf[8];
747 Py_complex c;
748 if (r_string((char*)buf, 8, p) != 8) {
749 PyErr_SetString(PyExc_EOFError,
750 "EOF read where object expected");
751 retval = NULL;
752 break;
753 }
754 c.real = _PyFloat_Unpack8(buf, 1);
755 if (c.real == -1.0 && PyErr_Occurred()) {
756 retval = NULL;
757 break;
758 }
759 if (r_string((char*)buf, 8, p) != 8) {
760 PyErr_SetString(PyExc_EOFError,
761 "EOF read where object expected");
762 retval = NULL;
763 break;
764 }
765 c.imag = _PyFloat_Unpack8(buf, 1);
766 if (c.imag == -1.0 && PyErr_Occurred()) {
767 retval = NULL;
768 break;
769 }
770 retval = PyComplex_FromCComplex(c);
771 break;
772 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000774 case TYPE_STRING:
775 n = r_long(p);
776 if (n < 0 || n > INT_MAX) {
777 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
778 retval = NULL;
779 break;
780 }
781 v = PyBytes_FromStringAndSize((char *)NULL, n);
782 if (v == NULL) {
783 retval = NULL;
784 break;
785 }
786 if (r_string(PyBytes_AS_STRING(v), (int)n, p) != n) {
787 Py_DECREF(v);
788 PyErr_SetString(PyExc_EOFError,
789 "EOF read where object expected");
790 retval = NULL;
791 break;
792 }
793 retval = v;
794 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000795
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 case TYPE_UNICODE:
797 {
798 char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +0000799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000800 n = r_long(p);
801 if (n < 0 || n > INT_MAX) {
802 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
803 retval = NULL;
804 break;
805 }
806 buffer = PyMem_NEW(char, n);
807 if (buffer == NULL) {
808 retval = PyErr_NoMemory();
809 break;
810 }
811 if (r_string(buffer, (int)n, p) != n) {
812 PyMem_DEL(buffer);
813 PyErr_SetString(PyExc_EOFError,
814 "EOF read where object expected");
815 retval = NULL;
816 break;
817 }
818 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
819 PyMem_DEL(buffer);
820 retval = v;
821 break;
822 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 case TYPE_TUPLE:
825 n = r_long(p);
826 if (n < 0 || n > INT_MAX) {
827 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
828 retval = NULL;
829 break;
830 }
831 v = PyTuple_New((int)n);
832 if (v == NULL) {
833 retval = NULL;
834 break;
835 }
836 for (i = 0; i < n; i++) {
837 v2 = r_object(p);
838 if ( v2 == NULL ) {
839 if (!PyErr_Occurred())
840 PyErr_SetString(PyExc_TypeError,
841 "NULL object in marshal data for tuple");
842 Py_DECREF(v);
843 v = NULL;
844 break;
845 }
846 PyTuple_SET_ITEM(v, (int)i, v2);
847 }
848 retval = v;
849 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 case TYPE_LIST:
852 n = r_long(p);
853 if (n < 0 || n > INT_MAX) {
854 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
855 retval = NULL;
856 break;
857 }
858 v = PyList_New((int)n);
859 if (v == NULL) {
860 retval = NULL;
861 break;
862 }
863 for (i = 0; i < n; i++) {
864 v2 = r_object(p);
865 if ( v2 == NULL ) {
866 if (!PyErr_Occurred())
867 PyErr_SetString(PyExc_TypeError,
868 "NULL object in marshal data for list");
869 Py_DECREF(v);
870 v = NULL;
871 break;
872 }
873 PyList_SET_ITEM(v, (int)i, v2);
874 }
875 retval = v;
876 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 case TYPE_DICT:
879 v = PyDict_New();
880 if (v == NULL) {
881 retval = NULL;
882 break;
883 }
884 for (;;) {
885 PyObject *key, *val;
886 key = r_object(p);
887 if (key == NULL)
888 break;
889 val = r_object(p);
890 if (val != NULL)
891 PyDict_SetItem(v, key, val);
892 Py_DECREF(key);
893 Py_XDECREF(val);
894 }
895 if (PyErr_Occurred()) {
896 Py_DECREF(v);
897 v = NULL;
898 }
899 retval = v;
900 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 case TYPE_SET:
903 case TYPE_FROZENSET:
904 n = r_long(p);
905 if (n < 0 || n > INT_MAX) {
906 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
907 retval = NULL;
908 break;
909 }
910 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
911 if (v == NULL) {
912 retval = NULL;
913 break;
914 }
915 for (i = 0; i < n; i++) {
916 v2 = r_object(p);
917 if ( v2 == NULL ) {
918 if (!PyErr_Occurred())
919 PyErr_SetString(PyExc_TypeError,
920 "NULL object in marshal data for set");
921 Py_DECREF(v);
922 v = NULL;
923 break;
924 }
925 if (PySet_Add(v, v2) == -1) {
926 Py_DECREF(v);
927 Py_DECREF(v2);
928 v = NULL;
929 break;
930 }
931 Py_DECREF(v2);
932 }
933 retval = v;
934 break;
Raymond Hettingera422c342005-01-11 03:03:27 +0000935
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 case TYPE_CODE:
937 {
938 int argcount;
939 int kwonlyargcount;
940 int nlocals;
941 int stacksize;
942 int flags;
943 PyObject *code = NULL;
944 PyObject *consts = NULL;
945 PyObject *names = NULL;
946 PyObject *varnames = NULL;
947 PyObject *freevars = NULL;
948 PyObject *cellvars = NULL;
949 PyObject *filename = NULL;
950 PyObject *name = NULL;
951 int firstlineno;
952 PyObject *lnotab = NULL;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 /* XXX ignore long->int overflows for now */
957 argcount = (int)r_long(p);
958 kwonlyargcount = (int)r_long(p);
959 nlocals = (int)r_long(p);
960 stacksize = (int)r_long(p);
961 flags = (int)r_long(p);
962 code = r_object(p);
963 if (code == NULL)
964 goto code_error;
965 consts = r_object(p);
966 if (consts == NULL)
967 goto code_error;
968 names = r_object(p);
969 if (names == NULL)
970 goto code_error;
971 varnames = r_object(p);
972 if (varnames == NULL)
973 goto code_error;
974 freevars = r_object(p);
975 if (freevars == NULL)
976 goto code_error;
977 cellvars = r_object(p);
978 if (cellvars == NULL)
979 goto code_error;
980 filename = r_object(p);
981 if (filename == NULL)
982 goto code_error;
983 name = r_object(p);
984 if (name == NULL)
985 goto code_error;
986 firstlineno = (int)r_long(p);
987 lnotab = r_object(p);
988 if (lnotab == NULL)
989 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000990
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000991 v = (PyObject *) PyCode_New(
992 argcount, kwonlyargcount,
993 nlocals, stacksize, flags,
994 code, consts, names, varnames,
995 freevars, cellvars, filename, name,
996 firstlineno, lnotab);
Tim Petersd9b9ac82001-01-28 00:27:39 +0000997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 code_error:
999 Py_XDECREF(code);
1000 Py_XDECREF(consts);
1001 Py_XDECREF(names);
1002 Py_XDECREF(varnames);
1003 Py_XDECREF(freevars);
1004 Py_XDECREF(cellvars);
1005 Py_XDECREF(filename);
1006 Py_XDECREF(name);
1007 Py_XDECREF(lnotab);
1008 }
1009 retval = v;
1010 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 default:
1013 /* Bogus data got written, which isn't ideal.
1014 This will let you keep working and recover. */
1015 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
1016 retval = NULL;
1017 break;
1018
1019 }
1020 p->depth--;
1021 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001022}
1023
Neal Norwitzd85c4522004-06-13 20:31:49 +00001024static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001025read_object(RFILE *p)
1026{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 PyObject *v;
1028 if (PyErr_Occurred()) {
1029 fprintf(stderr, "XXX readobject called with exception set\n");
1030 return NULL;
1031 }
1032 v = r_object(p);
1033 if (v == NULL && !PyErr_Occurred())
1034 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1035 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001036}
1037
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001038int
1039PyMarshal_ReadShortFromFile(FILE *fp)
1040{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001041 RFILE rf;
1042 assert(fp);
1043 rf.fp = fp;
1044 rf.strings = NULL;
1045 rf.end = rf.ptr = NULL;
1046 return r_short(&rf);
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001047}
1048
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001049long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001050PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001051{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 RFILE rf;
1053 rf.fp = fp;
1054 rf.strings = NULL;
1055 rf.ptr = rf.end = NULL;
1056 return r_long(&rf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001057}
1058
Tim Peters691e0e92001-01-18 04:39:16 +00001059#ifdef HAVE_FSTAT
1060/* Return size of file in bytes; < 0 if unknown. */
1061static off_t
1062getfilesize(FILE *fp)
1063{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 struct stat st;
1065 if (fstat(fileno(fp), &st) != 0)
1066 return -1;
1067 else
1068 return st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001069}
1070#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001071
Tim Peters691e0e92001-01-18 04:39:16 +00001072/* If we can get the size of the file up-front, and it's reasonably small,
1073 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1074 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001075 * CAUTION: since this may read the entire remainder of the file, don't
1076 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001077 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001078PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001079PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001080{
Antoine Pitrou5bc7ec92010-04-21 22:56:22 +00001081/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
Tim Peters691e0e92001-01-18 04:39:16 +00001082#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001083#ifdef HAVE_FSTAT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 off_t filesize;
1085 filesize = getfilesize(fp);
1086 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1087 char* pBuf = (char *)PyMem_MALLOC(filesize);
1088 if (pBuf != NULL) {
1089 PyObject* v;
1090 size_t n;
1091 /* filesize must fit into an int, because it
1092 is smaller than REASONABLE_FILE_LIMIT */
1093 n = fread(pBuf, 1, (int)filesize, fp);
1094 v = PyMarshal_ReadObjectFromString(pBuf, n);
1095 PyMem_FREE(pBuf);
1096 return v;
1097 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001098
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001099 }
Tim Peters691e0e92001-01-18 04:39:16 +00001100#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 /* We don't have fstat, or we do but the file is larger than
1102 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1103 */
1104 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001105
Tim Peters691e0e92001-01-18 04:39:16 +00001106#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001107}
1108
Guido van Rossum79f25d91997-04-29 20:08:16 +00001109PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001110PyMarshal_ReadObjectFromFile(FILE *fp)
1111{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 RFILE rf;
1113 PyObject *result;
1114 rf.fp = fp;
1115 rf.strings = PyList_New(0);
1116 rf.depth = 0;
1117 rf.ptr = rf.end = NULL;
1118 result = r_object(&rf);
1119 Py_DECREF(rf.strings);
1120 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001121}
1122
1123PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001124PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001125{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001126 RFILE rf;
1127 PyObject *result;
1128 rf.fp = NULL;
1129 rf.ptr = str;
1130 rf.end = str + len;
1131 rf.strings = PyList_New(0);
1132 rf.depth = 0;
1133 result = r_object(&rf);
1134 Py_DECREF(rf.strings);
1135 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001136}
1137
Guido van Rossum79f25d91997-04-29 20:08:16 +00001138PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001139PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001140{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 WFILE wf;
1142 PyObject *res = NULL;
Guido van Rossume6d39042007-05-09 00:01:30 +00001143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 wf.fp = NULL;
1145 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1146 if (wf.str == NULL)
1147 return NULL;
1148 wf.ptr = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1149 wf.end = wf.ptr + PyBytes_Size(wf.str);
1150 wf.error = WFERR_OK;
1151 wf.depth = 0;
1152 wf.version = version;
1153 wf.strings = (version > 0) ? PyDict_New() : NULL;
1154 w_object(x, &wf);
1155 Py_XDECREF(wf.strings);
1156 if (wf.str != NULL) {
1157 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1158 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1159 Py_DECREF(wf.str);
1160 PyErr_SetString(PyExc_OverflowError,
1161 "too much marshal data for a string");
1162 return NULL;
1163 }
1164 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1165 return NULL;
1166 }
1167 if (wf.error != WFERR_OK) {
1168 Py_XDECREF(wf.str);
1169 if (wf.error == WFERR_NOMEMORY)
1170 PyErr_NoMemory();
1171 else
1172 PyErr_SetString(PyExc_ValueError,
1173 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1174 :"object too deeply nested to marshal");
1175 return NULL;
1176 }
1177 if (wf.str != NULL) {
1178 /* XXX Quick hack -- need to do this differently */
1179 res = PyBytes_FromObject(wf.str);
1180 Py_DECREF(wf.str);
1181 }
1182 return res;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001183}
1184
Guido van Rossum64b45521991-06-07 13:58:22 +00001185/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001186
Guido van Rossum79f25d91997-04-29 20:08:16 +00001187static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001188marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001189{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 /* XXX Quick hack -- need to do this differently */
1191 PyObject *x;
1192 PyObject *f;
1193 int version = Py_MARSHAL_VERSION;
1194 PyObject *s;
1195 PyObject *res;
1196 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
1197 return NULL;
1198 s = PyMarshal_WriteObjectToString(x, version);
1199 if (s == NULL)
1200 return NULL;
1201 res = PyObject_CallMethod(f, "write", "O", s);
1202 Py_DECREF(s);
1203 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001204}
1205
R. David Murraydd226ea2009-05-13 12:27:21 +00001206PyDoc_STRVAR(dump_doc,
1207"dump(value, file[, version])\n\
1208\n\
1209Write the value on the open file. The value must be a supported type.\n\
1210The file must be an open file object such as sys.stdout or returned by\n\
1211open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1212\n\
1213If the value has (or contains an object that has) an unsupported type, a\n\
1214ValueError exception is raised but garbage data will also be written\n\
1215to the file. The object will not be properly read back by load()\n\
1216\n\
1217The version argument indicates the data format that dump should use.");
1218
Guido van Rossum79f25d91997-04-29 20:08:16 +00001219static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001220marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001221{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 /* XXX Quick hack -- need to do this differently */
1223 PyObject *data, *result;
1224 RFILE rf;
1225 data = PyObject_CallMethod(f, "read", "");
1226 if (data == NULL)
1227 return NULL;
1228 rf.fp = NULL;
1229 if (PyBytes_Check(data)) {
1230 rf.ptr = PyBytes_AS_STRING(data);
1231 rf.end = rf.ptr + PyBytes_GET_SIZE(data);
1232 }
1233 else if (PyBytes_Check(data)) {
1234 rf.ptr = PyBytes_AS_STRING(data);
1235 rf.end = rf.ptr + PyBytes_GET_SIZE(data);
1236 }
1237 else {
1238 PyErr_Format(PyExc_TypeError,
1239 "f.read() returned neither string "
1240 "nor bytes but %.100s",
1241 data->ob_type->tp_name);
1242 Py_DECREF(data);
1243 return NULL;
1244 }
1245 rf.strings = PyList_New(0);
1246 rf.depth = 0;
1247 result = read_object(&rf);
1248 Py_DECREF(rf.strings);
1249 Py_DECREF(data);
1250 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001251}
1252
R. David Murraydd226ea2009-05-13 12:27:21 +00001253PyDoc_STRVAR(load_doc,
1254"load(file)\n\
1255\n\
1256Read one value from the open file and return it. If no valid value is\n\
1257read (e.g. because the data has a different Python versions\n\
1258incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1259The file must be an open file object opened in binary mode ('rb' or\n\
1260'r+b').\n\
1261\n\
1262Note: If an object containing an unsupported type was marshalled with\n\
1263dump(), load() will substitute None for the unmarshallable type.");
1264
1265
Guido van Rossum79f25d91997-04-29 20:08:16 +00001266static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001267marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001268{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001269 PyObject *x;
1270 int version = Py_MARSHAL_VERSION;
1271 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
1272 return NULL;
1273 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001274}
1275
R. David Murraydd226ea2009-05-13 12:27:21 +00001276PyDoc_STRVAR(dumps_doc,
1277"dumps(value[, version])\n\
1278\n\
1279Return the string that would be written to a file by dump(value, file).\n\
1280The value must be a supported type. Raise a ValueError exception if\n\
1281value has (or contains an object that has) an unsupported type.\n\
1282\n\
1283The version argument indicates the data format that dumps should use.");
1284
1285
Guido van Rossum79f25d91997-04-29 20:08:16 +00001286static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001287marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001288{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 RFILE rf;
1290 Py_buffer p;
1291 char *s;
1292 Py_ssize_t n;
1293 PyObject* result;
1294 if (!PyArg_ParseTuple(args, "s*:loads", &p))
1295 return NULL;
1296 s = p.buf;
1297 n = p.len;
1298 rf.fp = NULL;
1299 rf.ptr = s;
1300 rf.end = s + n;
1301 rf.strings = PyList_New(0);
1302 rf.depth = 0;
1303 result = read_object(&rf);
1304 Py_DECREF(rf.strings);
1305 PyBuffer_Release(&p);
1306 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001307}
1308
R. David Murraydd226ea2009-05-13 12:27:21 +00001309PyDoc_STRVAR(loads_doc,
1310"loads(string)\n\
1311\n\
1312Convert the string to a value. If no valid value is found, raise\n\
1313EOFError, ValueError or TypeError. Extra characters in the string are\n\
1314ignored.");
1315
Guido van Rossum79f25d91997-04-29 20:08:16 +00001316static PyMethodDef marshal_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1318 {"load", marshal_load, METH_O, load_doc},
1319 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1320 {"loads", marshal_loads, METH_VARARGS, loads_doc},
1321 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001322};
1323
R. David Murraydd226ea2009-05-13 12:27:21 +00001324
1325PyDoc_STRVAR(module_doc,
1326"This module contains functions that can read and write Python values in\n\
1327a binary format. The format is specific to Python, but independent of\n\
1328machine architecture issues.\n\
1329\n\
1330Not all Python object types are supported; in general, only objects\n\
1331whose value is independent from a particular invocation of Python can be\n\
1332written and read by this module. The following types are supported:\n\
1333None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1334tuples, lists, sets, dictionaries, and code objects, where it\n\
1335should be understood that tuples, lists and dictionaries are only\n\
1336supported as long as the values contained therein are themselves\n\
1337supported; and recursive lists and dictionaries should not be written\n\
1338(they will cause infinite loops).\n\
1339\n\
1340Variables:\n\
1341\n\
1342version -- indicates the format that the module uses. Version 0 is the\n\
1343 historical format, version 1 shares interned strings and version 2\n\
1344 uses a binary format for floating point numbers.\n\
1345\n\
1346Functions:\n\
1347\n\
1348dump() -- write value to a file\n\
1349load() -- read value from a file\n\
1350dumps() -- write value to a string\n\
1351loads() -- read value from a string");
1352
1353
1354
Brett Cannon429ef652008-06-27 00:35:35 +00001355static struct PyModuleDef marshalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001356 PyModuleDef_HEAD_INIT,
1357 "marshal",
1358 module_doc,
1359 0,
1360 marshal_methods,
1361 NULL,
1362 NULL,
1363 NULL,
1364 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001365};
1366
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001367PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001368PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001369{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001370 PyObject *mod = PyModule_Create(&marshalmodule);
1371 if (mod == NULL)
1372 return NULL;
1373 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
1374 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001375}