blob: 1ef41b081b7a1dfda231d86edd9c0adfbe220dfb [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 Dickinsonefc82f72009-03-20 15:51:55 +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.
19 */
Neal Norwitzf6b0e4d2007-05-17 07:04:46 +000020#define MAX_MARSHAL_STACK_DEPTH 2000
Fred Drake6da0b912000-06-28 18:47:56 +000021
Michael W. Hudsondf888462005-06-03 14:41:55 +000022#define TYPE_NULL '0'
23#define TYPE_NONE 'N'
24#define TYPE_FALSE 'F'
25#define TYPE_TRUE 'T'
26#define TYPE_STOPITER 'S'
27#define TYPE_ELLIPSIS '.'
28#define TYPE_INT 'i'
29#define TYPE_INT64 'I'
30#define TYPE_FLOAT 'f'
31#define TYPE_BINARY_FLOAT 'g'
32#define TYPE_COMPLEX 'x'
33#define TYPE_BINARY_COMPLEX 'y'
34#define TYPE_LONG 'l'
35#define TYPE_STRING 's'
36#define TYPE_INTERNED 't'
37#define TYPE_STRINGREF 'R'
38#define TYPE_TUPLE '('
39#define TYPE_LIST '['
40#define TYPE_DICT '{'
41#define TYPE_CODE 'c'
42#define TYPE_UNICODE 'u'
43#define TYPE_UNKNOWN '?'
44#define TYPE_SET '<'
45#define TYPE_FROZENSET '>'
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000046
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000047typedef struct {
48 FILE *fp;
Guido van Rossumf2150601996-06-26 20:41:23 +000049 int error;
Fred Drake6da0b912000-06-28 18:47:56 +000050 int depth;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000051 /* If fp == NULL, the following are valid: */
Guido van Rossum79f25d91997-04-29 20:08:16 +000052 PyObject *str;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000053 char *ptr;
54 char *end;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +000055 PyObject *strings; /* dict on marshal, list on unmarshal */
Michael W. Hudsondf888462005-06-03 14:41:55 +000056 int version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000057} WFILE;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000058
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000059#define w_byte(c, p) if (((p)->fp)) putc((c), (p)->fp); \
60 else if ((p)->ptr != (p)->end) *(p)->ptr++ = (c); \
61 else w_more(c, p)
62
63static void
Fredrik Lundh11534382000-07-23 18:24:06 +000064w_more(int c, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000065{
Martin v. Löwis18e16552006-02-15 17:27:45 +000066 Py_ssize_t size, newsize;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000067 if (p->str == NULL)
68 return; /* An error already occurred */
Gregory P. Smithdd96db62008-06-09 04:58:54 +000069 size = PyString_Size(p->str);
Andrew M. Kuchling6c029162008-05-11 13:33:56 +000070 newsize = size + size + 1024;
71 if (newsize > 32*1024*1024) {
Raymond Hettinger305480c2008-06-16 01:42:40 +000072 newsize = size + (size >> 3); /* 12.5% overallocation */
Andrew M. Kuchling6c029162008-05-11 13:33:56 +000073 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +000074 if (_PyString_Resize(&p->str, newsize) != 0) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000075 p->ptr = p->end = NULL;
76 }
77 else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +000078 p->ptr = PyString_AS_STRING((PyStringObject *)p->str) + size;
Guido van Rossum79f25d91997-04-29 20:08:16 +000079 p->end =
Gregory P. Smithdd96db62008-06-09 04:58:54 +000080 PyString_AS_STRING((PyStringObject *)p->str) + newsize;
Tim Peters8315ea52000-07-23 19:28:35 +000081 *p->ptr++ = Py_SAFE_DOWNCAST(c, int, char);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000082 }
83}
84
85static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000086w_string(char *s, int n, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000087{
88 if (p->fp != NULL) {
89 fwrite(s, 1, n, p->fp);
90 }
91 else {
92 while (--n >= 0) {
93 w_byte(*s, p);
94 s++;
95 }
96 }
97}
98
99static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000100w_short(int x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000101{
Thomas Heller3e1c18a2002-07-30 11:40:57 +0000102 w_byte((char)( x & 0xff), p);
103 w_byte((char)((x>> 8) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000104}
105
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000106static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000107w_long(long x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000108{
Thomas Heller37d5a152002-07-30 11:44:44 +0000109 w_byte((char)( x & 0xff), p);
110 w_byte((char)((x>> 8) & 0xff), p);
111 w_byte((char)((x>>16) & 0xff), p);
112 w_byte((char)((x>>24) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000113}
114
Guido van Rossumc1547d91996-12-10 15:39:04 +0000115#if SIZEOF_LONG > 4
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000116static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000117w_long64(long x, WFILE *p)
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000118{
119 w_long(x, p);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000120 w_long(x>>32, p);
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000121}
Guido van Rossumc1547d91996-12-10 15:39:04 +0000122#endif
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000123
Mark Dickinsonefc82f72009-03-20 15:51:55 +0000124/* We assume that Python longs are stored internally in base some power of
125 2**15; for the sake of portability we'll always read and write them in base
126 exactly 2**15. */
127
128#define PyLong_MARSHAL_SHIFT 15
129#define PyLong_MARSHAL_BASE ((short)1 << PyLong_MARSHAL_SHIFT)
130#define PyLong_MARSHAL_MASK (PyLong_MARSHAL_BASE - 1)
131#if PyLong_SHIFT % PyLong_MARSHAL_SHIFT != 0
132#error "PyLong_SHIFT must be a multiple of PyLong_MARSHAL_SHIFT"
133#endif
134#define PyLong_MARSHAL_RATIO (PyLong_SHIFT / PyLong_MARSHAL_SHIFT)
135
136static void
137w_PyLong(const PyLongObject *ob, WFILE *p)
138{
139 Py_ssize_t i, j, n, l;
140 digit d;
141
142 w_byte(TYPE_LONG, p);
143 if (Py_SIZE(ob) == 0) {
144 w_long((long)0, p);
145 return;
146 }
147
148 /* set l to number of base PyLong_MARSHAL_BASE digits */
149 n = ABS(Py_SIZE(ob));
150 l = (n-1) * PyLong_MARSHAL_RATIO;
151 d = ob->ob_digit[n-1];
152 assert(d != 0); /* a PyLong is always normalized */
153 do {
154 d >>= PyLong_MARSHAL_SHIFT;
155 l++;
156 } while (d != 0);
157 w_long((long)(Py_SIZE(ob) > 0 ? l : -l), p);
158
159 for (i=0; i < n-1; i++) {
160 d = ob->ob_digit[i];
161 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
162 w_short(d & PyLong_MARSHAL_MASK, p);
163 d >>= PyLong_MARSHAL_SHIFT;
164 }
165 assert (d == 0);
166 }
167 d = ob->ob_digit[n-1];
168 do {
169 w_short(d & PyLong_MARSHAL_MASK, p);
170 d >>= PyLong_MARSHAL_SHIFT;
171 } while (d != 0);
172}
173
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000174static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000175w_object(PyObject *v, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000176{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000177 Py_ssize_t i, n;
Fred Drake6da0b912000-06-28 18:47:56 +0000178
179 p->depth++;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000180
Fred Drake6da0b912000-06-28 18:47:56 +0000181 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
182 p->error = 2;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000183 }
Fred Drake6da0b912000-06-28 18:47:56 +0000184 else if (v == NULL) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000185 w_byte(TYPE_NULL, p);
Guido van Rossum730806d1998-04-10 22:27:42 +0000186 }
187 else if (v == Py_None) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000188 w_byte(TYPE_NONE, p);
Guido van Rossum730806d1998-04-10 22:27:42 +0000189 }
Tim Peters5ca576e2001-06-18 22:08:13 +0000190 else if (v == PyExc_StopIteration) {
191 w_byte(TYPE_STOPITER, p);
192 }
Guido van Rossum730806d1998-04-10 22:27:42 +0000193 else if (v == Py_Ellipsis) {
194 w_byte(TYPE_ELLIPSIS, p);
195 }
Guido van Rossum77f6a652002-04-03 22:41:51 +0000196 else if (v == Py_False) {
197 w_byte(TYPE_FALSE, p);
198 }
199 else if (v == Py_True) {
200 w_byte(TYPE_TRUE, p);
201 }
Raymond Hettinger12e94202007-11-07 01:13:09 +0000202 else if (PyInt_CheckExact(v)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000203 long x = PyInt_AS_LONG((PyIntObject *)v);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000204#if SIZEOF_LONG > 4
Tim Peters44714002001-04-10 05:02:52 +0000205 long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000206 if (y && y != -1) {
207 w_byte(TYPE_INT64, p);
208 w_long64(x, p);
209 }
Guido van Rossumc1547d91996-12-10 15:39:04 +0000210 else
211#endif
212 {
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000213 w_byte(TYPE_INT, p);
214 w_long(x, p);
215 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000216 }
Raymond Hettinger12e94202007-11-07 01:13:09 +0000217 else if (PyLong_CheckExact(v)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000218 PyLongObject *ob = (PyLongObject *)v;
Mark Dickinsonefc82f72009-03-20 15:51:55 +0000219 w_PyLong(ob, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000220 }
Raymond Hettinger12e94202007-11-07 01:13:09 +0000221 else if (PyFloat_CheckExact(v)) {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000222 if (p->version > 1) {
Brett Cannonc9371d42005-06-25 08:23:41 +0000223 unsigned char buf[8];
Michael W. Hudsondf888462005-06-03 14:41:55 +0000224 if (_PyFloat_Pack8(PyFloat_AsDouble(v),
225 buf, 1) < 0) {
226 p->error = 1;
227 return;
228 }
229 w_byte(TYPE_BINARY_FLOAT, p);
Brett Cannonc9371d42005-06-25 08:23:41 +0000230 w_string((char*)buf, 8, p);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000231 }
232 else {
233 char buf[256]; /* Plenty to format any double */
234 PyFloat_AsReprString(buf, (PyFloatObject *)v);
Martin v. Löwis67baee62006-02-16 14:37:48 +0000235 n = strlen(buf);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000236 w_byte(TYPE_FLOAT, p);
Martin v. Löwis67baee62006-02-16 14:37:48 +0000237 w_byte((int)n, p);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000238 w_string(buf, (int)n, p);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000239 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000240 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000241#ifndef WITHOUT_COMPLEX
Raymond Hettinger12e94202007-11-07 01:13:09 +0000242 else if (PyComplex_CheckExact(v)) {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000243 if (p->version > 1) {
Brett Cannonc9371d42005-06-25 08:23:41 +0000244 unsigned char buf[8];
Michael W. Hudsondf888462005-06-03 14:41:55 +0000245 if (_PyFloat_Pack8(PyComplex_RealAsDouble(v),
246 buf, 1) < 0) {
247 p->error = 1;
248 return;
249 }
250 w_byte(TYPE_BINARY_COMPLEX, p);
Brett Cannonc9371d42005-06-25 08:23:41 +0000251 w_string((char*)buf, 8, p);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000252 if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v),
253 buf, 1) < 0) {
254 p->error = 1;
255 return;
256 }
Brett Cannonc9371d42005-06-25 08:23:41 +0000257 w_string((char*)buf, 8, p);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000258 }
259 else {
260 char buf[256]; /* Plenty to format any double */
261 PyFloatObject *temp;
262 w_byte(TYPE_COMPLEX, p);
263 temp = (PyFloatObject*)PyFloat_FromDouble(
264 PyComplex_RealAsDouble(v));
Neal Norwitzedb21682006-08-12 01:47:59 +0000265 if (!temp) {
266 p->error = 1;
267 return;
268 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000269 PyFloat_AsReprString(buf, temp);
270 Py_DECREF(temp);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000271 n = strlen(buf);
272 w_byte((int)n, p);
273 w_string(buf, (int)n, p);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000274 temp = (PyFloatObject*)PyFloat_FromDouble(
275 PyComplex_ImagAsDouble(v));
Neal Norwitzedb21682006-08-12 01:47:59 +0000276 if (!temp) {
277 p->error = 1;
278 return;
279 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000280 PyFloat_AsReprString(buf, temp);
281 Py_DECREF(temp);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000282 n = strlen(buf);
283 w_byte((int)n, p);
284 w_string(buf, (int)n, p);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000285 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000286 }
287#endif
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000288 else if (PyString_CheckExact(v)) {
289 if (p->strings && PyString_CHECK_INTERNED(v)) {
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000290 PyObject *o = PyDict_GetItem(p->strings, v);
291 if (o) {
292 long w = PyInt_AsLong(o);
293 w_byte(TYPE_STRINGREF, p);
294 w_long(w, p);
295 goto exit;
296 }
297 else {
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000298 int ok;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000299 o = PyInt_FromSsize_t(PyDict_Size(p->strings));
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000300 ok = o &&
301 PyDict_SetItem(p->strings, v, o) >= 0;
302 Py_XDECREF(o);
303 if (!ok) {
304 p->depth--;
305 p->error = 1;
306 return;
307 }
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000308 w_byte(TYPE_INTERNED, p);
309 }
310 }
311 else {
312 w_byte(TYPE_STRING, p);
313 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000314 n = PyString_GET_SIZE(v);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000315 if (n > INT_MAX) {
316 /* huge strings are not supported */
317 p->depth--;
318 p->error = 1;
319 return;
320 }
Guido van Rossum3a205f71995-02-17 15:10:07 +0000321 w_long((long)n, p);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000322 w_string(PyString_AS_STRING(v), (int)n, p);
Guido van Rossumc279b532000-03-10 23:03:02 +0000323 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000324#ifdef Py_USING_UNICODE
Raymond Hettinger12e94202007-11-07 01:13:09 +0000325 else if (PyUnicode_CheckExact(v)) {
Guido van Rossumc279b532000-03-10 23:03:02 +0000326 PyObject *utf8;
327 utf8 = PyUnicode_AsUTF8String(v);
328 if (utf8 == NULL) {
Guido van Rossum98626cd2000-06-28 23:24:19 +0000329 p->depth--;
330 p->error = 1;
331 return;
Guido van Rossumc279b532000-03-10 23:03:02 +0000332 }
333 w_byte(TYPE_UNICODE, p);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000334 n = PyString_GET_SIZE(utf8);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000335 if (n > INT_MAX) {
336 p->depth--;
337 p->error = 1;
338 return;
339 }
Guido van Rossumc279b532000-03-10 23:03:02 +0000340 w_long((long)n, p);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000341 w_string(PyString_AS_STRING(utf8), (int)n, p);
Guido van Rossumc279b532000-03-10 23:03:02 +0000342 Py_DECREF(utf8);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000343 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000344#endif
Raymond Hettinger12e94202007-11-07 01:13:09 +0000345 else if (PyTuple_CheckExact(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000346 w_byte(TYPE_TUPLE, p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000347 n = PyTuple_Size(v);
Guido van Rossum3a205f71995-02-17 15:10:07 +0000348 w_long((long)n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000349 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000350 w_object(PyTuple_GET_ITEM(v, i), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000351 }
352 }
Raymond Hettinger12e94202007-11-07 01:13:09 +0000353 else if (PyList_CheckExact(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000354 w_byte(TYPE_LIST, p);
Guido van Rossumc279b532000-03-10 23:03:02 +0000355 n = PyList_GET_SIZE(v);
Guido van Rossum3a205f71995-02-17 15:10:07 +0000356 w_long((long)n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000357 for (i = 0; i < n; i++) {
Guido van Rossumc279b532000-03-10 23:03:02 +0000358 w_object(PyList_GET_ITEM(v, i), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000359 }
360 }
Raymond Hettinger12e94202007-11-07 01:13:09 +0000361 else if (PyDict_CheckExact(v)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000362 Py_ssize_t pos;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000363 PyObject *key, *value;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000364 w_byte(TYPE_DICT, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000365 /* This one is NULL object terminated! */
Guido van Rossum25831651993-05-19 14:50:45 +0000366 pos = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000367 while (PyDict_Next(v, &pos, &key, &value)) {
Guido van Rossum25831651993-05-19 14:50:45 +0000368 w_object(key, p);
369 w_object(value, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000370 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000371 w_object((PyObject *)NULL, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000372 }
Raymond Hettinger12e94202007-11-07 01:13:09 +0000373 else if (PyAnySet_CheckExact(v)) {
Raymond Hettingera422c342005-01-11 03:03:27 +0000374 PyObject *value, *it;
375
376 if (PyObject_TypeCheck(v, &PySet_Type))
377 w_byte(TYPE_SET, p);
378 else
379 w_byte(TYPE_FROZENSET, p);
380 n = PyObject_Size(v);
381 if (n == -1) {
382 p->depth--;
383 p->error = 1;
384 return;
385 }
386 w_long((long)n, p);
387 it = PyObject_GetIter(v);
388 if (it == NULL) {
389 p->depth--;
390 p->error = 1;
391 return;
392 }
393 while ((value = PyIter_Next(it)) != NULL) {
394 w_object(value, p);
395 Py_DECREF(value);
396 }
397 Py_DECREF(it);
398 if (PyErr_Occurred()) {
399 p->depth--;
400 p->error = 1;
401 return;
402 }
403 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000404 else if (PyCode_Check(v)) {
405 PyCodeObject *co = (PyCodeObject *)v;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000406 w_byte(TYPE_CODE, p);
Neal Norwitz7fdcb412002-06-14 01:07:39 +0000407 w_long(co->co_argcount, p);
408 w_long(co->co_nlocals, p);
409 w_long(co->co_stacksize, p);
410 w_long(co->co_flags, p);
Guido van Rossumd076c731998-10-07 19:42:25 +0000411 w_object(co->co_code, p);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000412 w_object(co->co_consts, p);
413 w_object(co->co_names, p);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000414 w_object(co->co_varnames, p);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000415 w_object(co->co_freevars, p);
416 w_object(co->co_cellvars, p);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000417 w_object(co->co_filename, p);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000418 w_object(co->co_name, p);
Neal Norwitz7fdcb412002-06-14 01:07:39 +0000419 w_long(co->co_firstlineno, p);
Guido van Rossumd031c891997-01-24 03:44:17 +0000420 w_object(co->co_lnotab, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000421 }
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000422 else if (PyObject_CheckReadBuffer(v)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000423 /* Write unknown buffer-style objects as a string */
424 char *s;
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000425 PyBufferProcs *pb = v->ob_type->tp_as_buffer;
Guido van Rossumd076c731998-10-07 19:42:25 +0000426 w_byte(TYPE_STRING, p);
427 n = (*pb->bf_getreadbuffer)(v, 0, (void **)&s);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000428 if (n > INT_MAX) {
429 p->depth--;
430 p->error = 1;
431 return;
432 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000433 w_long((long)n, p);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000434 w_string(s, (int)n, p);
Guido van Rossumd076c731998-10-07 19:42:25 +0000435 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000436 else {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000437 w_byte(TYPE_UNKNOWN, p);
Guido van Rossumf2150601996-06-26 20:41:23 +0000438 p->error = 1;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000439 }
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000440 exit:
Guido van Rossum98626cd2000-06-28 23:24:19 +0000441 p->depth--;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000442}
443
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000444/* version currently has no effect for writing longs. */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000445void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000446PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000447{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000448 WFILE wf;
449 wf.fp = fp;
Guido van Rossumf2150601996-06-26 20:41:23 +0000450 wf.error = 0;
Fred Drake6da0b912000-06-28 18:47:56 +0000451 wf.depth = 0;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000452 wf.strings = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000453 wf.version = version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000454 w_long(x, &wf);
455}
456
457void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000458PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000459{
460 WFILE wf;
461 wf.fp = fp;
Guido van Rossumf2150601996-06-26 20:41:23 +0000462 wf.error = 0;
Guido van Rossum98626cd2000-06-28 23:24:19 +0000463 wf.depth = 0;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000464 wf.strings = (version > 0) ? PyDict_New() : NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000465 wf.version = version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000466 w_object(x, &wf);
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000467 Py_XDECREF(wf.strings);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000468}
469
470typedef WFILE RFILE; /* Same struct with different invariants */
471
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000472#define rs_byte(p) (((p)->ptr < (p)->end) ? (unsigned char)*(p)->ptr++ : EOF)
Guido van Rossum8d617a61995-03-09 12:12:11 +0000473
474#define r_byte(p) ((p)->fp ? getc((p)->fp) : rs_byte(p))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000475
476static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000477r_string(char *s, int n, RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000478{
479 if (p->fp != NULL)
Martin v. Löwis18e16552006-02-15 17:27:45 +0000480 /* The result fits into int because it must be <=n. */
481 return (int)fread(s, 1, n, p->fp);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000482 if (p->end - p->ptr < n)
Martin v. Löwis18e16552006-02-15 17:27:45 +0000483 n = (int)(p->end - p->ptr);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000484 memcpy(s, p->ptr, n);
485 p->ptr += n;
486 return n;
487}
488
489static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000490r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000491{
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000492 register short x;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000493 x = r_byte(p);
494 x |= r_byte(p) << 8;
Tim Peterse84b7402000-09-19 08:54:13 +0000495 /* Sign-extension, in case short greater than 16 bits */
496 x |= -(x & 0x8000);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000497 return x;
498}
499
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000500static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000501r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000502{
503 register long x;
Guido van Rossum8d617a61995-03-09 12:12:11 +0000504 register FILE *fp = p->fp;
505 if (fp) {
506 x = getc(fp);
507 x |= (long)getc(fp) << 8;
508 x |= (long)getc(fp) << 16;
509 x |= (long)getc(fp) << 24;
510 }
511 else {
512 x = rs_byte(p);
513 x |= (long)rs_byte(p) << 8;
514 x |= (long)rs_byte(p) << 16;
515 x |= (long)rs_byte(p) << 24;
516 }
Guido van Rossumc1547d91996-12-10 15:39:04 +0000517#if SIZEOF_LONG > 4
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000518 /* Sign extension for 64-bit machines */
Tim Peterse84b7402000-09-19 08:54:13 +0000519 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000520#endif
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000521 return x;
522}
523
Tim Peters82112372001-08-29 02:28:42 +0000524/* r_long64 deals with the TYPE_INT64 code. On a machine with
525 sizeof(long) > 4, it returns a Python int object, else a Python long
526 object. Note that w_long64 writes out TYPE_INT if 32 bits is enough,
527 so there's no inefficiency here in returning a PyLong on 32-bit boxes
528 for everything written via TYPE_INT64 (i.e., if an int is written via
529 TYPE_INT64, it *needs* more than 32 bits).
530*/
531static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000532r_long64(RFILE *p)
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000533{
Tim Peters82112372001-08-29 02:28:42 +0000534 long lo4 = r_long(p);
535 long hi4 = r_long(p);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000536#if SIZEOF_LONG > 4
Tim Peters82112372001-08-29 02:28:42 +0000537 long x = (hi4 << 32) | (lo4 & 0xFFFFFFFFL);
538 return PyInt_FromLong(x);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000539#else
Tim Peters82112372001-08-29 02:28:42 +0000540 unsigned char buf[8];
541 int one = 1;
542 int is_little_endian = (int)*(char*)&one;
543 if (is_little_endian) {
544 memcpy(buf, &lo4, 4);
545 memcpy(buf+4, &hi4, 4);
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000546 }
Tim Peters82112372001-08-29 02:28:42 +0000547 else {
548 memcpy(buf, &hi4, 4);
549 memcpy(buf+4, &lo4, 4);
550 }
551 return _PyLong_FromByteArray(buf, 8, is_little_endian, 1);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000552#endif
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000553}
554
Guido van Rossum79f25d91997-04-29 20:08:16 +0000555static PyObject *
Mark Dickinsonefc82f72009-03-20 15:51:55 +0000556r_PyLong(RFILE *p)
557{
558 PyLongObject *ob;
Mark Dickinson7e7a3ec2009-09-29 19:01:06 +0000559 int size, i, j, md, shorts_in_top_digit;
Mark Dickinsonefc82f72009-03-20 15:51:55 +0000560 long n;
561 digit d;
562
563 n = r_long(p);
564 if (n == 0)
565 return (PyObject *)_PyLong_New(0);
566 if (n < -INT_MAX || n > INT_MAX) {
567 PyErr_SetString(PyExc_ValueError,
568 "bad marshal data (long size out of range)");
569 return NULL;
570 }
571
Mark Dickinson7e7a3ec2009-09-29 19:01:06 +0000572 size = 1 + (ABS(n) - 1) / PyLong_MARSHAL_RATIO;
573 shorts_in_top_digit = 1 + (ABS(n) - 1) % PyLong_MARSHAL_RATIO;
Mark Dickinsonefc82f72009-03-20 15:51:55 +0000574 ob = _PyLong_New(size);
575 if (ob == NULL)
576 return NULL;
577 Py_SIZE(ob) = n > 0 ? size : -size;
578
579 for (i = 0; i < size-1; i++) {
580 d = 0;
581 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
582 md = r_short(p);
583 if (md < 0 || md > PyLong_MARSHAL_BASE)
584 goto bad_digit;
585 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
586 }
587 ob->ob_digit[i] = d;
588 }
589 d = 0;
Mark Dickinson7e7a3ec2009-09-29 19:01:06 +0000590 for (j=0; j < shorts_in_top_digit; j++) {
Mark Dickinsonefc82f72009-03-20 15:51:55 +0000591 md = r_short(p);
592 if (md < 0 || md > PyLong_MARSHAL_BASE)
593 goto bad_digit;
Mark Dickinson7e7a3ec2009-09-29 19:01:06 +0000594 /* topmost marshal digit should be nonzero */
595 if (md == 0 && j == shorts_in_top_digit - 1) {
596 Py_DECREF(ob);
597 PyErr_SetString(PyExc_ValueError,
598 "bad marshal data (unnormalized long data)");
599 return NULL;
600 }
Mark Dickinsonefc82f72009-03-20 15:51:55 +0000601 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
602 }
Mark Dickinson7e7a3ec2009-09-29 19:01:06 +0000603 /* top digit should be nonzero, else the resulting PyLong won't be
604 normalized */
Mark Dickinsonefc82f72009-03-20 15:51:55 +0000605 ob->ob_digit[size-1] = d;
606 return (PyObject *)ob;
607 bad_digit:
608 Py_DECREF(ob);
609 PyErr_SetString(PyExc_ValueError,
610 "bad marshal data (digit out of range in long)");
611 return NULL;
612}
613
614
615static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000616r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000617{
Armin Rigo01ab2792004-03-26 15:09:27 +0000618 /* NULL is a valid return value, it does not necessarily means that
619 an exception is set. */
Christian Heimes67ac0662008-01-30 11:46:00 +0000620 PyObject *v, *v2;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000621 long i, n;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000622 int type = r_byte(p);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000623 PyObject *retval;
624
625 p->depth++;
626
627 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
628 p->depth--;
629 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
630 return NULL;
631 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000632
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000633 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000634
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000635 case EOF:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000636 PyErr_SetString(PyExc_EOFError,
637 "EOF read where object expected");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000638 retval = NULL;
639 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000640
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000641 case TYPE_NULL:
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000642 retval = NULL;
643 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000644
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000645 case TYPE_NONE:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000646 Py_INCREF(Py_None);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000647 retval = Py_None;
648 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000649
Tim Peters5ca576e2001-06-18 22:08:13 +0000650 case TYPE_STOPITER:
651 Py_INCREF(PyExc_StopIteration);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000652 retval = PyExc_StopIteration;
653 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000654
Guido van Rossume449af71996-10-11 16:25:41 +0000655 case TYPE_ELLIPSIS:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000656 Py_INCREF(Py_Ellipsis);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000657 retval = Py_Ellipsis;
658 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000659
Guido van Rossum77f6a652002-04-03 22:41:51 +0000660 case TYPE_FALSE:
661 Py_INCREF(Py_False);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000662 retval = Py_False;
663 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000664
665 case TYPE_TRUE:
666 Py_INCREF(Py_True);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000667 retval = Py_True;
668 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000669
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000670 case TYPE_INT:
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000671 retval = PyInt_FromLong(r_long(p));
672 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000673
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000674 case TYPE_INT64:
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000675 retval = r_long64(p);
676 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000677
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000678 case TYPE_LONG:
Mark Dickinsonefc82f72009-03-20 15:51:55 +0000679 retval = r_PyLong(p);
680 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000681
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000682 case TYPE_FLOAT:
683 {
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000684 char buf[256];
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000685 double dx;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000686 n = r_byte(p);
Armin Rigo01ab2792004-03-26 15:09:27 +0000687 if (n == EOF || r_string(buf, (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000688 PyErr_SetString(PyExc_EOFError,
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000689 "EOF read where object expected");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000690 retval = NULL;
691 break;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000692 }
693 buf[n] = '\0';
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000694 retval = NULL;
695 PyFPE_START_PROTECT("atof", break)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000696 dx = PyOS_ascii_atof(buf);
Guido van Rossum45b83911997-03-14 04:32:50 +0000697 PyFPE_END_PROTECT(dx)
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000698 retval = PyFloat_FromDouble(dx);
699 break;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000700 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000701
Michael W. Hudsondf888462005-06-03 14:41:55 +0000702 case TYPE_BINARY_FLOAT:
703 {
Brett Cannonc9371d42005-06-25 08:23:41 +0000704 unsigned char buf[8];
Michael W. Hudsondf888462005-06-03 14:41:55 +0000705 double x;
Brett Cannonc9371d42005-06-25 08:23:41 +0000706 if (r_string((char*)buf, 8, p) != 8) {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000707 PyErr_SetString(PyExc_EOFError,
708 "EOF read where object expected");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000709 retval = NULL;
710 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000711 }
712 x = _PyFloat_Unpack8(buf, 1);
713 if (x == -1.0 && PyErr_Occurred()) {
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000714 retval = NULL;
715 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000716 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000717 retval = PyFloat_FromDouble(x);
718 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000719 }
720
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000721#ifndef WITHOUT_COMPLEX
722 case TYPE_COMPLEX:
723 {
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000724 char buf[256];
Guido van Rossum530956d1996-07-21 02:27:43 +0000725 Py_complex c;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000726 n = r_byte(p);
Armin Rigo01ab2792004-03-26 15:09:27 +0000727 if (n == EOF || r_string(buf, (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000728 PyErr_SetString(PyExc_EOFError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000729 "EOF read where object expected");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000730 retval = NULL;
731 break;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000732 }
733 buf[n] = '\0';
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000734 retval = NULL;
735 PyFPE_START_PROTECT("atof", break;)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000736 c.real = PyOS_ascii_atof(buf);
Guido van Rossum45b83911997-03-14 04:32:50 +0000737 PyFPE_END_PROTECT(c)
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000738 n = r_byte(p);
Armin Rigo01ab2792004-03-26 15:09:27 +0000739 if (n == EOF || r_string(buf, (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000740 PyErr_SetString(PyExc_EOFError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000741 "EOF read where object expected");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000742 retval = NULL;
743 break;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000744 }
745 buf[n] = '\0';
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000746 PyFPE_START_PROTECT("atof", break)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000747 c.imag = PyOS_ascii_atof(buf);
Guido van Rossum45b83911997-03-14 04:32:50 +0000748 PyFPE_END_PROTECT(c)
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000749 retval = PyComplex_FromCComplex(c);
750 break;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000751 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000752
753 case TYPE_BINARY_COMPLEX:
754 {
Brett Cannonc9371d42005-06-25 08:23:41 +0000755 unsigned char buf[8];
Michael W. Hudsondf888462005-06-03 14:41:55 +0000756 Py_complex c;
Brett Cannonc9371d42005-06-25 08:23:41 +0000757 if (r_string((char*)buf, 8, p) != 8) {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000758 PyErr_SetString(PyExc_EOFError,
759 "EOF read where object expected");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000760 retval = NULL;
761 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000762 }
763 c.real = _PyFloat_Unpack8(buf, 1);
764 if (c.real == -1.0 && PyErr_Occurred()) {
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000765 retval = NULL;
766 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000767 }
Brett Cannonc9371d42005-06-25 08:23:41 +0000768 if (r_string((char*)buf, 8, p) != 8) {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000769 PyErr_SetString(PyExc_EOFError,
770 "EOF read where object expected");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000771 retval = NULL;
772 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000773 }
774 c.imag = _PyFloat_Unpack8(buf, 1);
775 if (c.imag == -1.0 && PyErr_Occurred()) {
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000776 retval = NULL;
777 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000778 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000779 retval = PyComplex_FromCComplex(c);
780 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000781 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000782#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +0000783
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000784 case TYPE_INTERNED:
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000785 case TYPE_STRING:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000786 n = r_long(p);
Armin Rigo7ccbca92006-10-04 12:17:45 +0000787 if (n < 0 || n > INT_MAX) {
Nick Coghlan8eba5ed2009-03-15 03:24:46 +0000788 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000789 retval = NULL;
790 break;
Guido van Rossuma45cb451998-06-08 20:27:29 +0000791 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000792 v = PyString_FromStringAndSize((char *)NULL, n);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000793 if (v == NULL) {
794 retval = NULL;
795 break;
796 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000797 if (r_string(PyString_AS_STRING(v), (int)n, p) != n) {
Michael W. Hudson6d6917b2005-06-03 15:17:16 +0000798 Py_DECREF(v);
799 PyErr_SetString(PyExc_EOFError,
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000800 "EOF read where object expected");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000801 retval = NULL;
802 break;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000803 }
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000804 if (type == TYPE_INTERNED) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000805 PyString_InternInPlace(&v);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000806 if (PyList_Append(p->strings, v) < 0) {
807 retval = NULL;
808 break;
809 }
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000810 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000811 retval = v;
812 break;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000813
814 case TYPE_STRINGREF:
815 n = r_long(p);
Michael W. Hudsonf2ca5af2005-06-13 18:28:46 +0000816 if (n < 0 || n >= PyList_GET_SIZE(p->strings)) {
Nick Coghlan8eba5ed2009-03-15 03:24:46 +0000817 PyErr_SetString(PyExc_ValueError, "bad marshal data (string ref out of range)");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000818 retval = NULL;
819 break;
Michael W. Hudsonf2ca5af2005-06-13 18:28:46 +0000820 }
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000821 v = PyList_GET_ITEM(p->strings, n);
822 Py_INCREF(v);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000823 retval = v;
824 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000825
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000826#ifdef Py_USING_UNICODE
Guido van Rossumc279b532000-03-10 23:03:02 +0000827 case TYPE_UNICODE:
828 {
829 char *buffer;
830
831 n = r_long(p);
Armin Rigo7ccbca92006-10-04 12:17:45 +0000832 if (n < 0 || n > INT_MAX) {
Nick Coghlan8eba5ed2009-03-15 03:24:46 +0000833 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000834 retval = NULL;
835 break;
Guido van Rossumc279b532000-03-10 23:03:02 +0000836 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000837 buffer = PyMem_NEW(char, n);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000838 if (buffer == NULL) {
839 retval = PyErr_NoMemory();
840 break;
841 }
Guido van Rossumc279b532000-03-10 23:03:02 +0000842 if (r_string(buffer, (int)n, p) != n) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000843 PyMem_DEL(buffer);
Guido van Rossumc279b532000-03-10 23:03:02 +0000844 PyErr_SetString(PyExc_EOFError,
845 "EOF read where object expected");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000846 retval = NULL;
847 break;
Guido van Rossumc279b532000-03-10 23:03:02 +0000848 }
849 v = PyUnicode_DecodeUTF8(buffer, n, NULL);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000850 PyMem_DEL(buffer);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000851 retval = v;
852 break;
Guido van Rossumc279b532000-03-10 23:03:02 +0000853 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000854#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +0000855
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000856 case TYPE_TUPLE:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000857 n = r_long(p);
Armin Rigo7ccbca92006-10-04 12:17:45 +0000858 if (n < 0 || n > INT_MAX) {
Nick Coghlan8eba5ed2009-03-15 03:24:46 +0000859 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000860 retval = NULL;
861 break;
Guido van Rossuma45cb451998-06-08 20:27:29 +0000862 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000863 v = PyTuple_New((int)n);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000864 if (v == NULL) {
865 retval = NULL;
866 break;
867 }
Jack Jansen9513f2c1995-10-27 13:21:28 +0000868 for (i = 0; i < n; i++) {
869 v2 = r_object(p);
870 if ( v2 == NULL ) {
Armin Rigo01ab2792004-03-26 15:09:27 +0000871 if (!PyErr_Occurred())
872 PyErr_SetString(PyExc_TypeError,
Nick Coghlan8eba5ed2009-03-15 03:24:46 +0000873 "NULL object in marshal data for tuple");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000874 Py_DECREF(v);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000875 v = NULL;
876 break;
877 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000878 PyTuple_SET_ITEM(v, (int)i, v2);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000879 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000880 retval = v;
881 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000882
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000883 case TYPE_LIST:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000884 n = r_long(p);
Armin Rigo7ccbca92006-10-04 12:17:45 +0000885 if (n < 0 || n > INT_MAX) {
Nick Coghlan8eba5ed2009-03-15 03:24:46 +0000886 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000887 retval = NULL;
888 break;
Guido van Rossuma45cb451998-06-08 20:27:29 +0000889 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000890 v = PyList_New((int)n);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000891 if (v == NULL) {
892 retval = NULL;
893 break;
894 }
Jack Jansen9513f2c1995-10-27 13:21:28 +0000895 for (i = 0; i < n; i++) {
896 v2 = r_object(p);
897 if ( v2 == NULL ) {
Armin Rigo01ab2792004-03-26 15:09:27 +0000898 if (!PyErr_Occurred())
899 PyErr_SetString(PyExc_TypeError,
Nick Coghlan8eba5ed2009-03-15 03:24:46 +0000900 "NULL object in marshal data for list");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000901 Py_DECREF(v);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000902 v = NULL;
903 break;
904 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000905 PyList_SET_ITEM(v, (int)i, v2);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000906 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000907 retval = v;
908 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000909
Guido van Rossum64b45521991-06-07 13:58:22 +0000910 case TYPE_DICT:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000911 v = PyDict_New();
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000912 if (v == NULL) {
913 retval = NULL;
914 break;
915 }
Guido van Rossum64b45521991-06-07 13:58:22 +0000916 for (;;) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000917 PyObject *key, *val;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000918 key = r_object(p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000919 if (key == NULL)
Armin Rigo01ab2792004-03-26 15:09:27 +0000920 break;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000921 val = r_object(p);
Guido van Rossumf2150601996-06-26 20:41:23 +0000922 if (val != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000923 PyDict_SetItem(v, key, val);
924 Py_DECREF(key);
925 Py_XDECREF(val);
Guido van Rossum64b45521991-06-07 13:58:22 +0000926 }
Armin Rigo01ab2792004-03-26 15:09:27 +0000927 if (PyErr_Occurred()) {
928 Py_DECREF(v);
929 v = NULL;
930 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000931 retval = v;
932 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000933
Raymond Hettingera422c342005-01-11 03:03:27 +0000934 case TYPE_SET:
935 case TYPE_FROZENSET:
936 n = r_long(p);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000937 if (n < 0 || n > INT_MAX) {
Nick Coghlan8eba5ed2009-03-15 03:24:46 +0000938 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000939 retval = NULL;
940 break;
Raymond Hettingera422c342005-01-11 03:03:27 +0000941 }
Raymond Hettinger52716c92008-01-28 21:34:30 +0000942 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000943 if (v == NULL) {
944 retval = NULL;
945 break;
946 }
Raymond Hettingera422c342005-01-11 03:03:27 +0000947 for (i = 0; i < n; i++) {
948 v2 = r_object(p);
949 if ( v2 == NULL ) {
950 if (!PyErr_Occurred())
951 PyErr_SetString(PyExc_TypeError,
Nick Coghlan8eba5ed2009-03-15 03:24:46 +0000952 "NULL object in marshal data for set");
Raymond Hettingera422c342005-01-11 03:03:27 +0000953 Py_DECREF(v);
954 v = NULL;
955 break;
956 }
Raymond Hettinger52716c92008-01-28 21:34:30 +0000957 if (PySet_Add(v, v2) == -1) {
958 Py_DECREF(v);
959 Py_DECREF(v2);
960 v = NULL;
961 break;
962 }
Neal Norwitzfb43d1e2008-02-01 07:22:59 +0000963 Py_DECREF(v2);
Raymond Hettingera422c342005-01-11 03:03:27 +0000964 }
Raymond Hettingerbf3d1d52008-01-28 21:51:25 +0000965 retval = v;
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000966 break;
Raymond Hettingera422c342005-01-11 03:03:27 +0000967
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000968 case TYPE_CODE:
Michael W. Hudson80199132001-08-30 14:50:20 +0000969 if (PyEval_GetRestricted()) {
970 PyErr_SetString(PyExc_RuntimeError,
971 "cannot unmarshal code objects in "
972 "restricted execution mode");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000973 retval = NULL;
974 break;
Michael W. Hudson80199132001-08-30 14:50:20 +0000975 }
976 else {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000977 int argcount;
978 int nlocals;
979 int stacksize;
980 int flags;
981 PyObject *code = NULL;
982 PyObject *consts = NULL;
983 PyObject *names = NULL;
984 PyObject *varnames = NULL;
985 PyObject *freevars = NULL;
986 PyObject *cellvars = NULL;
987 PyObject *filename = NULL;
988 PyObject *name = NULL;
989 int firstlineno;
990 PyObject *lnotab = NULL;
991
992 v = NULL;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000993
Armin Rigo7ccbca92006-10-04 12:17:45 +0000994 /* XXX ignore long->int overflows for now */
995 argcount = (int)r_long(p);
996 nlocals = (int)r_long(p);
997 stacksize = (int)r_long(p);
998 flags = (int)r_long(p);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000999 code = r_object(p);
1000 if (code == NULL)
1001 goto code_error;
1002 consts = r_object(p);
1003 if (consts == NULL)
1004 goto code_error;
1005 names = r_object(p);
1006 if (names == NULL)
1007 goto code_error;
1008 varnames = r_object(p);
1009 if (varnames == NULL)
1010 goto code_error;
1011 freevars = r_object(p);
1012 if (freevars == NULL)
1013 goto code_error;
1014 cellvars = r_object(p);
1015 if (cellvars == NULL)
1016 goto code_error;
1017 filename = r_object(p);
1018 if (filename == NULL)
1019 goto code_error;
1020 name = r_object(p);
1021 if (name == NULL)
1022 goto code_error;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001023 firstlineno = (int)r_long(p);
Michael W. Hudsondf888462005-06-03 14:41:55 +00001024 lnotab = r_object(p);
1025 if (lnotab == NULL)
1026 goto code_error;
1027
1028 v = (PyObject *) PyCode_New(
Tim Petersd9b9ac82001-01-28 00:27:39 +00001029 argcount, nlocals, stacksize, flags,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001030 code, consts, names, varnames,
Tim Petersd9b9ac82001-01-28 00:27:39 +00001031 freevars, cellvars, filename, name,
1032 firstlineno, lnotab);
Michael W. Hudsondf888462005-06-03 14:41:55 +00001033
1034 code_error:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001035 Py_XDECREF(code);
1036 Py_XDECREF(consts);
1037 Py_XDECREF(names);
1038 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001039 Py_XDECREF(freevars);
1040 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001041 Py_XDECREF(filename);
1042 Py_XDECREF(name);
Guido van Rossum6fc06e71997-07-26 23:30:18 +00001043 Py_XDECREF(lnotab);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001044
1045 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +00001046 retval = v;
1047 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001048
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001049 default:
Guido van Rossumf2150601996-06-26 20:41:23 +00001050 /* Bogus data got written, which isn't ideal.
1051 This will let you keep working and recover. */
Nick Coghlan8eba5ed2009-03-15 03:24:46 +00001052 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
Neal Norwitzb1a9b372007-05-16 20:05:11 +00001053 retval = NULL;
1054 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001055
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001056 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +00001057 p->depth--;
1058 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001059}
1060
Neal Norwitzd85c4522004-06-13 20:31:49 +00001061static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001062read_object(RFILE *p)
1063{
1064 PyObject *v;
1065 if (PyErr_Occurred()) {
1066 fprintf(stderr, "XXX readobject called with exception set\n");
1067 return NULL;
1068 }
1069 v = r_object(p);
1070 if (v == NULL && !PyErr_Occurred())
Nick Coghlan8eba5ed2009-03-15 03:24:46 +00001071 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
Armin Rigo01ab2792004-03-26 15:09:27 +00001072 return v;
1073}
1074
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001075int
1076PyMarshal_ReadShortFromFile(FILE *fp)
1077{
1078 RFILE rf;
Thomas Wouters7f401ef2006-03-01 22:30:47 +00001079 assert(fp);
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001080 rf.fp = fp;
Thomas Wouters7464b432006-03-01 22:34:09 +00001081 rf.strings = NULL;
1082 rf.end = rf.ptr = NULL;
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001083 return r_short(&rf);
1084}
1085
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001086long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001087PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001088{
1089 RFILE rf;
1090 rf.fp = fp;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001091 rf.strings = NULL;
Neal Norwitz15f26612007-10-12 03:05:19 +00001092 rf.ptr = rf.end = NULL;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001093 return r_long(&rf);
1094}
1095
Tim Peters691e0e92001-01-18 04:39:16 +00001096#ifdef HAVE_FSTAT
1097/* Return size of file in bytes; < 0 if unknown. */
1098static off_t
1099getfilesize(FILE *fp)
1100{
1101 struct stat st;
1102 if (fstat(fileno(fp), &st) != 0)
1103 return -1;
1104 else
1105 return st.st_size;
1106}
1107#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001108
Tim Peters691e0e92001-01-18 04:39:16 +00001109/* If we can get the size of the file up-front, and it's reasonably small,
1110 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1111 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001112 * CAUTION: since this may read the entire remainder of the file, don't
1113 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001114 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001115PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001116PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001117{
Tim Peters691e0e92001-01-18 04:39:16 +00001118/* 75% of 2.1's .pyc files can exploit SMALL_FILE_LIMIT.
1119 * REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc.
1120 */
1121#define SMALL_FILE_LIMIT (1L << 14)
1122#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001123#ifdef HAVE_FSTAT
1124 off_t filesize;
1125#endif
Tim Peters691e0e92001-01-18 04:39:16 +00001126#ifdef HAVE_FSTAT
1127 filesize = getfilesize(fp);
1128 if (filesize > 0) {
1129 char buf[SMALL_FILE_LIMIT];
1130 char* pBuf = NULL;
1131 if (filesize <= SMALL_FILE_LIMIT)
1132 pBuf = buf;
1133 else if (filesize <= REASONABLE_FILE_LIMIT)
1134 pBuf = (char *)PyMem_MALLOC(filesize);
1135 if (pBuf != NULL) {
1136 PyObject* v;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001137 size_t n;
1138 /* filesize must fit into an int, because it
1139 is smaller than REASONABLE_FILE_LIMIT */
1140 n = fread(pBuf, 1, (int)filesize, fp);
Tim Peters691e0e92001-01-18 04:39:16 +00001141 v = PyMarshal_ReadObjectFromString(pBuf, n);
1142 if (pBuf != buf)
1143 PyMem_FREE(pBuf);
1144 return v;
1145 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001146
Tim Peters691e0e92001-01-18 04:39:16 +00001147 }
1148#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001149 /* We don't have fstat, or we do but the file is larger than
1150 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1151 */
1152 return PyMarshal_ReadObjectFromFile(fp);
1153
Tim Peters691e0e92001-01-18 04:39:16 +00001154#undef SMALL_FILE_LIMIT
1155#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001156}
1157
Guido van Rossum79f25d91997-04-29 20:08:16 +00001158PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001159PyMarshal_ReadObjectFromFile(FILE *fp)
1160{
1161 RFILE rf;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001162 PyObject *result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001163 rf.fp = fp;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001164 rf.strings = PyList_New(0);
Neal Norwitzb1a9b372007-05-16 20:05:11 +00001165 rf.depth = 0;
Neal Norwitz15f26612007-10-12 03:05:19 +00001166 rf.ptr = rf.end = NULL;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001167 result = r_object(&rf);
1168 Py_DECREF(rf.strings);
1169 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001170}
1171
1172PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001173PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001174{
1175 RFILE rf;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001176 PyObject *result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001177 rf.fp = NULL;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001178 rf.ptr = str;
1179 rf.end = str + len;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001180 rf.strings = PyList_New(0);
Neal Norwitzb1a9b372007-05-16 20:05:11 +00001181 rf.depth = 0;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001182 result = r_object(&rf);
1183 Py_DECREF(rf.strings);
1184 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001185}
1186
Guido van Rossum79f25d91997-04-29 20:08:16 +00001187PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001188PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001189{
1190 WFILE wf;
1191 wf.fp = NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001192 wf.str = PyString_FromStringAndSize((char *)NULL, 50);
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001193 if (wf.str == NULL)
1194 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001195 wf.ptr = PyString_AS_STRING((PyStringObject *)wf.str);
1196 wf.end = wf.ptr + PyString_Size(wf.str);
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001197 wf.error = 0;
Fred Drake6da0b912000-06-28 18:47:56 +00001198 wf.depth = 0;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001199 wf.version = version;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001200 wf.strings = (version > 0) ? PyDict_New() : NULL;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001201 w_object(x, &wf);
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001202 Py_XDECREF(wf.strings);
Armin Rigo7ccbca92006-10-04 12:17:45 +00001203 if (wf.str != NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001204 char *base = PyString_AS_STRING((PyStringObject *)wf.str);
Armin Rigo7ccbca92006-10-04 12:17:45 +00001205 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1206 Py_DECREF(wf.str);
1207 PyErr_SetString(PyExc_OverflowError,
1208 "too much marshall data for a string");
1209 return NULL;
1210 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001211 _PyString_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base));
Armin Rigo7ccbca92006-10-04 12:17:45 +00001212 }
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001213 if (wf.error) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001214 Py_XDECREF(wf.str);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001215 PyErr_SetString(PyExc_ValueError,
Fred Drake6da0b912000-06-28 18:47:56 +00001216 (wf.error==1)?"unmarshallable object"
1217 :"object too deeply nested to marshal");
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001218 return NULL;
1219 }
1220 return wf.str;
1221}
1222
Guido van Rossum64b45521991-06-07 13:58:22 +00001223/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001224
Guido van Rossum79f25d91997-04-29 20:08:16 +00001225static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001226marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001227{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001228 WFILE wf;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001229 PyObject *x;
1230 PyObject *f;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001231 int version = Py_MARSHAL_VERSION;
1232 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001233 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001234 if (!PyFile_Check(f)) {
1235 PyErr_SetString(PyExc_TypeError,
1236 "marshal.dump() 2nd arg must be file");
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001237 return NULL;
1238 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001239 wf.fp = PyFile_AsFile(f);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001240 wf.str = NULL;
1241 wf.ptr = wf.end = NULL;
Guido van Rossumf2150601996-06-26 20:41:23 +00001242 wf.error = 0;
Fred Drake6da0b912000-06-28 18:47:56 +00001243 wf.depth = 0;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001244 wf.strings = (version > 0) ? PyDict_New() : 0;
Neal Norwitzef785292005-11-16 05:04:51 +00001245 wf.version = version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001246 w_object(x, &wf);
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001247 Py_XDECREF(wf.strings);
Guido van Rossumf2150601996-06-26 20:41:23 +00001248 if (wf.error) {
Tim Petersd9b9ac82001-01-28 00:27:39 +00001249 PyErr_SetString(PyExc_ValueError,
Fred Drake6da0b912000-06-28 18:47:56 +00001250 (wf.error==1)?"unmarshallable object"
1251 :"object too deeply nested to marshal");
Guido van Rossumf2150601996-06-26 20:41:23 +00001252 return NULL;
1253 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001254 Py_INCREF(Py_None);
1255 return Py_None;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001256}
1257
R. David Murraya3ec6972009-05-13 00:30:29 +00001258PyDoc_STRVAR(dump_doc,
1259"dump(value, file[, version])\n\
1260\n\
1261Write the value on the open file. The value must be a supported type.\n\
1262The file must be an open file object such as sys.stdout or returned by\n\
1263open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1264\n\
1265If the value has (or contains an object that has) an unsupported type, a\n\
1266ValueError exception is raised but garbage data will also be written\n\
1267to the file. The object will not be properly read back by load()\n\
1268\n\
1269New in version 2.4: The version argument indicates the data format that\n\
1270dump should use.");
1271
Guido van Rossum79f25d91997-04-29 20:08:16 +00001272static PyObject *
Georg Brandlbf92f462006-05-29 21:58:42 +00001273marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001274{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001275 RFILE rf;
Georg Brandlbf92f462006-05-29 21:58:42 +00001276 PyObject *result;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001277 if (!PyFile_Check(f)) {
1278 PyErr_SetString(PyExc_TypeError,
1279 "marshal.load() arg must be file");
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001280 return NULL;
1281 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001282 rf.fp = PyFile_AsFile(f);
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001283 rf.strings = PyList_New(0);
Neal Norwitzb1a9b372007-05-16 20:05:11 +00001284 rf.depth = 0;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001285 result = read_object(&rf);
1286 Py_DECREF(rf.strings);
1287 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001288}
1289
R. David Murraya3ec6972009-05-13 00:30:29 +00001290PyDoc_STRVAR(load_doc,
1291"load(file)\n\
1292\n\
1293Read one value from the open file and return it. If no valid value is\n\
1294read (e.g. because the data has a different Python versions\n\
1295incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1296The file must be an open file object opened in binary mode ('rb' or\n\
1297'r+b').\n\
1298\n\
1299Note: If an object containing an unsupported type was marshalled with\n\
1300dump(), load() will substitute None for the unmarshallable type.");
1301
1302
Guido van Rossum79f25d91997-04-29 20:08:16 +00001303static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001304marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001305{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001306 PyObject *x;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001307 int version = Py_MARSHAL_VERSION;
Armin Rigo2ccea172004-12-20 12:25:57 +00001308 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001309 return NULL;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001310 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001311}
1312
R. David Murraya3ec6972009-05-13 00:30:29 +00001313PyDoc_STRVAR(dumps_doc,
1314"dumps(value[, version])\n\
1315\n\
1316Return the string that would be written to a file by dump(value, file).\n\
1317The value must be a supported type. Raise a ValueError exception if\n\
1318value has (or contains an object that has) an unsupported type.\n\
1319\n\
1320New in version 2.4: The version argument indicates the data format that\n\
R. David Murray525cffc2009-05-13 13:07:14 +00001321dumps should use.");
R. David Murraya3ec6972009-05-13 00:30:29 +00001322
1323
Guido van Rossum79f25d91997-04-29 20:08:16 +00001324static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001325marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001326{
1327 RFILE rf;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001328 char *s;
Thomas Wouters695934a2006-03-01 23:49:13 +00001329 Py_ssize_t n;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001330 PyObject* result;
Michael W. Hudson01fca112005-06-13 17:50:18 +00001331 if (!PyArg_ParseTuple(args, "s#:loads", &s, &n))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001332 return NULL;
1333 rf.fp = NULL;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001334 rf.ptr = s;
1335 rf.end = s + n;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001336 rf.strings = PyList_New(0);
Neal Norwitzb1a9b372007-05-16 20:05:11 +00001337 rf.depth = 0;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001338 result = read_object(&rf);
1339 Py_DECREF(rf.strings);
1340 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001341}
1342
R. David Murraya3ec6972009-05-13 00:30:29 +00001343PyDoc_STRVAR(loads_doc,
1344"loads(string)\n\
1345\n\
1346Convert the string to a value. If no valid value is found, raise\n\
1347EOFError, ValueError or TypeError. Extra characters in the string are\n\
1348ignored.");
1349
Guido van Rossum79f25d91997-04-29 20:08:16 +00001350static PyMethodDef marshal_methods[] = {
R. David Murraya3ec6972009-05-13 00:30:29 +00001351 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1352 {"load", marshal_load, METH_O, load_doc},
1353 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1354 {"loads", marshal_loads, METH_VARARGS, loads_doc},
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001355 {NULL, NULL} /* sentinel */
1356};
1357
R. David Murraya3ec6972009-05-13 00:30:29 +00001358PyDoc_STRVAR(marshal_doc,
1359"This module contains functions that can read and write Python values in\n\
1360a binary format. The format is specific to Python, but independent of\n\
1361machine architecture issues.\n\
1362\n\
1363Not all Python object types are supported; in general, only objects\n\
1364whose value is independent from a particular invocation of Python can be\n\
1365written and read by this module. The following types are supported:\n\
1366None, integers, long integers, floating point numbers, strings, Unicode\n\
1367objects, tuples, lists, sets, dictionaries, and code objects, where it\n\
1368should be understood that tuples, lists and dictionaries are only\n\
1369supported as long as the values contained therein are themselves\n\
1370supported; and recursive lists and dictionaries should not be written\n\
1371(they will cause infinite loops).\n\
1372\n\
1373Variables:\n\
1374\n\
1375version -- indicates the format that the module uses. Version 0 is the\n\
1376 historical format, version 1 (added in Python 2.4) shares interned\n\
1377 strings and version 2 (added in Python 2.5) uses a binary format for\n\
1378 floating point numbers. (New in version 2.4)\n\
1379\n\
1380Functions:\n\
1381\n\
1382dump() -- write value to a file\n\
1383load() -- read value from a file\n\
1384dumps() -- write value to a string\n\
1385loads() -- read value from a string");
1386
1387
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001388PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001389PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001390{
R. David Murraya3ec6972009-05-13 00:30:29 +00001391 PyObject *mod = Py_InitModule3("marshal", marshal_methods,
1392 marshal_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001393 if (mod == NULL)
1394 return;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001395 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001396}