blob: cc1732991307e6dccd1fb361842c7713bf5fda6f [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 Storchakadfde2152013-07-11 19:14:26 +030098w_string(const 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
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300142static void
143w_pstring(const char *s, Py_ssize_t n, WFILE *p)
144{
145 W_SIZE(n, p);
146 w_string(s, n, p);
147}
148
Serhiy Storchaka95949422013-08-27 19:40:23 +0300149/* We assume that Python ints are stored internally in base some power of
Mark Dickinsonbd792642009-03-18 20:06:12 +0000150 2**15; for the sake of portability we'll always read and write them in base
151 exactly 2**15. */
152
153#define PyLong_MARSHAL_SHIFT 15
154#define PyLong_MARSHAL_BASE ((short)1 << PyLong_MARSHAL_SHIFT)
155#define PyLong_MARSHAL_MASK (PyLong_MARSHAL_BASE - 1)
156#if PyLong_SHIFT % PyLong_MARSHAL_SHIFT != 0
157#error "PyLong_SHIFT must be a multiple of PyLong_MARSHAL_SHIFT"
158#endif
159#define PyLong_MARSHAL_RATIO (PyLong_SHIFT / PyLong_MARSHAL_SHIFT)
160
161static void
162w_PyLong(const PyLongObject *ob, WFILE *p)
163{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000164 Py_ssize_t i, j, n, l;
165 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000167 w_byte(TYPE_LONG, p);
168 if (Py_SIZE(ob) == 0) {
169 w_long((long)0, p);
170 return;
171 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000173 /* set l to number of base PyLong_MARSHAL_BASE digits */
174 n = ABS(Py_SIZE(ob));
175 l = (n-1) * PyLong_MARSHAL_RATIO;
176 d = ob->ob_digit[n-1];
177 assert(d != 0); /* a PyLong is always normalized */
178 do {
179 d >>= PyLong_MARSHAL_SHIFT;
180 l++;
181 } while (d != 0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200182 if (l > SIZE32_MAX) {
183 p->depth--;
184 p->error = WFERR_UNMARSHALLABLE;
185 return;
186 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000187 w_long((long)(Py_SIZE(ob) > 0 ? l : -l), p);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000189 for (i=0; i < n-1; i++) {
190 d = ob->ob_digit[i];
191 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
192 w_short(d & PyLong_MARSHAL_MASK, p);
193 d >>= PyLong_MARSHAL_SHIFT;
194 }
195 assert (d == 0);
196 }
197 d = ob->ob_digit[n-1];
198 do {
199 w_short(d & PyLong_MARSHAL_MASK, p);
200 d >>= PyLong_MARSHAL_SHIFT;
201 } while (d != 0);
Mark Dickinsonbd792642009-03-18 20:06:12 +0000202}
203
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000204static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000205w_object(PyObject *v, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000206{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000207 Py_ssize_t i, n;
Fred Drake6da0b912000-06-28 18:47:56 +0000208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000209 p->depth++;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000211 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
212 p->error = WFERR_NESTEDTOODEEP;
213 }
214 else if (v == NULL) {
215 w_byte(TYPE_NULL, p);
216 }
217 else if (v == Py_None) {
218 w_byte(TYPE_NONE, p);
219 }
220 else if (v == PyExc_StopIteration) {
221 w_byte(TYPE_STOPITER, p);
222 }
223 else if (v == Py_Ellipsis) {
224 w_byte(TYPE_ELLIPSIS, p);
225 }
226 else if (v == Py_False) {
227 w_byte(TYPE_FALSE, p);
228 }
229 else if (v == Py_True) {
230 w_byte(TYPE_TRUE, p);
231 }
232 else if (PyLong_CheckExact(v)) {
233 long x = PyLong_AsLong(v);
234 if ((x == -1) && PyErr_Occurred()) {
235 PyLongObject *ob = (PyLongObject *)v;
236 PyErr_Clear();
237 w_PyLong(ob, p);
238 }
239 else {
Guido van Rossumc1547d91996-12-10 15:39:04 +0000240#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000241 long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
242 if (y && y != -1) {
Martin v. Löwis7e395722012-07-28 19:44:05 +0200243 /* Too large for TYPE_INT */
244 w_PyLong((PyLongObject*)v, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000245 }
246 else
Guido van Rossumc1547d91996-12-10 15:39:04 +0000247#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000248 {
249 w_byte(TYPE_INT, p);
250 w_long(x, p);
251 }
252 }
253 }
254 else if (PyFloat_CheckExact(v)) {
255 if (p->version > 1) {
256 unsigned char buf[8];
257 if (_PyFloat_Pack8(PyFloat_AsDouble(v),
258 buf, 1) < 0) {
259 p->error = WFERR_UNMARSHALLABLE;
260 return;
261 }
262 w_byte(TYPE_BINARY_FLOAT, p);
263 w_string((char*)buf, 8, p);
264 }
265 else {
266 char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
267 'g', 17, 0, NULL);
268 if (!buf) {
269 p->error = WFERR_NOMEMORY;
270 return;
271 }
272 n = strlen(buf);
273 w_byte(TYPE_FLOAT, p);
274 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200275 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000276 PyMem_Free(buf);
277 }
278 }
279 else if (PyComplex_CheckExact(v)) {
280 if (p->version > 1) {
281 unsigned char buf[8];
282 if (_PyFloat_Pack8(PyComplex_RealAsDouble(v),
283 buf, 1) < 0) {
284 p->error = WFERR_UNMARSHALLABLE;
285 return;
286 }
287 w_byte(TYPE_BINARY_COMPLEX, p);
288 w_string((char*)buf, 8, p);
289 if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v),
290 buf, 1) < 0) {
291 p->error = WFERR_UNMARSHALLABLE;
292 return;
293 }
294 w_string((char*)buf, 8, p);
295 }
296 else {
297 char *buf;
298 w_byte(TYPE_COMPLEX, p);
299 buf = PyOS_double_to_string(PyComplex_RealAsDouble(v),
300 'g', 17, 0, NULL);
301 if (!buf) {
302 p->error = WFERR_NOMEMORY;
303 return;
304 }
305 n = strlen(buf);
306 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200307 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000308 PyMem_Free(buf);
309 buf = PyOS_double_to_string(PyComplex_ImagAsDouble(v),
310 'g', 17, 0, NULL);
311 if (!buf) {
312 p->error = WFERR_NOMEMORY;
313 return;
314 }
315 n = strlen(buf);
316 w_byte((int)n, p);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200317 w_string(buf, n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000318 PyMem_Free(buf);
319 }
320 }
321 else if (PyBytes_CheckExact(v)) {
322 w_byte(TYPE_STRING, p);
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300323 w_pstring(PyBytes_AS_STRING(v), PyBytes_GET_SIZE(v), p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000324 }
325 else if (PyUnicode_CheckExact(v)) {
326 PyObject *utf8;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200327 utf8 = PyUnicode_AsEncodedString(v, "utf8", "surrogatepass");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000328 if (utf8 == NULL) {
329 p->depth--;
330 p->error = WFERR_UNMARSHALLABLE;
331 return;
332 }
333 w_byte(TYPE_UNICODE, p);
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300334 w_pstring(PyBytes_AS_STRING(utf8), PyBytes_GET_SIZE(utf8), p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000335 Py_DECREF(utf8);
336 }
337 else if (PyTuple_CheckExact(v)) {
338 w_byte(TYPE_TUPLE, p);
339 n = PyTuple_Size(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200340 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000341 for (i = 0; i < n; i++) {
342 w_object(PyTuple_GET_ITEM(v, i), p);
343 }
344 }
345 else if (PyList_CheckExact(v)) {
346 w_byte(TYPE_LIST, p);
347 n = PyList_GET_SIZE(v);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200348 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000349 for (i = 0; i < n; i++) {
350 w_object(PyList_GET_ITEM(v, i), p);
351 }
352 }
353 else if (PyDict_CheckExact(v)) {
354 Py_ssize_t pos;
355 PyObject *key, *value;
356 w_byte(TYPE_DICT, p);
357 /* This one is NULL object terminated! */
358 pos = 0;
359 while (PyDict_Next(v, &pos, &key, &value)) {
360 w_object(key, p);
361 w_object(value, p);
362 }
363 w_object((PyObject *)NULL, p);
364 }
365 else if (PyAnySet_CheckExact(v)) {
366 PyObject *value, *it;
Raymond Hettingera422c342005-01-11 03:03:27 +0000367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000368 if (PyObject_TypeCheck(v, &PySet_Type))
369 w_byte(TYPE_SET, p);
370 else
371 w_byte(TYPE_FROZENSET, p);
372 n = PyObject_Size(v);
373 if (n == -1) {
374 p->depth--;
375 p->error = WFERR_UNMARSHALLABLE;
376 return;
377 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200378 W_SIZE(n, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000379 it = PyObject_GetIter(v);
380 if (it == NULL) {
381 p->depth--;
382 p->error = WFERR_UNMARSHALLABLE;
383 return;
384 }
385 while ((value = PyIter_Next(it)) != NULL) {
386 w_object(value, p);
387 Py_DECREF(value);
388 }
389 Py_DECREF(it);
390 if (PyErr_Occurred()) {
391 p->depth--;
392 p->error = WFERR_UNMARSHALLABLE;
393 return;
394 }
395 }
396 else if (PyCode_Check(v)) {
397 PyCodeObject *co = (PyCodeObject *)v;
398 w_byte(TYPE_CODE, p);
399 w_long(co->co_argcount, p);
400 w_long(co->co_kwonlyargcount, p);
401 w_long(co->co_nlocals, p);
402 w_long(co->co_stacksize, p);
403 w_long(co->co_flags, p);
404 w_object(co->co_code, p);
405 w_object(co->co_consts, p);
406 w_object(co->co_names, p);
407 w_object(co->co_varnames, p);
408 w_object(co->co_freevars, p);
409 w_object(co->co_cellvars, p);
410 w_object(co->co_filename, p);
411 w_object(co->co_name, p);
412 w_long(co->co_firstlineno, p);
413 w_object(co->co_lnotab, p);
414 }
415 else if (PyObject_CheckBuffer(v)) {
416 /* Write unknown buffer-style objects as a string */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 Py_buffer view;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100418 if (PyObject_GetBuffer(v, &view, PyBUF_SIMPLE) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000419 w_byte(TYPE_UNKNOWN, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100420 p->depth--;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000421 p->error = WFERR_UNMARSHALLABLE;
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100422 return;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000423 }
424 w_byte(TYPE_STRING, p);
Serhiy Storchakadfde2152013-07-11 19:14:26 +0300425 w_pstring(view.buf, view.len, p);
Antoine Pitrou679e9d32012-03-02 18:12:43 +0100426 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000427 }
428 else {
429 w_byte(TYPE_UNKNOWN, p);
430 p->error = WFERR_UNMARSHALLABLE;
431 }
432 p->depth--;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000433}
434
Serhiy Storchaka95949422013-08-27 19:40:23 +0300435/* version currently has no effect for writing ints. */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000436void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000437PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000438{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000439 WFILE wf;
440 wf.fp = fp;
441 wf.error = WFERR_OK;
442 wf.depth = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 wf.version = version;
444 w_long(x, &wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000445}
446
447void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000448PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000449{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000450 WFILE wf;
451 wf.fp = fp;
452 wf.error = WFERR_OK;
453 wf.depth = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000454 wf.version = version;
455 w_object(x, &wf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000456}
457
458typedef WFILE RFILE; /* Same struct with different invariants */
459
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000460#define rs_byte(p) (((p)->ptr < (p)->end) ? (unsigned char)*(p)->ptr++ : EOF)
Guido van Rossum8d617a61995-03-09 12:12:11 +0000461
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200462static Py_ssize_t
463r_string(char *s, Py_ssize_t n, RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000464{
Éric Araujo6c0ba442011-07-26 17:23:57 +0200465 char *ptr;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200466 Py_ssize_t read, left;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100467
468 if (!p->readable) {
469 if (p->fp != NULL)
470 /* The result fits into int because it must be <=n. */
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200471 read = fread(s, 1, n, p->fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100472 else {
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200473 left = p->end - p->ptr;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100474 read = (left < n) ? left : n;
475 memcpy(s, p->ptr, read);
476 p->ptr += read;
477 }
478 }
479 else {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200480 _Py_IDENTIFIER(read);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200481
Serhiy Storchaka5a1f1522013-02-13 12:11:03 +0200482 PyObject *data = _PyObject_CallMethodId(p->readable, &PyId_read, "n", n);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100483 read = 0;
484 if (data != NULL) {
485 if (!PyBytes_Check(data)) {
486 PyErr_Format(PyExc_TypeError,
487 "f.read() returned not bytes but %.100s",
488 data->ob_type->tp_name);
489 }
490 else {
491 read = PyBytes_GET_SIZE(data);
492 if (read > 0) {
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300493 if (read > n) {
494 PyErr_Format(PyExc_ValueError,
495 "read() returned too much data: "
496 "%zd bytes requested, %zd returned",
497 n, read);
498 read = -1;
499 }
500 else {
501 ptr = PyBytes_AS_STRING(data);
502 memcpy(s, ptr, read);
503 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100504 }
505 }
506 Py_DECREF(data);
507 }
508 }
509 if (!PyErr_Occurred() && (read < n)) {
510 PyErr_SetString(PyExc_EOFError, "EOF read where not expected");
511 }
512 return read;
513}
514
515
516static int
517r_byte(RFILE *p)
518{
519 int c = EOF;
520 unsigned char ch;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200521 Py_ssize_t n;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100522
523 if (!p->readable)
524 c = p->fp ? getc(p->fp) : rs_byte(p);
525 else {
526 n = r_string((char *) &ch, 1, p);
527 if (n > 0)
528 c = ch;
529 }
530 return c;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000531}
532
533static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000534r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000535{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 register short x;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100537 unsigned char buffer[2];
538
539 r_string((char *) buffer, 2, p);
540 x = buffer[0];
541 x |= buffer[1] << 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000542 /* Sign-extension, in case short greater than 16 bits */
543 x |= -(x & 0x8000);
544 return x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000545}
546
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000547static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000548r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000549{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000550 register long x;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100551 unsigned char buffer[4];
552
553 r_string((char *) buffer, 4, p);
554 x = buffer[0];
555 x |= (long)buffer[1] << 8;
556 x |= (long)buffer[2] << 16;
557 x |= (long)buffer[3] << 24;
Guido van Rossumc1547d91996-12-10 15:39:04 +0000558#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 /* Sign extension for 64-bit machines */
560 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000561#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000562 return x;
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000563}
564
Tim Peters82112372001-08-29 02:28:42 +0000565/* r_long64 deals with the TYPE_INT64 code. On a machine with
566 sizeof(long) > 4, it returns a Python int object, else a Python long
567 object. Note that w_long64 writes out TYPE_INT if 32 bits is enough,
568 so there's no inefficiency here in returning a PyLong on 32-bit boxes
569 for everything written via TYPE_INT64 (i.e., if an int is written via
570 TYPE_INT64, it *needs* more than 32 bits).
571*/
572static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000573r_long64(RFILE *p)
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000574{
Éric Araujo6c0ba442011-07-26 17:23:57 +0200575 PyObject *result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 long lo4 = r_long(p);
577 long hi4 = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100578
579 if (!PyErr_Occurred()) {
Guido van Rossumc1547d91996-12-10 15:39:04 +0000580#if SIZEOF_LONG > 4
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100581 long x = (hi4 << 32) | (lo4 & 0xFFFFFFFFL);
582 result = PyLong_FromLong(x);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000583#else
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100584 unsigned char buf[8];
585 int one = 1;
586 int is_little_endian = (int)*(char*)&one;
587 if (is_little_endian) {
588 memcpy(buf, &lo4, 4);
589 memcpy(buf+4, &hi4, 4);
590 }
591 else {
592 memcpy(buf, &hi4, 4);
593 memcpy(buf+4, &lo4, 4);
594 }
595 result = _PyLong_FromByteArray(buf, 8, is_little_endian, 1);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000596#endif
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100597 }
598 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000599}
600
Guido van Rossum79f25d91997-04-29 20:08:16 +0000601static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000602r_PyLong(RFILE *p)
603{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 PyLongObject *ob;
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200605 long n, size, i;
606 int j, md, shorts_in_top_digit;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 digit d;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100610 if (PyErr_Occurred())
611 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 if (n == 0)
613 return (PyObject *)_PyLong_New(0);
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200614 if (n < -SIZE32_MAX || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 PyErr_SetString(PyExc_ValueError,
616 "bad marshal data (long size out of range)");
617 return NULL;
618 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 size = 1 + (ABS(n) - 1) / PyLong_MARSHAL_RATIO;
621 shorts_in_top_digit = 1 + (ABS(n) - 1) % PyLong_MARSHAL_RATIO;
622 ob = _PyLong_New(size);
623 if (ob == NULL)
624 return NULL;
625 Py_SIZE(ob) = n > 0 ? size : -size;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 for (i = 0; i < size-1; i++) {
628 d = 0;
629 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
630 md = r_short(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100631 if (PyErr_Occurred())
632 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 if (md < 0 || md > PyLong_MARSHAL_BASE)
634 goto bad_digit;
635 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
636 }
637 ob->ob_digit[i] = d;
638 }
639 d = 0;
640 for (j=0; j < shorts_in_top_digit; j++) {
641 md = r_short(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100642 if (PyErr_Occurred())
643 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 if (md < 0 || md > PyLong_MARSHAL_BASE)
645 goto bad_digit;
646 /* topmost marshal digit should be nonzero */
647 if (md == 0 && j == shorts_in_top_digit - 1) {
648 Py_DECREF(ob);
649 PyErr_SetString(PyExc_ValueError,
650 "bad marshal data (unnormalized long data)");
651 return NULL;
652 }
653 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
654 }
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100655 if (PyErr_Occurred()) {
656 Py_DECREF(ob);
657 return NULL;
658 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 /* top digit should be nonzero, else the resulting PyLong won't be
660 normalized */
661 ob->ob_digit[size-1] = d;
662 return (PyObject *)ob;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000663 bad_digit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000664 Py_DECREF(ob);
665 PyErr_SetString(PyExc_ValueError,
666 "bad marshal data (digit out of range in long)");
667 return NULL;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000668}
669
670
671static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000672r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000673{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 /* NULL is a valid return value, it does not necessarily means that
675 an exception is set. */
676 PyObject *v, *v2;
677 long i, n;
678 int type = r_byte(p);
679 PyObject *retval;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681 p->depth++;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
684 p->depth--;
685 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
686 return NULL;
687 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000691 case EOF:
692 PyErr_SetString(PyExc_EOFError,
693 "EOF read where object expected");
694 retval = NULL;
695 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 case TYPE_NULL:
698 retval = NULL;
699 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 case TYPE_NONE:
702 Py_INCREF(Py_None);
703 retval = Py_None;
704 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 case TYPE_STOPITER:
707 Py_INCREF(PyExc_StopIteration);
708 retval = PyExc_StopIteration;
709 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000711 case TYPE_ELLIPSIS:
712 Py_INCREF(Py_Ellipsis);
713 retval = Py_Ellipsis;
714 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 case TYPE_FALSE:
717 Py_INCREF(Py_False);
718 retval = Py_False;
719 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 case TYPE_TRUE:
722 Py_INCREF(Py_True);
723 retval = Py_True;
724 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000725
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000726 case TYPE_INT:
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100727 n = r_long(p);
728 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000729 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000731 case TYPE_INT64:
732 retval = r_long64(p);
733 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000735 case TYPE_LONG:
736 retval = r_PyLong(p);
737 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000739 case TYPE_FLOAT:
740 {
741 char buf[256];
742 double dx;
743 retval = NULL;
744 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300745 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000746 PyErr_SetString(PyExc_EOFError,
747 "EOF read where object expected");
748 break;
749 }
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300750 if (r_string(buf, n, p) != n)
751 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000752 buf[n] = '\0';
753 dx = PyOS_string_to_double(buf, NULL, NULL);
754 if (dx == -1.0 && PyErr_Occurred())
755 break;
756 retval = PyFloat_FromDouble(dx);
757 break;
758 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000760 case TYPE_BINARY_FLOAT:
761 {
762 unsigned char buf[8];
763 double x;
764 if (r_string((char*)buf, 8, p) != 8) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 retval = NULL;
766 break;
767 }
768 x = _PyFloat_Unpack8(buf, 1);
769 if (x == -1.0 && PyErr_Occurred()) {
770 retval = NULL;
771 break;
772 }
773 retval = PyFloat_FromDouble(x);
774 break;
775 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000777 case TYPE_COMPLEX:
778 {
779 char buf[256];
780 Py_complex c;
781 retval = NULL;
782 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300783 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000784 PyErr_SetString(PyExc_EOFError,
785 "EOF read where object expected");
786 break;
787 }
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300788 if (r_string(buf, n, p) != n)
789 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 buf[n] = '\0';
791 c.real = PyOS_string_to_double(buf, NULL, NULL);
792 if (c.real == -1.0 && PyErr_Occurred())
793 break;
794 n = r_byte(p);
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300795 if (n == EOF) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 PyErr_SetString(PyExc_EOFError,
797 "EOF read where object expected");
798 break;
799 }
Serhiy Storchaka3641a742013-07-11 22:20:47 +0300800 if (r_string(buf, n, p) != n)
801 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 buf[n] = '\0';
803 c.imag = PyOS_string_to_double(buf, NULL, NULL);
804 if (c.imag == -1.0 && PyErr_Occurred())
805 break;
806 retval = PyComplex_FromCComplex(c);
807 break;
808 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 case TYPE_BINARY_COMPLEX:
811 {
812 unsigned char buf[8];
813 Py_complex c;
814 if (r_string((char*)buf, 8, p) != 8) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000815 retval = NULL;
816 break;
817 }
818 c.real = _PyFloat_Unpack8(buf, 1);
819 if (c.real == -1.0 && PyErr_Occurred()) {
820 retval = NULL;
821 break;
822 }
823 if (r_string((char*)buf, 8, p) != 8) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 retval = NULL;
825 break;
826 }
827 c.imag = _PyFloat_Unpack8(buf, 1);
828 if (c.imag == -1.0 && PyErr_Occurred()) {
829 retval = NULL;
830 break;
831 }
832 retval = PyComplex_FromCComplex(c);
833 break;
834 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000835
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 case TYPE_STRING:
837 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100838 if (PyErr_Occurred()) {
839 retval = NULL;
840 break;
841 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200842 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000843 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
844 retval = NULL;
845 break;
846 }
847 v = PyBytes_FromStringAndSize((char *)NULL, n);
848 if (v == NULL) {
849 retval = NULL;
850 break;
851 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200852 if (r_string(PyBytes_AS_STRING(v), n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000853 Py_DECREF(v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 retval = NULL;
855 break;
856 }
857 retval = v;
858 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000860 case TYPE_UNICODE:
861 {
862 char *buffer;
Guido van Rossumc279b532000-03-10 23:03:02 +0000863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000864 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100865 if (PyErr_Occurred()) {
866 retval = NULL;
867 break;
868 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200869 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000870 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
871 retval = NULL;
872 break;
873 }
874 buffer = PyMem_NEW(char, n);
875 if (buffer == NULL) {
876 retval = PyErr_NoMemory();
877 break;
878 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200879 if (r_string(buffer, n, p) != n) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 PyMem_DEL(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 retval = NULL;
882 break;
883 }
884 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
885 PyMem_DEL(buffer);
886 retval = v;
887 break;
888 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000890 case TYPE_TUPLE:
891 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100892 if (PyErr_Occurred()) {
893 retval = NULL;
894 break;
895 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200896 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
898 retval = NULL;
899 break;
900 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200901 v = PyTuple_New(n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 if (v == NULL) {
903 retval = NULL;
904 break;
905 }
906 for (i = 0; i < n; i++) {
907 v2 = r_object(p);
908 if ( v2 == NULL ) {
909 if (!PyErr_Occurred())
910 PyErr_SetString(PyExc_TypeError,
911 "NULL object in marshal data for tuple");
912 Py_DECREF(v);
913 v = NULL;
914 break;
915 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200916 PyTuple_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 }
918 retval = v;
919 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000921 case TYPE_LIST:
922 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100923 if (PyErr_Occurred()) {
924 retval = NULL;
925 break;
926 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200927 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
929 retval = NULL;
930 break;
931 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200932 v = PyList_New(n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 if (v == NULL) {
934 retval = NULL;
935 break;
936 }
937 for (i = 0; i < n; i++) {
938 v2 = r_object(p);
939 if ( v2 == NULL ) {
940 if (!PyErr_Occurred())
941 PyErr_SetString(PyExc_TypeError,
942 "NULL object in marshal data for list");
943 Py_DECREF(v);
944 v = NULL;
945 break;
946 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200947 PyList_SET_ITEM(v, i, v2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000948 }
949 retval = v;
950 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000952 case TYPE_DICT:
953 v = PyDict_New();
954 if (v == NULL) {
955 retval = NULL;
956 break;
957 }
958 for (;;) {
959 PyObject *key, *val;
960 key = r_object(p);
961 if (key == NULL)
962 break;
963 val = r_object(p);
964 if (val != NULL)
965 PyDict_SetItem(v, key, val);
966 Py_DECREF(key);
967 Py_XDECREF(val);
968 }
969 if (PyErr_Occurred()) {
970 Py_DECREF(v);
971 v = NULL;
972 }
973 retval = v;
974 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 case TYPE_SET:
977 case TYPE_FROZENSET:
978 n = r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +0100979 if (PyErr_Occurred()) {
980 retval = NULL;
981 break;
982 }
Serhiy Storchaka7e019112013-02-13 12:08:15 +0200983 if (n < 0 || n > SIZE32_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
985 retval = NULL;
986 break;
987 }
988 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
989 if (v == NULL) {
990 retval = NULL;
991 break;
992 }
993 for (i = 0; i < n; i++) {
994 v2 = r_object(p);
995 if ( v2 == NULL ) {
996 if (!PyErr_Occurred())
997 PyErr_SetString(PyExc_TypeError,
998 "NULL object in marshal data for set");
999 Py_DECREF(v);
1000 v = NULL;
1001 break;
1002 }
1003 if (PySet_Add(v, v2) == -1) {
1004 Py_DECREF(v);
1005 Py_DECREF(v2);
1006 v = NULL;
1007 break;
1008 }
1009 Py_DECREF(v2);
1010 }
1011 retval = v;
1012 break;
Raymond Hettingera422c342005-01-11 03:03:27 +00001013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 case TYPE_CODE:
1015 {
1016 int argcount;
1017 int kwonlyargcount;
1018 int nlocals;
1019 int stacksize;
1020 int flags;
1021 PyObject *code = NULL;
1022 PyObject *consts = NULL;
1023 PyObject *names = NULL;
1024 PyObject *varnames = NULL;
1025 PyObject *freevars = NULL;
1026 PyObject *cellvars = NULL;
1027 PyObject *filename = NULL;
1028 PyObject *name = NULL;
1029 int firstlineno;
1030 PyObject *lnotab = NULL;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 v = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 /* XXX ignore long->int overflows for now */
1035 argcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001036 if (PyErr_Occurred())
1037 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001038 kwonlyargcount = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001039 if (PyErr_Occurred())
1040 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001041 nlocals = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001042 if (PyErr_Occurred())
1043 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001044 stacksize = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001045 if (PyErr_Occurred())
1046 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 flags = (int)r_long(p);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001048 if (PyErr_Occurred())
1049 goto code_error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 code = r_object(p);
1051 if (code == NULL)
1052 goto code_error;
1053 consts = r_object(p);
1054 if (consts == NULL)
1055 goto code_error;
1056 names = r_object(p);
1057 if (names == NULL)
1058 goto code_error;
1059 varnames = r_object(p);
1060 if (varnames == NULL)
1061 goto code_error;
1062 freevars = r_object(p);
1063 if (freevars == NULL)
1064 goto code_error;
1065 cellvars = r_object(p);
1066 if (cellvars == NULL)
1067 goto code_error;
1068 filename = r_object(p);
1069 if (filename == NULL)
1070 goto code_error;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001071 if (PyUnicode_CheckExact(filename)) {
1072 if (p->current_filename != NULL) {
1073 if (!PyUnicode_Compare(filename, p->current_filename)) {
1074 Py_DECREF(filename);
1075 Py_INCREF(p->current_filename);
1076 filename = p->current_filename;
1077 }
1078 }
1079 else {
1080 p->current_filename = filename;
1081 }
1082 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 name = r_object(p);
1084 if (name == NULL)
1085 goto code_error;
1086 firstlineno = (int)r_long(p);
1087 lnotab = r_object(p);
1088 if (lnotab == NULL)
1089 goto code_error;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 v = (PyObject *) PyCode_New(
1092 argcount, kwonlyargcount,
1093 nlocals, stacksize, flags,
1094 code, consts, names, varnames,
1095 freevars, cellvars, filename, name,
1096 firstlineno, lnotab);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001098 code_error:
1099 Py_XDECREF(code);
1100 Py_XDECREF(consts);
1101 Py_XDECREF(names);
1102 Py_XDECREF(varnames);
1103 Py_XDECREF(freevars);
1104 Py_XDECREF(cellvars);
1105 Py_XDECREF(filename);
1106 Py_XDECREF(name);
1107 Py_XDECREF(lnotab);
1108 }
1109 retval = v;
1110 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 default:
1113 /* Bogus data got written, which isn't ideal.
1114 This will let you keep working and recover. */
1115 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
1116 retval = NULL;
1117 break;
1118
1119 }
1120 p->depth--;
1121 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001122}
1123
Neal Norwitzd85c4522004-06-13 20:31:49 +00001124static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001125read_object(RFILE *p)
1126{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001127 PyObject *v;
1128 if (PyErr_Occurred()) {
1129 fprintf(stderr, "XXX readobject called with exception set\n");
1130 return NULL;
1131 }
1132 v = r_object(p);
1133 if (v == NULL && !PyErr_Occurred())
1134 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1135 return v;
Armin Rigo01ab2792004-03-26 15:09:27 +00001136}
1137
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001138int
1139PyMarshal_ReadShortFromFile(FILE *fp)
1140{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 RFILE rf;
1142 assert(fp);
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001143 rf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 rf.fp = fp;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001145 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 rf.end = rf.ptr = NULL;
1147 return r_short(&rf);
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001148}
1149
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001150long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001151PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001152{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 RFILE rf;
1154 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001155 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001156 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001157 rf.ptr = rf.end = NULL;
1158 return r_long(&rf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001159}
1160
Tim Peters691e0e92001-01-18 04:39:16 +00001161#ifdef HAVE_FSTAT
1162/* Return size of file in bytes; < 0 if unknown. */
1163static off_t
1164getfilesize(FILE *fp)
1165{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 struct stat st;
1167 if (fstat(fileno(fp), &st) != 0)
1168 return -1;
1169 else
1170 return st.st_size;
Tim Peters691e0e92001-01-18 04:39:16 +00001171}
1172#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001173
Tim Peters691e0e92001-01-18 04:39:16 +00001174/* If we can get the size of the file up-front, and it's reasonably small,
1175 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1176 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001177 * CAUTION: since this may read the entire remainder of the file, don't
1178 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001179 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001180PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001181PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001182{
Antoine Pitrou5bc7ec92010-04-21 22:56:22 +00001183/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
Tim Peters691e0e92001-01-18 04:39:16 +00001184#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001185#ifdef HAVE_FSTAT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 off_t filesize;
1187 filesize = getfilesize(fp);
1188 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
1189 char* pBuf = (char *)PyMem_MALLOC(filesize);
1190 if (pBuf != NULL) {
Serhiy Storchaka7e019112013-02-13 12:08:15 +02001191 size_t n = fread(pBuf, 1, (size_t)filesize, fp);
1192 PyObject* v = PyMarshal_ReadObjectFromString(pBuf, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 PyMem_FREE(pBuf);
1194 return v;
1195 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 }
Tim Peters691e0e92001-01-18 04:39:16 +00001198#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 /* We don't have fstat, or we do but the file is larger than
1200 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1201 */
1202 return PyMarshal_ReadObjectFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001203
Tim Peters691e0e92001-01-18 04:39:16 +00001204#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001205}
1206
Guido van Rossum79f25d91997-04-29 20:08:16 +00001207PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001208PyMarshal_ReadObjectFromFile(FILE *fp)
1209{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 RFILE rf;
1211 PyObject *result;
1212 rf.fp = fp;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001213 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001214 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001215 rf.depth = 0;
1216 rf.ptr = rf.end = NULL;
1217 result = r_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001219}
1220
1221PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001222PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001223{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001224 RFILE rf;
1225 PyObject *result;
1226 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001227 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001228 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001229 rf.ptr = str;
1230 rf.end = str + len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 rf.depth = 0;
1232 result = r_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001233 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001234}
1235
Guido van Rossum79f25d91997-04-29 20:08:16 +00001236PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001237PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001238{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 WFILE wf;
Guido van Rossume6d39042007-05-09 00:01:30 +00001240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 wf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001242 wf.readable = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001243 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
1244 if (wf.str == NULL)
1245 return NULL;
1246 wf.ptr = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1247 wf.end = wf.ptr + PyBytes_Size(wf.str);
1248 wf.error = WFERR_OK;
1249 wf.depth = 0;
1250 wf.version = version;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 w_object(x, &wf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 if (wf.str != NULL) {
1253 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1254 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1255 Py_DECREF(wf.str);
1256 PyErr_SetString(PyExc_OverflowError,
1257 "too much marshal data for a string");
1258 return NULL;
1259 }
1260 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
1261 return NULL;
1262 }
1263 if (wf.error != WFERR_OK) {
1264 Py_XDECREF(wf.str);
1265 if (wf.error == WFERR_NOMEMORY)
1266 PyErr_NoMemory();
1267 else
1268 PyErr_SetString(PyExc_ValueError,
1269 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1270 :"object too deeply nested to marshal");
1271 return NULL;
1272 }
Antoine Pitrou1c13f842012-03-02 18:22:23 +01001273 return wf.str;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001274}
1275
Guido van Rossum64b45521991-06-07 13:58:22 +00001276/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001277
Guido van Rossum79f25d91997-04-29 20:08:16 +00001278static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001279marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001280{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 /* XXX Quick hack -- need to do this differently */
1282 PyObject *x;
1283 PyObject *f;
1284 int version = Py_MARSHAL_VERSION;
1285 PyObject *s;
1286 PyObject *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001287 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
1290 return NULL;
1291 s = PyMarshal_WriteObjectToString(x, version);
1292 if (s == NULL)
1293 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001294 res = _PyObject_CallMethodId(f, &PyId_write, "O", s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001295 Py_DECREF(s);
1296 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001297}
1298
R. David Murraydd226ea2009-05-13 12:27:21 +00001299PyDoc_STRVAR(dump_doc,
1300"dump(value, file[, version])\n\
1301\n\
1302Write the value on the open file. The value must be a supported type.\n\
1303The file must be an open file object such as sys.stdout or returned by\n\
1304open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1305\n\
1306If the value has (or contains an object that has) an unsupported type, a\n\
1307ValueError exception is raised but garbage data will also be written\n\
1308to the file. The object will not be properly read back by load()\n\
1309\n\
1310The version argument indicates the data format that dump should use.");
1311
Guido van Rossum79f25d91997-04-29 20:08:16 +00001312static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001313marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001314{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001315 PyObject *data, *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001316 _Py_IDENTIFIER(read);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 RFILE rf;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001318
1319 /*
1320 * Make a call to the read method, but read zero bytes.
1321 * This is to ensure that the object passed in at least
1322 * has a read method which returns bytes.
1323 */
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001324 data = _PyObject_CallMethodId(f, &PyId_read, "i", 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001325 if (data == NULL)
1326 return NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001327 if (!PyBytes_Check(data)) {
1328 PyErr_Format(PyExc_TypeError,
1329 "f.read() returned not bytes but %.100s",
1330 data->ob_type->tp_name);
1331 result = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001332 }
1333 else {
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001334 rf.depth = 0;
1335 rf.fp = NULL;
1336 rf.readable = f;
Vinay Sajipaac0f752011-07-02 18:42:21 +01001337 rf.current_filename = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001338 result = read_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001339 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001340 Py_DECREF(data);
1341 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001342}
1343
R. David Murraydd226ea2009-05-13 12:27:21 +00001344PyDoc_STRVAR(load_doc,
1345"load(file)\n\
1346\n\
1347Read one value from the open file and return it. If no valid value is\n\
1348read (e.g. because the data has a different Python versions\n\
1349incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1350The file must be an open file object opened in binary mode ('rb' or\n\
1351'r+b').\n\
1352\n\
1353Note: If an object containing an unsupported type was marshalled with\n\
1354dump(), load() will substitute None for the unmarshallable type.");
1355
1356
Guido van Rossum79f25d91997-04-29 20:08:16 +00001357static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001358marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001359{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001360 PyObject *x;
1361 int version = Py_MARSHAL_VERSION;
1362 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
1363 return NULL;
1364 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001365}
1366
R. David Murraydd226ea2009-05-13 12:27:21 +00001367PyDoc_STRVAR(dumps_doc,
1368"dumps(value[, version])\n\
1369\n\
1370Return the string that would be written to a file by dump(value, file).\n\
1371The value must be a supported type. Raise a ValueError exception if\n\
1372value has (or contains an object that has) an unsupported type.\n\
1373\n\
1374The version argument indicates the data format that dumps should use.");
1375
1376
Guido van Rossum79f25d91997-04-29 20:08:16 +00001377static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001378marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001379{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001380 RFILE rf;
1381 Py_buffer p;
1382 char *s;
1383 Py_ssize_t n;
1384 PyObject* result;
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001385 if (!PyArg_ParseTuple(args, "y*:loads", &p))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 return NULL;
1387 s = p.buf;
1388 n = p.len;
1389 rf.fp = NULL;
Vinay Sajip5bdae3b2011-07-02 16:42:47 +01001390 rf.readable = NULL;
Benjamin Peterson43b06862011-05-27 09:08:01 -05001391 rf.current_filename = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 rf.ptr = s;
1393 rf.end = s + n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001394 rf.depth = 0;
1395 result = read_object(&rf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001396 PyBuffer_Release(&p);
1397 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001398}
1399
R. David Murraydd226ea2009-05-13 12:27:21 +00001400PyDoc_STRVAR(loads_doc,
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001401"loads(bytes)\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001402\n\
Antoine Pitrou4a90ef02012-03-03 02:35:32 +01001403Convert the bytes object to a value. If no valid value is found, raise\n\
1404EOFError, ValueError or TypeError. Extra characters in the input are\n\
R. David Murraydd226ea2009-05-13 12:27:21 +00001405ignored.");
1406
Guido van Rossum79f25d91997-04-29 20:08:16 +00001407static PyMethodDef marshal_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001408 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1409 {"load", marshal_load, METH_O, load_doc},
1410 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1411 {"loads", marshal_loads, METH_VARARGS, loads_doc},
1412 {NULL, NULL} /* sentinel */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001413};
1414
R. David Murraydd226ea2009-05-13 12:27:21 +00001415
1416PyDoc_STRVAR(module_doc,
1417"This module contains functions that can read and write Python values in\n\
1418a binary format. The format is specific to Python, but independent of\n\
1419machine architecture issues.\n\
1420\n\
1421Not all Python object types are supported; in general, only objects\n\
1422whose value is independent from a particular invocation of Python can be\n\
1423written and read by this module. The following types are supported:\n\
1424None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1425tuples, lists, sets, dictionaries, and code objects, where it\n\
1426should be understood that tuples, lists and dictionaries are only\n\
1427supported as long as the values contained therein are themselves\n\
1428supported; and recursive lists and dictionaries should not be written\n\
1429(they will cause infinite loops).\n\
1430\n\
1431Variables:\n\
1432\n\
1433version -- indicates the format that the module uses. Version 0 is the\n\
1434 historical format, version 1 shares interned strings and version 2\n\
1435 uses a binary format for floating point numbers.\n\
1436\n\
1437Functions:\n\
1438\n\
1439dump() -- write value to a file\n\
1440load() -- read value from a file\n\
1441dumps() -- write value to a string\n\
1442loads() -- read value from a string");
1443
1444
1445
Brett Cannon429ef652008-06-27 00:35:35 +00001446static struct PyModuleDef marshalmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001447 PyModuleDef_HEAD_INIT,
1448 "marshal",
1449 module_doc,
1450 0,
1451 marshal_methods,
1452 NULL,
1453 NULL,
1454 NULL,
1455 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001456};
1457
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001458PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001459PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001460{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 PyObject *mod = PyModule_Create(&marshalmodule);
1462 if (mod == NULL)
1463 return NULL;
1464 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
1465 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001466}