blob: 0d551322d17d27ca42fa5169eefd414697d18646 [file] [log] [blame]
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001
2/* Write Python objects to files and read them back.
3 This is intended for writing and reading compiled Python code only;
4 a true persistent storage facility would be much harder, since
5 it would have to take circular links and sharing into account. */
6
Thomas Wouters695934a2006-03-01 23:49:13 +00007#define PY_SSIZE_T_CLEAN
8
Guido van Rossum79f25d91997-04-29 20:08:16 +00009#include "Python.h"
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000010#include "longintrepr.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011#include "code.h"
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000012#include "marshal.h"
13
Mark Dickinsonbd792642009-03-18 20:06:12 +000014#define ABS(x) ((x) < 0 ? -(x) : (x))
15
Fred Drake6da0b912000-06-28 18:47:56 +000016/* High water mark to determine when the marshalled object is dangerously deep
17 * and risks coring the interpreter. When the object stack gets this deep,
18 * raise an exception instead of continuing.
Guido van Rossum63175a12007-08-29 20:39:13 +000019 * On Windows debug builds, reduce this value.
Fred Drake6da0b912000-06-28 18:47:56 +000020 */
Guido van Rossum63175a12007-08-29 20:39:13 +000021#if defined(MS_WINDOWS) && defined(_DEBUG)
22#define MAX_MARSHAL_STACK_DEPTH 1500
23#else
Guido van Rossumd59da4b2007-05-22 18:11:13 +000024#define MAX_MARSHAL_STACK_DEPTH 2000
Guido van Rossum63175a12007-08-29 20:39:13 +000025#endif
Fred Drake6da0b912000-06-28 18:47:56 +000026
Michael W. Hudsondf888462005-06-03 14:41:55 +000027#define TYPE_NULL '0'
28#define TYPE_NONE 'N'
29#define TYPE_FALSE 'F'
30#define TYPE_TRUE 'T'
31#define TYPE_STOPITER 'S'
32#define TYPE_ELLIPSIS '.'
33#define TYPE_INT 'i'
34#define TYPE_INT64 'I'
35#define TYPE_FLOAT 'f'
36#define TYPE_BINARY_FLOAT 'g'
37#define TYPE_COMPLEX 'x'
38#define TYPE_BINARY_COMPLEX 'y'
39#define TYPE_LONG 'l'
40#define TYPE_STRING 's'
Michael W. Hudsondf888462005-06-03 14:41:55 +000041#define TYPE_TUPLE '('
42#define TYPE_LIST '['
43#define TYPE_DICT '{'
44#define TYPE_CODE 'c'
45#define TYPE_UNICODE 'u'
46#define TYPE_UNKNOWN '?'
47#define TYPE_SET '<'
48#define TYPE_FROZENSET '>'
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000049
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000050typedef struct {
51 FILE *fp;
Guido van Rossumf2150601996-06-26 20:41:23 +000052 int error;
Fred Drake6da0b912000-06-28 18:47:56 +000053 int depth;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000054 /* If fp == NULL, the following are valid: */
Guido van Rossum79f25d91997-04-29 20:08:16 +000055 PyObject *str;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000056 char *ptr;
57 char *end;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +000058 PyObject *strings; /* dict on marshal, list on unmarshal */
Michael W. Hudsondf888462005-06-03 14:41:55 +000059 int version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000060} WFILE;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000061
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000062#define w_byte(c, p) if (((p)->fp)) putc((c), (p)->fp); \
63 else if ((p)->ptr != (p)->end) *(p)->ptr++ = (c); \
64 else w_more(c, p)
65
66static void
Fredrik Lundh11534382000-07-23 18:24:06 +000067w_more(int c, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000068{
Martin v. Löwis18e16552006-02-15 17:27:45 +000069 Py_ssize_t size, newsize;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000070 if (p->str == NULL)
71 return; /* An error already occurred */
Christian Heimes72b710a2008-05-26 13:28:38 +000072 size = PyBytes_Size(p->str);
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +000073 newsize = size + size + 1024;
74 if (newsize > 32*1024*1024) {
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +000075 newsize = size + (size >> 3); /* 12.5% overallocation */
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +000076 }
Christian Heimes72b710a2008-05-26 13:28:38 +000077 if (_PyBytes_Resize(&p->str, newsize) != 0) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000078 p->ptr = p->end = NULL;
79 }
80 else {
Christian Heimes72b710a2008-05-26 13:28:38 +000081 p->ptr = PyBytes_AS_STRING((PyBytesObject *)p->str) + size;
Guido van Rossum79f25d91997-04-29 20:08:16 +000082 p->end =
Christian Heimes72b710a2008-05-26 13:28:38 +000083 PyBytes_AS_STRING((PyBytesObject *)p->str) + newsize;
Tim Peters8315ea52000-07-23 19:28:35 +000084 *p->ptr++ = Py_SAFE_DOWNCAST(c, int, char);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000085 }
86}
87
88static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000089w_string(char *s, int n, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000090{
91 if (p->fp != NULL) {
92 fwrite(s, 1, n, p->fp);
93 }
94 else {
95 while (--n >= 0) {
96 w_byte(*s, p);
97 s++;
98 }
99 }
100}
101
102static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000103w_short(int x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000104{
Thomas Heller3e1c18a2002-07-30 11:40:57 +0000105 w_byte((char)( x & 0xff), p);
106 w_byte((char)((x>> 8) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000107}
108
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000109static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000110w_long(long x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000111{
Thomas Heller37d5a152002-07-30 11:44:44 +0000112 w_byte((char)( x & 0xff), p);
113 w_byte((char)((x>> 8) & 0xff), p);
114 w_byte((char)((x>>16) & 0xff), p);
115 w_byte((char)((x>>24) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000116}
117
Guido van Rossumc1547d91996-12-10 15:39:04 +0000118#if SIZEOF_LONG > 4
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000119static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000120w_long64(long x, WFILE *p)
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000121{
122 w_long(x, p);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000123 w_long(x>>32, p);
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000124}
Guido van Rossumc1547d91996-12-10 15:39:04 +0000125#endif
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000126
Mark Dickinsonbd792642009-03-18 20:06:12 +0000127/* We assume that Python longs are stored internally in base some power of
128 2**15; for the sake of portability we'll always read and write them in base
129 exactly 2**15. */
130
131#define PyLong_MARSHAL_SHIFT 15
132#define PyLong_MARSHAL_BASE ((short)1 << PyLong_MARSHAL_SHIFT)
133#define PyLong_MARSHAL_MASK (PyLong_MARSHAL_BASE - 1)
134#if PyLong_SHIFT % PyLong_MARSHAL_SHIFT != 0
135#error "PyLong_SHIFT must be a multiple of PyLong_MARSHAL_SHIFT"
136#endif
137#define PyLong_MARSHAL_RATIO (PyLong_SHIFT / PyLong_MARSHAL_SHIFT)
138
139static void
140w_PyLong(const PyLongObject *ob, WFILE *p)
141{
142 Py_ssize_t i, j, n, l;
143 digit d;
144
145 w_byte(TYPE_LONG, p);
146 if (Py_SIZE(ob) == 0) {
147 w_long((long)0, p);
148 return;
149 }
150
151 /* set l to number of base PyLong_MARSHAL_BASE digits */
152 n = ABS(Py_SIZE(ob));
153 l = (n-1) * PyLong_MARSHAL_RATIO;
154 d = ob->ob_digit[n-1];
155 assert(d != 0); /* a PyLong is always normalized */
156 do {
157 d >>= PyLong_MARSHAL_SHIFT;
158 l++;
159 } while (d != 0);
160 w_long((long)(Py_SIZE(ob) > 0 ? l : -l), p);
161
162 for (i=0; i < n-1; i++) {
163 d = ob->ob_digit[i];
164 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
165 w_short(d & PyLong_MARSHAL_MASK, p);
166 d >>= PyLong_MARSHAL_SHIFT;
167 }
168 assert (d == 0);
169 }
170 d = ob->ob_digit[n-1];
171 do {
172 w_short(d & PyLong_MARSHAL_MASK, p);
173 d >>= PyLong_MARSHAL_SHIFT;
174 } while (d != 0);
175}
176
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000177static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000178w_object(PyObject *v, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000179{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000180 Py_ssize_t i, n;
Fred Drake6da0b912000-06-28 18:47:56 +0000181
182 p->depth++;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000183
Fred Drake6da0b912000-06-28 18:47:56 +0000184 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
185 p->error = 2;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000186 }
Fred Drake6da0b912000-06-28 18:47:56 +0000187 else if (v == NULL) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000188 w_byte(TYPE_NULL, p);
Guido van Rossum730806d1998-04-10 22:27:42 +0000189 }
190 else if (v == Py_None) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000191 w_byte(TYPE_NONE, p);
Guido van Rossum730806d1998-04-10 22:27:42 +0000192 }
Tim Peters5ca576e2001-06-18 22:08:13 +0000193 else if (v == PyExc_StopIteration) {
194 w_byte(TYPE_STOPITER, p);
195 }
Guido van Rossum730806d1998-04-10 22:27:42 +0000196 else if (v == Py_Ellipsis) {
197 w_byte(TYPE_ELLIPSIS, p);
198 }
Guido van Rossum77f6a652002-04-03 22:41:51 +0000199 else if (v == Py_False) {
200 w_byte(TYPE_FALSE, p);
201 }
202 else if (v == Py_True) {
203 w_byte(TYPE_TRUE, p);
204 }
Guido van Rossum58da9312007-11-10 23:39:45 +0000205 else if (PyLong_CheckExact(v)) {
Guido van Rossumddefaf32007-01-14 03:31:43 +0000206 long x = PyLong_AsLong(v);
207 if ((x == -1) && PyErr_Occurred()) {
208 PyLongObject *ob = (PyLongObject *)v;
209 PyErr_Clear();
Mark Dickinsonbd792642009-03-18 20:06:12 +0000210 w_PyLong(ob, p);
211 }
Guido van Rossumddefaf32007-01-14 03:31:43 +0000212 else {
Guido van Rossumc1547d91996-12-10 15:39:04 +0000213#if SIZEOF_LONG > 4
Guido van Rossumddefaf32007-01-14 03:31:43 +0000214 long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
215 if (y && y != -1) {
216 w_byte(TYPE_INT64, p);
217 w_long64(x, p);
218 }
219 else
Guido van Rossumc1547d91996-12-10 15:39:04 +0000220#endif
221 {
Guido van Rossumddefaf32007-01-14 03:31:43 +0000222 w_byte(TYPE_INT, p);
223 w_long(x, p);
224 }
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000225 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000226 }
Guido van Rossum58da9312007-11-10 23:39:45 +0000227 else if (PyFloat_CheckExact(v)) {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000228 if (p->version > 1) {
Brett Cannonc9371d42005-06-25 08:23:41 +0000229 unsigned char buf[8];
Michael W. Hudsondf888462005-06-03 14:41:55 +0000230 if (_PyFloat_Pack8(PyFloat_AsDouble(v),
231 buf, 1) < 0) {
232 p->error = 1;
233 return;
234 }
235 w_byte(TYPE_BINARY_FLOAT, p);
Brett Cannonc9371d42005-06-25 08:23:41 +0000236 w_string((char*)buf, 8, p);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000237 }
238 else {
Eric Smith0923d1d2009-04-16 20:16:10 +0000239 char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
240 'r', 0, 0, NULL);
241 if (!buf)
242 return;
243 n = strlen(buf);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000244 w_byte(TYPE_FLOAT, p);
Martin v. Löwis67baee62006-02-16 14:37:48 +0000245 w_byte((int)n, p);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000246 w_string(buf, (int)n, p);
Eric Smith0923d1d2009-04-16 20:16:10 +0000247 PyMem_Free(buf);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000248 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000249 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000250#ifndef WITHOUT_COMPLEX
Guido van Rossum58da9312007-11-10 23:39:45 +0000251 else if (PyComplex_CheckExact(v)) {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000252 if (p->version > 1) {
Brett Cannonc9371d42005-06-25 08:23:41 +0000253 unsigned char buf[8];
Michael W. Hudsondf888462005-06-03 14:41:55 +0000254 if (_PyFloat_Pack8(PyComplex_RealAsDouble(v),
255 buf, 1) < 0) {
256 p->error = 1;
257 return;
258 }
259 w_byte(TYPE_BINARY_COMPLEX, p);
Brett Cannonc9371d42005-06-25 08:23:41 +0000260 w_string((char*)buf, 8, p);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000261 if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v),
262 buf, 1) < 0) {
263 p->error = 1;
264 return;
265 }
Brett Cannonc9371d42005-06-25 08:23:41 +0000266 w_string((char*)buf, 8, p);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000267 }
268 else {
Eric Smith0923d1d2009-04-16 20:16:10 +0000269 char *buf;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000270 w_byte(TYPE_COMPLEX, p);
Eric Smith0923d1d2009-04-16 20:16:10 +0000271 buf = PyOS_double_to_string(PyComplex_RealAsDouble(v),
272 'r', 0, 0, NULL);
273 if (!buf)
274 return;
Martin v. Löwis725507b2006-03-07 12:08:51 +0000275 n = strlen(buf);
276 w_byte((int)n, p);
277 w_string(buf, (int)n, p);
Eric Smith0923d1d2009-04-16 20:16:10 +0000278 PyMem_Free(buf);
279 buf = PyOS_double_to_string(PyComplex_ImagAsDouble(v),
280 'r', 0, 0, NULL);
281 if (!buf)
282 return;
283 n = strlen(buf);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000284 w_byte((int)n, p);
285 w_string(buf, (int)n, p);
Eric Smith0923d1d2009-04-16 20:16:10 +0000286 PyMem_Free(buf);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000287 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000288 }
289#endif
Christian Heimes72b710a2008-05-26 13:28:38 +0000290 else if (PyBytes_CheckExact(v)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +0000291 w_byte(TYPE_STRING, p);
Christian Heimes72b710a2008-05-26 13:28:38 +0000292 n = PyBytes_GET_SIZE(v);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000293 if (n > INT_MAX) {
294 /* huge strings are not supported */
295 p->depth--;
296 p->error = 1;
297 return;
298 }
Guido van Rossum3a205f71995-02-17 15:10:07 +0000299 w_long((long)n, p);
Christian Heimes72b710a2008-05-26 13:28:38 +0000300 w_string(PyBytes_AS_STRING(v), (int)n, p);
Guido van Rossumc279b532000-03-10 23:03:02 +0000301 }
Guido van Rossum58da9312007-11-10 23:39:45 +0000302 else if (PyUnicode_CheckExact(v)) {
Guido van Rossumc279b532000-03-10 23:03:02 +0000303 PyObject *utf8;
304 utf8 = PyUnicode_AsUTF8String(v);
305 if (utf8 == NULL) {
Guido van Rossum98626cd2000-06-28 23:24:19 +0000306 p->depth--;
307 p->error = 1;
308 return;
Guido van Rossumc279b532000-03-10 23:03:02 +0000309 }
310 w_byte(TYPE_UNICODE, p);
Christian Heimes72b710a2008-05-26 13:28:38 +0000311 n = PyBytes_GET_SIZE(utf8);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000312 if (n > INT_MAX) {
313 p->depth--;
314 p->error = 1;
315 return;
316 }
Guido van Rossumc279b532000-03-10 23:03:02 +0000317 w_long((long)n, p);
Christian Heimes72b710a2008-05-26 13:28:38 +0000318 w_string(PyBytes_AS_STRING(utf8), (int)n, p);
Guido van Rossumc279b532000-03-10 23:03:02 +0000319 Py_DECREF(utf8);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000320 }
Guido van Rossum58da9312007-11-10 23:39:45 +0000321 else if (PyTuple_CheckExact(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000322 w_byte(TYPE_TUPLE, p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000323 n = PyTuple_Size(v);
Guido van Rossum3a205f71995-02-17 15:10:07 +0000324 w_long((long)n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000325 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000326 w_object(PyTuple_GET_ITEM(v, i), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000327 }
328 }
Guido van Rossum58da9312007-11-10 23:39:45 +0000329 else if (PyList_CheckExact(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000330 w_byte(TYPE_LIST, p);
Guido van Rossumc279b532000-03-10 23:03:02 +0000331 n = PyList_GET_SIZE(v);
Guido van Rossum3a205f71995-02-17 15:10:07 +0000332 w_long((long)n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000333 for (i = 0; i < n; i++) {
Guido van Rossumc279b532000-03-10 23:03:02 +0000334 w_object(PyList_GET_ITEM(v, i), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000335 }
336 }
Guido van Rossum58da9312007-11-10 23:39:45 +0000337 else if (PyDict_CheckExact(v)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000338 Py_ssize_t pos;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000339 PyObject *key, *value;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000340 w_byte(TYPE_DICT, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000341 /* This one is NULL object terminated! */
Guido van Rossum25831651993-05-19 14:50:45 +0000342 pos = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000343 while (PyDict_Next(v, &pos, &key, &value)) {
Guido van Rossum25831651993-05-19 14:50:45 +0000344 w_object(key, p);
345 w_object(value, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000346 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000347 w_object((PyObject *)NULL, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000348 }
Guido van Rossum58da9312007-11-10 23:39:45 +0000349 else if (PyAnySet_CheckExact(v)) {
Raymond Hettingera422c342005-01-11 03:03:27 +0000350 PyObject *value, *it;
351
352 if (PyObject_TypeCheck(v, &PySet_Type))
353 w_byte(TYPE_SET, p);
354 else
355 w_byte(TYPE_FROZENSET, p);
356 n = PyObject_Size(v);
357 if (n == -1) {
358 p->depth--;
359 p->error = 1;
360 return;
361 }
362 w_long((long)n, p);
363 it = PyObject_GetIter(v);
364 if (it == NULL) {
365 p->depth--;
366 p->error = 1;
367 return;
368 }
369 while ((value = PyIter_Next(it)) != NULL) {
370 w_object(value, p);
371 Py_DECREF(value);
372 }
373 Py_DECREF(it);
374 if (PyErr_Occurred()) {
375 p->depth--;
376 p->error = 1;
377 return;
378 }
379 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000380 else if (PyCode_Check(v)) {
381 PyCodeObject *co = (PyCodeObject *)v;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000382 w_byte(TYPE_CODE, p);
Neal Norwitz7fdcb412002-06-14 01:07:39 +0000383 w_long(co->co_argcount, p);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000384 w_long(co->co_kwonlyargcount, p);
Neal Norwitz7fdcb412002-06-14 01:07:39 +0000385 w_long(co->co_nlocals, p);
386 w_long(co->co_stacksize, p);
387 w_long(co->co_flags, p);
Guido van Rossumd076c731998-10-07 19:42:25 +0000388 w_object(co->co_code, p);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000389 w_object(co->co_consts, p);
390 w_object(co->co_names, p);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000391 w_object(co->co_varnames, p);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000392 w_object(co->co_freevars, p);
393 w_object(co->co_cellvars, p);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000394 w_object(co->co_filename, p);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000395 w_object(co->co_name, p);
Neal Norwitz7fdcb412002-06-14 01:07:39 +0000396 w_long(co->co_firstlineno, p);
Guido van Rossumd031c891997-01-24 03:44:17 +0000397 w_object(co->co_lnotab, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000398 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000399 else if (PyObject_CheckBuffer(v)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000400 /* Write unknown buffer-style objects as a string */
401 char *s;
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000402 PyBufferProcs *pb = v->ob_type->tp_as_buffer;
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000403 Py_buffer view;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000404 if ((*pb->bf_getbuffer)(v, &view, PyBUF_SIMPLE) != 0) {
405 w_byte(TYPE_UNKNOWN, p);
406 p->error = 1;
407 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000408 w_byte(TYPE_STRING, p);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000409 n = view.len;
410 s = view.buf;
Martin v. Löwis725507b2006-03-07 12:08:51 +0000411 if (n > INT_MAX) {
412 p->depth--;
413 p->error = 1;
414 return;
415 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000416 w_long((long)n, p);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000417 w_string(s, (int)n, p);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000418 if (pb->bf_releasebuffer != NULL)
419 (*pb->bf_releasebuffer)(v, &view);
Guido van Rossumd076c731998-10-07 19:42:25 +0000420 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000421 else {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000422 w_byte(TYPE_UNKNOWN, p);
Guido van Rossumf2150601996-06-26 20:41:23 +0000423 p->error = 1;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000424 }
Guido van Rossum98626cd2000-06-28 23:24:19 +0000425 p->depth--;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000426}
427
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000428/* version currently has no effect for writing longs. */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000429void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000430PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000431{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000432 WFILE wf;
433 wf.fp = fp;
Guido van Rossumf2150601996-06-26 20:41:23 +0000434 wf.error = 0;
Fred Drake6da0b912000-06-28 18:47:56 +0000435 wf.depth = 0;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000436 wf.strings = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000437 wf.version = version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000438 w_long(x, &wf);
439}
440
441void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000442PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000443{
444 WFILE wf;
445 wf.fp = fp;
Guido van Rossumf2150601996-06-26 20:41:23 +0000446 wf.error = 0;
Guido van Rossum98626cd2000-06-28 23:24:19 +0000447 wf.depth = 0;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000448 wf.strings = (version > 0) ? PyDict_New() : NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000449 wf.version = version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000450 w_object(x, &wf);
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000451 Py_XDECREF(wf.strings);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000452}
453
454typedef WFILE RFILE; /* Same struct with different invariants */
455
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000456#define rs_byte(p) (((p)->ptr < (p)->end) ? (unsigned char)*(p)->ptr++ : EOF)
Guido van Rossum8d617a61995-03-09 12:12:11 +0000457
458#define r_byte(p) ((p)->fp ? getc((p)->fp) : rs_byte(p))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000459
460static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000461r_string(char *s, int n, RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000462{
463 if (p->fp != NULL)
Martin v. Löwis18e16552006-02-15 17:27:45 +0000464 /* The result fits into int because it must be <=n. */
465 return (int)fread(s, 1, n, p->fp);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000466 if (p->end - p->ptr < n)
Martin v. Löwis18e16552006-02-15 17:27:45 +0000467 n = (int)(p->end - p->ptr);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000468 memcpy(s, p->ptr, n);
469 p->ptr += n;
470 return n;
471}
472
473static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000474r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000475{
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000476 register short x;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000477 x = r_byte(p);
478 x |= r_byte(p) << 8;
Tim Peterse84b7402000-09-19 08:54:13 +0000479 /* Sign-extension, in case short greater than 16 bits */
480 x |= -(x & 0x8000);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000481 return x;
482}
483
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000484static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000485r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000486{
487 register long x;
Guido van Rossum8d617a61995-03-09 12:12:11 +0000488 register FILE *fp = p->fp;
489 if (fp) {
490 x = getc(fp);
491 x |= (long)getc(fp) << 8;
492 x |= (long)getc(fp) << 16;
493 x |= (long)getc(fp) << 24;
494 }
495 else {
496 x = rs_byte(p);
497 x |= (long)rs_byte(p) << 8;
498 x |= (long)rs_byte(p) << 16;
499 x |= (long)rs_byte(p) << 24;
500 }
Guido van Rossumc1547d91996-12-10 15:39:04 +0000501#if SIZEOF_LONG > 4
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000502 /* Sign extension for 64-bit machines */
Tim Peterse84b7402000-09-19 08:54:13 +0000503 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000504#endif
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000505 return x;
506}
507
Tim Peters82112372001-08-29 02:28:42 +0000508/* r_long64 deals with the TYPE_INT64 code. On a machine with
509 sizeof(long) > 4, it returns a Python int object, else a Python long
510 object. Note that w_long64 writes out TYPE_INT if 32 bits is enough,
511 so there's no inefficiency here in returning a PyLong on 32-bit boxes
512 for everything written via TYPE_INT64 (i.e., if an int is written via
513 TYPE_INT64, it *needs* more than 32 bits).
514*/
515static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000516r_long64(RFILE *p)
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000517{
Tim Peters82112372001-08-29 02:28:42 +0000518 long lo4 = r_long(p);
519 long hi4 = r_long(p);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000520#if SIZEOF_LONG > 4
Tim Peters82112372001-08-29 02:28:42 +0000521 long x = (hi4 << 32) | (lo4 & 0xFFFFFFFFL);
Christian Heimes217cfd12007-12-02 14:31:20 +0000522 return PyLong_FromLong(x);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000523#else
Tim Peters82112372001-08-29 02:28:42 +0000524 unsigned char buf[8];
525 int one = 1;
526 int is_little_endian = (int)*(char*)&one;
527 if (is_little_endian) {
528 memcpy(buf, &lo4, 4);
529 memcpy(buf+4, &hi4, 4);
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000530 }
Tim Peters82112372001-08-29 02:28:42 +0000531 else {
532 memcpy(buf, &hi4, 4);
533 memcpy(buf+4, &lo4, 4);
534 }
535 return _PyLong_FromByteArray(buf, 8, is_little_endian, 1);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000536#endif
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000537}
538
Guido van Rossum79f25d91997-04-29 20:08:16 +0000539static PyObject *
Mark Dickinsonbd792642009-03-18 20:06:12 +0000540r_PyLong(RFILE *p)
541{
542 PyLongObject *ob;
543 int size, i, j, md;
544 long n;
545 digit d;
546
547 n = r_long(p);
548 if (n == 0)
549 return (PyObject *)_PyLong_New(0);
550 if (n < -INT_MAX || n > INT_MAX) {
551 PyErr_SetString(PyExc_ValueError,
552 "bad marshal data (long size out of range)");
553 return NULL;
554 }
555
556 size = 1 + (ABS(n)-1) / PyLong_MARSHAL_RATIO;
557 ob = _PyLong_New(size);
558 if (ob == NULL)
559 return NULL;
560 Py_SIZE(ob) = n > 0 ? size : -size;
561
562 for (i = 0; i < size-1; i++) {
563 d = 0;
564 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
565 md = r_short(p);
566 if (md < 0 || md > PyLong_MARSHAL_BASE)
567 goto bad_digit;
568 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
569 }
570 ob->ob_digit[i] = d;
571 }
572 d = 0;
573 for (j=0; j < (ABS(n)-1)%PyLong_MARSHAL_RATIO + 1; j++) {
574 md = r_short(p);
575 if (md < 0 || md > PyLong_MARSHAL_BASE)
576 goto bad_digit;
577 d += (digit)md << j*PyLong_MARSHAL_SHIFT;
578 }
579 ob->ob_digit[size-1] = d;
580 return (PyObject *)ob;
581 bad_digit:
582 Py_DECREF(ob);
583 PyErr_SetString(PyExc_ValueError,
584 "bad marshal data (digit out of range in long)");
585 return NULL;
586}
587
588
589static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000590r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000591{
Armin Rigo01ab2792004-03-26 15:09:27 +0000592 /* NULL is a valid return value, it does not necessarily means that
593 an exception is set. */
Christian Heimes7b3ce6a2008-01-31 14:31:45 +0000594 PyObject *v, *v2;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000595 long i, n;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000596 int type = r_byte(p);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000597 PyObject *retval;
598
599 p->depth++;
600
601 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
602 p->depth--;
603 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
604 return NULL;
605 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000606
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000607 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000608
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000609 case EOF:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000610 PyErr_SetString(PyExc_EOFError,
611 "EOF read where object expected");
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000612 retval = NULL;
613 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000614
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000615 case TYPE_NULL:
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000616 retval = NULL;
617 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000618
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000619 case TYPE_NONE:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000620 Py_INCREF(Py_None);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000621 retval = Py_None;
622 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000623
Tim Peters5ca576e2001-06-18 22:08:13 +0000624 case TYPE_STOPITER:
625 Py_INCREF(PyExc_StopIteration);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000626 retval = PyExc_StopIteration;
627 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000628
Guido van Rossume449af71996-10-11 16:25:41 +0000629 case TYPE_ELLIPSIS:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000630 Py_INCREF(Py_Ellipsis);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000631 retval = Py_Ellipsis;
632 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000633
Guido van Rossum77f6a652002-04-03 22:41:51 +0000634 case TYPE_FALSE:
635 Py_INCREF(Py_False);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000636 retval = Py_False;
637 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000638
639 case TYPE_TRUE:
640 Py_INCREF(Py_True);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000641 retval = Py_True;
642 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000643
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000644 case TYPE_INT:
Christian Heimes217cfd12007-12-02 14:31:20 +0000645 retval = PyLong_FromLong(r_long(p));
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000646 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000647
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000648 case TYPE_INT64:
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000649 retval = r_long64(p);
650 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000651
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000652 case TYPE_LONG:
Mark Dickinsonbd792642009-03-18 20:06:12 +0000653 retval = r_PyLong(p);
654 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000655
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000656 case TYPE_FLOAT:
657 {
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000658 char buf[256];
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000659 double dx;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000660 n = r_byte(p);
Armin Rigo01ab2792004-03-26 15:09:27 +0000661 if (n == EOF || r_string(buf, (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000662 PyErr_SetString(PyExc_EOFError,
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000663 "EOF read where object expected");
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000664 retval = NULL;
665 break;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000666 }
667 buf[n] = '\0';
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000668 retval = NULL;
669 PyFPE_START_PROTECT("atof", break)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000670 dx = PyOS_ascii_atof(buf);
Guido van Rossum45b83911997-03-14 04:32:50 +0000671 PyFPE_END_PROTECT(dx)
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000672 retval = PyFloat_FromDouble(dx);
673 break;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000674 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000675
Michael W. Hudsondf888462005-06-03 14:41:55 +0000676 case TYPE_BINARY_FLOAT:
677 {
Brett Cannonc9371d42005-06-25 08:23:41 +0000678 unsigned char buf[8];
Michael W. Hudsondf888462005-06-03 14:41:55 +0000679 double x;
Brett Cannonc9371d42005-06-25 08:23:41 +0000680 if (r_string((char*)buf, 8, p) != 8) {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000681 PyErr_SetString(PyExc_EOFError,
682 "EOF read where object expected");
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000683 retval = NULL;
684 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000685 }
686 x = _PyFloat_Unpack8(buf, 1);
687 if (x == -1.0 && PyErr_Occurred()) {
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000688 retval = NULL;
689 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000690 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000691 retval = PyFloat_FromDouble(x);
692 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000693 }
694
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000695#ifndef WITHOUT_COMPLEX
696 case TYPE_COMPLEX:
697 {
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000698 char buf[256];
Guido van Rossum530956d1996-07-21 02:27:43 +0000699 Py_complex c;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000700 n = r_byte(p);
Armin Rigo01ab2792004-03-26 15:09:27 +0000701 if (n == EOF || r_string(buf, (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000702 PyErr_SetString(PyExc_EOFError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000703 "EOF read where object expected");
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000704 retval = NULL;
705 break;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000706 }
707 buf[n] = '\0';
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000708 retval = NULL;
709 PyFPE_START_PROTECT("atof", break;)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000710 c.real = PyOS_ascii_atof(buf);
Guido van Rossum45b83911997-03-14 04:32:50 +0000711 PyFPE_END_PROTECT(c)
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000712 n = r_byte(p);
Armin Rigo01ab2792004-03-26 15:09:27 +0000713 if (n == EOF || r_string(buf, (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000714 PyErr_SetString(PyExc_EOFError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000715 "EOF read where object expected");
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000716 retval = NULL;
717 break;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000718 }
719 buf[n] = '\0';
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000720 PyFPE_START_PROTECT("atof", break)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000721 c.imag = PyOS_ascii_atof(buf);
Guido van Rossum45b83911997-03-14 04:32:50 +0000722 PyFPE_END_PROTECT(c)
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000723 retval = PyComplex_FromCComplex(c);
724 break;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000725 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000726
727 case TYPE_BINARY_COMPLEX:
728 {
Brett Cannonc9371d42005-06-25 08:23:41 +0000729 unsigned char buf[8];
Michael W. Hudsondf888462005-06-03 14:41:55 +0000730 Py_complex c;
Brett Cannonc9371d42005-06-25 08:23:41 +0000731 if (r_string((char*)buf, 8, p) != 8) {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000732 PyErr_SetString(PyExc_EOFError,
733 "EOF read where object expected");
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000734 retval = NULL;
735 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000736 }
737 c.real = _PyFloat_Unpack8(buf, 1);
738 if (c.real == -1.0 && PyErr_Occurred()) {
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000739 retval = NULL;
740 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000741 }
Brett Cannonc9371d42005-06-25 08:23:41 +0000742 if (r_string((char*)buf, 8, p) != 8) {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000743 PyErr_SetString(PyExc_EOFError,
744 "EOF read where object expected");
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000745 retval = NULL;
746 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000747 }
748 c.imag = _PyFloat_Unpack8(buf, 1);
749 if (c.imag == -1.0 && PyErr_Occurred()) {
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000750 retval = NULL;
751 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000752 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000753 retval = PyComplex_FromCComplex(c);
754 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000755 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000756#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +0000757
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000758 case TYPE_STRING:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000759 n = r_long(p);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000760 if (n < 0 || n > INT_MAX) {
Nick Coghlan93095832009-03-15 05:07:56 +0000761 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000762 retval = NULL;
763 break;
Guido van Rossuma45cb451998-06-08 20:27:29 +0000764 }
Christian Heimes72b710a2008-05-26 13:28:38 +0000765 v = PyBytes_FromStringAndSize((char *)NULL, n);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000766 if (v == NULL) {
767 retval = NULL;
768 break;
769 }
Christian Heimes72b710a2008-05-26 13:28:38 +0000770 if (r_string(PyBytes_AS_STRING(v), (int)n, p) != n) {
Michael W. Hudson6d6917b2005-06-03 15:17:16 +0000771 Py_DECREF(v);
772 PyErr_SetString(PyExc_EOFError,
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000773 "EOF read where object expected");
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000774 retval = NULL;
775 break;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000776 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000777 retval = v;
778 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000779
Guido van Rossumc279b532000-03-10 23:03:02 +0000780 case TYPE_UNICODE:
781 {
782 char *buffer;
783
784 n = r_long(p);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000785 if (n < 0 || n > INT_MAX) {
Nick Coghlan93095832009-03-15 05:07:56 +0000786 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000787 retval = NULL;
788 break;
Guido van Rossumc279b532000-03-10 23:03:02 +0000789 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000790 buffer = PyMem_NEW(char, n);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000791 if (buffer == NULL) {
792 retval = PyErr_NoMemory();
793 break;
794 }
Guido van Rossumc279b532000-03-10 23:03:02 +0000795 if (r_string(buffer, (int)n, p) != n) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000796 PyMem_DEL(buffer);
Guido van Rossumc279b532000-03-10 23:03:02 +0000797 PyErr_SetString(PyExc_EOFError,
798 "EOF read where object expected");
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000799 retval = NULL;
800 break;
Guido van Rossumc279b532000-03-10 23:03:02 +0000801 }
802 v = PyUnicode_DecodeUTF8(buffer, n, NULL);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000803 PyMem_DEL(buffer);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000804 retval = v;
805 break;
Guido van Rossumc279b532000-03-10 23:03:02 +0000806 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000807
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000808 case TYPE_TUPLE:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000809 n = r_long(p);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000810 if (n < 0 || n > INT_MAX) {
Nick Coghlan93095832009-03-15 05:07:56 +0000811 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000812 retval = NULL;
813 break;
Guido van Rossuma45cb451998-06-08 20:27:29 +0000814 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000815 v = PyTuple_New((int)n);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000816 if (v == NULL) {
817 retval = NULL;
818 break;
819 }
Jack Jansen9513f2c1995-10-27 13:21:28 +0000820 for (i = 0; i < n; i++) {
821 v2 = r_object(p);
822 if ( v2 == NULL ) {
Armin Rigo01ab2792004-03-26 15:09:27 +0000823 if (!PyErr_Occurred())
824 PyErr_SetString(PyExc_TypeError,
Nick Coghlan93095832009-03-15 05:07:56 +0000825 "NULL object in marshal data for tuple");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000826 Py_DECREF(v);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000827 v = NULL;
828 break;
829 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000830 PyTuple_SET_ITEM(v, (int)i, v2);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000831 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000832 retval = v;
833 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000834
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000835 case TYPE_LIST:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000836 n = r_long(p);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000837 if (n < 0 || n > INT_MAX) {
Nick Coghlan93095832009-03-15 05:07:56 +0000838 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000839 retval = NULL;
840 break;
Guido van Rossuma45cb451998-06-08 20:27:29 +0000841 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000842 v = PyList_New((int)n);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000843 if (v == NULL) {
844 retval = NULL;
845 break;
846 }
Jack Jansen9513f2c1995-10-27 13:21:28 +0000847 for (i = 0; i < n; i++) {
848 v2 = r_object(p);
849 if ( v2 == NULL ) {
Armin Rigo01ab2792004-03-26 15:09:27 +0000850 if (!PyErr_Occurred())
851 PyErr_SetString(PyExc_TypeError,
Nick Coghlan93095832009-03-15 05:07:56 +0000852 "NULL object in marshal data for list");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000853 Py_DECREF(v);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000854 v = NULL;
855 break;
856 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000857 PyList_SET_ITEM(v, (int)i, v2);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000858 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000859 retval = v;
860 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000861
Guido van Rossum64b45521991-06-07 13:58:22 +0000862 case TYPE_DICT:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000863 v = PyDict_New();
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000864 if (v == NULL) {
865 retval = NULL;
866 break;
867 }
Guido van Rossum64b45521991-06-07 13:58:22 +0000868 for (;;) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000869 PyObject *key, *val;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000870 key = r_object(p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000871 if (key == NULL)
Armin Rigo01ab2792004-03-26 15:09:27 +0000872 break;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000873 val = r_object(p);
Guido van Rossumf2150601996-06-26 20:41:23 +0000874 if (val != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000875 PyDict_SetItem(v, key, val);
876 Py_DECREF(key);
877 Py_XDECREF(val);
Guido van Rossum64b45521991-06-07 13:58:22 +0000878 }
Armin Rigo01ab2792004-03-26 15:09:27 +0000879 if (PyErr_Occurred()) {
880 Py_DECREF(v);
881 v = NULL;
882 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000883 retval = v;
884 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000885
Raymond Hettingera422c342005-01-11 03:03:27 +0000886 case TYPE_SET:
887 case TYPE_FROZENSET:
888 n = r_long(p);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000889 if (n < 0 || n > INT_MAX) {
Nick Coghlan93095832009-03-15 05:07:56 +0000890 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000891 retval = NULL;
892 break;
Raymond Hettingera422c342005-01-11 03:03:27 +0000893 }
Christian Heimesfd66e512008-01-29 12:18:50 +0000894 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000895 if (v == NULL) {
896 retval = NULL;
897 break;
898 }
Raymond Hettingera422c342005-01-11 03:03:27 +0000899 for (i = 0; i < n; i++) {
900 v2 = r_object(p);
901 if ( v2 == NULL ) {
902 if (!PyErr_Occurred())
903 PyErr_SetString(PyExc_TypeError,
Nick Coghlan93095832009-03-15 05:07:56 +0000904 "NULL object in marshal data for set");
Raymond Hettingera422c342005-01-11 03:03:27 +0000905 Py_DECREF(v);
906 v = NULL;
907 break;
908 }
Christian Heimesfd66e512008-01-29 12:18:50 +0000909 if (PySet_Add(v, v2) == -1) {
910 Py_DECREF(v);
911 Py_DECREF(v2);
912 v = NULL;
913 break;
914 }
Christian Heimes400adb02008-02-01 08:12:03 +0000915 Py_DECREF(v2);
Raymond Hettingera422c342005-01-11 03:03:27 +0000916 }
Christian Heimesfd66e512008-01-29 12:18:50 +0000917 retval = v;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000918 break;
Raymond Hettingera422c342005-01-11 03:03:27 +0000919
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000920 case TYPE_CODE:
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000921 {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000922 int argcount;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000923 int kwonlyargcount;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000924 int nlocals;
925 int stacksize;
926 int flags;
927 PyObject *code = NULL;
928 PyObject *consts = NULL;
929 PyObject *names = NULL;
930 PyObject *varnames = NULL;
931 PyObject *freevars = NULL;
932 PyObject *cellvars = NULL;
933 PyObject *filename = NULL;
934 PyObject *name = NULL;
935 int firstlineno;
936 PyObject *lnotab = NULL;
937
938 v = NULL;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000939
Guido van Rossuma8add0e2007-05-14 22:03:55 +0000940 /* XXX ignore long->int overflows for now */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000941 argcount = (int)r_long(p);
942 kwonlyargcount = (int)r_long(p);
943 nlocals = (int)r_long(p);
944 stacksize = (int)r_long(p);
945 flags = (int)r_long(p);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000946 code = r_object(p);
947 if (code == NULL)
948 goto code_error;
949 consts = r_object(p);
950 if (consts == NULL)
951 goto code_error;
952 names = r_object(p);
953 if (names == NULL)
954 goto code_error;
955 varnames = r_object(p);
956 if (varnames == NULL)
957 goto code_error;
958 freevars = r_object(p);
959 if (freevars == NULL)
960 goto code_error;
961 cellvars = r_object(p);
962 if (cellvars == NULL)
963 goto code_error;
964 filename = r_object(p);
965 if (filename == NULL)
966 goto code_error;
967 name = r_object(p);
968 if (name == NULL)
969 goto code_error;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000970 firstlineno = (int)r_long(p);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000971 lnotab = r_object(p);
972 if (lnotab == NULL)
973 goto code_error;
974
975 v = (PyObject *) PyCode_New(
Guido van Rossum4f72a782006-10-27 23:31:49 +0000976 argcount, kwonlyargcount,
977 nlocals, stacksize, flags,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000978 code, consts, names, varnames,
Tim Petersd9b9ac82001-01-28 00:27:39 +0000979 freevars, cellvars, filename, name,
980 firstlineno, lnotab);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000981
982 code_error:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000983 Py_XDECREF(code);
984 Py_XDECREF(consts);
985 Py_XDECREF(names);
986 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000987 Py_XDECREF(freevars);
988 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000989 Py_XDECREF(filename);
990 Py_XDECREF(name);
Guido van Rossum6fc06e71997-07-26 23:30:18 +0000991 Py_XDECREF(lnotab);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000992 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000993 retval = v;
994 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000995
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000996 default:
Guido van Rossumf2150601996-06-26 20:41:23 +0000997 /* Bogus data got written, which isn't ideal.
998 This will let you keep working and recover. */
Nick Coghlan93095832009-03-15 05:07:56 +0000999 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001000 retval = NULL;
1001 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001002
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001003 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001004 p->depth--;
1005 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001006}
1007
Neal Norwitzd85c4522004-06-13 20:31:49 +00001008static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +00001009read_object(RFILE *p)
1010{
1011 PyObject *v;
1012 if (PyErr_Occurred()) {
1013 fprintf(stderr, "XXX readobject called with exception set\n");
1014 return NULL;
1015 }
1016 v = r_object(p);
1017 if (v == NULL && !PyErr_Occurred())
Nick Coghlan93095832009-03-15 05:07:56 +00001018 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
Armin Rigo01ab2792004-03-26 15:09:27 +00001019 return v;
1020}
1021
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001022int
1023PyMarshal_ReadShortFromFile(FILE *fp)
1024{
1025 RFILE rf;
Thomas Wouters7f401ef2006-03-01 22:30:47 +00001026 assert(fp);
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001027 rf.fp = fp;
Thomas Wouters7464b432006-03-01 22:34:09 +00001028 rf.strings = NULL;
1029 rf.end = rf.ptr = NULL;
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001030 return r_short(&rf);
1031}
1032
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001033long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001034PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001035{
1036 RFILE rf;
1037 rf.fp = fp;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001038 rf.strings = NULL;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001039 rf.ptr = rf.end = NULL;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001040 return r_long(&rf);
1041}
1042
Tim Peters691e0e92001-01-18 04:39:16 +00001043#ifdef HAVE_FSTAT
1044/* Return size of file in bytes; < 0 if unknown. */
1045static off_t
1046getfilesize(FILE *fp)
1047{
1048 struct stat st;
1049 if (fstat(fileno(fp), &st) != 0)
1050 return -1;
1051 else
1052 return st.st_size;
1053}
1054#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001055
Tim Peters691e0e92001-01-18 04:39:16 +00001056/* If we can get the size of the file up-front, and it's reasonably small,
1057 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1058 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001059 * CAUTION: since this may read the entire remainder of the file, don't
1060 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001061 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001062PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001063PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001064{
Tim Peters691e0e92001-01-18 04:39:16 +00001065/* 75% of 2.1's .pyc files can exploit SMALL_FILE_LIMIT.
1066 * REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc.
1067 */
1068#define SMALL_FILE_LIMIT (1L << 14)
1069#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001070#ifdef HAVE_FSTAT
1071 off_t filesize;
1072#endif
Tim Peters691e0e92001-01-18 04:39:16 +00001073#ifdef HAVE_FSTAT
1074 filesize = getfilesize(fp);
1075 if (filesize > 0) {
1076 char buf[SMALL_FILE_LIMIT];
1077 char* pBuf = NULL;
1078 if (filesize <= SMALL_FILE_LIMIT)
1079 pBuf = buf;
1080 else if (filesize <= REASONABLE_FILE_LIMIT)
1081 pBuf = (char *)PyMem_MALLOC(filesize);
1082 if (pBuf != NULL) {
1083 PyObject* v;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001084 size_t n;
1085 /* filesize must fit into an int, because it
1086 is smaller than REASONABLE_FILE_LIMIT */
1087 n = fread(pBuf, 1, (int)filesize, fp);
Tim Peters691e0e92001-01-18 04:39:16 +00001088 v = PyMarshal_ReadObjectFromString(pBuf, n);
1089 if (pBuf != buf)
1090 PyMem_FREE(pBuf);
1091 return v;
1092 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001093
Tim Peters691e0e92001-01-18 04:39:16 +00001094 }
1095#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001096 /* We don't have fstat, or we do but the file is larger than
1097 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1098 */
1099 return PyMarshal_ReadObjectFromFile(fp);
1100
Tim Peters691e0e92001-01-18 04:39:16 +00001101#undef SMALL_FILE_LIMIT
1102#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001103}
1104
Guido van Rossum79f25d91997-04-29 20:08:16 +00001105PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001106PyMarshal_ReadObjectFromFile(FILE *fp)
1107{
1108 RFILE rf;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001109 PyObject *result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001110 rf.fp = fp;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001111 rf.strings = PyList_New(0);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001112 rf.depth = 0;
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001113 rf.ptr = rf.end = NULL;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001114 result = r_object(&rf);
1115 Py_DECREF(rf.strings);
1116 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001117}
1118
1119PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001120PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001121{
1122 RFILE rf;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001123 PyObject *result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001124 rf.fp = NULL;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001125 rf.ptr = str;
1126 rf.end = str + len;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001127 rf.strings = PyList_New(0);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001128 rf.depth = 0;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001129 result = r_object(&rf);
1130 Py_DECREF(rf.strings);
1131 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001132}
1133
Guido van Rossum79f25d91997-04-29 20:08:16 +00001134PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001135PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001136{
1137 WFILE wf;
Guido van Rossume6d39042007-05-09 00:01:30 +00001138 PyObject *res = NULL;
1139
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001140 wf.fp = NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00001141 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001142 if (wf.str == NULL)
1143 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00001144 wf.ptr = PyBytes_AS_STRING((PyBytesObject *)wf.str);
1145 wf.end = wf.ptr + PyBytes_Size(wf.str);
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001146 wf.error = 0;
Fred Drake6da0b912000-06-28 18:47:56 +00001147 wf.depth = 0;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001148 wf.version = version;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001149 wf.strings = (version > 0) ? PyDict_New() : NULL;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001150 w_object(x, &wf);
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001151 Py_XDECREF(wf.strings);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001152 if (wf.str != NULL) {
Christian Heimes72b710a2008-05-26 13:28:38 +00001153 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001154 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1155 Py_DECREF(wf.str);
1156 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumf15a29f2007-05-04 00:41:39 +00001157 "too much marshal data for a string");
Thomas Wouters89f507f2006-12-13 04:49:30 +00001158 return NULL;
1159 }
Christian Heimes72b710a2008-05-26 13:28:38 +00001160 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
Guido van Rossume6d39042007-05-09 00:01:30 +00001161 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001162 }
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001163 if (wf.error) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001164 Py_XDECREF(wf.str);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001165 PyErr_SetString(PyExc_ValueError,
Fred Drake6da0b912000-06-28 18:47:56 +00001166 (wf.error==1)?"unmarshallable object"
1167 :"object too deeply nested to marshal");
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001168 return NULL;
1169 }
Guido van Rossume6d39042007-05-09 00:01:30 +00001170 if (wf.str != NULL) {
1171 /* XXX Quick hack -- need to do this differently */
Gregory P. Smith0a608fd2008-09-06 21:34:51 +00001172 res = PyBytes_FromObject(wf.str);
Guido van Rossume6d39042007-05-09 00:01:30 +00001173 Py_DECREF(wf.str);
1174 }
1175 return res;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001176}
1177
Guido van Rossum64b45521991-06-07 13:58:22 +00001178/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001179
Guido van Rossum79f25d91997-04-29 20:08:16 +00001180static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001181marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001182{
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001183 /* XXX Quick hack -- need to do this differently */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001184 PyObject *x;
1185 PyObject *f;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001186 int version = Py_MARSHAL_VERSION;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001187 PyObject *s;
1188 PyObject *res;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001189 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001190 return NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001191 s = PyMarshal_WriteObjectToString(x, version);
1192 if (s == NULL)
Guido van Rossumf2150601996-06-26 20:41:23 +00001193 return NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001194 res = PyObject_CallMethod(f, "write", "O", s);
1195 Py_DECREF(s);
1196 return res;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001197}
1198
Guido van Rossum79f25d91997-04-29 20:08:16 +00001199static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001200marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001201{
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001202 /* XXX Quick hack -- need to do this differently */
1203 PyObject *data, *result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001204 RFILE rf;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001205 data = PyObject_CallMethod(f, "read", "");
1206 if (data == NULL)
1207 return NULL;
1208 rf.fp = NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00001209 if (PyBytes_Check(data)) {
1210 rf.ptr = PyBytes_AS_STRING(data);
1211 rf.end = rf.ptr + PyBytes_GET_SIZE(data);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001212 }
Gregory P. Smith0a608fd2008-09-06 21:34:51 +00001213 else if (PyBytes_Check(data)) {
1214 rf.ptr = PyBytes_AS_STRING(data);
1215 rf.end = rf.ptr + PyBytes_GET_SIZE(data);
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001216 }
1217 else {
1218 PyErr_Format(PyExc_TypeError,
1219 "f.read() returned neither string "
1220 "nor bytes but %.100s",
1221 data->ob_type->tp_name);
1222 Py_DECREF(data);
1223 return NULL;
1224 }
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001225 rf.strings = PyList_New(0);
Guido van Rossum7a265342007-07-30 00:04:35 +00001226 rf.depth = 0;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001227 result = read_object(&rf);
1228 Py_DECREF(rf.strings);
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001229 Py_DECREF(data);
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001230 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001231}
1232
Guido van Rossum79f25d91997-04-29 20:08:16 +00001233static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001234marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001235{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001236 PyObject *x;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001237 int version = Py_MARSHAL_VERSION;
Armin Rigo2ccea172004-12-20 12:25:57 +00001238 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001239 return NULL;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001240 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001241}
1242
Guido van Rossum79f25d91997-04-29 20:08:16 +00001243static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001244marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001245{
1246 RFILE rf;
Martin v. Löwis423be952008-08-13 15:53:07 +00001247 Py_buffer p;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001248 char *s;
Thomas Wouters695934a2006-03-01 23:49:13 +00001249 Py_ssize_t n;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001250 PyObject* result;
Martin v. Löwis423be952008-08-13 15:53:07 +00001251 if (!PyArg_ParseTuple(args, "s*:loads", &p))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001252 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +00001253 s = p.buf;
1254 n = p.len;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001255 rf.fp = NULL;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001256 rf.ptr = s;
1257 rf.end = s + n;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001258 rf.strings = PyList_New(0);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001259 rf.depth = 0;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001260 result = read_object(&rf);
1261 Py_DECREF(rf.strings);
Martin v. Löwis423be952008-08-13 15:53:07 +00001262 PyBuffer_Release(&p);
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001263 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001264}
1265
Guido van Rossum79f25d91997-04-29 20:08:16 +00001266static PyMethodDef marshal_methods[] = {
Neal Norwitz031829d2002-03-31 14:37:44 +00001267 {"dump", marshal_dump, METH_VARARGS},
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001268 {"load", marshal_load, METH_O},
Neal Norwitz031829d2002-03-31 14:37:44 +00001269 {"dumps", marshal_dumps, METH_VARARGS},
1270 {"loads", marshal_loads, METH_VARARGS},
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001271 {NULL, NULL} /* sentinel */
1272};
1273
Brett Cannon429ef652008-06-27 00:35:35 +00001274static struct PyModuleDef marshalmodule = {
Martin v. Löwis1a214512008-06-11 05:26:20 +00001275 PyModuleDef_HEAD_INIT,
1276 "marshal",
1277 NULL,
1278 0,
1279 marshal_methods,
1280 NULL,
1281 NULL,
1282 NULL,
1283 NULL
1284};
1285
1286
1287
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001288PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001289PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001290{
Brett Cannon429ef652008-06-27 00:35:35 +00001291 PyObject *mod = PyModule_Create(&marshalmodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001292 if (mod == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001293 return NULL;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001294 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
Martin v. Löwis1a214512008-06-11 05:26:20 +00001295 return mod;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001296}