blob: 256285b4268c8162de18c8fb8069c1963f667ab1 [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
Michael W. Hudsondf888462005-06-03 14:41:55 +000027#define TYPE_NULL '0'
28#define TYPE_NONE 'N'
29#define TYPE_FALSE 'F'
30#define TYPE_TRUE 'T'
31#define TYPE_STOPITER 'S'
32#define TYPE_ELLIPSIS '.'
33#define TYPE_INT 'i'
34#define TYPE_INT64 'I'
35#define TYPE_FLOAT 'f'
36#define TYPE_BINARY_FLOAT 'g'
37#define TYPE_COMPLEX 'x'
38#define TYPE_BINARY_COMPLEX 'y'
39#define TYPE_LONG 'l'
40#define TYPE_STRING 's'
Michael W. Hudsondf888462005-06-03 14:41:55 +000041#define TYPE_TUPLE '('
42#define TYPE_LIST '['
43#define TYPE_DICT '{'
44#define TYPE_CODE 'c'
45#define TYPE_UNICODE 'u'
46#define TYPE_UNKNOWN '?'
47#define TYPE_SET '<'
48#define TYPE_FROZENSET '>'
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000049
Eric Smithb1a03cf2009-04-21 11:57:38 +000050#define WFERR_OK 0
51#define WFERR_UNMARSHALLABLE 1
52#define WFERR_NESTEDTOODEEP 2
53#define WFERR_NOMEMORY 3
54
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000055typedef struct {
56 FILE *fp;
Eric Smithb1a03cf2009-04-21 11:57:38 +000057 int error; /* see WFERR_* values */
Fred Drake6da0b912000-06-28 18:47:56 +000058 int depth;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000059 /* If fp == NULL, the following are valid: */
Guido van Rossum79f25d91997-04-29 20:08:16 +000060 PyObject *str;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000061 char *ptr;
62 char *end;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +000063 PyObject *strings; /* dict on marshal, list on unmarshal */
Michael W. Hudsondf888462005-06-03 14:41:55 +000064 int version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000065} WFILE;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000066
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000067#define w_byte(c, p) if (((p)->fp)) putc((c), (p)->fp); \
68 else if ((p)->ptr != (p)->end) *(p)->ptr++ = (c); \
69 else w_more(c, p)
70
71static void
Fredrik Lundh11534382000-07-23 18:24:06 +000072w_more(int c, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000073{
Martin v. Löwis18e16552006-02-15 17:27:45 +000074 Py_ssize_t size, newsize;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000075 if (p->str == NULL)
76 return; /* An error already occurred */
Christian Heimes72b710a2008-05-26 13:28:38 +000077 size = PyBytes_Size(p->str);
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +000078 newsize = size + size + 1024;
79 if (newsize > 32*1024*1024) {
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +000080 newsize = size + (size >> 3); /* 12.5% overallocation */
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +000081 }
Christian Heimes72b710a2008-05-26 13:28:38 +000082 if (_PyBytes_Resize(&p->str, newsize) != 0) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000083 p->ptr = p->end = NULL;
84 }
85 else {
Christian Heimes72b710a2008-05-26 13:28:38 +000086 p->ptr = PyBytes_AS_STRING((PyBytesObject *)p->str) + size;
Guido van Rossum79f25d91997-04-29 20:08:16 +000087 p->end =
Christian Heimes72b710a2008-05-26 13:28:38 +000088 PyBytes_AS_STRING((PyBytesObject *)p->str) + newsize;
Tim Peters8315ea52000-07-23 19:28:35 +000089 *p->ptr++ = Py_SAFE_DOWNCAST(c, int, char);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000090 }
91}
92
93static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000094w_string(char *s, int n, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000095{
96 if (p->fp != NULL) {
97 fwrite(s, 1, n, p->fp);
98 }
99 else {
100 while (--n >= 0) {
101 w_byte(*s, p);
102 s++;
103 }
104 }
105}
106
107static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000108w_short(int x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000109{
Thomas Heller3e1c18a2002-07-30 11:40:57 +0000110 w_byte((char)( x & 0xff), p);
111 w_byte((char)((x>> 8) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000112}
113
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000114static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000115w_long(long x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000116{
Thomas Heller37d5a152002-07-30 11:44:44 +0000117 w_byte((char)( x & 0xff), p);
118 w_byte((char)((x>> 8) & 0xff), p);
119 w_byte((char)((x>>16) & 0xff), p);
120 w_byte((char)((x>>24) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000121}
122
Guido van Rossumc1547d91996-12-10 15:39:04 +0000123#if SIZEOF_LONG > 4
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000124static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000125w_long64(long x, WFILE *p)
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000126{
127 w_long(x, p);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000128 w_long(x>>32, p);
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000129}
Guido van Rossumc1547d91996-12-10 15:39:04 +0000130#endif
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000131
Mark Dickinsonbd792642009-03-18 20:06:12 +0000132/* We assume that Python longs are stored internally in base some power of
133 2**15; for the sake of portability we'll always read and write them in base
134 exactly 2**15. */
135
136#define PyLong_MARSHAL_SHIFT 15
137#define PyLong_MARSHAL_BASE ((short)1 << PyLong_MARSHAL_SHIFT)
138#define PyLong_MARSHAL_MASK (PyLong_MARSHAL_BASE - 1)
139#if PyLong_SHIFT % PyLong_MARSHAL_SHIFT != 0
140#error "PyLong_SHIFT must be a multiple of PyLong_MARSHAL_SHIFT"
141#endif
142#define PyLong_MARSHAL_RATIO (PyLong_SHIFT / PyLong_MARSHAL_SHIFT)
143
144static void
145w_PyLong(const PyLongObject *ob, WFILE *p)
146{
147 Py_ssize_t i, j, n, l;
148 digit d;
149
150 w_byte(TYPE_LONG, p);
151 if (Py_SIZE(ob) == 0) {
152 w_long((long)0, p);
153 return;
154 }
155
156 /* set l to number of base PyLong_MARSHAL_BASE digits */
157 n = ABS(Py_SIZE(ob));
158 l = (n-1) * PyLong_MARSHAL_RATIO;
159 d = ob->ob_digit[n-1];
160 assert(d != 0); /* a PyLong is always normalized */
161 do {
162 d >>= PyLong_MARSHAL_SHIFT;
163 l++;
164 } while (d != 0);
165 w_long((long)(Py_SIZE(ob) > 0 ? l : -l), p);
166
167 for (i=0; i < n-1; i++) {
168 d = ob->ob_digit[i];
169 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
170 w_short(d & PyLong_MARSHAL_MASK, p);
171 d >>= PyLong_MARSHAL_SHIFT;
172 }
173 assert (d == 0);
174 }
175 d = ob->ob_digit[n-1];
176 do {
177 w_short(d & PyLong_MARSHAL_MASK, p);
178 d >>= PyLong_MARSHAL_SHIFT;
179 } while (d != 0);
180}
181
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000182static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000183w_object(PyObject *v, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000184{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000185 Py_ssize_t i, n;
Fred Drake6da0b912000-06-28 18:47:56 +0000186
187 p->depth++;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000188
Fred Drake6da0b912000-06-28 18:47:56 +0000189 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
Eric Smithb1a03cf2009-04-21 11:57:38 +0000190 p->error = WFERR_NESTEDTOODEEP;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000191 }
Fred Drake6da0b912000-06-28 18:47:56 +0000192 else if (v == NULL) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000193 w_byte(TYPE_NULL, p);
Guido van Rossum730806d1998-04-10 22:27:42 +0000194 }
195 else if (v == Py_None) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000196 w_byte(TYPE_NONE, p);
Guido van Rossum730806d1998-04-10 22:27:42 +0000197 }
Tim Peters5ca576e2001-06-18 22:08:13 +0000198 else if (v == PyExc_StopIteration) {
199 w_byte(TYPE_STOPITER, p);
200 }
Guido van Rossum730806d1998-04-10 22:27:42 +0000201 else if (v == Py_Ellipsis) {
202 w_byte(TYPE_ELLIPSIS, p);
203 }
Guido van Rossum77f6a652002-04-03 22:41:51 +0000204 else if (v == Py_False) {
205 w_byte(TYPE_FALSE, p);
206 }
207 else if (v == Py_True) {
208 w_byte(TYPE_TRUE, p);
209 }
Guido van Rossum58da9312007-11-10 23:39:45 +0000210 else if (PyLong_CheckExact(v)) {
Guido van Rossumddefaf32007-01-14 03:31:43 +0000211 long x = PyLong_AsLong(v);
212 if ((x == -1) && PyErr_Occurred()) {
213 PyLongObject *ob = (PyLongObject *)v;
214 PyErr_Clear();
Mark Dickinsonbd792642009-03-18 20:06:12 +0000215 w_PyLong(ob, p);
216 }
Guido van Rossumddefaf32007-01-14 03:31:43 +0000217 else {
Guido van Rossumc1547d91996-12-10 15:39:04 +0000218#if SIZEOF_LONG > 4
Guido van Rossumddefaf32007-01-14 03:31:43 +0000219 long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
220 if (y && y != -1) {
221 w_byte(TYPE_INT64, p);
222 w_long64(x, p);
223 }
224 else
Guido van Rossumc1547d91996-12-10 15:39:04 +0000225#endif
226 {
Guido van Rossumddefaf32007-01-14 03:31:43 +0000227 w_byte(TYPE_INT, p);
228 w_long(x, p);
229 }
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000230 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000231 }
Guido van Rossum58da9312007-11-10 23:39:45 +0000232 else if (PyFloat_CheckExact(v)) {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000233 if (p->version > 1) {
Brett Cannonc9371d42005-06-25 08:23:41 +0000234 unsigned char buf[8];
Michael W. Hudsondf888462005-06-03 14:41:55 +0000235 if (_PyFloat_Pack8(PyFloat_AsDouble(v),
236 buf, 1) < 0) {
Eric Smithb1a03cf2009-04-21 11:57:38 +0000237 p->error = WFERR_UNMARSHALLABLE;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000238 return;
239 }
240 w_byte(TYPE_BINARY_FLOAT, p);
Brett Cannonc9371d42005-06-25 08:23:41 +0000241 w_string((char*)buf, 8, p);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000242 }
243 else {
Eric Smith0923d1d2009-04-16 20:16:10 +0000244 char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
Mark Dickinson3e09f432009-04-17 08:41:23 +0000245 'g', 17, 0, NULL);
Eric Smithb1a03cf2009-04-21 11:57:38 +0000246 if (!buf) {
247 p->error = WFERR_NOMEMORY;
248 return;
249 }
Eric Smith0923d1d2009-04-16 20:16:10 +0000250 n = strlen(buf);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000251 w_byte(TYPE_FLOAT, p);
Martin v. Löwis67baee62006-02-16 14:37:48 +0000252 w_byte((int)n, p);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000253 w_string(buf, (int)n, p);
Eric Smith0923d1d2009-04-16 20:16:10 +0000254 PyMem_Free(buf);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000255 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000256 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000257#ifndef WITHOUT_COMPLEX
Guido van Rossum58da9312007-11-10 23:39:45 +0000258 else if (PyComplex_CheckExact(v)) {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000259 if (p->version > 1) {
Brett Cannonc9371d42005-06-25 08:23:41 +0000260 unsigned char buf[8];
Michael W. Hudsondf888462005-06-03 14:41:55 +0000261 if (_PyFloat_Pack8(PyComplex_RealAsDouble(v),
262 buf, 1) < 0) {
Eric Smithb1a03cf2009-04-21 11:57:38 +0000263 p->error = WFERR_UNMARSHALLABLE;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000264 return;
265 }
266 w_byte(TYPE_BINARY_COMPLEX, p);
Brett Cannonc9371d42005-06-25 08:23:41 +0000267 w_string((char*)buf, 8, p);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000268 if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v),
269 buf, 1) < 0) {
Eric Smithb1a03cf2009-04-21 11:57:38 +0000270 p->error = WFERR_UNMARSHALLABLE;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000271 return;
272 }
Brett Cannonc9371d42005-06-25 08:23:41 +0000273 w_string((char*)buf, 8, p);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000274 }
275 else {
Eric Smith0923d1d2009-04-16 20:16:10 +0000276 char *buf;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000277 w_byte(TYPE_COMPLEX, p);
Eric Smith0923d1d2009-04-16 20:16:10 +0000278 buf = PyOS_double_to_string(PyComplex_RealAsDouble(v),
Mark Dickinson3e09f432009-04-17 08:41:23 +0000279 'g', 17, 0, NULL);
Eric Smithb1a03cf2009-04-21 11:57:38 +0000280 if (!buf) {
281 p->error = WFERR_NOMEMORY;
282 return;
283 }
Martin v. Löwis725507b2006-03-07 12:08:51 +0000284 n = strlen(buf);
285 w_byte((int)n, p);
286 w_string(buf, (int)n, p);
Eric Smith0923d1d2009-04-16 20:16:10 +0000287 PyMem_Free(buf);
288 buf = PyOS_double_to_string(PyComplex_ImagAsDouble(v),
Mark Dickinson3e09f432009-04-17 08:41:23 +0000289 'g', 17, 0, NULL);
Eric Smithb1a03cf2009-04-21 11:57:38 +0000290 if (!buf) {
291 p->error = WFERR_NOMEMORY;
292 return;
293 }
Eric Smith0923d1d2009-04-16 20:16:10 +0000294 n = strlen(buf);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000295 w_byte((int)n, p);
296 w_string(buf, (int)n, p);
Eric Smith0923d1d2009-04-16 20:16:10 +0000297 PyMem_Free(buf);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000298 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000299 }
300#endif
Christian Heimes72b710a2008-05-26 13:28:38 +0000301 else if (PyBytes_CheckExact(v)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +0000302 w_byte(TYPE_STRING, p);
Christian Heimes72b710a2008-05-26 13:28:38 +0000303 n = PyBytes_GET_SIZE(v);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000304 if (n > INT_MAX) {
305 /* huge strings are not supported */
306 p->depth--;
Eric Smithb1a03cf2009-04-21 11:57:38 +0000307 p->error = WFERR_UNMARSHALLABLE;
Martin v. Löwis725507b2006-03-07 12:08:51 +0000308 return;
309 }
Guido van Rossum3a205f71995-02-17 15:10:07 +0000310 w_long((long)n, p);
Christian Heimes72b710a2008-05-26 13:28:38 +0000311 w_string(PyBytes_AS_STRING(v), (int)n, p);
Guido van Rossumc279b532000-03-10 23:03:02 +0000312 }
Guido van Rossum58da9312007-11-10 23:39:45 +0000313 else if (PyUnicode_CheckExact(v)) {
Guido van Rossumc279b532000-03-10 23:03:02 +0000314 PyObject *utf8;
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000315 utf8 = PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(v),
316 PyUnicode_GET_SIZE(v),
Martin v. Löwise0a2b722009-05-10 08:08:56 +0000317 "surrogatepass");
Guido van Rossumc279b532000-03-10 23:03:02 +0000318 if (utf8 == NULL) {
Guido van Rossum98626cd2000-06-28 23:24:19 +0000319 p->depth--;
Eric Smithb1a03cf2009-04-21 11:57:38 +0000320 p->error = WFERR_UNMARSHALLABLE;
Guido van Rossum98626cd2000-06-28 23:24:19 +0000321 return;
Guido van Rossumc279b532000-03-10 23:03:02 +0000322 }
323 w_byte(TYPE_UNICODE, p);
Christian Heimes72b710a2008-05-26 13:28:38 +0000324 n = PyBytes_GET_SIZE(utf8);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000325 if (n > INT_MAX) {
326 p->depth--;
Eric Smithb1a03cf2009-04-21 11:57:38 +0000327 p->error = WFERR_UNMARSHALLABLE;
Martin v. Löwis725507b2006-03-07 12:08:51 +0000328 return;
329 }
Guido van Rossumc279b532000-03-10 23:03:02 +0000330 w_long((long)n, p);
Christian Heimes72b710a2008-05-26 13:28:38 +0000331 w_string(PyBytes_AS_STRING(utf8), (int)n, p);
Guido van Rossumc279b532000-03-10 23:03:02 +0000332 Py_DECREF(utf8);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000333 }
Guido van Rossum58da9312007-11-10 23:39:45 +0000334 else if (PyTuple_CheckExact(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000335 w_byte(TYPE_TUPLE, p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000336 n = PyTuple_Size(v);
Guido van Rossum3a205f71995-02-17 15:10:07 +0000337 w_long((long)n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000338 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000339 w_object(PyTuple_GET_ITEM(v, i), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000340 }
341 }
Guido van Rossum58da9312007-11-10 23:39:45 +0000342 else if (PyList_CheckExact(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000343 w_byte(TYPE_LIST, p);
Guido van Rossumc279b532000-03-10 23:03:02 +0000344 n = PyList_GET_SIZE(v);
Guido van Rossum3a205f71995-02-17 15:10:07 +0000345 w_long((long)n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000346 for (i = 0; i < n; i++) {
Guido van Rossumc279b532000-03-10 23:03:02 +0000347 w_object(PyList_GET_ITEM(v, i), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000348 }
349 }
Guido van Rossum58da9312007-11-10 23:39:45 +0000350 else if (PyDict_CheckExact(v)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000351 Py_ssize_t pos;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000352 PyObject *key, *value;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000353 w_byte(TYPE_DICT, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000354 /* This one is NULL object terminated! */
Guido van Rossum25831651993-05-19 14:50:45 +0000355 pos = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000356 while (PyDict_Next(v, &pos, &key, &value)) {
Guido van Rossum25831651993-05-19 14:50:45 +0000357 w_object(key, p);
358 w_object(value, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000359 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000360 w_object((PyObject *)NULL, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000361 }
Guido van Rossum58da9312007-11-10 23:39:45 +0000362 else if (PyAnySet_CheckExact(v)) {
Raymond Hettingera422c342005-01-11 03:03:27 +0000363 PyObject *value, *it;
364
365 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--;
Eric Smithb1a03cf2009-04-21 11:57:38 +0000372 p->error = WFERR_UNMARSHALLABLE;
Raymond Hettingera422c342005-01-11 03:03:27 +0000373 return;
374 }
375 w_long((long)n, p);
376 it = PyObject_GetIter(v);
377 if (it == NULL) {
378 p->depth--;
Eric Smithb1a03cf2009-04-21 11:57:38 +0000379 p->error = WFERR_UNMARSHALLABLE;
Raymond Hettingera422c342005-01-11 03:03:27 +0000380 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--;
Eric Smithb1a03cf2009-04-21 11:57:38 +0000389 p->error = WFERR_UNMARSHALLABLE;
Raymond Hettingera422c342005-01-11 03:03:27 +0000390 return;
391 }
392 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000393 else if (PyCode_Check(v)) {
394 PyCodeObject *co = (PyCodeObject *)v;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000395 w_byte(TYPE_CODE, p);
Neal Norwitz7fdcb412002-06-14 01:07:39 +0000396 w_long(co->co_argcount, p);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000397 w_long(co->co_kwonlyargcount, p);
Neal Norwitz7fdcb412002-06-14 01:07:39 +0000398 w_long(co->co_nlocals, p);
399 w_long(co->co_stacksize, p);
400 w_long(co->co_flags, p);
Guido van Rossumd076c731998-10-07 19:42:25 +0000401 w_object(co->co_code, p);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000402 w_object(co->co_consts, p);
403 w_object(co->co_names, p);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000404 w_object(co->co_varnames, p);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000405 w_object(co->co_freevars, p);
406 w_object(co->co_cellvars, p);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000407 w_object(co->co_filename, p);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000408 w_object(co->co_name, p);
Neal Norwitz7fdcb412002-06-14 01:07:39 +0000409 w_long(co->co_firstlineno, p);
Guido van Rossumd031c891997-01-24 03:44:17 +0000410 w_object(co->co_lnotab, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000411 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000412 else if (PyObject_CheckBuffer(v)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000413 /* Write unknown buffer-style objects as a string */
414 char *s;
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000415 PyBufferProcs *pb = v->ob_type->tp_as_buffer;
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000416 Py_buffer view;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000417 if ((*pb->bf_getbuffer)(v, &view, PyBUF_SIMPLE) != 0) {
418 w_byte(TYPE_UNKNOWN, p);
Eric Smithb1a03cf2009-04-21 11:57:38 +0000419 p->error = WFERR_UNMARSHALLABLE;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000420 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000421 w_byte(TYPE_STRING, p);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000422 n = view.len;
423 s = view.buf;
Martin v. Löwis725507b2006-03-07 12:08:51 +0000424 if (n > INT_MAX) {
425 p->depth--;
Eric Smithb1a03cf2009-04-21 11:57:38 +0000426 p->error = WFERR_UNMARSHALLABLE;
Martin v. Löwis725507b2006-03-07 12:08:51 +0000427 return;
428 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000429 w_long((long)n, p);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000430 w_string(s, (int)n, p);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000431 if (pb->bf_releasebuffer != NULL)
432 (*pb->bf_releasebuffer)(v, &view);
Guido van Rossumd076c731998-10-07 19:42:25 +0000433 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000434 else {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000435 w_byte(TYPE_UNKNOWN, p);
Eric Smithb1a03cf2009-04-21 11:57:38 +0000436 p->error = WFERR_UNMARSHALLABLE;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000437 }
Guido van Rossum98626cd2000-06-28 23:24:19 +0000438 p->depth--;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000439}
440
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000441/* version currently has no effect for writing longs. */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000442void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000443PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000444{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000445 WFILE wf;
446 wf.fp = fp;
Eric Smithb1a03cf2009-04-21 11:57:38 +0000447 wf.error = WFERR_OK;
Fred Drake6da0b912000-06-28 18:47:56 +0000448 wf.depth = 0;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000449 wf.strings = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000450 wf.version = version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000451 w_long(x, &wf);
452}
453
454void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000455PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000456{
457 WFILE wf;
458 wf.fp = fp;
Eric Smithb1a03cf2009-04-21 11:57:38 +0000459 wf.error = WFERR_OK;
Guido van Rossum98626cd2000-06-28 23:24:19 +0000460 wf.depth = 0;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000461 wf.strings = (version > 0) ? PyDict_New() : NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000462 wf.version = version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000463 w_object(x, &wf);
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000464 Py_XDECREF(wf.strings);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000465}
466
467typedef WFILE RFILE; /* Same struct with different invariants */
468
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000469#define rs_byte(p) (((p)->ptr < (p)->end) ? (unsigned char)*(p)->ptr++ : EOF)
Guido van Rossum8d617a61995-03-09 12:12:11 +0000470
471#define r_byte(p) ((p)->fp ? getc((p)->fp) : rs_byte(p))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000472
473static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000474r_string(char *s, int n, RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000475{
476 if (p->fp != NULL)
Martin v. Löwis18e16552006-02-15 17:27:45 +0000477 /* The result fits into int because it must be <=n. */
478 return (int)fread(s, 1, n, p->fp);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000479 if (p->end - p->ptr < n)
Martin v. Löwis18e16552006-02-15 17:27:45 +0000480 n = (int)(p->end - p->ptr);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000481 memcpy(s, p->ptr, n);
482 p->ptr += n;
483 return n;
484}
485
486static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000487r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000488{
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000489 register short x;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000490 x = r_byte(p);
491 x |= r_byte(p) << 8;
Tim Peterse84b7402000-09-19 08:54:13 +0000492 /* Sign-extension, in case short greater than 16 bits */
493 x |= -(x & 0x8000);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000494 return x;
495}
496
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000497static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000498r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000499{
500 register long x;
Guido van Rossum8d617a61995-03-09 12:12:11 +0000501 register FILE *fp = p->fp;
502 if (fp) {
503 x = getc(fp);
504 x |= (long)getc(fp) << 8;
505 x |= (long)getc(fp) << 16;
506 x |= (long)getc(fp) << 24;
507 }
508 else {
509 x = rs_byte(p);
510 x |= (long)rs_byte(p) << 8;
511 x |= (long)rs_byte(p) << 16;
512 x |= (long)rs_byte(p) << 24;
513 }
Guido van Rossumc1547d91996-12-10 15:39:04 +0000514#if SIZEOF_LONG > 4
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000515 /* Sign extension for 64-bit machines */
Tim Peterse84b7402000-09-19 08:54:13 +0000516 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000517#endif
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000518 return x;
519}
520
Tim Peters82112372001-08-29 02:28:42 +0000521/* r_long64 deals with the TYPE_INT64 code. On a machine with
522 sizeof(long) > 4, it returns a Python int object, else a Python long
523 object. Note that w_long64 writes out TYPE_INT if 32 bits is enough,
524 so there's no inefficiency here in returning a PyLong on 32-bit boxes
525 for everything written via TYPE_INT64 (i.e., if an int is written via
526 TYPE_INT64, it *needs* more than 32 bits).
527*/
528static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000529r_long64(RFILE *p)
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000530{
Tim Peters82112372001-08-29 02:28:42 +0000531 long lo4 = r_long(p);
532 long hi4 = r_long(p);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000533#if SIZEOF_LONG > 4
Tim Peters82112372001-08-29 02:28:42 +0000534 long x = (hi4 << 32) | (lo4 & 0xFFFFFFFFL);
Christian Heimes217cfd12007-12-02 14:31:20 +0000535 return PyLong_FromLong(x);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000536#else
Tim Peters82112372001-08-29 02:28:42 +0000537 unsigned char buf[8];
538 int one = 1;
539 int is_little_endian = (int)*(char*)&one;
540 if (is_little_endian) {
541 memcpy(buf, &lo4, 4);
542 memcpy(buf+4, &hi4, 4);
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000543 }
Tim Peters82112372001-08-29 02:28:42 +0000544 else {
545 memcpy(buf, &hi4, 4);
546 memcpy(buf+4, &lo4, 4);
547 }
548 return _PyLong_FromByteArray(buf, 8, is_little_endian, 1);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000549#endif
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000550}
551
Guido van Rossum79f25d91997-04-29 20:08:16 +0000552static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000553r_PyLong(RFILE *p)
554{
555 PyLongObject *ob;
Mark Dickinson2683ab02009-09-29 19:21:35 +0000556 int size, i, j, md, shorts_in_top_digit;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000557 long n;
558 digit d;
559
560 n = r_long(p);
561 if (n == 0)
562 return (PyObject *)_PyLong_New(0);
563 if (n < -INT_MAX || n > INT_MAX) {
564 PyErr_SetString(PyExc_ValueError,
565 "bad marshal data (long size out of range)");
566 return NULL;
567 }
568
Mark Dickinson2683ab02009-09-29 19:21:35 +0000569 size = 1 + (ABS(n) - 1) / PyLong_MARSHAL_RATIO;
570 shorts_in_top_digit = 1 + (ABS(n) - 1) % PyLong_MARSHAL_RATIO;
Mark Dickinsonbd792642009-03-18 20:06:12 +0000571 ob = _PyLong_New(size);
572 if (ob == NULL)
573 return NULL;
574 Py_SIZE(ob) = n > 0 ? size : -size;
575
576 for (i = 0; i < size-1; i++) {
577 d = 0;
578 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
579 md = r_short(p);
580 if (md < 0 || md > PyLong_MARSHAL_BASE)
581 goto bad_digit;
582 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
583 }
584 ob->ob_digit[i] = d;
585 }
586 d = 0;
Mark Dickinson2683ab02009-09-29 19:21:35 +0000587 for (j=0; j < shorts_in_top_digit; j++) {
Mark Dickinsonbd792642009-03-18 20:06:12 +0000588 md = r_short(p);
589 if (md < 0 || md > PyLong_MARSHAL_BASE)
590 goto bad_digit;
Mark Dickinson2683ab02009-09-29 19:21:35 +0000591 /* topmost marshal digit should be nonzero */
592 if (md == 0 && j == shorts_in_top_digit - 1) {
593 Py_DECREF(ob);
594 PyErr_SetString(PyExc_ValueError,
595 "bad marshal data (unnormalized long data)");
596 return NULL;
597 }
Mark Dickinsonbd792642009-03-18 20:06:12 +0000598 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
599 }
Mark Dickinson2683ab02009-09-29 19:21:35 +0000600 /* top digit should be nonzero, else the resulting PyLong won't be
601 normalized */
Mark Dickinsonbd792642009-03-18 20:06:12 +0000602 ob->ob_digit[size-1] = d;
603 return (PyObject *)ob;
604 bad_digit:
605 Py_DECREF(ob);
606 PyErr_SetString(PyExc_ValueError,
607 "bad marshal data (digit out of range in long)");
608 return NULL;
609}
610
611
612static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000613r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000614{
Armin Rigo01ab2792004-03-26 15:09:27 +0000615 /* NULL is a valid return value, it does not necessarily means that
616 an exception is set. */
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000617 PyObject *v, *v2;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000618 long i, n;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000619 int type = r_byte(p);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000620 PyObject *retval;
621
622 p->depth++;
623
624 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
625 p->depth--;
626 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
627 return NULL;
628 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000629
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000630 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000631
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000632 case EOF:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000633 PyErr_SetString(PyExc_EOFError,
634 "EOF read where object expected");
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000635 retval = NULL;
636 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000637
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000638 case TYPE_NULL:
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000639 retval = NULL;
640 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000641
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000642 case TYPE_NONE:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000643 Py_INCREF(Py_None);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000644 retval = Py_None;
645 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000646
Tim Peters5ca576e2001-06-18 22:08:13 +0000647 case TYPE_STOPITER:
648 Py_INCREF(PyExc_StopIteration);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000649 retval = PyExc_StopIteration;
650 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000651
Guido van Rossume449af71996-10-11 16:25:41 +0000652 case TYPE_ELLIPSIS:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000653 Py_INCREF(Py_Ellipsis);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000654 retval = Py_Ellipsis;
655 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000656
Guido van Rossum77f6a652002-04-03 22:41:51 +0000657 case TYPE_FALSE:
658 Py_INCREF(Py_False);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000659 retval = Py_False;
660 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000661
662 case TYPE_TRUE:
663 Py_INCREF(Py_True);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000664 retval = Py_True;
665 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000666
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000667 case TYPE_INT:
Christian Heimes217cfd12007-12-02 14:31:20 +0000668 retval = PyLong_FromLong(r_long(p));
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000669 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000670
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000671 case TYPE_INT64:
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000672 retval = r_long64(p);
673 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000674
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000675 case TYPE_LONG:
Mark Dickinsonbd792642009-03-18 20:06:12 +0000676 retval = r_PyLong(p);
677 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000678
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000679 case TYPE_FLOAT:
680 {
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000681 char buf[256];
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000682 double dx;
Mark Dickinson725bfd82009-05-03 20:33:40 +0000683 retval = NULL;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000684 n = r_byte(p);
Armin Rigo01ab2792004-03-26 15:09:27 +0000685 if (n == EOF || r_string(buf, (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000686 PyErr_SetString(PyExc_EOFError,
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000687 "EOF read where object expected");
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000688 break;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000689 }
690 buf[n] = '\0';
Mark Dickinson725bfd82009-05-03 20:33:40 +0000691 dx = PyOS_string_to_double(buf, NULL, NULL);
692 if (dx == -1.0 && PyErr_Occurred())
693 break;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000694 retval = PyFloat_FromDouble(dx);
695 break;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000696 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000697
Michael W. Hudsondf888462005-06-03 14:41:55 +0000698 case TYPE_BINARY_FLOAT:
699 {
Brett Cannonc9371d42005-06-25 08:23:41 +0000700 unsigned char buf[8];
Michael W. Hudsondf888462005-06-03 14:41:55 +0000701 double x;
Brett Cannonc9371d42005-06-25 08:23:41 +0000702 if (r_string((char*)buf, 8, p) != 8) {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000703 PyErr_SetString(PyExc_EOFError,
704 "EOF read where object expected");
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000705 retval = NULL;
706 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000707 }
708 x = _PyFloat_Unpack8(buf, 1);
709 if (x == -1.0 && PyErr_Occurred()) {
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000710 retval = NULL;
711 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000712 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000713 retval = PyFloat_FromDouble(x);
714 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000715 }
716
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000717#ifndef WITHOUT_COMPLEX
718 case TYPE_COMPLEX:
719 {
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000720 char buf[256];
Guido van Rossum530956d1996-07-21 02:27:43 +0000721 Py_complex c;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000722 retval = NULL;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000723 n = r_byte(p);
Armin Rigo01ab2792004-03-26 15:09:27 +0000724 if (n == EOF || r_string(buf, (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000725 PyErr_SetString(PyExc_EOFError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000726 "EOF read where object expected");
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000727 break;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000728 }
729 buf[n] = '\0';
Mark Dickinson725bfd82009-05-03 20:33:40 +0000730 c.real = PyOS_string_to_double(buf, NULL, NULL);
731 if (c.real == -1.0 && PyErr_Occurred())
732 break;
733 n = r_byte(p);
734 if (n == EOF || r_string(buf, (int)n, p) != n) {
735 PyErr_SetString(PyExc_EOFError,
736 "EOF read where object expected");
737 break;
738 }
739 buf[n] = '\0';
740 c.imag = PyOS_string_to_double(buf, NULL, NULL);
741 if (c.imag == -1.0 && PyErr_Occurred())
742 break;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000743 retval = PyComplex_FromCComplex(c);
744 break;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000745 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000746
747 case TYPE_BINARY_COMPLEX:
748 {
Brett Cannonc9371d42005-06-25 08:23:41 +0000749 unsigned char buf[8];
Michael W. Hudsondf888462005-06-03 14:41:55 +0000750 Py_complex c;
Brett Cannonc9371d42005-06-25 08:23:41 +0000751 if (r_string((char*)buf, 8, p) != 8) {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000752 PyErr_SetString(PyExc_EOFError,
753 "EOF read where object expected");
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000754 retval = NULL;
755 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000756 }
757 c.real = _PyFloat_Unpack8(buf, 1);
758 if (c.real == -1.0 && PyErr_Occurred()) {
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000759 retval = NULL;
760 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000761 }
Brett Cannonc9371d42005-06-25 08:23:41 +0000762 if (r_string((char*)buf, 8, p) != 8) {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000763 PyErr_SetString(PyExc_EOFError,
764 "EOF read where object expected");
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000765 retval = NULL;
766 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000767 }
768 c.imag = _PyFloat_Unpack8(buf, 1);
769 if (c.imag == -1.0 && PyErr_Occurred()) {
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000770 retval = NULL;
771 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000772 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000773 retval = PyComplex_FromCComplex(c);
774 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000775 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000776#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +0000777
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000778 case TYPE_STRING:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000779 n = r_long(p);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000780 if (n < 0 || n > INT_MAX) {
Nick Coghlan93095832009-03-15 05:07:56 +0000781 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000782 retval = NULL;
783 break;
Guido van Rossuma45cb451998-06-08 20:27:29 +0000784 }
Christian Heimes72b710a2008-05-26 13:28:38 +0000785 v = PyBytes_FromStringAndSize((char *)NULL, n);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000786 if (v == NULL) {
787 retval = NULL;
788 break;
789 }
Christian Heimes72b710a2008-05-26 13:28:38 +0000790 if (r_string(PyBytes_AS_STRING(v), (int)n, p) != n) {
Michael W. Hudson6d6917b2005-06-03 15:17:16 +0000791 Py_DECREF(v);
792 PyErr_SetString(PyExc_EOFError,
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000793 "EOF read where object expected");
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000794 retval = NULL;
795 break;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000796 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000797 retval = v;
798 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000799
Guido van Rossumc279b532000-03-10 23:03:02 +0000800 case TYPE_UNICODE:
801 {
802 char *buffer;
803
804 n = r_long(p);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000805 if (n < 0 || n > INT_MAX) {
Nick Coghlan93095832009-03-15 05:07:56 +0000806 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000807 retval = NULL;
808 break;
Guido van Rossumc279b532000-03-10 23:03:02 +0000809 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000810 buffer = PyMem_NEW(char, n);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000811 if (buffer == NULL) {
812 retval = PyErr_NoMemory();
813 break;
814 }
Guido van Rossumc279b532000-03-10 23:03:02 +0000815 if (r_string(buffer, (int)n, p) != n) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000816 PyMem_DEL(buffer);
Guido van Rossumc279b532000-03-10 23:03:02 +0000817 PyErr_SetString(PyExc_EOFError,
818 "EOF read where object expected");
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000819 retval = NULL;
820 break;
Guido van Rossumc279b532000-03-10 23:03:02 +0000821 }
Martin v. Löwise0a2b722009-05-10 08:08:56 +0000822 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
Guido van Rossumb18618d2000-05-03 23:44:39 +0000823 PyMem_DEL(buffer);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000824 retval = v;
825 break;
Guido van Rossumc279b532000-03-10 23:03:02 +0000826 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000827
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000828 case TYPE_TUPLE:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000829 n = r_long(p);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000830 if (n < 0 || n > INT_MAX) {
Nick Coghlan93095832009-03-15 05:07:56 +0000831 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000832 retval = NULL;
833 break;
Guido van Rossuma45cb451998-06-08 20:27:29 +0000834 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000835 v = PyTuple_New((int)n);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000836 if (v == NULL) {
837 retval = NULL;
838 break;
839 }
Jack Jansen9513f2c1995-10-27 13:21:28 +0000840 for (i = 0; i < n; i++) {
841 v2 = r_object(p);
842 if ( v2 == NULL ) {
Armin Rigo01ab2792004-03-26 15:09:27 +0000843 if (!PyErr_Occurred())
844 PyErr_SetString(PyExc_TypeError,
Nick Coghlan93095832009-03-15 05:07:56 +0000845 "NULL object in marshal data for tuple");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000846 Py_DECREF(v);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000847 v = NULL;
848 break;
849 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000850 PyTuple_SET_ITEM(v, (int)i, v2);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000851 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000852 retval = v;
853 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000854
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000855 case TYPE_LIST:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000856 n = r_long(p);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000857 if (n < 0 || n > INT_MAX) {
Nick Coghlan93095832009-03-15 05:07:56 +0000858 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000859 retval = NULL;
860 break;
Guido van Rossuma45cb451998-06-08 20:27:29 +0000861 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000862 v = PyList_New((int)n);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000863 if (v == NULL) {
864 retval = NULL;
865 break;
866 }
Jack Jansen9513f2c1995-10-27 13:21:28 +0000867 for (i = 0; i < n; i++) {
868 v2 = r_object(p);
869 if ( v2 == NULL ) {
Armin Rigo01ab2792004-03-26 15:09:27 +0000870 if (!PyErr_Occurred())
871 PyErr_SetString(PyExc_TypeError,
Nick Coghlan93095832009-03-15 05:07:56 +0000872 "NULL object in marshal data for list");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000873 Py_DECREF(v);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000874 v = NULL;
875 break;
876 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000877 PyList_SET_ITEM(v, (int)i, v2);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000878 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000879 retval = v;
880 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000881
Guido van Rossum64b45521991-06-07 13:58:22 +0000882 case TYPE_DICT:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000883 v = PyDict_New();
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000884 if (v == NULL) {
885 retval = NULL;
886 break;
887 }
Guido van Rossum64b45521991-06-07 13:58:22 +0000888 for (;;) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000889 PyObject *key, *val;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000890 key = r_object(p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000891 if (key == NULL)
Armin Rigo01ab2792004-03-26 15:09:27 +0000892 break;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000893 val = r_object(p);
Guido van Rossumf2150601996-06-26 20:41:23 +0000894 if (val != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000895 PyDict_SetItem(v, key, val);
896 Py_DECREF(key);
897 Py_XDECREF(val);
Guido van Rossum64b45521991-06-07 13:58:22 +0000898 }
Armin Rigo01ab2792004-03-26 15:09:27 +0000899 if (PyErr_Occurred()) {
900 Py_DECREF(v);
901 v = NULL;
902 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000903 retval = v;
904 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000905
Raymond Hettingera422c342005-01-11 03:03:27 +0000906 case TYPE_SET:
907 case TYPE_FROZENSET:
908 n = r_long(p);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000909 if (n < 0 || n > INT_MAX) {
Nick Coghlan93095832009-03-15 05:07:56 +0000910 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000911 retval = NULL;
912 break;
Raymond Hettingera422c342005-01-11 03:03:27 +0000913 }
Christian Heimesfd66e512008-01-29 12:18:50 +0000914 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000915 if (v == NULL) {
916 retval = NULL;
917 break;
918 }
Raymond Hettingera422c342005-01-11 03:03:27 +0000919 for (i = 0; i < n; i++) {
920 v2 = r_object(p);
921 if ( v2 == NULL ) {
922 if (!PyErr_Occurred())
923 PyErr_SetString(PyExc_TypeError,
Nick Coghlan93095832009-03-15 05:07:56 +0000924 "NULL object in marshal data for set");
Raymond Hettingera422c342005-01-11 03:03:27 +0000925 Py_DECREF(v);
926 v = NULL;
927 break;
928 }
Christian Heimesfd66e512008-01-29 12:18:50 +0000929 if (PySet_Add(v, v2) == -1) {
930 Py_DECREF(v);
931 Py_DECREF(v2);
932 v = NULL;
933 break;
934 }
Christian Heimes400adb02008-02-01 08:12:03 +0000935 Py_DECREF(v2);
Raymond Hettingera422c342005-01-11 03:03:27 +0000936 }
Christian Heimesfd66e512008-01-29 12:18:50 +0000937 retval = v;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000938 break;
Raymond Hettingera422c342005-01-11 03:03:27 +0000939
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000940 case TYPE_CODE:
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000941 {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000942 int argcount;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000943 int kwonlyargcount;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000944 int nlocals;
945 int stacksize;
946 int flags;
947 PyObject *code = NULL;
948 PyObject *consts = NULL;
949 PyObject *names = NULL;
950 PyObject *varnames = NULL;
951 PyObject *freevars = NULL;
952 PyObject *cellvars = NULL;
953 PyObject *filename = NULL;
954 PyObject *name = NULL;
955 int firstlineno;
956 PyObject *lnotab = NULL;
957
958 v = NULL;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000959
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000960 /* XXX ignore long->int overflows for now */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000961 argcount = (int)r_long(p);
962 kwonlyargcount = (int)r_long(p);
963 nlocals = (int)r_long(p);
964 stacksize = (int)r_long(p);
965 flags = (int)r_long(p);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000966 code = r_object(p);
967 if (code == NULL)
968 goto code_error;
969 consts = r_object(p);
970 if (consts == NULL)
971 goto code_error;
972 names = r_object(p);
973 if (names == NULL)
974 goto code_error;
975 varnames = r_object(p);
976 if (varnames == NULL)
977 goto code_error;
978 freevars = r_object(p);
979 if (freevars == NULL)
980 goto code_error;
981 cellvars = r_object(p);
982 if (cellvars == NULL)
983 goto code_error;
984 filename = r_object(p);
985 if (filename == NULL)
986 goto code_error;
987 name = r_object(p);
988 if (name == NULL)
989 goto code_error;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000990 firstlineno = (int)r_long(p);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000991 lnotab = r_object(p);
992 if (lnotab == NULL)
993 goto code_error;
994
995 v = (PyObject *) PyCode_New(
Guido van Rossum4f72a782006-10-27 23:31:49 +0000996 argcount, kwonlyargcount,
997 nlocals, stacksize, flags,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000998 code, consts, names, varnames,
Tim Petersd9b9ac82001-01-28 00:27:39 +0000999 freevars, cellvars, filename, name,
1000 firstlineno, lnotab);
Michael W. Hudsondf888462005-06-03 14:41:55 +00001001
1002 code_error:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001003 Py_XDECREF(code);
1004 Py_XDECREF(consts);
1005 Py_XDECREF(names);
1006 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001007 Py_XDECREF(freevars);
1008 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001009 Py_XDECREF(filename);
1010 Py_XDECREF(name);
Guido van Rossum6fc06e71997-07-26 23:30:18 +00001011 Py_XDECREF(lnotab);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001012 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001013 retval = v;
1014 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001015
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001016 default:
Guido van Rossumf2150601996-06-26 20:41:23 +00001017 /* Bogus data got written, which isn't ideal.
1018 This will let you keep working and recover. */
Nick Coghlan93095832009-03-15 05:07:56 +00001019 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001020 retval = NULL;
1021 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001022
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001023 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001024 p->depth--;
1025 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001026}
1027
Neal Norwitzd85c4522004-06-13 20:31:49 +00001028static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001029read_object(RFILE *p)
1030{
1031 PyObject *v;
1032 if (PyErr_Occurred()) {
1033 fprintf(stderr, "XXX readobject called with exception set\n");
1034 return NULL;
1035 }
1036 v = r_object(p);
1037 if (v == NULL && !PyErr_Occurred())
Nick Coghlan93095832009-03-15 05:07:56 +00001038 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
Armin Rigo01ab2792004-03-26 15:09:27 +00001039 return v;
1040}
1041
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001042int
1043PyMarshal_ReadShortFromFile(FILE *fp)
1044{
1045 RFILE rf;
Thomas Wouters7f401ef2006-03-01 22:30:47 +00001046 assert(fp);
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001047 rf.fp = fp;
Thomas Wouters7464b432006-03-01 22:34:09 +00001048 rf.strings = NULL;
1049 rf.end = rf.ptr = NULL;
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001050 return r_short(&rf);
1051}
1052
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001053long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001054PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001055{
1056 RFILE rf;
1057 rf.fp = fp;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001058 rf.strings = NULL;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001059 rf.ptr = rf.end = NULL;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001060 return r_long(&rf);
1061}
1062
Tim Peters691e0e92001-01-18 04:39:16 +00001063#ifdef HAVE_FSTAT
1064/* Return size of file in bytes; < 0 if unknown. */
1065static off_t
1066getfilesize(FILE *fp)
1067{
1068 struct stat st;
1069 if (fstat(fileno(fp), &st) != 0)
1070 return -1;
1071 else
1072 return st.st_size;
1073}
1074#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001075
Tim Peters691e0e92001-01-18 04:39:16 +00001076/* If we can get the size of the file up-front, and it's reasonably small,
1077 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1078 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001079 * CAUTION: since this may read the entire remainder of the file, don't
1080 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001081 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001082PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001083PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001084{
Tim Peters691e0e92001-01-18 04:39:16 +00001085/* 75% of 2.1's .pyc files can exploit SMALL_FILE_LIMIT.
1086 * REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc.
1087 */
1088#define SMALL_FILE_LIMIT (1L << 14)
1089#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001090#ifdef HAVE_FSTAT
1091 off_t filesize;
1092#endif
Tim Peters691e0e92001-01-18 04:39:16 +00001093#ifdef HAVE_FSTAT
1094 filesize = getfilesize(fp);
1095 if (filesize > 0) {
1096 char buf[SMALL_FILE_LIMIT];
1097 char* pBuf = NULL;
1098 if (filesize <= SMALL_FILE_LIMIT)
1099 pBuf = buf;
1100 else if (filesize <= REASONABLE_FILE_LIMIT)
1101 pBuf = (char *)PyMem_MALLOC(filesize);
1102 if (pBuf != NULL) {
1103 PyObject* v;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001104 size_t n;
1105 /* filesize must fit into an int, because it
1106 is smaller than REASONABLE_FILE_LIMIT */
1107 n = fread(pBuf, 1, (int)filesize, fp);
Tim Peters691e0e92001-01-18 04:39:16 +00001108 v = PyMarshal_ReadObjectFromString(pBuf, n);
1109 if (pBuf != buf)
1110 PyMem_FREE(pBuf);
1111 return v;
1112 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001113
Tim Peters691e0e92001-01-18 04:39:16 +00001114 }
1115#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001116 /* We don't have fstat, or we do but the file is larger than
1117 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1118 */
1119 return PyMarshal_ReadObjectFromFile(fp);
1120
Tim Peters691e0e92001-01-18 04:39:16 +00001121#undef SMALL_FILE_LIMIT
1122#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001123}
1124
Guido van Rossum79f25d91997-04-29 20:08:16 +00001125PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001126PyMarshal_ReadObjectFromFile(FILE *fp)
1127{
1128 RFILE rf;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001129 PyObject *result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001130 rf.fp = fp;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001131 rf.strings = PyList_New(0);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001132 rf.depth = 0;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001133 rf.ptr = rf.end = NULL;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001134 result = r_object(&rf);
1135 Py_DECREF(rf.strings);
1136 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001137}
1138
1139PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001140PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001141{
1142 RFILE rf;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001143 PyObject *result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001144 rf.fp = NULL;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001145 rf.ptr = str;
1146 rf.end = str + len;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001147 rf.strings = PyList_New(0);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001148 rf.depth = 0;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001149 result = r_object(&rf);
1150 Py_DECREF(rf.strings);
1151 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001152}
1153
Guido van Rossum79f25d91997-04-29 20:08:16 +00001154PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001155PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001156{
1157 WFILE wf;
Guido van Rossume6d39042007-05-09 00:01:30 +00001158 PyObject *res = NULL;
1159
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001160 wf.fp = NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00001161 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001162 if (wf.str == NULL)
1163 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00001164 wf.ptr = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1165 wf.end = wf.ptr + PyBytes_Size(wf.str);
Eric Smithb1a03cf2009-04-21 11:57:38 +00001166 wf.error = WFERR_OK;
Fred Drake6da0b912000-06-28 18:47:56 +00001167 wf.depth = 0;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001168 wf.version = version;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001169 wf.strings = (version > 0) ? PyDict_New() : NULL;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001170 w_object(x, &wf);
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001171 Py_XDECREF(wf.strings);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001172 if (wf.str != NULL) {
Christian Heimes72b710a2008-05-26 13:28:38 +00001173 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001174 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1175 Py_DECREF(wf.str);
1176 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumf15a29f2007-05-04 00:41:39 +00001177 "too much marshal data for a string");
Thomas Wouters89f507f2006-12-13 04:49:30 +00001178 return NULL;
1179 }
Christian Heimes72b710a2008-05-26 13:28:38 +00001180 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
Guido van Rossume6d39042007-05-09 00:01:30 +00001181 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001182 }
Eric Smithb1a03cf2009-04-21 11:57:38 +00001183 if (wf.error != WFERR_OK) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001184 Py_XDECREF(wf.str);
Eric Smithb1a03cf2009-04-21 11:57:38 +00001185 if (wf.error == WFERR_NOMEMORY)
1186 PyErr_NoMemory();
1187 else
1188 PyErr_SetString(PyExc_ValueError,
1189 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
1190 :"object too deeply nested to marshal");
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001191 return NULL;
1192 }
Guido van Rossume6d39042007-05-09 00:01:30 +00001193 if (wf.str != NULL) {
1194 /* XXX Quick hack -- need to do this differently */
Gregory P. Smith0a608fd2008-09-06 21:34:51 +00001195 res = PyBytes_FromObject(wf.str);
Guido van Rossume6d39042007-05-09 00:01:30 +00001196 Py_DECREF(wf.str);
1197 }
1198 return res;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001199}
1200
Guido van Rossum64b45521991-06-07 13:58:22 +00001201/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001202
Guido van Rossum79f25d91997-04-29 20:08:16 +00001203static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001204marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001205{
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001206 /* XXX Quick hack -- need to do this differently */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001207 PyObject *x;
1208 PyObject *f;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001209 int version = Py_MARSHAL_VERSION;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001210 PyObject *s;
1211 PyObject *res;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001212 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001213 return NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001214 s = PyMarshal_WriteObjectToString(x, version);
1215 if (s == NULL)
Guido van Rossumf2150601996-06-26 20:41:23 +00001216 return NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001217 res = PyObject_CallMethod(f, "write", "O", s);
1218 Py_DECREF(s);
1219 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001220}
1221
R. David Murraydd226ea2009-05-13 12:27:21 +00001222PyDoc_STRVAR(dump_doc,
1223"dump(value, file[, version])\n\
1224\n\
1225Write the value on the open file. The value must be a supported type.\n\
1226The file must be an open file object such as sys.stdout or returned by\n\
1227open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1228\n\
1229If the value has (or contains an object that has) an unsupported type, a\n\
1230ValueError exception is raised but garbage data will also be written\n\
1231to the file. The object will not be properly read back by load()\n\
1232\n\
1233The version argument indicates the data format that dump should use.");
1234
Guido van Rossum79f25d91997-04-29 20:08:16 +00001235static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001236marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001237{
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001238 /* XXX Quick hack -- need to do this differently */
1239 PyObject *data, *result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001240 RFILE rf;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001241 data = PyObject_CallMethod(f, "read", "");
1242 if (data == NULL)
1243 return NULL;
1244 rf.fp = NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00001245 if (PyBytes_Check(data)) {
1246 rf.ptr = PyBytes_AS_STRING(data);
1247 rf.end = rf.ptr + PyBytes_GET_SIZE(data);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001248 }
Gregory P. Smith0a608fd2008-09-06 21:34:51 +00001249 else if (PyBytes_Check(data)) {
1250 rf.ptr = PyBytes_AS_STRING(data);
1251 rf.end = rf.ptr + PyBytes_GET_SIZE(data);
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001252 }
1253 else {
1254 PyErr_Format(PyExc_TypeError,
1255 "f.read() returned neither string "
1256 "nor bytes but %.100s",
1257 data->ob_type->tp_name);
1258 Py_DECREF(data);
1259 return NULL;
1260 }
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001261 rf.strings = PyList_New(0);
Guido van Rossum7a265342007-07-30 00:04:35 +00001262 rf.depth = 0;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001263 result = read_object(&rf);
1264 Py_DECREF(rf.strings);
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001265 Py_DECREF(data);
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001266 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001267}
1268
R. David Murraydd226ea2009-05-13 12:27:21 +00001269PyDoc_STRVAR(load_doc,
1270"load(file)\n\
1271\n\
1272Read one value from the open file and return it. If no valid value is\n\
1273read (e.g. because the data has a different Python versions\n\
1274incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1275The file must be an open file object opened in binary mode ('rb' or\n\
1276'r+b').\n\
1277\n\
1278Note: If an object containing an unsupported type was marshalled with\n\
1279dump(), load() will substitute None for the unmarshallable type.");
1280
1281
Guido van Rossum79f25d91997-04-29 20:08:16 +00001282static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001283marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001284{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001285 PyObject *x;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001286 int version = Py_MARSHAL_VERSION;
Armin Rigo2ccea172004-12-20 12:25:57 +00001287 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001288 return NULL;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001289 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001290}
1291
R. David Murraydd226ea2009-05-13 12:27:21 +00001292PyDoc_STRVAR(dumps_doc,
1293"dumps(value[, version])\n\
1294\n\
1295Return the string that would be written to a file by dump(value, file).\n\
1296The value must be a supported type. Raise a ValueError exception if\n\
1297value has (or contains an object that has) an unsupported type.\n\
1298\n\
1299The version argument indicates the data format that dumps should use.");
1300
1301
Guido van Rossum79f25d91997-04-29 20:08:16 +00001302static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001303marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001304{
1305 RFILE rf;
Martin v. Löwis423be952008-08-13 15:53:07 +00001306 Py_buffer p;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001307 char *s;
Thomas Wouters695934a2006-03-01 23:49:13 +00001308 Py_ssize_t n;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001309 PyObject* result;
Martin v. Löwis423be952008-08-13 15:53:07 +00001310 if (!PyArg_ParseTuple(args, "s*:loads", &p))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001311 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +00001312 s = p.buf;
1313 n = p.len;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001314 rf.fp = NULL;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001315 rf.ptr = s;
1316 rf.end = s + n;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001317 rf.strings = PyList_New(0);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001318 rf.depth = 0;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001319 result = read_object(&rf);
1320 Py_DECREF(rf.strings);
Martin v. Löwis423be952008-08-13 15:53:07 +00001321 PyBuffer_Release(&p);
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001322 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001323}
1324
R. David Murraydd226ea2009-05-13 12:27:21 +00001325PyDoc_STRVAR(loads_doc,
1326"loads(string)\n\
1327\n\
1328Convert the string to a value. If no valid value is found, raise\n\
1329EOFError, ValueError or TypeError. Extra characters in the string are\n\
1330ignored.");
1331
Guido van Rossum79f25d91997-04-29 20:08:16 +00001332static PyMethodDef marshal_methods[] = {
R. David Murraydd226ea2009-05-13 12:27:21 +00001333 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1334 {"load", marshal_load, METH_O, load_doc},
1335 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1336 {"loads", marshal_loads, METH_VARARGS, loads_doc},
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001337 {NULL, NULL} /* sentinel */
1338};
1339
R. David Murraydd226ea2009-05-13 12:27:21 +00001340
1341PyDoc_STRVAR(module_doc,
1342"This module contains functions that can read and write Python values in\n\
1343a binary format. The format is specific to Python, but independent of\n\
1344machine architecture issues.\n\
1345\n\
1346Not all Python object types are supported; in general, only objects\n\
1347whose value is independent from a particular invocation of Python can be\n\
1348written and read by this module. The following types are supported:\n\
1349None, integers, floating point numbers, strings, bytes, bytearrays,\n\
1350tuples, lists, sets, dictionaries, and code objects, where it\n\
1351should be understood that tuples, lists and dictionaries are only\n\
1352supported as long as the values contained therein are themselves\n\
1353supported; and recursive lists and dictionaries should not be written\n\
1354(they will cause infinite loops).\n\
1355\n\
1356Variables:\n\
1357\n\
1358version -- indicates the format that the module uses. Version 0 is the\n\
1359 historical format, version 1 shares interned strings and version 2\n\
1360 uses a binary format for floating point numbers.\n\
1361\n\
1362Functions:\n\
1363\n\
1364dump() -- write value to a file\n\
1365load() -- read value from a file\n\
1366dumps() -- write value to a string\n\
1367loads() -- read value from a string");
1368
1369
1370
Brett Cannon429ef652008-06-27 00:35:35 +00001371static struct PyModuleDef marshalmodule = {
Martin v. Löwis1a214512008-06-11 05:26:20 +00001372 PyModuleDef_HEAD_INIT,
1373 "marshal",
R. David Murraydd226ea2009-05-13 12:27:21 +00001374 module_doc,
Martin v. Löwis1a214512008-06-11 05:26:20 +00001375 0,
1376 marshal_methods,
1377 NULL,
1378 NULL,
1379 NULL,
1380 NULL
1381};
1382
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001383PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001384PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001385{
Brett Cannon429ef652008-06-27 00:35:35 +00001386 PyObject *mod = PyModule_Create(&marshalmodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001387 if (mod == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001388 return NULL;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001389 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
Martin v. Löwis1a214512008-06-11 05:26:20 +00001390 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001391}