blob: bcc86360096b96660537fa44f253a08a06e7afa5 [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
Fred Drake6da0b912000-06-28 18:47:56 +000014/* High water mark to determine when the marshalled object is dangerously deep
15 * and risks coring the interpreter. When the object stack gets this deep,
16 * raise an exception instead of continuing.
17 */
Neal Norwitzf6b0e4d2007-05-17 07:04:46 +000018#define MAX_MARSHAL_STACK_DEPTH 2000
Fred Drake6da0b912000-06-28 18:47:56 +000019
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000020#define TYPE_NULL '0'
21#define TYPE_NONE 'N'
22#define TYPE_FALSE 'F'
23#define TYPE_TRUE 'T'
24#define TYPE_STOPITER 'S'
25#define TYPE_ELLIPSIS '.'
26#define TYPE_INT 'i'
27#define TYPE_INT64 'I'
28#define TYPE_FLOAT 'f'
29#define TYPE_BINARY_FLOAT 'g'
30#define TYPE_COMPLEX 'x'
31#define TYPE_BINARY_COMPLEX 'y'
32#define TYPE_LONG 'l'
33#define TYPE_STRING 's'
34#define TYPE_INTERNED 't'
35#define TYPE_STRINGREF 'R'
36#define TYPE_TUPLE '('
37#define TYPE_LIST '['
38#define TYPE_DICT '{'
39#define TYPE_CODE 'c'
40#define TYPE_UNICODE 'u'
41#define TYPE_UNKNOWN '?'
42#define TYPE_SET '<'
43#define TYPE_FROZENSET '>'
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000044
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000045typedef struct {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000046 FILE *fp;
47 int error;
48 int depth;
49 /* If fp == NULL, the following are valid: */
50 PyObject *str;
51 char *ptr;
52 char *end;
53 PyObject *strings; /* dict on marshal, list on unmarshal */
54 int version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000055} WFILE;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000056
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000057#define w_byte(c, p) if (((p)->fp)) putc((c), (p)->fp); \
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000058 else if ((p)->ptr != (p)->end) *(p)->ptr++ = (c); \
59 else w_more(c, p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000060
61static void
Fredrik Lundh11534382000-07-23 18:24:06 +000062w_more(int c, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000063{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000064 Py_ssize_t size, newsize;
65 if (p->str == NULL)
66 return; /* An error already occurred */
67 size = PyString_Size(p->str);
68 newsize = size + size + 1024;
69 if (newsize > 32*1024*1024) {
70 newsize = size + (size >> 3); /* 12.5% overallocation */
71 }
72 if (_PyString_Resize(&p->str, newsize) != 0) {
73 p->ptr = p->end = NULL;
74 }
75 else {
76 p->ptr = PyString_AS_STRING((PyStringObject *)p->str) + size;
77 p->end =
78 PyString_AS_STRING((PyStringObject *)p->str) + newsize;
79 *p->ptr++ = Py_SAFE_DOWNCAST(c, int, char);
80 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000081}
82
83static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000084w_string(char *s, int n, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000085{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000086 if (p->fp != NULL) {
87 fwrite(s, 1, n, p->fp);
88 }
89 else {
90 while (--n >= 0) {
91 w_byte(*s, p);
92 s++;
93 }
94 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000095}
96
97static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000098w_short(int x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000099{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000100 w_byte((char)( x & 0xff), p);
101 w_byte((char)((x>> 8) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000102}
103
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000104static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000105w_long(long x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000106{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000107 w_byte((char)( x & 0xff), p);
108 w_byte((char)((x>> 8) & 0xff), p);
109 w_byte((char)((x>>16) & 0xff), p);
110 w_byte((char)((x>>24) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000111}
112
Guido van Rossumc1547d91996-12-10 15:39:04 +0000113#if SIZEOF_LONG > 4
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000114static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000115w_long64(long x, WFILE *p)
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000116{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000117 w_long(x, p);
118 w_long(x>>32, p);
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000119}
Guido van Rossumc1547d91996-12-10 15:39:04 +0000120#endif
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000121
122static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000123w_object(PyObject *v, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000124{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000125 Py_ssize_t i, n;
Fred Drake6da0b912000-06-28 18:47:56 +0000126
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000127 p->depth++;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000128
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000129 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
130 p->error = 2;
131 }
132 else if (v == NULL) {
133 w_byte(TYPE_NULL, p);
134 }
135 else if (v == Py_None) {
136 w_byte(TYPE_NONE, p);
137 }
138 else if (v == PyExc_StopIteration) {
139 w_byte(TYPE_STOPITER, p);
140 }
141 else if (v == Py_Ellipsis) {
142 w_byte(TYPE_ELLIPSIS, p);
143 }
144 else if (v == Py_False) {
145 w_byte(TYPE_FALSE, p);
146 }
147 else if (v == Py_True) {
148 w_byte(TYPE_TRUE, p);
149 }
150 else if (PyInt_CheckExact(v)) {
151 long x = PyInt_AS_LONG((PyIntObject *)v);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000152#if SIZEOF_LONG > 4
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000153 long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
154 if (y && y != -1) {
155 w_byte(TYPE_INT64, p);
156 w_long64(x, p);
157 }
158 else
Guido van Rossumc1547d91996-12-10 15:39:04 +0000159#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000160 {
161 w_byte(TYPE_INT, p);
162 w_long(x, p);
163 }
164 }
165 else if (PyLong_CheckExact(v)) {
166 PyLongObject *ob = (PyLongObject *)v;
167 w_byte(TYPE_LONG, p);
168 n = ob->ob_size;
169 w_long((long)n, p);
170 if (n < 0)
171 n = -n;
172 for (i = 0; i < n; i++)
173 w_short(ob->ob_digit[i], p);
174 }
175 else if (PyFloat_CheckExact(v)) {
176 if (p->version > 1) {
177 unsigned char buf[8];
178 if (_PyFloat_Pack8(PyFloat_AsDouble(v),
179 buf, 1) < 0) {
180 p->error = 1;
181 return;
182 }
183 w_byte(TYPE_BINARY_FLOAT, p);
184 w_string((char*)buf, 8, p);
185 }
186 else {
187 char buf[256]; /* Plenty to format any double */
188 PyFloat_AsReprString(buf, (PyFloatObject *)v);
189 n = strlen(buf);
190 w_byte(TYPE_FLOAT, p);
191 w_byte((int)n, p);
192 w_string(buf, (int)n, p);
193 }
194 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000195#ifndef WITHOUT_COMPLEX
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000196 else if (PyComplex_CheckExact(v)) {
197 if (p->version > 1) {
198 unsigned char buf[8];
199 if (_PyFloat_Pack8(PyComplex_RealAsDouble(v),
200 buf, 1) < 0) {
201 p->error = 1;
202 return;
203 }
204 w_byte(TYPE_BINARY_COMPLEX, p);
205 w_string((char*)buf, 8, p);
206 if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v),
207 buf, 1) < 0) {
208 p->error = 1;
209 return;
210 }
211 w_string((char*)buf, 8, p);
212 }
213 else {
214 char buf[256]; /* Plenty to format any double */
215 PyFloatObject *temp;
216 w_byte(TYPE_COMPLEX, p);
217 temp = (PyFloatObject*)PyFloat_FromDouble(
218 PyComplex_RealAsDouble(v));
219 if (!temp) {
220 p->error = 1;
221 return;
222 }
223 PyFloat_AsReprString(buf, temp);
224 Py_DECREF(temp);
225 n = strlen(buf);
226 w_byte((int)n, p);
227 w_string(buf, (int)n, p);
228 temp = (PyFloatObject*)PyFloat_FromDouble(
229 PyComplex_ImagAsDouble(v));
230 if (!temp) {
231 p->error = 1;
232 return;
233 }
234 PyFloat_AsReprString(buf, temp);
235 Py_DECREF(temp);
236 n = strlen(buf);
237 w_byte((int)n, p);
238 w_string(buf, (int)n, p);
239 }
240 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000241#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000242 else if (PyString_CheckExact(v)) {
243 if (p->strings && PyString_CHECK_INTERNED(v)) {
244 PyObject *o = PyDict_GetItem(p->strings, v);
245 if (o) {
246 long w = PyInt_AsLong(o);
247 w_byte(TYPE_STRINGREF, p);
248 w_long(w, p);
249 goto exit;
250 }
251 else {
252 int ok;
253 o = PyInt_FromSsize_t(PyDict_Size(p->strings));
254 ok = o &&
255 PyDict_SetItem(p->strings, v, o) >= 0;
256 Py_XDECREF(o);
257 if (!ok) {
258 p->depth--;
259 p->error = 1;
260 return;
261 }
262 w_byte(TYPE_INTERNED, p);
263 }
264 }
265 else {
266 w_byte(TYPE_STRING, p);
267 }
268 n = PyString_GET_SIZE(v);
269 if (n > INT_MAX) {
270 /* huge strings are not supported */
271 p->depth--;
272 p->error = 1;
273 return;
274 }
275 w_long((long)n, p);
276 w_string(PyString_AS_STRING(v), (int)n, p);
277 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000278#ifdef Py_USING_UNICODE
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000279 else if (PyUnicode_CheckExact(v)) {
280 PyObject *utf8;
281 utf8 = PyUnicode_AsUTF8String(v);
282 if (utf8 == NULL) {
283 p->depth--;
284 p->error = 1;
285 return;
286 }
287 w_byte(TYPE_UNICODE, p);
288 n = PyString_GET_SIZE(utf8);
289 if (n > INT_MAX) {
290 p->depth--;
291 p->error = 1;
292 return;
293 }
294 w_long((long)n, p);
295 w_string(PyString_AS_STRING(utf8), (int)n, p);
296 Py_DECREF(utf8);
297 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000298#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000299 else if (PyTuple_CheckExact(v)) {
300 w_byte(TYPE_TUPLE, p);
301 n = PyTuple_Size(v);
302 w_long((long)n, p);
303 for (i = 0; i < n; i++) {
304 w_object(PyTuple_GET_ITEM(v, i), p);
305 }
306 }
307 else if (PyList_CheckExact(v)) {
308 w_byte(TYPE_LIST, p);
309 n = PyList_GET_SIZE(v);
310 w_long((long)n, p);
311 for (i = 0; i < n; i++) {
312 w_object(PyList_GET_ITEM(v, i), p);
313 }
314 }
315 else if (PyDict_CheckExact(v)) {
316 Py_ssize_t pos;
317 PyObject *key, *value;
318 w_byte(TYPE_DICT, p);
319 /* This one is NULL object terminated! */
320 pos = 0;
321 while (PyDict_Next(v, &pos, &key, &value)) {
322 w_object(key, p);
323 w_object(value, p);
324 }
325 w_object((PyObject *)NULL, p);
326 }
327 else if (PyAnySet_CheckExact(v)) {
328 PyObject *value, *it;
Raymond Hettingera422c342005-01-11 03:03:27 +0000329
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000330 if (PyObject_TypeCheck(v, &PySet_Type))
331 w_byte(TYPE_SET, p);
332 else
333 w_byte(TYPE_FROZENSET, p);
334 n = PyObject_Size(v);
335 if (n == -1) {
336 p->depth--;
337 p->error = 1;
338 return;
339 }
340 w_long((long)n, p);
341 it = PyObject_GetIter(v);
342 if (it == NULL) {
343 p->depth--;
344 p->error = 1;
345 return;
346 }
347 while ((value = PyIter_Next(it)) != NULL) {
348 w_object(value, p);
349 Py_DECREF(value);
350 }
351 Py_DECREF(it);
352 if (PyErr_Occurred()) {
353 p->depth--;
354 p->error = 1;
355 return;
356 }
357 }
358 else if (PyCode_Check(v)) {
359 PyCodeObject *co = (PyCodeObject *)v;
360 w_byte(TYPE_CODE, p);
361 w_long(co->co_argcount, p);
362 w_long(co->co_nlocals, p);
363 w_long(co->co_stacksize, p);
364 w_long(co->co_flags, p);
365 w_object(co->co_code, p);
366 w_object(co->co_consts, p);
367 w_object(co->co_names, p);
368 w_object(co->co_varnames, p);
369 w_object(co->co_freevars, p);
370 w_object(co->co_cellvars, p);
371 w_object(co->co_filename, p);
372 w_object(co->co_name, p);
373 w_long(co->co_firstlineno, p);
374 w_object(co->co_lnotab, p);
375 }
376 else if (PyObject_CheckReadBuffer(v)) {
377 /* Write unknown buffer-style objects as a string */
378 char *s;
379 PyBufferProcs *pb = v->ob_type->tp_as_buffer;
380 w_byte(TYPE_STRING, p);
381 n = (*pb->bf_getreadbuffer)(v, 0, (void **)&s);
382 if (n > INT_MAX) {
383 p->depth--;
384 p->error = 1;
385 return;
386 }
387 w_long((long)n, p);
388 w_string(s, (int)n, p);
389 }
390 else {
391 w_byte(TYPE_UNKNOWN, p);
392 p->error = 1;
393 }
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000394 exit:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000395 p->depth--;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000396}
397
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000398/* version currently has no effect for writing longs. */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000399void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000400PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000401{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000402 WFILE wf;
403 wf.fp = fp;
404 wf.error = 0;
405 wf.depth = 0;
406 wf.strings = NULL;
407 wf.version = version;
408 w_long(x, &wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000409}
410
411void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000412PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000413{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000414 WFILE wf;
415 wf.fp = fp;
416 wf.error = 0;
417 wf.depth = 0;
418 wf.strings = (version > 0) ? PyDict_New() : NULL;
419 wf.version = version;
420 w_object(x, &wf);
421 Py_XDECREF(wf.strings);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000422}
423
424typedef WFILE RFILE; /* Same struct with different invariants */
425
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000426#define rs_byte(p) (((p)->ptr < (p)->end) ? (unsigned char)*(p)->ptr++ : EOF)
Guido van Rossum8d617a61995-03-09 12:12:11 +0000427
428#define r_byte(p) ((p)->fp ? getc((p)->fp) : rs_byte(p))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000429
430static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000431r_string(char *s, int n, RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000432{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000433 if (p->fp != NULL)
434 /* The result fits into int because it must be <=n. */
435 return (int)fread(s, 1, n, p->fp);
436 if (p->end - p->ptr < n)
437 n = (int)(p->end - p->ptr);
438 memcpy(s, p->ptr, n);
439 p->ptr += n;
440 return n;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000441}
442
443static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000444r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000445{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000446 register short x;
447 x = r_byte(p);
448 x |= r_byte(p) << 8;
449 /* Sign-extension, in case short greater than 16 bits */
450 x |= -(x & 0x8000);
451 return x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000452}
453
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000454static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000455r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000456{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000457 register long x;
458 register FILE *fp = p->fp;
459 if (fp) {
460 x = getc(fp);
461 x |= (long)getc(fp) << 8;
462 x |= (long)getc(fp) << 16;
463 x |= (long)getc(fp) << 24;
464 }
465 else {
466 x = rs_byte(p);
467 x |= (long)rs_byte(p) << 8;
468 x |= (long)rs_byte(p) << 16;
469 x |= (long)rs_byte(p) << 24;
470 }
Guido van Rossumc1547d91996-12-10 15:39:04 +0000471#if SIZEOF_LONG > 4
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000472 /* Sign extension for 64-bit machines */
473 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000474#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000475 return x;
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000476}
477
Tim Peters82112372001-08-29 02:28:42 +0000478/* r_long64 deals with the TYPE_INT64 code. On a machine with
479 sizeof(long) > 4, it returns a Python int object, else a Python long
480 object. Note that w_long64 writes out TYPE_INT if 32 bits is enough,
481 so there's no inefficiency here in returning a PyLong on 32-bit boxes
482 for everything written via TYPE_INT64 (i.e., if an int is written via
483 TYPE_INT64, it *needs* more than 32 bits).
484*/
485static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000486r_long64(RFILE *p)
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000487{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000488 long lo4 = r_long(p);
489 long hi4 = r_long(p);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000490#if SIZEOF_LONG > 4
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000491 long x = (hi4 << 32) | (lo4 & 0xFFFFFFFFL);
492 return PyInt_FromLong(x);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000493#else
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000494 unsigned char buf[8];
495 int one = 1;
496 int is_little_endian = (int)*(char*)&one;
497 if (is_little_endian) {
498 memcpy(buf, &lo4, 4);
499 memcpy(buf+4, &hi4, 4);
500 }
501 else {
502 memcpy(buf, &hi4, 4);
503 memcpy(buf+4, &lo4, 4);
504 }
505 return _PyLong_FromByteArray(buf, 8, is_little_endian, 1);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000506#endif
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000507}
508
Guido van Rossum79f25d91997-04-29 20:08:16 +0000509static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000510r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000511{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000512 /* NULL is a valid return value, it does not necessarily means that
513 an exception is set. */
514 PyObject *v, *v2;
515 long i, n;
516 int type = r_byte(p);
517 PyObject *retval;
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000518
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000519 p->depth++;
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000520
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000521 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
522 p->depth--;
523 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
524 return NULL;
525 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000526
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000527 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000528
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000529 case EOF:
530 PyErr_SetString(PyExc_EOFError,
531 "EOF read where object expected");
532 retval = NULL;
533 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000534
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000535 case TYPE_NULL:
536 retval = NULL;
537 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000538
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000539 case TYPE_NONE:
540 Py_INCREF(Py_None);
541 retval = Py_None;
542 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000543
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000544 case TYPE_STOPITER:
545 Py_INCREF(PyExc_StopIteration);
546 retval = PyExc_StopIteration;
547 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000548
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000549 case TYPE_ELLIPSIS:
550 Py_INCREF(Py_Ellipsis);
551 retval = Py_Ellipsis;
552 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000553
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000554 case TYPE_FALSE:
555 Py_INCREF(Py_False);
556 retval = Py_False;
557 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000558
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000559 case TYPE_TRUE:
560 Py_INCREF(Py_True);
561 retval = Py_True;
562 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000563
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000564 case TYPE_INT:
565 retval = PyInt_FromLong(r_long(p));
566 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000567
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000568 case TYPE_INT64:
569 retval = r_long64(p);
570 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000571
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000572 case TYPE_LONG:
573 {
574 int size;
575 PyLongObject *ob;
576 n = r_long(p);
577 if (n < -INT_MAX || n > INT_MAX) {
578 PyErr_SetString(PyExc_ValueError,
579 "bad marshal data");
580 retval = NULL;
581 break;
582 }
583 size = n<0 ? -n : n;
584 ob = _PyLong_New(size);
585 if (ob == NULL) {
586 retval = NULL;
587 break;
588 }
589 ob->ob_size = n;
590 for (i = 0; i < size; i++) {
591 int digit = r_short(p);
592 if (digit < 0 ||
593 (digit == 0 && i == size-1)) {
594 Py_DECREF(ob);
595 PyErr_SetString(PyExc_ValueError,
596 "bad marshal data");
597 ob = NULL;
598 break;
599 }
600 if (ob != NULL)
601 ob->ob_digit[i] = digit;
602 }
603 retval = (PyObject *)ob;
604 break;
605 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000606
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000607 case TYPE_FLOAT:
608 {
609 char buf[256];
610 double dx;
611 n = r_byte(p);
612 if (n == EOF || r_string(buf, (int)n, p) != n) {
613 PyErr_SetString(PyExc_EOFError,
614 "EOF read where object expected");
615 retval = NULL;
616 break;
617 }
618 buf[n] = '\0';
619 retval = NULL;
620 PyFPE_START_PROTECT("atof", break)
621 dx = PyOS_ascii_atof(buf);
622 PyFPE_END_PROTECT(dx)
623 retval = PyFloat_FromDouble(dx);
624 break;
625 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000626
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000627 case TYPE_BINARY_FLOAT:
628 {
629 unsigned char buf[8];
630 double x;
631 if (r_string((char*)buf, 8, p) != 8) {
632 PyErr_SetString(PyExc_EOFError,
633 "EOF read where object expected");
634 retval = NULL;
635 break;
636 }
637 x = _PyFloat_Unpack8(buf, 1);
638 if (x == -1.0 && PyErr_Occurred()) {
639 retval = NULL;
640 break;
641 }
642 retval = PyFloat_FromDouble(x);
643 break;
644 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000645
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000646#ifndef WITHOUT_COMPLEX
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000647 case TYPE_COMPLEX:
648 {
649 char buf[256];
650 Py_complex c;
651 n = r_byte(p);
652 if (n == EOF || r_string(buf, (int)n, p) != n) {
653 PyErr_SetString(PyExc_EOFError,
654 "EOF read where object expected");
655 retval = NULL;
656 break;
657 }
658 buf[n] = '\0';
659 retval = NULL;
660 PyFPE_START_PROTECT("atof", break;)
661 c.real = PyOS_ascii_atof(buf);
662 PyFPE_END_PROTECT(c)
663 n = r_byte(p);
664 if (n == EOF || r_string(buf, (int)n, p) != n) {
665 PyErr_SetString(PyExc_EOFError,
666 "EOF read where object expected");
667 retval = NULL;
668 break;
669 }
670 buf[n] = '\0';
671 PyFPE_START_PROTECT("atof", break)
672 c.imag = PyOS_ascii_atof(buf);
673 PyFPE_END_PROTECT(c)
674 retval = PyComplex_FromCComplex(c);
675 break;
676 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000677
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000678 case TYPE_BINARY_COMPLEX:
679 {
680 unsigned char buf[8];
681 Py_complex c;
682 if (r_string((char*)buf, 8, p) != 8) {
683 PyErr_SetString(PyExc_EOFError,
684 "EOF read where object expected");
685 retval = NULL;
686 break;
687 }
688 c.real = _PyFloat_Unpack8(buf, 1);
689 if (c.real == -1.0 && PyErr_Occurred()) {
690 retval = NULL;
691 break;
692 }
693 if (r_string((char*)buf, 8, p) != 8) {
694 PyErr_SetString(PyExc_EOFError,
695 "EOF read where object expected");
696 retval = NULL;
697 break;
698 }
699 c.imag = _PyFloat_Unpack8(buf, 1);
700 if (c.imag == -1.0 && PyErr_Occurred()) {
701 retval = NULL;
702 break;
703 }
704 retval = PyComplex_FromCComplex(c);
705 break;
706 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000707#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +0000708
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000709 case TYPE_INTERNED:
710 case TYPE_STRING:
711 n = r_long(p);
712 if (n < 0 || n > INT_MAX) {
713 PyErr_SetString(PyExc_ValueError, "bad marshal data");
714 retval = NULL;
715 break;
716 }
717 v = PyString_FromStringAndSize((char *)NULL, n);
718 if (v == NULL) {
719 retval = NULL;
720 break;
721 }
722 if (r_string(PyString_AS_STRING(v), (int)n, p) != n) {
723 Py_DECREF(v);
724 PyErr_SetString(PyExc_EOFError,
725 "EOF read where object expected");
726 retval = NULL;
727 break;
728 }
729 if (type == TYPE_INTERNED) {
730 PyString_InternInPlace(&v);
731 if (PyList_Append(p->strings, v) < 0) {
732 retval = NULL;
733 break;
734 }
735 }
736 retval = v;
737 break;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000738
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000739 case TYPE_STRINGREF:
740 n = r_long(p);
741 if (n < 0 || n >= PyList_GET_SIZE(p->strings)) {
742 PyErr_SetString(PyExc_ValueError, "bad marshal data");
743 retval = NULL;
744 break;
745 }
746 v = PyList_GET_ITEM(p->strings, n);
747 Py_INCREF(v);
748 retval = v;
749 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000750
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000751#ifdef Py_USING_UNICODE
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000752 case TYPE_UNICODE:
753 {
754 char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +0000755
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000756 n = r_long(p);
757 if (n < 0 || n > INT_MAX) {
758 PyErr_SetString(PyExc_ValueError, "bad marshal data");
759 retval = NULL;
760 break;
761 }
762 buffer = PyMem_NEW(char, n);
763 if (buffer == NULL) {
764 retval = PyErr_NoMemory();
765 break;
766 }
767 if (r_string(buffer, (int)n, p) != n) {
768 PyMem_DEL(buffer);
769 PyErr_SetString(PyExc_EOFError,
770 "EOF read where object expected");
771 retval = NULL;
772 break;
773 }
774 v = PyUnicode_DecodeUTF8(buffer, n, NULL);
775 PyMem_DEL(buffer);
776 retval = v;
777 break;
778 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000779#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +0000780
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000781 case TYPE_TUPLE:
782 n = r_long(p);
783 if (n < 0 || n > INT_MAX) {
784 PyErr_SetString(PyExc_ValueError, "bad marshal data");
785 retval = NULL;
786 break;
787 }
788 v = PyTuple_New((int)n);
789 if (v == NULL) {
790 retval = NULL;
791 break;
792 }
793 for (i = 0; i < n; i++) {
794 v2 = r_object(p);
795 if ( v2 == NULL ) {
796 if (!PyErr_Occurred())
797 PyErr_SetString(PyExc_TypeError,
798 "NULL object in marshal data");
799 Py_DECREF(v);
800 v = NULL;
801 break;
802 }
803 PyTuple_SET_ITEM(v, (int)i, v2);
804 }
805 retval = v;
806 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000807
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000808 case TYPE_LIST:
809 n = r_long(p);
810 if (n < 0 || n > INT_MAX) {
811 PyErr_SetString(PyExc_ValueError, "bad marshal data");
812 retval = NULL;
813 break;
814 }
815 v = PyList_New((int)n);
816 if (v == NULL) {
817 retval = NULL;
818 break;
819 }
820 for (i = 0; i < n; i++) {
821 v2 = r_object(p);
822 if ( v2 == NULL ) {
823 if (!PyErr_Occurred())
824 PyErr_SetString(PyExc_TypeError,
825 "NULL object in marshal data");
826 Py_DECREF(v);
827 v = NULL;
828 break;
829 }
830 PyList_SET_ITEM(v, (int)i, v2);
831 }
832 retval = v;
833 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000834
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000835 case TYPE_DICT:
836 v = PyDict_New();
837 if (v == NULL) {
838 retval = NULL;
839 break;
840 }
841 for (;;) {
842 PyObject *key, *val;
843 key = r_object(p);
844 if (key == NULL)
845 break;
846 val = r_object(p);
847 if (val != NULL)
848 PyDict_SetItem(v, key, val);
849 Py_DECREF(key);
850 Py_XDECREF(val);
851 }
852 if (PyErr_Occurred()) {
853 Py_DECREF(v);
854 v = NULL;
855 }
856 retval = v;
857 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000858
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000859 case TYPE_SET:
860 case TYPE_FROZENSET:
861 n = r_long(p);
862 if (n < 0 || n > INT_MAX) {
863 PyErr_SetString(PyExc_ValueError, "bad marshal data");
864 retval = NULL;
865 break;
866 }
867 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
868 if (v == NULL) {
869 retval = NULL;
870 break;
871 }
872 for (i = 0; i < n; i++) {
873 v2 = r_object(p);
874 if ( v2 == NULL ) {
875 if (!PyErr_Occurred())
876 PyErr_SetString(PyExc_TypeError,
877 "NULL object in marshal data");
878 Py_DECREF(v);
879 v = NULL;
880 break;
881 }
882 if (PySet_Add(v, v2) == -1) {
883 Py_DECREF(v);
884 Py_DECREF(v2);
885 v = NULL;
886 break;
887 }
888 Py_DECREF(v2);
889 }
890 retval = v;
891 break;
Raymond Hettingera422c342005-01-11 03:03:27 +0000892
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000893 case TYPE_CODE:
894 if (PyEval_GetRestricted()) {
895 PyErr_SetString(PyExc_RuntimeError,
896 "cannot unmarshal code objects in "
897 "restricted execution mode");
898 retval = NULL;
899 break;
900 }
901 else {
902 int argcount;
903 int nlocals;
904 int stacksize;
905 int flags;
906 PyObject *code = NULL;
907 PyObject *consts = NULL;
908 PyObject *names = NULL;
909 PyObject *varnames = NULL;
910 PyObject *freevars = NULL;
911 PyObject *cellvars = NULL;
912 PyObject *filename = NULL;
913 PyObject *name = NULL;
914 int firstlineno;
915 PyObject *lnotab = NULL;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000916
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000917 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000918
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000919 /* XXX ignore long->int overflows for now */
920 argcount = (int)r_long(p);
921 nlocals = (int)r_long(p);
922 stacksize = (int)r_long(p);
923 flags = (int)r_long(p);
924 code = r_object(p);
925 if (code == NULL)
926 goto code_error;
927 consts = r_object(p);
928 if (consts == NULL)
929 goto code_error;
930 names = r_object(p);
931 if (names == NULL)
932 goto code_error;
933 varnames = r_object(p);
934 if (varnames == NULL)
935 goto code_error;
936 freevars = r_object(p);
937 if (freevars == NULL)
938 goto code_error;
939 cellvars = r_object(p);
940 if (cellvars == NULL)
941 goto code_error;
942 filename = r_object(p);
943 if (filename == NULL)
944 goto code_error;
945 name = r_object(p);
946 if (name == NULL)
947 goto code_error;
948 firstlineno = (int)r_long(p);
949 lnotab = r_object(p);
950 if (lnotab == NULL)
951 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000952
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000953 v = (PyObject *) PyCode_New(
954 argcount, nlocals, stacksize, flags,
955 code, consts, names, varnames,
956 freevars, cellvars, filename, name,
957 firstlineno, lnotab);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000958
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000959 code_error:
960 Py_XDECREF(code);
961 Py_XDECREF(consts);
962 Py_XDECREF(names);
963 Py_XDECREF(varnames);
964 Py_XDECREF(freevars);
965 Py_XDECREF(cellvars);
966 Py_XDECREF(filename);
967 Py_XDECREF(name);
968 Py_XDECREF(lnotab);
Tim Petersd9b9ac82001-01-28 00:27:39 +0000969
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000970 }
971 retval = v;
972 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000973
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000974 default:
975 /* Bogus data got written, which isn't ideal.
976 This will let you keep working and recover. */
977 PyErr_SetString(PyExc_ValueError, "bad marshal data");
978 retval = NULL;
979 break;
980
981 }
982 p->depth--;
983 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000984}
985
Neal Norwitzd85c4522004-06-13 20:31:49 +0000986static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +0000987read_object(RFILE *p)
988{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000989 PyObject *v;
990 if (PyErr_Occurred()) {
991 fprintf(stderr, "XXX readobject called with exception set\n");
992 return NULL;
993 }
994 v = r_object(p);
995 if (v == NULL && !PyErr_Occurred())
996 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data");
997 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +0000998}
999
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001000int
1001PyMarshal_ReadShortFromFile(FILE *fp)
1002{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001003 RFILE rf;
1004 assert(fp);
1005 rf.fp = fp;
1006 rf.strings = NULL;
1007 rf.end = rf.ptr = NULL;
1008 return r_short(&rf);
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001009}
1010
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001011long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001012PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001013{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001014 RFILE rf;
1015 rf.fp = fp;
1016 rf.strings = NULL;
1017 rf.ptr = rf.end = NULL;
1018 return r_long(&rf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001019}
1020
Tim Peters691e0e92001-01-18 04:39:16 +00001021#ifdef HAVE_FSTAT
1022/* Return size of file in bytes; < 0 if unknown. */
1023static off_t
1024getfilesize(FILE *fp)
1025{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001026 struct stat st;
1027 if (fstat(fileno(fp), &st) != 0)
1028 return -1;
1029 else
1030 return st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001031}
1032#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001033
Tim Peters691e0e92001-01-18 04:39:16 +00001034/* If we can get the size of the file up-front, and it's reasonably small,
1035 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1036 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001037 * CAUTION: since this may read the entire remainder of the file, don't
1038 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001039 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001040PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001041PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001042{
Tim Peters691e0e92001-01-18 04:39:16 +00001043/* 75% of 2.1's .pyc files can exploit SMALL_FILE_LIMIT.
1044 * REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc.
1045 */
1046#define SMALL_FILE_LIMIT (1L << 14)
1047#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001048#ifdef HAVE_FSTAT
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001049 off_t filesize;
Tim Peters691e0e92001-01-18 04:39:16 +00001050#endif
Tim Peters691e0e92001-01-18 04:39:16 +00001051#ifdef HAVE_FSTAT
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001052 filesize = getfilesize(fp);
1053 if (filesize > 0) {
1054 char buf[SMALL_FILE_LIMIT];
1055 char* pBuf = NULL;
1056 if (filesize <= SMALL_FILE_LIMIT)
1057 pBuf = buf;
1058 else if (filesize <= REASONABLE_FILE_LIMIT)
1059 pBuf = (char *)PyMem_MALLOC(filesize);
1060 if (pBuf != NULL) {
1061 PyObject* v;
1062 size_t n;
1063 /* filesize must fit into an int, because it
1064 is smaller than REASONABLE_FILE_LIMIT */
1065 n = fread(pBuf, 1, (int)filesize, fp);
1066 v = PyMarshal_ReadObjectFromString(pBuf, n);
1067 if (pBuf != buf)
1068 PyMem_FREE(pBuf);
1069 return v;
1070 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001071
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001072 }
Tim Peters691e0e92001-01-18 04:39:16 +00001073#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001074 /* We don't have fstat, or we do but the file is larger than
1075 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1076 */
1077 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001078
Tim Peters691e0e92001-01-18 04:39:16 +00001079#undef SMALL_FILE_LIMIT
1080#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001081}
1082
Guido van Rossum79f25d91997-04-29 20:08:16 +00001083PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001084PyMarshal_ReadObjectFromFile(FILE *fp)
1085{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001086 RFILE rf;
1087 PyObject *result;
1088 rf.fp = fp;
1089 rf.strings = PyList_New(0);
1090 rf.depth = 0;
1091 rf.ptr = rf.end = NULL;
1092 result = r_object(&rf);
1093 Py_DECREF(rf.strings);
1094 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001095}
1096
1097PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001098PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001099{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001100 RFILE rf;
1101 PyObject *result;
1102 rf.fp = NULL;
1103 rf.ptr = str;
1104 rf.end = str + len;
1105 rf.strings = PyList_New(0);
1106 rf.depth = 0;
1107 result = r_object(&rf);
1108 Py_DECREF(rf.strings);
1109 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001110}
1111
Guido van Rossum79f25d91997-04-29 20:08:16 +00001112PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001113PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001114{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001115 WFILE wf;
1116 wf.fp = NULL;
1117 wf.str = PyString_FromStringAndSize((char *)NULL, 50);
1118 if (wf.str == NULL)
1119 return NULL;
1120 wf.ptr = PyString_AS_STRING((PyStringObject *)wf.str);
1121 wf.end = wf.ptr + PyString_Size(wf.str);
1122 wf.error = 0;
1123 wf.depth = 0;
1124 wf.version = version;
1125 wf.strings = (version > 0) ? PyDict_New() : NULL;
1126 w_object(x, &wf);
1127 Py_XDECREF(wf.strings);
1128 if (wf.str != NULL) {
1129 char *base = PyString_AS_STRING((PyStringObject *)wf.str);
1130 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1131 Py_DECREF(wf.str);
1132 PyErr_SetString(PyExc_OverflowError,
1133 "too much marshall data for a string");
1134 return NULL;
1135 }
1136 _PyString_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base));
1137 }
1138 if (wf.error) {
1139 Py_XDECREF(wf.str);
1140 PyErr_SetString(PyExc_ValueError,
1141 (wf.error==1)?"unmarshallable object"
1142 :"object too deeply nested to marshal");
1143 return NULL;
1144 }
1145 return wf.str;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001146}
1147
Guido van Rossum64b45521991-06-07 13:58:22 +00001148/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001149
Guido van Rossum79f25d91997-04-29 20:08:16 +00001150static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001151marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001152{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001153 WFILE wf;
1154 PyObject *x;
1155 PyObject *f;
1156 int version = Py_MARSHAL_VERSION;
1157 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
1158 return NULL;
1159 if (!PyFile_Check(f)) {
1160 PyErr_SetString(PyExc_TypeError,
1161 "marshal.dump() 2nd arg must be file");
1162 return NULL;
1163 }
1164 wf.fp = PyFile_AsFile(f);
1165 wf.str = NULL;
1166 wf.ptr = wf.end = NULL;
1167 wf.error = 0;
1168 wf.depth = 0;
1169 wf.strings = (version > 0) ? PyDict_New() : 0;
1170 wf.version = version;
1171 w_object(x, &wf);
1172 Py_XDECREF(wf.strings);
1173 if (wf.error) {
1174 PyErr_SetString(PyExc_ValueError,
1175 (wf.error==1)?"unmarshallable object"
1176 :"object too deeply nested to marshal");
1177 return NULL;
1178 }
1179 Py_INCREF(Py_None);
1180 return Py_None;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001181}
1182
R. David Murray666f1832009-05-13 01:08:35 +00001183PyDoc_STRVAR(dump_doc,
1184"dump(value, file[, version])\n\
1185\n\
1186Write the value on the open file. The value must be a supported type.\n\
1187The file must be an open file object such as sys.stdout or returned by\n\
1188open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1189\n\
1190If the value has (or contains an object that has) an unsupported type, a\n\
1191ValueError exception is raised but garbage data will also be written\n\
1192to the file. The object will not be properly read back by load()\n\
1193\n\
1194New in version 2.4: The version argument indicates the data format that\n\
1195dump should use.");
1196
Guido van Rossum79f25d91997-04-29 20:08:16 +00001197static PyObject *
Georg Brandlbf92f462006-05-29 21:58:42 +00001198marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001199{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001200 RFILE rf;
1201 PyObject *result;
1202 if (!PyFile_Check(f)) {
1203 PyErr_SetString(PyExc_TypeError,
1204 "marshal.load() arg must be file");
1205 return NULL;
1206 }
1207 rf.fp = PyFile_AsFile(f);
1208 rf.strings = PyList_New(0);
1209 rf.depth = 0;
1210 result = read_object(&rf);
1211 Py_DECREF(rf.strings);
1212 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001213}
1214
R. David Murray666f1832009-05-13 01:08:35 +00001215PyDoc_STRVAR(load_doc,
1216"load(file)\n\
1217\n\
1218Read one value from the open file and return it. If no valid value is\n\
1219read (e.g. because the data has a different Python versions\n\
1220incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1221The file must be an open file object opened in binary mode ('rb' or\n\
1222'r+b').\n\
1223\n\
1224Note: If an object containing an unsupported type was marshalled with\n\
1225dump(), load() will substitute None for the unmarshallable type.");
1226
1227
Guido van Rossum79f25d91997-04-29 20:08:16 +00001228static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001229marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001230{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001231 PyObject *x;
1232 int version = Py_MARSHAL_VERSION;
1233 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
1234 return NULL;
1235 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001236}
1237
R. David Murray666f1832009-05-13 01:08:35 +00001238PyDoc_STRVAR(dumps_doc,
1239"dumps(value[, version])\n\
1240\n\
1241Return the string that would be written to a file by dump(value, file).\n\
1242The value must be a supported type. Raise a ValueError exception if\n\
1243value has (or contains an object that has) an unsupported type.\n\
1244\n\
1245New in version 2.4: The version argument indicates the data format that\n\
R. David Murray98c78792009-05-13 13:13:18 +00001246dumps should use.");
R. David Murray666f1832009-05-13 01:08:35 +00001247
1248
Guido van Rossum79f25d91997-04-29 20:08:16 +00001249static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001250marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001251{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001252 RFILE rf;
1253 char *s;
1254 Py_ssize_t n;
1255 PyObject* result;
1256 if (!PyArg_ParseTuple(args, "s#:loads", &s, &n))
1257 return NULL;
1258 rf.fp = NULL;
1259 rf.ptr = s;
1260 rf.end = s + n;
1261 rf.strings = PyList_New(0);
1262 rf.depth = 0;
1263 result = read_object(&rf);
1264 Py_DECREF(rf.strings);
1265 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001266}
1267
R. David Murray666f1832009-05-13 01:08:35 +00001268PyDoc_STRVAR(loads_doc,
1269"loads(string)\n\
1270\n\
1271Convert the string to a value. If no valid value is found, raise\n\
1272EOFError, ValueError or TypeError. Extra characters in the string are\n\
1273ignored.");
1274
Guido van Rossum79f25d91997-04-29 20:08:16 +00001275static PyMethodDef marshal_methods[] = {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001276 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1277 {"load", marshal_load, METH_O, load_doc},
1278 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1279 {"loads", marshal_loads, METH_VARARGS, loads_doc},
1280 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001281};
1282
R. David Murray666f1832009-05-13 01:08:35 +00001283PyDoc_STRVAR(marshal_doc,
1284"This module contains functions that can read and write Python values in\n\
1285a binary format. The format is specific to Python, but independent of\n\
1286machine architecture issues.\n\
1287\n\
1288Not all Python object types are supported; in general, only objects\n\
1289whose value is independent from a particular invocation of Python can be\n\
1290written and read by this module. The following types are supported:\n\
1291None, integers, long integers, floating point numbers, strings, Unicode\n\
1292objects, tuples, lists, sets, dictionaries, and code objects, where it\n\
1293should be understood that tuples, lists and dictionaries are only\n\
1294supported as long as the values contained therein are themselves\n\
1295supported; and recursive lists and dictionaries should not be written\n\
1296(they will cause infinite loops).\n\
1297\n\
1298Variables:\n\
1299\n\
1300version -- indicates the format that the module uses. Version 0 is the\n\
1301 historical format, version 1 (added in Python 2.4) shares interned\n\
1302 strings and version 2 (added in Python 2.5) uses a binary format for\n\
1303 floating point numbers. (New in version 2.4)\n\
1304\n\
1305Functions:\n\
1306\n\
1307dump() -- write value to a file\n\
1308load() -- read value from a file\n\
1309dumps() -- write value to a string\n\
1310loads() -- read value from a string");
1311
1312
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001313PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001314PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001315{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001316 PyObject *mod = Py_InitModule3("marshal", marshal_methods,
1317 marshal_doc);
1318 if (mod == NULL)
1319 return;
1320 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001321}