blob: 8f8ac365765360700ef9f0a82ad1ac6d018c7ad4 [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;
559 int size, i, j, md;
560 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
572 size = 1 + (ABS(n)-1) / PyLong_MARSHAL_RATIO;
573 ob = _PyLong_New(size);
574 if (ob == NULL)
575 return NULL;
576 Py_SIZE(ob) = n > 0 ? size : -size;
577
578 for (i = 0; i < size-1; i++) {
579 d = 0;
580 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
581 md = r_short(p);
582 if (md < 0 || md > PyLong_MARSHAL_BASE)
583 goto bad_digit;
584 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
585 }
586 ob->ob_digit[i] = d;
587 }
588 d = 0;
589 for (j=0; j < (ABS(n)-1)%PyLong_MARSHAL_RATIO + 1; j++) {
590 md = r_short(p);
591 if (md < 0 || md > PyLong_MARSHAL_BASE)
592 goto bad_digit;
593 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
594 }
595 ob->ob_digit[size-1] = d;
596 return (PyObject *)ob;
597 bad_digit:
598 Py_DECREF(ob);
599 PyErr_SetString(PyExc_ValueError,
600 "bad marshal data (digit out of range in long)");
601 return NULL;
602}
603
604
605static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000606r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000607{
Armin Rigo01ab2792004-03-26 15:09:27 +0000608 /* NULL is a valid return value, it does not necessarily means that
609 an exception is set. */
Christian Heimes67ac0662008-01-30 11:46:00 +0000610 PyObject *v, *v2;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000611 long i, n;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000612 int type = r_byte(p);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000613 PyObject *retval;
614
615 p->depth++;
616
617 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
618 p->depth--;
619 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
620 return NULL;
621 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000622
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000623 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000624
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000625 case EOF:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000626 PyErr_SetString(PyExc_EOFError,
627 "EOF read where object expected");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000628 retval = NULL;
629 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000630
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000631 case TYPE_NULL:
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000632 retval = NULL;
633 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000634
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000635 case TYPE_NONE:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000636 Py_INCREF(Py_None);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000637 retval = Py_None;
638 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000639
Tim Peters5ca576e2001-06-18 22:08:13 +0000640 case TYPE_STOPITER:
641 Py_INCREF(PyExc_StopIteration);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000642 retval = PyExc_StopIteration;
643 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000644
Guido van Rossume449af71996-10-11 16:25:41 +0000645 case TYPE_ELLIPSIS:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000646 Py_INCREF(Py_Ellipsis);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000647 retval = Py_Ellipsis;
648 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000649
Guido van Rossum77f6a652002-04-03 22:41:51 +0000650 case TYPE_FALSE:
651 Py_INCREF(Py_False);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000652 retval = Py_False;
653 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000654
655 case TYPE_TRUE:
656 Py_INCREF(Py_True);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000657 retval = Py_True;
658 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000659
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000660 case TYPE_INT:
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000661 retval = PyInt_FromLong(r_long(p));
662 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000663
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000664 case TYPE_INT64:
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000665 retval = r_long64(p);
666 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000667
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000668 case TYPE_LONG:
Mark Dickinsonefc82f72009-03-20 15:51:55 +0000669 retval = r_PyLong(p);
670 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000671
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000672 case TYPE_FLOAT:
673 {
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000674 char buf[256];
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000675 double dx;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000676 n = r_byte(p);
Armin Rigo01ab2792004-03-26 15:09:27 +0000677 if (n == EOF || r_string(buf, (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000678 PyErr_SetString(PyExc_EOFError,
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000679 "EOF read where object expected");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000680 retval = NULL;
681 break;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000682 }
683 buf[n] = '\0';
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000684 retval = NULL;
685 PyFPE_START_PROTECT("atof", break)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000686 dx = PyOS_ascii_atof(buf);
Guido van Rossum45b83911997-03-14 04:32:50 +0000687 PyFPE_END_PROTECT(dx)
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000688 retval = PyFloat_FromDouble(dx);
689 break;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000690 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000691
Michael W. Hudsondf888462005-06-03 14:41:55 +0000692 case TYPE_BINARY_FLOAT:
693 {
Brett Cannonc9371d42005-06-25 08:23:41 +0000694 unsigned char buf[8];
Michael W. Hudsondf888462005-06-03 14:41:55 +0000695 double x;
Brett Cannonc9371d42005-06-25 08:23:41 +0000696 if (r_string((char*)buf, 8, p) != 8) {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000697 PyErr_SetString(PyExc_EOFError,
698 "EOF read where object expected");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000699 retval = NULL;
700 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000701 }
702 x = _PyFloat_Unpack8(buf, 1);
703 if (x == -1.0 && PyErr_Occurred()) {
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000704 retval = NULL;
705 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000706 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000707 retval = PyFloat_FromDouble(x);
708 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000709 }
710
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000711#ifndef WITHOUT_COMPLEX
712 case TYPE_COMPLEX:
713 {
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000714 char buf[256];
Guido van Rossum530956d1996-07-21 02:27:43 +0000715 Py_complex c;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000716 n = r_byte(p);
Armin Rigo01ab2792004-03-26 15:09:27 +0000717 if (n == EOF || r_string(buf, (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000718 PyErr_SetString(PyExc_EOFError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000719 "EOF read where object expected");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000720 retval = NULL;
721 break;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000722 }
723 buf[n] = '\0';
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000724 retval = NULL;
725 PyFPE_START_PROTECT("atof", break;)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000726 c.real = PyOS_ascii_atof(buf);
Guido van Rossum45b83911997-03-14 04:32:50 +0000727 PyFPE_END_PROTECT(c)
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000728 n = r_byte(p);
Armin Rigo01ab2792004-03-26 15:09:27 +0000729 if (n == EOF || r_string(buf, (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000730 PyErr_SetString(PyExc_EOFError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000731 "EOF read where object expected");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000732 retval = NULL;
733 break;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000734 }
735 buf[n] = '\0';
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000736 PyFPE_START_PROTECT("atof", break)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000737 c.imag = PyOS_ascii_atof(buf);
Guido van Rossum45b83911997-03-14 04:32:50 +0000738 PyFPE_END_PROTECT(c)
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000739 retval = PyComplex_FromCComplex(c);
740 break;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000741 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000742
743 case TYPE_BINARY_COMPLEX:
744 {
Brett Cannonc9371d42005-06-25 08:23:41 +0000745 unsigned char buf[8];
Michael W. Hudsondf888462005-06-03 14:41:55 +0000746 Py_complex c;
Brett Cannonc9371d42005-06-25 08:23:41 +0000747 if (r_string((char*)buf, 8, p) != 8) {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000748 PyErr_SetString(PyExc_EOFError,
749 "EOF read where object expected");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000750 retval = NULL;
751 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000752 }
753 c.real = _PyFloat_Unpack8(buf, 1);
754 if (c.real == -1.0 && PyErr_Occurred()) {
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000755 retval = NULL;
756 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000757 }
Brett Cannonc9371d42005-06-25 08:23:41 +0000758 if (r_string((char*)buf, 8, p) != 8) {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000759 PyErr_SetString(PyExc_EOFError,
760 "EOF read where object expected");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000761 retval = NULL;
762 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000763 }
764 c.imag = _PyFloat_Unpack8(buf, 1);
765 if (c.imag == -1.0 && PyErr_Occurred()) {
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000766 retval = NULL;
767 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000768 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000769 retval = PyComplex_FromCComplex(c);
770 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000771 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000772#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +0000773
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000774 case TYPE_INTERNED:
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000775 case TYPE_STRING:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000776 n = r_long(p);
Armin Rigo7ccbca92006-10-04 12:17:45 +0000777 if (n < 0 || n > INT_MAX) {
Nick Coghlan8eba5ed2009-03-15 03:24:46 +0000778 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000779 retval = NULL;
780 break;
Guido van Rossuma45cb451998-06-08 20:27:29 +0000781 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000782 v = PyString_FromStringAndSize((char *)NULL, n);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000783 if (v == NULL) {
784 retval = NULL;
785 break;
786 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000787 if (r_string(PyString_AS_STRING(v), (int)n, p) != n) {
Michael W. Hudson6d6917b2005-06-03 15:17:16 +0000788 Py_DECREF(v);
789 PyErr_SetString(PyExc_EOFError,
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000790 "EOF read where object expected");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000791 retval = NULL;
792 break;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000793 }
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000794 if (type == TYPE_INTERNED) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000795 PyString_InternInPlace(&v);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000796 if (PyList_Append(p->strings, v) < 0) {
797 retval = NULL;
798 break;
799 }
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000800 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000801 retval = v;
802 break;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000803
804 case TYPE_STRINGREF:
805 n = r_long(p);
Michael W. Hudsonf2ca5af2005-06-13 18:28:46 +0000806 if (n < 0 || n >= PyList_GET_SIZE(p->strings)) {
Nick Coghlan8eba5ed2009-03-15 03:24:46 +0000807 PyErr_SetString(PyExc_ValueError, "bad marshal data (string ref out of range)");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000808 retval = NULL;
809 break;
Michael W. Hudsonf2ca5af2005-06-13 18:28:46 +0000810 }
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000811 v = PyList_GET_ITEM(p->strings, n);
812 Py_INCREF(v);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000813 retval = v;
814 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000815
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000816#ifdef Py_USING_UNICODE
Guido van Rossumc279b532000-03-10 23:03:02 +0000817 case TYPE_UNICODE:
818 {
819 char *buffer;
820
821 n = r_long(p);
Armin Rigo7ccbca92006-10-04 12:17:45 +0000822 if (n < 0 || n > INT_MAX) {
Nick Coghlan8eba5ed2009-03-15 03:24:46 +0000823 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000824 retval = NULL;
825 break;
Guido van Rossumc279b532000-03-10 23:03:02 +0000826 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000827 buffer = PyMem_NEW(char, n);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000828 if (buffer == NULL) {
829 retval = PyErr_NoMemory();
830 break;
831 }
Guido van Rossumc279b532000-03-10 23:03:02 +0000832 if (r_string(buffer, (int)n, p) != n) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000833 PyMem_DEL(buffer);
Guido van Rossumc279b532000-03-10 23:03:02 +0000834 PyErr_SetString(PyExc_EOFError,
835 "EOF read where object expected");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000836 retval = NULL;
837 break;
Guido van Rossumc279b532000-03-10 23:03:02 +0000838 }
839 v = PyUnicode_DecodeUTF8(buffer, n, NULL);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000840 PyMem_DEL(buffer);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000841 retval = v;
842 break;
Guido van Rossumc279b532000-03-10 23:03:02 +0000843 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000844#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +0000845
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000846 case TYPE_TUPLE:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000847 n = r_long(p);
Armin Rigo7ccbca92006-10-04 12:17:45 +0000848 if (n < 0 || n > INT_MAX) {
Nick Coghlan8eba5ed2009-03-15 03:24:46 +0000849 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000850 retval = NULL;
851 break;
Guido van Rossuma45cb451998-06-08 20:27:29 +0000852 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000853 v = PyTuple_New((int)n);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000854 if (v == NULL) {
855 retval = NULL;
856 break;
857 }
Jack Jansen9513f2c1995-10-27 13:21:28 +0000858 for (i = 0; i < n; i++) {
859 v2 = r_object(p);
860 if ( v2 == NULL ) {
Armin Rigo01ab2792004-03-26 15:09:27 +0000861 if (!PyErr_Occurred())
862 PyErr_SetString(PyExc_TypeError,
Nick Coghlan8eba5ed2009-03-15 03:24:46 +0000863 "NULL object in marshal data for tuple");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000864 Py_DECREF(v);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000865 v = NULL;
866 break;
867 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000868 PyTuple_SET_ITEM(v, (int)i, v2);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000869 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000870 retval = v;
871 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000872
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000873 case TYPE_LIST:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000874 n = r_long(p);
Armin Rigo7ccbca92006-10-04 12:17:45 +0000875 if (n < 0 || n > INT_MAX) {
Nick Coghlan8eba5ed2009-03-15 03:24:46 +0000876 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000877 retval = NULL;
878 break;
Guido van Rossuma45cb451998-06-08 20:27:29 +0000879 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000880 v = PyList_New((int)n);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000881 if (v == NULL) {
882 retval = NULL;
883 break;
884 }
Jack Jansen9513f2c1995-10-27 13:21:28 +0000885 for (i = 0; i < n; i++) {
886 v2 = r_object(p);
887 if ( v2 == NULL ) {
Armin Rigo01ab2792004-03-26 15:09:27 +0000888 if (!PyErr_Occurred())
889 PyErr_SetString(PyExc_TypeError,
Nick Coghlan8eba5ed2009-03-15 03:24:46 +0000890 "NULL object in marshal data for list");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000891 Py_DECREF(v);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000892 v = NULL;
893 break;
894 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000895 PyList_SET_ITEM(v, (int)i, v2);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000896 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000897 retval = v;
898 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000899
Guido van Rossum64b45521991-06-07 13:58:22 +0000900 case TYPE_DICT:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000901 v = PyDict_New();
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000902 if (v == NULL) {
903 retval = NULL;
904 break;
905 }
Guido van Rossum64b45521991-06-07 13:58:22 +0000906 for (;;) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000907 PyObject *key, *val;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000908 key = r_object(p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000909 if (key == NULL)
Armin Rigo01ab2792004-03-26 15:09:27 +0000910 break;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000911 val = r_object(p);
Guido van Rossumf2150601996-06-26 20:41:23 +0000912 if (val != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000913 PyDict_SetItem(v, key, val);
914 Py_DECREF(key);
915 Py_XDECREF(val);
Guido van Rossum64b45521991-06-07 13:58:22 +0000916 }
Armin Rigo01ab2792004-03-26 15:09:27 +0000917 if (PyErr_Occurred()) {
918 Py_DECREF(v);
919 v = NULL;
920 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000921 retval = v;
922 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000923
Raymond Hettingera422c342005-01-11 03:03:27 +0000924 case TYPE_SET:
925 case TYPE_FROZENSET:
926 n = r_long(p);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000927 if (n < 0 || n > INT_MAX) {
Nick Coghlan8eba5ed2009-03-15 03:24:46 +0000928 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000929 retval = NULL;
930 break;
Raymond Hettingera422c342005-01-11 03:03:27 +0000931 }
Raymond Hettinger52716c92008-01-28 21:34:30 +0000932 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000933 if (v == NULL) {
934 retval = NULL;
935 break;
936 }
Raymond Hettingera422c342005-01-11 03:03:27 +0000937 for (i = 0; i < n; i++) {
938 v2 = r_object(p);
939 if ( v2 == NULL ) {
940 if (!PyErr_Occurred())
941 PyErr_SetString(PyExc_TypeError,
Nick Coghlan8eba5ed2009-03-15 03:24:46 +0000942 "NULL object in marshal data for set");
Raymond Hettingera422c342005-01-11 03:03:27 +0000943 Py_DECREF(v);
944 v = NULL;
945 break;
946 }
Raymond Hettinger52716c92008-01-28 21:34:30 +0000947 if (PySet_Add(v, v2) == -1) {
948 Py_DECREF(v);
949 Py_DECREF(v2);
950 v = NULL;
951 break;
952 }
Neal Norwitzfb43d1e2008-02-01 07:22:59 +0000953 Py_DECREF(v2);
Raymond Hettingera422c342005-01-11 03:03:27 +0000954 }
Raymond Hettingerbf3d1d52008-01-28 21:51:25 +0000955 retval = v;
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000956 break;
Raymond Hettingera422c342005-01-11 03:03:27 +0000957
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000958 case TYPE_CODE:
Michael W. Hudson80199132001-08-30 14:50:20 +0000959 if (PyEval_GetRestricted()) {
960 PyErr_SetString(PyExc_RuntimeError,
961 "cannot unmarshal code objects in "
962 "restricted execution mode");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000963 retval = NULL;
964 break;
Michael W. Hudson80199132001-08-30 14:50:20 +0000965 }
966 else {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000967 int argcount;
968 int nlocals;
969 int stacksize;
970 int flags;
971 PyObject *code = NULL;
972 PyObject *consts = NULL;
973 PyObject *names = NULL;
974 PyObject *varnames = NULL;
975 PyObject *freevars = NULL;
976 PyObject *cellvars = NULL;
977 PyObject *filename = NULL;
978 PyObject *name = NULL;
979 int firstlineno;
980 PyObject *lnotab = NULL;
981
982 v = NULL;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000983
Armin Rigo7ccbca92006-10-04 12:17:45 +0000984 /* XXX ignore long->int overflows for now */
985 argcount = (int)r_long(p);
986 nlocals = (int)r_long(p);
987 stacksize = (int)r_long(p);
988 flags = (int)r_long(p);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000989 code = r_object(p);
990 if (code == NULL)
991 goto code_error;
992 consts = r_object(p);
993 if (consts == NULL)
994 goto code_error;
995 names = r_object(p);
996 if (names == NULL)
997 goto code_error;
998 varnames = r_object(p);
999 if (varnames == NULL)
1000 goto code_error;
1001 freevars = r_object(p);
1002 if (freevars == NULL)
1003 goto code_error;
1004 cellvars = r_object(p);
1005 if (cellvars == NULL)
1006 goto code_error;
1007 filename = r_object(p);
1008 if (filename == NULL)
1009 goto code_error;
1010 name = r_object(p);
1011 if (name == NULL)
1012 goto code_error;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001013 firstlineno = (int)r_long(p);
Michael W. Hudsondf888462005-06-03 14:41:55 +00001014 lnotab = r_object(p);
1015 if (lnotab == NULL)
1016 goto code_error;
1017
1018 v = (PyObject *) PyCode_New(
Tim Petersd9b9ac82001-01-28 00:27:39 +00001019 argcount, nlocals, stacksize, flags,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001020 code, consts, names, varnames,
Tim Petersd9b9ac82001-01-28 00:27:39 +00001021 freevars, cellvars, filename, name,
1022 firstlineno, lnotab);
Michael W. Hudsondf888462005-06-03 14:41:55 +00001023
1024 code_error:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001025 Py_XDECREF(code);
1026 Py_XDECREF(consts);
1027 Py_XDECREF(names);
1028 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001029 Py_XDECREF(freevars);
1030 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001031 Py_XDECREF(filename);
1032 Py_XDECREF(name);
Guido van Rossum6fc06e71997-07-26 23:30:18 +00001033 Py_XDECREF(lnotab);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001034
1035 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +00001036 retval = v;
1037 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001038
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001039 default:
Guido van Rossumf2150601996-06-26 20:41:23 +00001040 /* Bogus data got written, which isn't ideal.
1041 This will let you keep working and recover. */
Nick Coghlan8eba5ed2009-03-15 03:24:46 +00001042 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
Neal Norwitzb1a9b372007-05-16 20:05:11 +00001043 retval = NULL;
1044 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001045
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001046 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +00001047 p->depth--;
1048 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001049}
1050
Neal Norwitzd85c4522004-06-13 20:31:49 +00001051static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001052read_object(RFILE *p)
1053{
1054 PyObject *v;
1055 if (PyErr_Occurred()) {
1056 fprintf(stderr, "XXX readobject called with exception set\n");
1057 return NULL;
1058 }
1059 v = r_object(p);
1060 if (v == NULL && !PyErr_Occurred())
Nick Coghlan8eba5ed2009-03-15 03:24:46 +00001061 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
Armin Rigo01ab2792004-03-26 15:09:27 +00001062 return v;
1063}
1064
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001065int
1066PyMarshal_ReadShortFromFile(FILE *fp)
1067{
1068 RFILE rf;
Thomas Wouters7f401ef2006-03-01 22:30:47 +00001069 assert(fp);
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001070 rf.fp = fp;
Thomas Wouters7464b432006-03-01 22:34:09 +00001071 rf.strings = NULL;
1072 rf.end = rf.ptr = NULL;
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001073 return r_short(&rf);
1074}
1075
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001076long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001077PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001078{
1079 RFILE rf;
1080 rf.fp = fp;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001081 rf.strings = NULL;
Neal Norwitz15f26612007-10-12 03:05:19 +00001082 rf.ptr = rf.end = NULL;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001083 return r_long(&rf);
1084}
1085
Tim Peters691e0e92001-01-18 04:39:16 +00001086#ifdef HAVE_FSTAT
1087/* Return size of file in bytes; < 0 if unknown. */
1088static off_t
1089getfilesize(FILE *fp)
1090{
1091 struct stat st;
1092 if (fstat(fileno(fp), &st) != 0)
1093 return -1;
1094 else
1095 return st.st_size;
1096}
1097#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001098
Tim Peters691e0e92001-01-18 04:39:16 +00001099/* If we can get the size of the file up-front, and it's reasonably small,
1100 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1101 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001102 * CAUTION: since this may read the entire remainder of the file, don't
1103 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001104 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001105PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001106PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001107{
Tim Peters691e0e92001-01-18 04:39:16 +00001108/* 75% of 2.1's .pyc files can exploit SMALL_FILE_LIMIT.
1109 * REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc.
1110 */
1111#define SMALL_FILE_LIMIT (1L << 14)
1112#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001113#ifdef HAVE_FSTAT
1114 off_t filesize;
1115#endif
Tim Peters691e0e92001-01-18 04:39:16 +00001116#ifdef HAVE_FSTAT
1117 filesize = getfilesize(fp);
1118 if (filesize > 0) {
1119 char buf[SMALL_FILE_LIMIT];
1120 char* pBuf = NULL;
1121 if (filesize <= SMALL_FILE_LIMIT)
1122 pBuf = buf;
1123 else if (filesize <= REASONABLE_FILE_LIMIT)
1124 pBuf = (char *)PyMem_MALLOC(filesize);
1125 if (pBuf != NULL) {
1126 PyObject* v;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001127 size_t n;
1128 /* filesize must fit into an int, because it
1129 is smaller than REASONABLE_FILE_LIMIT */
1130 n = fread(pBuf, 1, (int)filesize, fp);
Tim Peters691e0e92001-01-18 04:39:16 +00001131 v = PyMarshal_ReadObjectFromString(pBuf, n);
1132 if (pBuf != buf)
1133 PyMem_FREE(pBuf);
1134 return v;
1135 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001136
Tim Peters691e0e92001-01-18 04:39:16 +00001137 }
1138#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001139 /* We don't have fstat, or we do but the file is larger than
1140 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1141 */
1142 return PyMarshal_ReadObjectFromFile(fp);
1143
Tim Peters691e0e92001-01-18 04:39:16 +00001144#undef SMALL_FILE_LIMIT
1145#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001146}
1147
Guido van Rossum79f25d91997-04-29 20:08:16 +00001148PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001149PyMarshal_ReadObjectFromFile(FILE *fp)
1150{
1151 RFILE rf;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001152 PyObject *result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001153 rf.fp = fp;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001154 rf.strings = PyList_New(0);
Neal Norwitzb1a9b372007-05-16 20:05:11 +00001155 rf.depth = 0;
Neal Norwitz15f26612007-10-12 03:05:19 +00001156 rf.ptr = rf.end = NULL;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001157 result = r_object(&rf);
1158 Py_DECREF(rf.strings);
1159 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001160}
1161
1162PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001163PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001164{
1165 RFILE rf;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001166 PyObject *result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001167 rf.fp = NULL;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001168 rf.ptr = str;
1169 rf.end = str + len;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001170 rf.strings = PyList_New(0);
Neal Norwitzb1a9b372007-05-16 20:05:11 +00001171 rf.depth = 0;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001172 result = r_object(&rf);
1173 Py_DECREF(rf.strings);
1174 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001175}
1176
Guido van Rossum79f25d91997-04-29 20:08:16 +00001177PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001178PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001179{
1180 WFILE wf;
1181 wf.fp = NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001182 wf.str = PyString_FromStringAndSize((char *)NULL, 50);
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001183 if (wf.str == NULL)
1184 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001185 wf.ptr = PyString_AS_STRING((PyStringObject *)wf.str);
1186 wf.end = wf.ptr + PyString_Size(wf.str);
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001187 wf.error = 0;
Fred Drake6da0b912000-06-28 18:47:56 +00001188 wf.depth = 0;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001189 wf.version = version;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001190 wf.strings = (version > 0) ? PyDict_New() : NULL;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001191 w_object(x, &wf);
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001192 Py_XDECREF(wf.strings);
Armin Rigo7ccbca92006-10-04 12:17:45 +00001193 if (wf.str != NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001194 char *base = PyString_AS_STRING((PyStringObject *)wf.str);
Armin Rigo7ccbca92006-10-04 12:17:45 +00001195 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1196 Py_DECREF(wf.str);
1197 PyErr_SetString(PyExc_OverflowError,
1198 "too much marshall data for a string");
1199 return NULL;
1200 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001201 _PyString_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base));
Armin Rigo7ccbca92006-10-04 12:17:45 +00001202 }
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001203 if (wf.error) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001204 Py_XDECREF(wf.str);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001205 PyErr_SetString(PyExc_ValueError,
Fred Drake6da0b912000-06-28 18:47:56 +00001206 (wf.error==1)?"unmarshallable object"
1207 :"object too deeply nested to marshal");
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001208 return NULL;
1209 }
1210 return wf.str;
1211}
1212
Guido van Rossum64b45521991-06-07 13:58:22 +00001213/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001214
Guido van Rossum79f25d91997-04-29 20:08:16 +00001215static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001216marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001217{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001218 WFILE wf;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001219 PyObject *x;
1220 PyObject *f;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001221 int version = Py_MARSHAL_VERSION;
1222 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001223 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001224 if (!PyFile_Check(f)) {
1225 PyErr_SetString(PyExc_TypeError,
1226 "marshal.dump() 2nd arg must be file");
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001227 return NULL;
1228 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001229 wf.fp = PyFile_AsFile(f);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001230 wf.str = NULL;
1231 wf.ptr = wf.end = NULL;
Guido van Rossumf2150601996-06-26 20:41:23 +00001232 wf.error = 0;
Fred Drake6da0b912000-06-28 18:47:56 +00001233 wf.depth = 0;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001234 wf.strings = (version > 0) ? PyDict_New() : 0;
Neal Norwitzef785292005-11-16 05:04:51 +00001235 wf.version = version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001236 w_object(x, &wf);
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001237 Py_XDECREF(wf.strings);
Guido van Rossumf2150601996-06-26 20:41:23 +00001238 if (wf.error) {
Tim Petersd9b9ac82001-01-28 00:27:39 +00001239 PyErr_SetString(PyExc_ValueError,
Fred Drake6da0b912000-06-28 18:47:56 +00001240 (wf.error==1)?"unmarshallable object"
1241 :"object too deeply nested to marshal");
Guido van Rossumf2150601996-06-26 20:41:23 +00001242 return NULL;
1243 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001244 Py_INCREF(Py_None);
1245 return Py_None;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001246}
1247
R. David Murraya3ec6972009-05-13 00:30:29 +00001248PyDoc_STRVAR(dump_doc,
1249"dump(value, file[, version])\n\
1250\n\
1251Write the value on the open file. The value must be a supported type.\n\
1252The file must be an open file object such as sys.stdout or returned by\n\
1253open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1254\n\
1255If the value has (or contains an object that has) an unsupported type, a\n\
1256ValueError exception is raised but garbage data will also be written\n\
1257to the file. The object will not be properly read back by load()\n\
1258\n\
1259New in version 2.4: The version argument indicates the data format that\n\
1260dump should use.");
1261
Guido van Rossum79f25d91997-04-29 20:08:16 +00001262static PyObject *
Georg Brandlbf92f462006-05-29 21:58:42 +00001263marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001264{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001265 RFILE rf;
Georg Brandlbf92f462006-05-29 21:58:42 +00001266 PyObject *result;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001267 if (!PyFile_Check(f)) {
1268 PyErr_SetString(PyExc_TypeError,
1269 "marshal.load() arg must be file");
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001270 return NULL;
1271 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001272 rf.fp = PyFile_AsFile(f);
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001273 rf.strings = PyList_New(0);
Neal Norwitzb1a9b372007-05-16 20:05:11 +00001274 rf.depth = 0;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001275 result = read_object(&rf);
1276 Py_DECREF(rf.strings);
1277 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001278}
1279
R. David Murraya3ec6972009-05-13 00:30:29 +00001280PyDoc_STRVAR(load_doc,
1281"load(file)\n\
1282\n\
1283Read one value from the open file and return it. If no valid value is\n\
1284read (e.g. because the data has a different Python versions\n\
1285incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1286The file must be an open file object opened in binary mode ('rb' or\n\
1287'r+b').\n\
1288\n\
1289Note: If an object containing an unsupported type was marshalled with\n\
1290dump(), load() will substitute None for the unmarshallable type.");
1291
1292
Guido van Rossum79f25d91997-04-29 20:08:16 +00001293static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001294marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001295{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001296 PyObject *x;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001297 int version = Py_MARSHAL_VERSION;
Armin Rigo2ccea172004-12-20 12:25:57 +00001298 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001299 return NULL;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001300 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001301}
1302
R. David Murraya3ec6972009-05-13 00:30:29 +00001303PyDoc_STRVAR(dumps_doc,
1304"dumps(value[, version])\n\
1305\n\
1306Return the string that would be written to a file by dump(value, file).\n\
1307The value must be a supported type. Raise a ValueError exception if\n\
1308value has (or contains an object that has) an unsupported type.\n\
1309\n\
1310New in version 2.4: The version argument indicates the data format that\n\
R. David Murray525cffc2009-05-13 13:07:14 +00001311dumps should use.");
R. David Murraya3ec6972009-05-13 00:30:29 +00001312
1313
Guido van Rossum79f25d91997-04-29 20:08:16 +00001314static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001315marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001316{
1317 RFILE rf;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001318 char *s;
Thomas Wouters695934a2006-03-01 23:49:13 +00001319 Py_ssize_t n;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001320 PyObject* result;
Michael W. Hudson01fca112005-06-13 17:50:18 +00001321 if (!PyArg_ParseTuple(args, "s#:loads", &s, &n))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001322 return NULL;
1323 rf.fp = NULL;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001324 rf.ptr = s;
1325 rf.end = s + n;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001326 rf.strings = PyList_New(0);
Neal Norwitzb1a9b372007-05-16 20:05:11 +00001327 rf.depth = 0;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001328 result = read_object(&rf);
1329 Py_DECREF(rf.strings);
1330 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001331}
1332
R. David Murraya3ec6972009-05-13 00:30:29 +00001333PyDoc_STRVAR(loads_doc,
1334"loads(string)\n\
1335\n\
1336Convert the string to a value. If no valid value is found, raise\n\
1337EOFError, ValueError or TypeError. Extra characters in the string are\n\
1338ignored.");
1339
Guido van Rossum79f25d91997-04-29 20:08:16 +00001340static PyMethodDef marshal_methods[] = {
R. David Murraya3ec6972009-05-13 00:30:29 +00001341 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1342 {"load", marshal_load, METH_O, load_doc},
1343 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1344 {"loads", marshal_loads, METH_VARARGS, loads_doc},
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001345 {NULL, NULL} /* sentinel */
1346};
1347
R. David Murraya3ec6972009-05-13 00:30:29 +00001348PyDoc_STRVAR(marshal_doc,
1349"This module contains functions that can read and write Python values in\n\
1350a binary format. The format is specific to Python, but independent of\n\
1351machine architecture issues.\n\
1352\n\
1353Not all Python object types are supported; in general, only objects\n\
1354whose value is independent from a particular invocation of Python can be\n\
1355written and read by this module. The following types are supported:\n\
1356None, integers, long integers, floating point numbers, strings, Unicode\n\
1357objects, tuples, lists, sets, dictionaries, and code objects, where it\n\
1358should be understood that tuples, lists and dictionaries are only\n\
1359supported as long as the values contained therein are themselves\n\
1360supported; and recursive lists and dictionaries should not be written\n\
1361(they will cause infinite loops).\n\
1362\n\
1363Variables:\n\
1364\n\
1365version -- indicates the format that the module uses. Version 0 is the\n\
1366 historical format, version 1 (added in Python 2.4) shares interned\n\
1367 strings and version 2 (added in Python 2.5) uses a binary format for\n\
1368 floating point numbers. (New in version 2.4)\n\
1369\n\
1370Functions:\n\
1371\n\
1372dump() -- write value to a file\n\
1373load() -- read value from a file\n\
1374dumps() -- write value to a string\n\
1375loads() -- read value from a string");
1376
1377
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001378PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001379PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001380{
R. David Murraya3ec6972009-05-13 00:30:29 +00001381 PyObject *mod = Py_InitModule3("marshal", marshal_methods,
1382 marshal_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001383 if (mod == NULL)
1384 return;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001385 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001386}