blob: 959f3f7f2cd50a028ddb31467faf188a91f879a7 [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'
Martin v. Löwis7e395722012-07-28 19:44:05 +020034/* TYPE_INT64 is deprecated. It is not
35 generated anymore, and support for reading it
36 will be removed in Python 3.4. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000037#define TYPE_INT64 'I'
38#define TYPE_FLOAT 'f'
39#define TYPE_BINARY_FLOAT 'g'
40#define TYPE_COMPLEX 'x'
41#define TYPE_BINARY_COMPLEX 'y'
42#define TYPE_LONG 'l'
43#define TYPE_STRING 's'
44#define TYPE_TUPLE '('
45#define TYPE_LIST '['
46#define TYPE_DICT '{'
47#define TYPE_CODE 'c'
48#define TYPE_UNICODE 'u'
49#define TYPE_UNKNOWN '?'
50#define TYPE_SET '<'
51#define TYPE_FROZENSET '>'
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000052
Eric Smithb1a03cf2009-04-21 11:57:38 +000053#define WFERR_OK 0
54#define WFERR_UNMARSHALLABLE 1
55#define WFERR_NESTEDTOODEEP 2
56#define WFERR_NOMEMORY 3
57
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000058typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000059 FILE *fp;
60 int error; /* see WFERR_* values */
61 int depth;
62 /* If fp == NULL, the following are valid: */
Éric Araujo6c0ba442011-07-26 17:23:57 +020063 PyObject *readable; /* Stream-like object being read from */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 PyObject *str;
Benjamin Peterson43b06862011-05-27 09:08:01 -050065 PyObject *current_filename;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000066 char *ptr;
67 char *end;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000068 int version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000069} WFILE;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000070
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000071#define w_byte(c, p) if (((p)->fp)) putc((c), (p)->fp); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000072 else if ((p)->ptr != (p)->end) *(p)->ptr++ = (c); \
73 else w_more(c, p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000074
75static void
Fredrik Lundh11534382000-07-23 18:24:06 +000076w_more(int c, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000077{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000078 Py_ssize_t size, newsize;
79 if (p->str == NULL)
80 return; /* An error already occurred */
81 size = PyBytes_Size(p->str);
82 newsize = size + size + 1024;
83 if (newsize > 32*1024*1024) {
84 newsize = size + (size >> 3); /* 12.5% overallocation */
85 }
86 if (_PyBytes_Resize(&p->str, newsize) != 0) {
87 p->ptr = p->end = NULL;
88 }
89 else {
90 p->ptr = PyBytes_AS_STRING((PyBytesObject *)p->str) + size;
91 p->end =
92 PyBytes_AS_STRING((PyBytesObject *)p->str) + newsize;
93 *p->ptr++ = Py_SAFE_DOWNCAST(c, int, char);
94 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000095}
96
97static void
Serhiy Storchaka7e019112013-02-13 12:08:15 +020098w_string(char *s, Py_ssize_t n, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000099{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000100 if (p->fp != NULL) {
101 fwrite(s, 1, n, p->fp);
102 }
103 else {
104 while (--n >= 0) {
105 w_byte(*s, p);
106 s++;
107 }
108 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000109}
110
111static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000112w_short(int x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000113{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000114 w_byte((char)( x & 0xff), p);
115 w_byte((char)((x>> 8) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000116}
117
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000118static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000119w_long(long x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000120{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000121 w_byte((char)( x & 0xff), p);
122 w_byte((char)((x>> 8) & 0xff), p);
123 w_byte((char)((x>>16) & 0xff), p);
124 w_byte((char)((x>>24) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000125}
126
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200127#define SIZE32_MAX 0x7FFFFFFF
128
129#if SIZEOF_SIZE_T > 4
130# define W_SIZE(n, p) do { \
131 if ((n) > SIZE32_MAX) { \
132 (p)->depth--; \
133 (p)->error = WFERR_UNMARSHALLABLE; \
134 return; \
135 } \
136 w_long((long)(n), p); \
137 } while(0)
138#else
139# define W_SIZE w_long
140#endif
141
Mark Dickinsonbd792642009-03-18 20:06:12 +0000142/* We assume that Python longs are stored internally in base some power of
143 2**15; for the sake of portability we'll always read and write them in base
144 exactly 2**15. */
145
146#define PyLong_MARSHAL_SHIFT 15
147#define PyLong_MARSHAL_BASE ((short)1 << PyLong_MARSHAL_SHIFT)
148#define PyLong_MARSHAL_MASK (PyLong_MARSHAL_BASE - 1)
149#if PyLong_SHIFT % PyLong_MARSHAL_SHIFT != 0
150#error "PyLong_SHIFT must be a multiple of PyLong_MARSHAL_SHIFT"
151#endif
152#define PyLong_MARSHAL_RATIO (PyLong_SHIFT / PyLong_MARSHAL_SHIFT)
153
154static void
155w_PyLong(const PyLongObject *ob, WFILE *p)
156{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000157 Py_ssize_t i, j, n, l;
158 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000159
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000160 w_byte(TYPE_LONG, p);
161 if (Py_SIZE(ob) == 0) {
162 w_long((long)0, p);
163 return;
164 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000166 /* set l to number of base PyLong_MARSHAL_BASE digits */
167 n = ABS(Py_SIZE(ob));
168 l = (n-1) * PyLong_MARSHAL_RATIO;
169 d = ob->ob_digit[n-1];
170 assert(d != 0); /* a PyLong is always normalized */
171 do {
172 d >>= PyLong_MARSHAL_SHIFT;
173 l++;
174 } while (d != 0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200175 if (l > SIZE32_MAX) {
176 p->depth--;
177 p->error = WFERR_UNMARSHALLABLE;
178 return;
179 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000180 w_long((long)(Py_SIZE(ob) > 0 ? l : -l), p);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000181
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000182 for (i=0; i < n-1; i++) {
183 d = ob->ob_digit[i];
184 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
185 w_short(d & PyLong_MARSHAL_MASK, p);
186 d >>= PyLong_MARSHAL_SHIFT;
187 }
188 assert (d == 0);
189 }
190 d = ob->ob_digit[n-1];
191 do {
192 w_short(d & PyLong_MARSHAL_MASK, p);
193 d >>= PyLong_MARSHAL_SHIFT;
194 } while (d != 0);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000195}
196
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000197static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000198w_object(PyObject *v, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000199{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000200 Py_ssize_t i, n;
Fred Drake6da0b912000-06-28 18:47:56 +0000201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 p->depth++;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000204 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
205 p->error = WFERR_NESTEDTOODEEP;
206 }
207 else if (v == NULL) {
208 w_byte(TYPE_NULL, p);
209 }
210 else if (v == Py_None) {
211 w_byte(TYPE_NONE, p);
212 }
213 else if (v == PyExc_StopIteration) {
214 w_byte(TYPE_STOPITER, p);
215 }
216 else if (v == Py_Ellipsis) {
217 w_byte(TYPE_ELLIPSIS, p);
218 }
219 else if (v == Py_False) {
220 w_byte(TYPE_FALSE, p);
221 }
222 else if (v == Py_True) {
223 w_byte(TYPE_TRUE, p);
224 }
225 else if (PyLong_CheckExact(v)) {
226 long x = PyLong_AsLong(v);
227 if ((x == -1) && PyErr_Occurred()) {
228 PyLongObject *ob = (PyLongObject *)v;
229 PyErr_Clear();
230 w_PyLong(ob, p);
231 }
232 else {
Guido van Rossumc1547d91996-12-10 15:39:04 +0000233#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000234 long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
235 if (y && y != -1) {
Martin v. Löwis7e395722012-07-28 19:44:05 +0200236 /* Too large for TYPE_INT */
237 w_PyLong((PyLongObject*)v, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000238 }
239 else
Guido van Rossumc1547d91996-12-10 15:39:04 +0000240#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000241 {
242 w_byte(TYPE_INT, p);
243 w_long(x, p);
244 }
245 }
246 }
247 else if (PyFloat_CheckExact(v)) {
248 if (p->version > 1) {
249 unsigned char buf[8];
250 if (_PyFloat_Pack8(PyFloat_AsDouble(v),
251 buf, 1) < 0) {
252 p->error = WFERR_UNMARSHALLABLE;
253 return;
254 }
255 w_byte(TYPE_BINARY_FLOAT, p);
256 w_string((char*)buf, 8, p);
257 }
258 else {
259 char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
260 'g', 17, 0, NULL);
261 if (!buf) {
262 p->error = WFERR_NOMEMORY;
263 return;
264 }
265 n = strlen(buf);
266 w_byte(TYPE_FLOAT, p);
267 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200268 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000269 PyMem_Free(buf);
270 }
271 }
272 else if (PyComplex_CheckExact(v)) {
273 if (p->version > 1) {
274 unsigned char buf[8];
275 if (_PyFloat_Pack8(PyComplex_RealAsDouble(v),
276 buf, 1) < 0) {
277 p->error = WFERR_UNMARSHALLABLE;
278 return;
279 }
280 w_byte(TYPE_BINARY_COMPLEX, p);
281 w_string((char*)buf, 8, p);
282 if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v),
283 buf, 1) < 0) {
284 p->error = WFERR_UNMARSHALLABLE;
285 return;
286 }
287 w_string((char*)buf, 8, p);
288 }
289 else {
290 char *buf;
291 w_byte(TYPE_COMPLEX, p);
292 buf = PyOS_double_to_string(PyComplex_RealAsDouble(v),
293 'g', 17, 0, NULL);
294 if (!buf) {
295 p->error = WFERR_NOMEMORY;
296 return;
297 }
298 n = strlen(buf);
299 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200300 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000301 PyMem_Free(buf);
302 buf = PyOS_double_to_string(PyComplex_ImagAsDouble(v),
303 'g', 17, 0, NULL);
304 if (!buf) {
305 p->error = WFERR_NOMEMORY;
306 return;
307 }
308 n = strlen(buf);
309 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200310 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000311 PyMem_Free(buf);
312 }
313 }
314 else if (PyBytes_CheckExact(v)) {
315 w_byte(TYPE_STRING, p);
316 n = PyBytes_GET_SIZE(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200317 W_SIZE(n, p);
318 w_string(PyBytes_AS_STRING(v), n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000319 }
320 else if (PyUnicode_CheckExact(v)) {
321 PyObject *utf8;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200322 utf8 = PyUnicode_AsEncodedString(v, "utf8", "surrogatepass");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000323 if (utf8 == NULL) {
324 p->depth--;
325 p->error = WFERR_UNMARSHALLABLE;
326 return;
327 }
328 w_byte(TYPE_UNICODE, p);
329 n = PyBytes_GET_SIZE(utf8);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200330 W_SIZE(n, p);
331 w_string(PyBytes_AS_STRING(utf8), n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000332 Py_DECREF(utf8);
333 }
334 else if (PyTuple_CheckExact(v)) {
335 w_byte(TYPE_TUPLE, p);
336 n = PyTuple_Size(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200337 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000338 for (i = 0; i < n; i++) {
339 w_object(PyTuple_GET_ITEM(v, i), p);
340 }
341 }
342 else if (PyList_CheckExact(v)) {
343 w_byte(TYPE_LIST, p);
344 n = PyList_GET_SIZE(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200345 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000346 for (i = 0; i < n; i++) {
347 w_object(PyList_GET_ITEM(v, i), p);
348 }
349 }
350 else if (PyDict_CheckExact(v)) {
351 Py_ssize_t pos;
352 PyObject *key, *value;
353 w_byte(TYPE_DICT, p);
354 /* This one is NULL object terminated! */
355 pos = 0;
356 while (PyDict_Next(v, &pos, &key, &value)) {
357 w_object(key, p);
358 w_object(value, p);
359 }
360 w_object((PyObject *)NULL, p);
361 }
362 else if (PyAnySet_CheckExact(v)) {
363 PyObject *value, *it;
Raymond Hettingera422c342005-01-11 03:03:27 +0000364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000365 if (PyObject_TypeCheck(v, &PySet_Type))
366 w_byte(TYPE_SET, p);
367 else
368 w_byte(TYPE_FROZENSET, p);
369 n = PyObject_Size(v);
370 if (n == -1) {
371 p->depth--;
372 p->error = WFERR_UNMARSHALLABLE;
373 return;
374 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200375 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 it = PyObject_GetIter(v);
377 if (it == NULL) {
378 p->depth--;
379 p->error = WFERR_UNMARSHALLABLE;
380 return;
381 }
382 while ((value = PyIter_Next(it)) != NULL) {
383 w_object(value, p);
384 Py_DECREF(value);
385 }
386 Py_DECREF(it);
387 if (PyErr_Occurred()) {
388 p->depth--;
389 p->error = WFERR_UNMARSHALLABLE;
390 return;
391 }
392 }
393 else if (PyCode_Check(v)) {
394 PyCodeObject *co = (PyCodeObject *)v;
395 w_byte(TYPE_CODE, p);
396 w_long(co->co_argcount, p);
397 w_long(co->co_kwonlyargcount, p);
398 w_long(co->co_nlocals, p);
399 w_long(co->co_stacksize, p);
400 w_long(co->co_flags, p);
401 w_object(co->co_code, p);
402 w_object(co->co_consts, p);
403 w_object(co->co_names, p);
404 w_object(co->co_varnames, p);
405 w_object(co->co_freevars, p);
406 w_object(co->co_cellvars, p);
407 w_object(co->co_filename, p);
408 w_object(co->co_name, p);
409 w_long(co->co_firstlineno, p);
410 w_object(co->co_lnotab, p);
411 }
412 else if (PyObject_CheckBuffer(v)) {
413 /* Write unknown buffer-style objects as a string */
414 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000415 Py_buffer view;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100416 if (PyObject_GetBuffer(v, &view, PyBUF_SIMPLE) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 w_byte(TYPE_UNKNOWN, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100418 p->depth--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000419 p->error = WFERR_UNMARSHALLABLE;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100420 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000421 }
422 w_byte(TYPE_STRING, p);
423 n = view.len;
424 s = view.buf;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200425 W_SIZE(n, p);
426 w_string(s, n, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100427 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000428 }
429 else {
430 w_byte(TYPE_UNKNOWN, p);
431 p->error = WFERR_UNMARSHALLABLE;
432 }
433 p->depth--;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000434}
435
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000436/* version currently has no effect for writing longs. */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000437void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000438PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000439{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000440 WFILE wf;
441 wf.fp = fp;
442 wf.error = WFERR_OK;
443 wf.depth = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000444 wf.version = version;
445 w_long(x, &wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000446}
447
448void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000449PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000450{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000451 WFILE wf;
452 wf.fp = fp;
453 wf.error = WFERR_OK;
454 wf.depth = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000455 wf.version = version;
456 w_object(x, &wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000457}
458
459typedef WFILE RFILE; /* Same struct with different invariants */
460
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000461#define rs_byte(p) (((p)->ptr < (p)->end) ? (unsigned char)*(p)->ptr++ : EOF)
Guido van Rossum8d617a61995-03-09 12:12:11 +0000462
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200463static Py_ssize_t
464r_string(char *s, Py_ssize_t n, RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000465{
Éric Araujo6c0ba442011-07-26 17:23:57 +0200466 char *ptr;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200467 Py_ssize_t read, left;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100468
469 if (!p->readable) {
470 if (p->fp != NULL)
471 /* The result fits into int because it must be <=n. */
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200472 read = fread(s, 1, n, p->fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100473 else {
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200474 left = p->end - p->ptr;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100475 read = (left < n) ? left : n;
476 memcpy(s, p->ptr, read);
477 p->ptr += read;
478 }
479 }
480 else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200481 _Py_IDENTIFIER(read);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200482
Serhiy Storchaka5a1f1522013-02-13 12:11:03 +0200483 PyObject *data = _PyObject_CallMethodId(p->readable, &PyId_read, "n", n);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100484 read = 0;
485 if (data != NULL) {
486 if (!PyBytes_Check(data)) {
487 PyErr_Format(PyExc_TypeError,
488 "f.read() returned not bytes but %.100s",
489 data->ob_type->tp_name);
490 }
491 else {
492 read = PyBytes_GET_SIZE(data);
493 if (read > 0) {
494 ptr = PyBytes_AS_STRING(data);
495 memcpy(s, ptr, read);
496 }
497 }
498 Py_DECREF(data);
499 }
500 }
501 if (!PyErr_Occurred() && (read < n)) {
502 PyErr_SetString(PyExc_EOFError, "EOF read where not expected");
503 }
504 return read;
505}
506
507
508static int
509r_byte(RFILE *p)
510{
511 int c = EOF;
512 unsigned char ch;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200513 Py_ssize_t n;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100514
515 if (!p->readable)
516 c = p->fp ? getc(p->fp) : rs_byte(p);
517 else {
518 n = r_string((char *) &ch, 1, p);
519 if (n > 0)
520 c = ch;
521 }
522 return c;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000523}
524
525static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000526r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000527{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000528 register short x;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100529 unsigned char buffer[2];
530
531 r_string((char *) buffer, 2, p);
532 x = buffer[0];
533 x |= buffer[1] << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 /* Sign-extension, in case short greater than 16 bits */
535 x |= -(x & 0x8000);
536 return x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000537}
538
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000539static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000540r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000541{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000542 register long x;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100543 unsigned char buffer[4];
544
545 r_string((char *) buffer, 4, p);
546 x = buffer[0];
547 x |= (long)buffer[1] << 8;
548 x |= (long)buffer[2] << 16;
549 x |= (long)buffer[3] << 24;
Guido van Rossumc1547d91996-12-10 15:39:04 +0000550#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 /* Sign extension for 64-bit machines */
552 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000553#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 return x;
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000555}
556
Tim Peters82112372001-08-29 02:28:42 +0000557/* r_long64 deals with the TYPE_INT64 code. On a machine with
558 sizeof(long) > 4, it returns a Python int object, else a Python long
559 object. Note that w_long64 writes out TYPE_INT if 32 bits is enough,
560 so there's no inefficiency here in returning a PyLong on 32-bit boxes
561 for everything written via TYPE_INT64 (i.e., if an int is written via
562 TYPE_INT64, it *needs* more than 32 bits).
563*/
564static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000565r_long64(RFILE *p)
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000566{
Éric Araujo6c0ba442011-07-26 17:23:57 +0200567 PyObject *result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 long lo4 = r_long(p);
569 long hi4 = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100570
571 if (!PyErr_Occurred()) {
Guido van Rossumc1547d91996-12-10 15:39:04 +0000572#if SIZEOF_LONG > 4
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100573 long x = (hi4 << 32) | (lo4 & 0xFFFFFFFFL);
574 result = PyLong_FromLong(x);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000575#else
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100576 unsigned char buf[8];
577 int one = 1;
578 int is_little_endian = (int)*(char*)&one;
579 if (is_little_endian) {
580 memcpy(buf, &lo4, 4);
581 memcpy(buf+4, &hi4, 4);
582 }
583 else {
584 memcpy(buf, &hi4, 4);
585 memcpy(buf+4, &lo4, 4);
586 }
587 result = _PyLong_FromByteArray(buf, 8, is_little_endian, 1);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000588#endif
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100589 }
590 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000591}
592
Guido van Rossum79f25d91997-04-29 20:08:16 +0000593static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000594r_PyLong(RFILE *p)
595{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 PyLongObject *ob;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200597 long n, size, i;
598 int j, md, shorts_in_top_digit;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100602 if (PyErr_Occurred())
603 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 if (n == 0)
605 return (PyObject *)_PyLong_New(0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200606 if (n < -SIZE32_MAX || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 PyErr_SetString(PyExc_ValueError,
608 "bad marshal data (long size out of range)");
609 return NULL;
610 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000611
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 size = 1 + (ABS(n) - 1) / PyLong_MARSHAL_RATIO;
613 shorts_in_top_digit = 1 + (ABS(n) - 1) % PyLong_MARSHAL_RATIO;
614 ob = _PyLong_New(size);
615 if (ob == NULL)
616 return NULL;
617 Py_SIZE(ob) = n > 0 ? size : -size;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 for (i = 0; i < size-1; i++) {
620 d = 0;
621 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
622 md = r_short(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100623 if (PyErr_Occurred())
624 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 if (md < 0 || md > PyLong_MARSHAL_BASE)
626 goto bad_digit;
627 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
628 }
629 ob->ob_digit[i] = d;
630 }
631 d = 0;
632 for (j=0; j < shorts_in_top_digit; j++) {
633 md = r_short(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100634 if (PyErr_Occurred())
635 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 if (md < 0 || md > PyLong_MARSHAL_BASE)
637 goto bad_digit;
638 /* topmost marshal digit should be nonzero */
639 if (md == 0 && j == shorts_in_top_digit - 1) {
640 Py_DECREF(ob);
641 PyErr_SetString(PyExc_ValueError,
642 "bad marshal data (unnormalized long data)");
643 return NULL;
644 }
645 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
646 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100647 if (PyErr_Occurred()) {
648 Py_DECREF(ob);
649 return NULL;
650 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000651 /* top digit should be nonzero, else the resulting PyLong won't be
652 normalized */
653 ob->ob_digit[size-1] = d;
654 return (PyObject *)ob;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000655 bad_digit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 Py_DECREF(ob);
657 PyErr_SetString(PyExc_ValueError,
658 "bad marshal data (digit out of range in long)");
659 return NULL;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000660}
661
662
663static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000664r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000665{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000666 /* NULL is a valid return value, it does not necessarily means that
667 an exception is set. */
668 PyObject *v, *v2;
669 long i, n;
670 int type = r_byte(p);
671 PyObject *retval;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
676 p->depth--;
677 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
678 return NULL;
679 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 case EOF:
684 PyErr_SetString(PyExc_EOFError,
685 "EOF read where object expected");
686 retval = NULL;
687 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 case TYPE_NULL:
690 retval = NULL;
691 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 case TYPE_NONE:
694 Py_INCREF(Py_None);
695 retval = Py_None;
696 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000698 case TYPE_STOPITER:
699 Py_INCREF(PyExc_StopIteration);
700 retval = PyExc_StopIteration;
701 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 case TYPE_ELLIPSIS:
704 Py_INCREF(Py_Ellipsis);
705 retval = Py_Ellipsis;
706 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708 case TYPE_FALSE:
709 Py_INCREF(Py_False);
710 retval = Py_False;
711 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 case TYPE_TRUE:
714 Py_INCREF(Py_True);
715 retval = Py_True;
716 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 case TYPE_INT:
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100719 n = r_long(p);
720 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 case TYPE_INT64:
724 retval = r_long64(p);
725 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000726
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000727 case TYPE_LONG:
728 retval = r_PyLong(p);
729 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000731 case TYPE_FLOAT:
732 {
733 char buf[256];
734 double dx;
735 retval = NULL;
736 n = r_byte(p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200737 if (n == EOF || r_string(buf, n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000738 PyErr_SetString(PyExc_EOFError,
739 "EOF read where object expected");
740 break;
741 }
742 buf[n] = '\0';
743 dx = PyOS_string_to_double(buf, NULL, NULL);
744 if (dx == -1.0 && PyErr_Occurred())
745 break;
746 retval = PyFloat_FromDouble(dx);
747 break;
748 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000750 case TYPE_BINARY_FLOAT:
751 {
752 unsigned char buf[8];
753 double x;
754 if (r_string((char*)buf, 8, p) != 8) {
755 PyErr_SetString(PyExc_EOFError,
756 "EOF read where object expected");
757 retval = NULL;
758 break;
759 }
760 x = _PyFloat_Unpack8(buf, 1);
761 if (x == -1.0 && PyErr_Occurred()) {
762 retval = NULL;
763 break;
764 }
765 retval = PyFloat_FromDouble(x);
766 break;
767 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 case TYPE_COMPLEX:
770 {
771 char buf[256];
772 Py_complex c;
773 retval = NULL;
774 n = r_byte(p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200775 if (n == EOF || r_string(buf, n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000776 PyErr_SetString(PyExc_EOFError,
777 "EOF read where object expected");
778 break;
779 }
780 buf[n] = '\0';
781 c.real = PyOS_string_to_double(buf, NULL, NULL);
782 if (c.real == -1.0 && PyErr_Occurred())
783 break;
784 n = r_byte(p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200785 if (n == EOF || r_string(buf, n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 PyErr_SetString(PyExc_EOFError,
787 "EOF read where object expected");
788 break;
789 }
790 buf[n] = '\0';
791 c.imag = PyOS_string_to_double(buf, NULL, NULL);
792 if (c.imag == -1.0 && PyErr_Occurred())
793 break;
794 retval = PyComplex_FromCComplex(c);
795 break;
796 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000797
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000798 case TYPE_BINARY_COMPLEX:
799 {
800 unsigned char buf[8];
801 Py_complex c;
802 if (r_string((char*)buf, 8, p) != 8) {
803 PyErr_SetString(PyExc_EOFError,
804 "EOF read where object expected");
805 retval = NULL;
806 break;
807 }
808 c.real = _PyFloat_Unpack8(buf, 1);
809 if (c.real == -1.0 && PyErr_Occurred()) {
810 retval = NULL;
811 break;
812 }
813 if (r_string((char*)buf, 8, p) != 8) {
814 PyErr_SetString(PyExc_EOFError,
815 "EOF read where object expected");
816 retval = NULL;
817 break;
818 }
819 c.imag = _PyFloat_Unpack8(buf, 1);
820 if (c.imag == -1.0 && PyErr_Occurred()) {
821 retval = NULL;
822 break;
823 }
824 retval = PyComplex_FromCComplex(c);
825 break;
826 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000828 case TYPE_STRING:
829 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100830 if (PyErr_Occurred()) {
831 retval = NULL;
832 break;
833 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200834 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000835 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
836 retval = NULL;
837 break;
838 }
839 v = PyBytes_FromStringAndSize((char *)NULL, n);
840 if (v == NULL) {
841 retval = NULL;
842 break;
843 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200844 if (r_string(PyBytes_AS_STRING(v), n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 Py_DECREF(v);
846 PyErr_SetString(PyExc_EOFError,
847 "EOF read where object expected");
848 retval = NULL;
849 break;
850 }
851 retval = v;
852 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 case TYPE_UNICODE:
855 {
856 char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +0000857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100859 if (PyErr_Occurred()) {
860 retval = NULL;
861 break;
862 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200863 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000864 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
865 retval = NULL;
866 break;
867 }
868 buffer = PyMem_NEW(char, n);
869 if (buffer == NULL) {
870 retval = PyErr_NoMemory();
871 break;
872 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200873 if (r_string(buffer, n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 PyMem_DEL(buffer);
875 PyErr_SetString(PyExc_EOFError,
876 "EOF read where object expected");
877 retval = NULL;
878 break;
879 }
880 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
881 PyMem_DEL(buffer);
882 retval = v;
883 break;
884 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886 case TYPE_TUPLE:
887 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100888 if (PyErr_Occurred()) {
889 retval = NULL;
890 break;
891 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200892 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
894 retval = NULL;
895 break;
896 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200897 v = PyTuple_New(n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000898 if (v == NULL) {
899 retval = NULL;
900 break;
901 }
902 for (i = 0; i < n; i++) {
903 v2 = r_object(p);
904 if ( v2 == NULL ) {
905 if (!PyErr_Occurred())
906 PyErr_SetString(PyExc_TypeError,
907 "NULL object in marshal data for tuple");
908 Py_DECREF(v);
909 v = NULL;
910 break;
911 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200912 PyTuple_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 }
914 retval = v;
915 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 case TYPE_LIST:
918 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100919 if (PyErr_Occurred()) {
920 retval = NULL;
921 break;
922 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200923 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000924 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
925 retval = NULL;
926 break;
927 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200928 v = PyList_New(n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000929 if (v == NULL) {
930 retval = NULL;
931 break;
932 }
933 for (i = 0; i < n; i++) {
934 v2 = r_object(p);
935 if ( v2 == NULL ) {
936 if (!PyErr_Occurred())
937 PyErr_SetString(PyExc_TypeError,
938 "NULL object in marshal data for list");
939 Py_DECREF(v);
940 v = NULL;
941 break;
942 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200943 PyList_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 }
945 retval = v;
946 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000948 case TYPE_DICT:
949 v = PyDict_New();
950 if (v == NULL) {
951 retval = NULL;
952 break;
953 }
954 for (;;) {
955 PyObject *key, *val;
956 key = r_object(p);
957 if (key == NULL)
958 break;
959 val = r_object(p);
960 if (val != NULL)
961 PyDict_SetItem(v, key, val);
962 Py_DECREF(key);
963 Py_XDECREF(val);
964 }
965 if (PyErr_Occurred()) {
966 Py_DECREF(v);
967 v = NULL;
968 }
969 retval = v;
970 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000971
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 case TYPE_SET:
973 case TYPE_FROZENSET:
974 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100975 if (PyErr_Occurred()) {
976 retval = NULL;
977 break;
978 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200979 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000980 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
981 retval = NULL;
982 break;
983 }
984 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
985 if (v == NULL) {
986 retval = NULL;
987 break;
988 }
989 for (i = 0; i < n; i++) {
990 v2 = r_object(p);
991 if ( v2 == NULL ) {
992 if (!PyErr_Occurred())
993 PyErr_SetString(PyExc_TypeError,
994 "NULL object in marshal data for set");
995 Py_DECREF(v);
996 v = NULL;
997 break;
998 }
999 if (PySet_Add(v, v2) == -1) {
1000 Py_DECREF(v);
1001 Py_DECREF(v2);
1002 v = NULL;
1003 break;
1004 }
1005 Py_DECREF(v2);
1006 }
1007 retval = v;
1008 break;
Raymond Hettingera422c342005-01-11 03:03:27 +00001009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 case TYPE_CODE:
1011 {
1012 int argcount;
1013 int kwonlyargcount;
1014 int nlocals;
1015 int stacksize;
1016 int flags;
1017 PyObject *code = NULL;
1018 PyObject *consts = NULL;
1019 PyObject *names = NULL;
1020 PyObject *varnames = NULL;
1021 PyObject *freevars = NULL;
1022 PyObject *cellvars = NULL;
1023 PyObject *filename = NULL;
1024 PyObject *name = NULL;
1025 int firstlineno;
1026 PyObject *lnotab = NULL;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001028 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001030 /* XXX ignore long->int overflows for now */
1031 argcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001032 if (PyErr_Occurred())
1033 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 kwonlyargcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001035 if (PyErr_Occurred())
1036 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001037 nlocals = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001038 if (PyErr_Occurred())
1039 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 stacksize = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001041 if (PyErr_Occurred())
1042 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 flags = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001044 if (PyErr_Occurred())
1045 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 code = r_object(p);
1047 if (code == NULL)
1048 goto code_error;
1049 consts = r_object(p);
1050 if (consts == NULL)
1051 goto code_error;
1052 names = r_object(p);
1053 if (names == NULL)
1054 goto code_error;
1055 varnames = r_object(p);
1056 if (varnames == NULL)
1057 goto code_error;
1058 freevars = r_object(p);
1059 if (freevars == NULL)
1060 goto code_error;
1061 cellvars = r_object(p);
1062 if (cellvars == NULL)
1063 goto code_error;
1064 filename = r_object(p);
1065 if (filename == NULL)
1066 goto code_error;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001067 if (PyUnicode_CheckExact(filename)) {
1068 if (p->current_filename != NULL) {
1069 if (!PyUnicode_Compare(filename, p->current_filename)) {
1070 Py_DECREF(filename);
1071 Py_INCREF(p->current_filename);
1072 filename = p->current_filename;
1073 }
1074 }
1075 else {
1076 p->current_filename = filename;
1077 }
1078 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 name = r_object(p);
1080 if (name == NULL)
1081 goto code_error;
1082 firstlineno = (int)r_long(p);
1083 lnotab = r_object(p);
1084 if (lnotab == NULL)
1085 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001087 v = (PyObject *) PyCode_New(
1088 argcount, kwonlyargcount,
1089 nlocals, stacksize, flags,
1090 code, consts, names, varnames,
1091 freevars, cellvars, filename, name,
1092 firstlineno, lnotab);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 code_error:
1095 Py_XDECREF(code);
1096 Py_XDECREF(consts);
1097 Py_XDECREF(names);
1098 Py_XDECREF(varnames);
1099 Py_XDECREF(freevars);
1100 Py_XDECREF(cellvars);
1101 Py_XDECREF(filename);
1102 Py_XDECREF(name);
1103 Py_XDECREF(lnotab);
1104 }
1105 retval = v;
1106 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 default:
1109 /* Bogus data got written, which isn't ideal.
1110 This will let you keep working and recover. */
1111 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
1112 retval = NULL;
1113 break;
1114
1115 }
1116 p->depth--;
1117 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001118}
1119
Neal Norwitzd85c4522004-06-13 20:31:49 +00001120static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001121read_object(RFILE *p)
1122{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001123 PyObject *v;
1124 if (PyErr_Occurred()) {
1125 fprintf(stderr, "XXX readobject called with exception set\n");
1126 return NULL;
1127 }
1128 v = r_object(p);
1129 if (v == NULL && !PyErr_Occurred())
1130 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1131 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001132}
1133
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001134int
1135PyMarshal_ReadShortFromFile(FILE *fp)
1136{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 RFILE rf;
1138 assert(fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001139 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 rf.fp = fp;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001141 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 rf.end = rf.ptr = NULL;
1143 return r_short(&rf);
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001144}
1145
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001146long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001147PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001148{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 RFILE rf;
1150 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001151 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001152 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 rf.ptr = rf.end = NULL;
1154 return r_long(&rf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001155}
1156
Tim Peters691e0e92001-01-18 04:39:16 +00001157#ifdef HAVE_FSTAT
1158/* Return size of file in bytes; < 0 if unknown. */
1159static off_t
1160getfilesize(FILE *fp)
1161{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 struct stat st;
1163 if (fstat(fileno(fp), &st) != 0)
1164 return -1;
1165 else
1166 return st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001167}
1168#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001169
Tim Peters691e0e92001-01-18 04:39:16 +00001170/* If we can get the size of the file up-front, and it's reasonably small,
1171 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1172 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001173 * CAUTION: since this may read the entire remainder of the file, don't
1174 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001175 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001176PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001177PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001178{
Antoine Pitrou5bc7ec92010-04-21 22:56:22 +00001179/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
Tim Peters691e0e92001-01-18 04:39:16 +00001180#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001181#ifdef HAVE_FSTAT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001182 off_t filesize;
1183 filesize = getfilesize(fp);
1184 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1185 char* pBuf = (char *)PyMem_MALLOC(filesize);
1186 if (pBuf != NULL) {
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001187 size_t n = fread(pBuf, 1, (size_t)filesize, fp);
1188 PyObject* v = PyMarshal_ReadObjectFromString(pBuf, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 PyMem_FREE(pBuf);
1190 return v;
1191 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 }
Tim Peters691e0e92001-01-18 04:39:16 +00001194#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 /* We don't have fstat, or we do but the file is larger than
1196 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1197 */
1198 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001199
Tim Peters691e0e92001-01-18 04:39:16 +00001200#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001201}
1202
Guido van Rossum79f25d91997-04-29 20:08:16 +00001203PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001204PyMarshal_ReadObjectFromFile(FILE *fp)
1205{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 RFILE rf;
1207 PyObject *result;
1208 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001209 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001210 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 rf.depth = 0;
1212 rf.ptr = rf.end = NULL;
1213 result = r_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001215}
1216
1217PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001218PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001219{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 RFILE rf;
1221 PyObject *result;
1222 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001223 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001224 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 rf.ptr = str;
1226 rf.end = str + len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 rf.depth = 0;
1228 result = r_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001229 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001230}
1231
Guido van Rossum79f25d91997-04-29 20:08:16 +00001232PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001233PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001234{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 WFILE wf;
Guido van Rossume6d39042007-05-09 00:01:30 +00001236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 wf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001238 wf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1240 if (wf.str == NULL)
1241 return NULL;
1242 wf.ptr = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1243 wf.end = wf.ptr + PyBytes_Size(wf.str);
1244 wf.error = WFERR_OK;
1245 wf.depth = 0;
1246 wf.version = version;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001247 w_object(x, &wf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 if (wf.str != NULL) {
1249 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1250 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1251 Py_DECREF(wf.str);
1252 PyErr_SetString(PyExc_OverflowError,
1253 "too much marshal data for a string");
1254 return NULL;
1255 }
1256 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1257 return NULL;
1258 }
1259 if (wf.error != WFERR_OK) {
1260 Py_XDECREF(wf.str);
1261 if (wf.error == WFERR_NOMEMORY)
1262 PyErr_NoMemory();
1263 else
1264 PyErr_SetString(PyExc_ValueError,
1265 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1266 :"object too deeply nested to marshal");
1267 return NULL;
1268 }
Antoine Pitrou1c13f842012-03-02 18:22:23 +01001269 return wf.str;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001270}
1271
Guido van Rossum64b45521991-06-07 13:58:22 +00001272/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001273
Guido van Rossum79f25d91997-04-29 20:08:16 +00001274static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001275marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001276{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 /* XXX Quick hack -- need to do this differently */
1278 PyObject *x;
1279 PyObject *f;
1280 int version = Py_MARSHAL_VERSION;
1281 PyObject *s;
1282 PyObject *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001283 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001284
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
1286 return NULL;
1287 s = PyMarshal_WriteObjectToString(x, version);
1288 if (s == NULL)
1289 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001290 res = _PyObject_CallMethodId(f, &PyId_write, "O", s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 Py_DECREF(s);
1292 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001293}
1294
R. David Murraydd226ea2009-05-13 12:27:21 +00001295PyDoc_STRVAR(dump_doc,
1296"dump(value, file[, version])\n\
1297\n\
1298Write the value on the open file. The value must be a supported type.\n\
1299The file must be an open file object such as sys.stdout or returned by\n\
1300open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1301\n\
1302If the value has (or contains an object that has) an unsupported type, a\n\
1303ValueError exception is raised but garbage data will also be written\n\
1304to the file. The object will not be properly read back by load()\n\
1305\n\
1306The version argument indicates the data format that dump should use.");
1307
Guido van Rossum79f25d91997-04-29 20:08:16 +00001308static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001309marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001310{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311 PyObject *data, *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001312 _Py_IDENTIFIER(read);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 RFILE rf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001314
1315 /*
1316 * Make a call to the read method, but read zero bytes.
1317 * This is to ensure that the object passed in at least
1318 * has a read method which returns bytes.
1319 */
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001320 data = _PyObject_CallMethodId(f, &PyId_read, "i", 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 if (data == NULL)
1322 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001323 if (!PyBytes_Check(data)) {
1324 PyErr_Format(PyExc_TypeError,
1325 "f.read() returned not bytes but %.100s",
1326 data->ob_type->tp_name);
1327 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001328 }
1329 else {
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001330 rf.depth = 0;
1331 rf.fp = NULL;
1332 rf.readable = f;
Vinay Sajipaac0f752011-07-02 18:42:21 +01001333 rf.current_filename = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001334 result = read_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001335 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 Py_DECREF(data);
1337 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001338}
1339
R. David Murraydd226ea2009-05-13 12:27:21 +00001340PyDoc_STRVAR(load_doc,
1341"load(file)\n\
1342\n\
1343Read one value from the open file and return it. If no valid value is\n\
1344read (e.g. because the data has a different Python versions\n\
1345incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1346The file must be an open file object opened in binary mode ('rb' or\n\
1347'r+b').\n\
1348\n\
1349Note: If an object containing an unsupported type was marshalled with\n\
1350dump(), load() will substitute None for the unmarshallable type.");
1351
1352
Guido van Rossum79f25d91997-04-29 20:08:16 +00001353static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001354marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001355{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001356 PyObject *x;
1357 int version = Py_MARSHAL_VERSION;
1358 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
1359 return NULL;
1360 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001361}
1362
R. David Murraydd226ea2009-05-13 12:27:21 +00001363PyDoc_STRVAR(dumps_doc,
1364"dumps(value[, version])\n\
1365\n\
1366Return the string that would be written to a file by dump(value, file).\n\
1367The value must be a supported type. Raise a ValueError exception if\n\
1368value has (or contains an object that has) an unsupported type.\n\
1369\n\
1370The version argument indicates the data format that dumps should use.");
1371
1372
Guido van Rossum79f25d91997-04-29 20:08:16 +00001373static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001374marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001375{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001376 RFILE rf;
1377 Py_buffer p;
1378 char *s;
1379 Py_ssize_t n;
1380 PyObject* result;
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001381 if (!PyArg_ParseTuple(args, "y*:loads", &p))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001382 return NULL;
1383 s = p.buf;
1384 n = p.len;
1385 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001386 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001387 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001388 rf.ptr = s;
1389 rf.end = s + n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 rf.depth = 0;
1391 result = read_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 PyBuffer_Release(&p);
1393 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001394}
1395
R. David Murraydd226ea2009-05-13 12:27:21 +00001396PyDoc_STRVAR(loads_doc,
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001397"loads(bytes)\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001398\n\
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001399Convert the bytes object to a value. If no valid value is found, raise\n\
1400EOFError, ValueError or TypeError. Extra characters in the input are\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001401ignored.");
1402
Guido van Rossum79f25d91997-04-29 20:08:16 +00001403static PyMethodDef marshal_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1405 {"load", marshal_load, METH_O, load_doc},
1406 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1407 {"loads", marshal_loads, METH_VARARGS, loads_doc},
1408 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001409};
1410
R. David Murraydd226ea2009-05-13 12:27:21 +00001411
1412PyDoc_STRVAR(module_doc,
1413"This module contains functions that can read and write Python values in\n\
1414a binary format. The format is specific to Python, but independent of\n\
1415machine architecture issues.\n\
1416\n\
1417Not all Python object types are supported; in general, only objects\n\
1418whose value is independent from a particular invocation of Python can be\n\
1419written and read by this module. The following types are supported:\n\
1420None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1421tuples, lists, sets, dictionaries, and code objects, where it\n\
1422should be understood that tuples, lists and dictionaries are only\n\
1423supported as long as the values contained therein are themselves\n\
1424supported; and recursive lists and dictionaries should not be written\n\
1425(they will cause infinite loops).\n\
1426\n\
1427Variables:\n\
1428\n\
1429version -- indicates the format that the module uses. Version 0 is the\n\
1430 historical format, version 1 shares interned strings and version 2\n\
1431 uses a binary format for floating point numbers.\n\
1432\n\
1433Functions:\n\
1434\n\
1435dump() -- write value to a file\n\
1436load() -- read value from a file\n\
1437dumps() -- write value to a string\n\
1438loads() -- read value from a string");
1439
1440
1441
Brett Cannon429ef652008-06-27 00:35:35 +00001442static struct PyModuleDef marshalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001443 PyModuleDef_HEAD_INIT,
1444 "marshal",
1445 module_doc,
1446 0,
1447 marshal_methods,
1448 NULL,
1449 NULL,
1450 NULL,
1451 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001452};
1453
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001454PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001455PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001456{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001457 PyObject *mod = PyModule_Create(&marshalmodule);
1458 if (mod == NULL)
1459 return NULL;
1460 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
1461 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001462}