blob: a4c831f261584d39e47b55458dc76e1d46a4c379 [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
Fred Drake6da0b912000-06-28 18:47:56 +000014/* High water mark to determine when the marshalled object is dangerously deep
15 * and risks coring the interpreter. When the object stack gets this deep,
16 * raise an exception instead of continuing.
17 */
Neal Norwitzf6b0e4d2007-05-17 07:04:46 +000018#define MAX_MARSHAL_STACK_DEPTH 2000
Fred Drake6da0b912000-06-28 18:47:56 +000019
Michael W. Hudsondf888462005-06-03 14:41:55 +000020#define TYPE_NULL '0'
21#define TYPE_NONE 'N'
22#define TYPE_FALSE 'F'
23#define TYPE_TRUE 'T'
24#define TYPE_STOPITER 'S'
25#define TYPE_ELLIPSIS '.'
26#define TYPE_INT 'i'
27#define TYPE_INT64 'I'
28#define TYPE_FLOAT 'f'
29#define TYPE_BINARY_FLOAT 'g'
30#define TYPE_COMPLEX 'x'
31#define TYPE_BINARY_COMPLEX 'y'
32#define TYPE_LONG 'l'
33#define TYPE_STRING 's'
34#define TYPE_INTERNED 't'
35#define TYPE_STRINGREF 'R'
36#define TYPE_TUPLE '('
37#define TYPE_LIST '['
38#define TYPE_DICT '{'
39#define TYPE_CODE 'c'
40#define TYPE_UNICODE 'u'
41#define TYPE_UNKNOWN '?'
42#define TYPE_SET '<'
43#define TYPE_FROZENSET '>'
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000044
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000045typedef struct {
46 FILE *fp;
Guido van Rossumf2150601996-06-26 20:41:23 +000047 int error;
Fred Drake6da0b912000-06-28 18:47:56 +000048 int depth;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000049 /* If fp == NULL, the following are valid: */
Guido van Rossum79f25d91997-04-29 20:08:16 +000050 PyObject *str;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000051 char *ptr;
52 char *end;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +000053 PyObject *strings; /* dict on marshal, list on unmarshal */
Michael W. Hudsondf888462005-06-03 14:41:55 +000054 int version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000055} WFILE;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000056
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000057#define w_byte(c, p) if (((p)->fp)) putc((c), (p)->fp); \
58 else if ((p)->ptr != (p)->end) *(p)->ptr++ = (c); \
59 else w_more(c, p)
60
61static void
Fredrik Lundh11534382000-07-23 18:24:06 +000062w_more(int c, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000063{
Martin v. Löwis18e16552006-02-15 17:27:45 +000064 Py_ssize_t size, newsize;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000065 if (p->str == NULL)
66 return; /* An error already occurred */
Gregory P. Smithdd96db62008-06-09 04:58:54 +000067 size = PyString_Size(p->str);
Andrew M. Kuchling6c029162008-05-11 13:33:56 +000068 newsize = size + size + 1024;
69 if (newsize > 32*1024*1024) {
Raymond Hettinger305480c2008-06-16 01:42:40 +000070 newsize = size + (size >> 3); /* 12.5% overallocation */
Andrew M. Kuchling6c029162008-05-11 13:33:56 +000071 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +000072 if (_PyString_Resize(&p->str, newsize) != 0) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000073 p->ptr = p->end = NULL;
74 }
75 else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +000076 p->ptr = PyString_AS_STRING((PyStringObject *)p->str) + size;
Guido van Rossum79f25d91997-04-29 20:08:16 +000077 p->end =
Gregory P. Smithdd96db62008-06-09 04:58:54 +000078 PyString_AS_STRING((PyStringObject *)p->str) + newsize;
Tim Peters8315ea52000-07-23 19:28:35 +000079 *p->ptr++ = Py_SAFE_DOWNCAST(c, int, char);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000080 }
81}
82
83static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000084w_string(char *s, int n, WFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000085{
86 if (p->fp != NULL) {
87 fwrite(s, 1, n, p->fp);
88 }
89 else {
90 while (--n >= 0) {
91 w_byte(*s, p);
92 s++;
93 }
94 }
95}
96
97static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000098w_short(int x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000099{
Thomas Heller3e1c18a2002-07-30 11:40:57 +0000100 w_byte((char)( x & 0xff), p);
101 w_byte((char)((x>> 8) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000102}
103
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000104static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000105w_long(long x, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000106{
Thomas Heller37d5a152002-07-30 11:44:44 +0000107 w_byte((char)( x & 0xff), p);
108 w_byte((char)((x>> 8) & 0xff), p);
109 w_byte((char)((x>>16) & 0xff), p);
110 w_byte((char)((x>>24) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000111}
112
Guido van Rossumc1547d91996-12-10 15:39:04 +0000113#if SIZEOF_LONG > 4
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000114static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000115w_long64(long x, WFILE *p)
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000116{
117 w_long(x, p);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000118 w_long(x>>32, p);
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000119}
Guido van Rossumc1547d91996-12-10 15:39:04 +0000120#endif
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000121
122static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000123w_object(PyObject *v, WFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000124{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000125 Py_ssize_t i, n;
Fred Drake6da0b912000-06-28 18:47:56 +0000126
127 p->depth++;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000128
Fred Drake6da0b912000-06-28 18:47:56 +0000129 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
130 p->error = 2;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000131 }
Fred Drake6da0b912000-06-28 18:47:56 +0000132 else if (v == NULL) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000133 w_byte(TYPE_NULL, p);
Guido van Rossum730806d1998-04-10 22:27:42 +0000134 }
135 else if (v == Py_None) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000136 w_byte(TYPE_NONE, p);
Guido van Rossum730806d1998-04-10 22:27:42 +0000137 }
Tim Peters5ca576e2001-06-18 22:08:13 +0000138 else if (v == PyExc_StopIteration) {
139 w_byte(TYPE_STOPITER, p);
140 }
Guido van Rossum730806d1998-04-10 22:27:42 +0000141 else if (v == Py_Ellipsis) {
142 w_byte(TYPE_ELLIPSIS, p);
143 }
Guido van Rossum77f6a652002-04-03 22:41:51 +0000144 else if (v == Py_False) {
145 w_byte(TYPE_FALSE, p);
146 }
147 else if (v == Py_True) {
148 w_byte(TYPE_TRUE, p);
149 }
Raymond Hettinger12e94202007-11-07 01:13:09 +0000150 else if (PyInt_CheckExact(v)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000151 long x = PyInt_AS_LONG((PyIntObject *)v);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000152#if SIZEOF_LONG > 4
Tim Peters44714002001-04-10 05:02:52 +0000153 long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000154 if (y && y != -1) {
155 w_byte(TYPE_INT64, p);
156 w_long64(x, p);
157 }
Guido van Rossumc1547d91996-12-10 15:39:04 +0000158 else
159#endif
160 {
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000161 w_byte(TYPE_INT, p);
162 w_long(x, p);
163 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000164 }
Raymond Hettinger12e94202007-11-07 01:13:09 +0000165 else if (PyLong_CheckExact(v)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000166 PyLongObject *ob = (PyLongObject *)v;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000167 w_byte(TYPE_LONG, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000168 n = ob->ob_size;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000169 w_long((long)n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000170 if (n < 0)
171 n = -n;
172 for (i = 0; i < n; i++)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000173 w_short(ob->ob_digit[i], p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000174 }
Raymond Hettinger12e94202007-11-07 01:13:09 +0000175 else if (PyFloat_CheckExact(v)) {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000176 if (p->version > 1) {
Brett Cannonc9371d42005-06-25 08:23:41 +0000177 unsigned char buf[8];
Michael W. Hudsondf888462005-06-03 14:41:55 +0000178 if (_PyFloat_Pack8(PyFloat_AsDouble(v),
179 buf, 1) < 0) {
180 p->error = 1;
181 return;
182 }
183 w_byte(TYPE_BINARY_FLOAT, p);
Brett Cannonc9371d42005-06-25 08:23:41 +0000184 w_string((char*)buf, 8, p);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000185 }
186 else {
187 char buf[256]; /* Plenty to format any double */
188 PyFloat_AsReprString(buf, (PyFloatObject *)v);
Martin v. Löwis67baee62006-02-16 14:37:48 +0000189 n = strlen(buf);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000190 w_byte(TYPE_FLOAT, p);
Martin v. Löwis67baee62006-02-16 14:37:48 +0000191 w_byte((int)n, p);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000192 w_string(buf, (int)n, p);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000193 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000194 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000195#ifndef WITHOUT_COMPLEX
Raymond Hettinger12e94202007-11-07 01:13:09 +0000196 else if (PyComplex_CheckExact(v)) {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000197 if (p->version > 1) {
Brett Cannonc9371d42005-06-25 08:23:41 +0000198 unsigned char buf[8];
Michael W. Hudsondf888462005-06-03 14:41:55 +0000199 if (_PyFloat_Pack8(PyComplex_RealAsDouble(v),
200 buf, 1) < 0) {
201 p->error = 1;
202 return;
203 }
204 w_byte(TYPE_BINARY_COMPLEX, p);
Brett Cannonc9371d42005-06-25 08:23:41 +0000205 w_string((char*)buf, 8, p);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000206 if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v),
207 buf, 1) < 0) {
208 p->error = 1;
209 return;
210 }
Brett Cannonc9371d42005-06-25 08:23:41 +0000211 w_string((char*)buf, 8, p);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000212 }
213 else {
214 char buf[256]; /* Plenty to format any double */
215 PyFloatObject *temp;
216 w_byte(TYPE_COMPLEX, p);
217 temp = (PyFloatObject*)PyFloat_FromDouble(
218 PyComplex_RealAsDouble(v));
Neal Norwitzedb21682006-08-12 01:47:59 +0000219 if (!temp) {
220 p->error = 1;
221 return;
222 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000223 PyFloat_AsReprString(buf, temp);
224 Py_DECREF(temp);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000225 n = strlen(buf);
226 w_byte((int)n, p);
227 w_string(buf, (int)n, p);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000228 temp = (PyFloatObject*)PyFloat_FromDouble(
229 PyComplex_ImagAsDouble(v));
Neal Norwitzedb21682006-08-12 01:47:59 +0000230 if (!temp) {
231 p->error = 1;
232 return;
233 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000234 PyFloat_AsReprString(buf, temp);
235 Py_DECREF(temp);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000236 n = strlen(buf);
237 w_byte((int)n, p);
238 w_string(buf, (int)n, p);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000239 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000240 }
241#endif
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000242 else if (PyString_CheckExact(v)) {
243 if (p->strings && PyString_CHECK_INTERNED(v)) {
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000244 PyObject *o = PyDict_GetItem(p->strings, v);
245 if (o) {
246 long w = PyInt_AsLong(o);
247 w_byte(TYPE_STRINGREF, p);
248 w_long(w, p);
249 goto exit;
250 }
251 else {
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000252 int ok;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000253 o = PyInt_FromSsize_t(PyDict_Size(p->strings));
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000254 ok = o &&
255 PyDict_SetItem(p->strings, v, o) >= 0;
256 Py_XDECREF(o);
257 if (!ok) {
258 p->depth--;
259 p->error = 1;
260 return;
261 }
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000262 w_byte(TYPE_INTERNED, p);
263 }
264 }
265 else {
266 w_byte(TYPE_STRING, p);
267 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000268 n = PyString_GET_SIZE(v);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000269 if (n > INT_MAX) {
270 /* huge strings are not supported */
271 p->depth--;
272 p->error = 1;
273 return;
274 }
Guido van Rossum3a205f71995-02-17 15:10:07 +0000275 w_long((long)n, p);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000276 w_string(PyString_AS_STRING(v), (int)n, p);
Guido van Rossumc279b532000-03-10 23:03:02 +0000277 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000278#ifdef Py_USING_UNICODE
Raymond Hettinger12e94202007-11-07 01:13:09 +0000279 else if (PyUnicode_CheckExact(v)) {
Guido van Rossumc279b532000-03-10 23:03:02 +0000280 PyObject *utf8;
281 utf8 = PyUnicode_AsUTF8String(v);
282 if (utf8 == NULL) {
Guido van Rossum98626cd2000-06-28 23:24:19 +0000283 p->depth--;
284 p->error = 1;
285 return;
Guido van Rossumc279b532000-03-10 23:03:02 +0000286 }
287 w_byte(TYPE_UNICODE, p);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000288 n = PyString_GET_SIZE(utf8);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000289 if (n > INT_MAX) {
290 p->depth--;
291 p->error = 1;
292 return;
293 }
Guido van Rossumc279b532000-03-10 23:03:02 +0000294 w_long((long)n, p);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000295 w_string(PyString_AS_STRING(utf8), (int)n, p);
Guido van Rossumc279b532000-03-10 23:03:02 +0000296 Py_DECREF(utf8);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000297 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000298#endif
Raymond Hettinger12e94202007-11-07 01:13:09 +0000299 else if (PyTuple_CheckExact(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000300 w_byte(TYPE_TUPLE, p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000301 n = PyTuple_Size(v);
Guido van Rossum3a205f71995-02-17 15:10:07 +0000302 w_long((long)n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000303 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000304 w_object(PyTuple_GET_ITEM(v, i), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000305 }
306 }
Raymond Hettinger12e94202007-11-07 01:13:09 +0000307 else if (PyList_CheckExact(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000308 w_byte(TYPE_LIST, p);
Guido van Rossumc279b532000-03-10 23:03:02 +0000309 n = PyList_GET_SIZE(v);
Guido van Rossum3a205f71995-02-17 15:10:07 +0000310 w_long((long)n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000311 for (i = 0; i < n; i++) {
Guido van Rossumc279b532000-03-10 23:03:02 +0000312 w_object(PyList_GET_ITEM(v, i), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000313 }
314 }
Raymond Hettinger12e94202007-11-07 01:13:09 +0000315 else if (PyDict_CheckExact(v)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000316 Py_ssize_t pos;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000317 PyObject *key, *value;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000318 w_byte(TYPE_DICT, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000319 /* This one is NULL object terminated! */
Guido van Rossum25831651993-05-19 14:50:45 +0000320 pos = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000321 while (PyDict_Next(v, &pos, &key, &value)) {
Guido van Rossum25831651993-05-19 14:50:45 +0000322 w_object(key, p);
323 w_object(value, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000324 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000325 w_object((PyObject *)NULL, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000326 }
Raymond Hettinger12e94202007-11-07 01:13:09 +0000327 else if (PyAnySet_CheckExact(v)) {
Raymond Hettingera422c342005-01-11 03:03:27 +0000328 PyObject *value, *it;
329
330 if (PyObject_TypeCheck(v, &PySet_Type))
331 w_byte(TYPE_SET, p);
332 else
333 w_byte(TYPE_FROZENSET, p);
334 n = PyObject_Size(v);
335 if (n == -1) {
336 p->depth--;
337 p->error = 1;
338 return;
339 }
340 w_long((long)n, p);
341 it = PyObject_GetIter(v);
342 if (it == NULL) {
343 p->depth--;
344 p->error = 1;
345 return;
346 }
347 while ((value = PyIter_Next(it)) != NULL) {
348 w_object(value, p);
349 Py_DECREF(value);
350 }
351 Py_DECREF(it);
352 if (PyErr_Occurred()) {
353 p->depth--;
354 p->error = 1;
355 return;
356 }
357 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000358 else if (PyCode_Check(v)) {
359 PyCodeObject *co = (PyCodeObject *)v;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000360 w_byte(TYPE_CODE, p);
Neal Norwitz7fdcb412002-06-14 01:07:39 +0000361 w_long(co->co_argcount, p);
362 w_long(co->co_nlocals, p);
363 w_long(co->co_stacksize, p);
364 w_long(co->co_flags, p);
Guido van Rossumd076c731998-10-07 19:42:25 +0000365 w_object(co->co_code, p);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000366 w_object(co->co_consts, p);
367 w_object(co->co_names, p);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000368 w_object(co->co_varnames, p);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000369 w_object(co->co_freevars, p);
370 w_object(co->co_cellvars, p);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000371 w_object(co->co_filename, p);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000372 w_object(co->co_name, p);
Neal Norwitz7fdcb412002-06-14 01:07:39 +0000373 w_long(co->co_firstlineno, p);
Guido van Rossumd031c891997-01-24 03:44:17 +0000374 w_object(co->co_lnotab, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000375 }
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000376 else if (PyObject_CheckReadBuffer(v)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000377 /* Write unknown buffer-style objects as a string */
378 char *s;
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000379 PyBufferProcs *pb = v->ob_type->tp_as_buffer;
Guido van Rossumd076c731998-10-07 19:42:25 +0000380 w_byte(TYPE_STRING, p);
381 n = (*pb->bf_getreadbuffer)(v, 0, (void **)&s);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000382 if (n > INT_MAX) {
383 p->depth--;
384 p->error = 1;
385 return;
386 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000387 w_long((long)n, p);
Martin v. Löwis725507b2006-03-07 12:08:51 +0000388 w_string(s, (int)n, p);
Guido van Rossumd076c731998-10-07 19:42:25 +0000389 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000390 else {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000391 w_byte(TYPE_UNKNOWN, p);
Guido van Rossumf2150601996-06-26 20:41:23 +0000392 p->error = 1;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000393 }
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000394 exit:
Guido van Rossum98626cd2000-06-28 23:24:19 +0000395 p->depth--;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000396}
397
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000398/* version currently has no effect for writing longs. */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000399void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000400PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000401{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000402 WFILE wf;
403 wf.fp = fp;
Guido van Rossumf2150601996-06-26 20:41:23 +0000404 wf.error = 0;
Fred Drake6da0b912000-06-28 18:47:56 +0000405 wf.depth = 0;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000406 wf.strings = NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000407 wf.version = version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000408 w_long(x, &wf);
409}
410
411void
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000412PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000413{
414 WFILE wf;
415 wf.fp = fp;
Guido van Rossumf2150601996-06-26 20:41:23 +0000416 wf.error = 0;
Guido van Rossum98626cd2000-06-28 23:24:19 +0000417 wf.depth = 0;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000418 wf.strings = (version > 0) ? PyDict_New() : NULL;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000419 wf.version = version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000420 w_object(x, &wf);
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000421 Py_XDECREF(wf.strings);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000422}
423
424typedef WFILE RFILE; /* Same struct with different invariants */
425
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000426#define rs_byte(p) (((p)->ptr < (p)->end) ? (unsigned char)*(p)->ptr++ : EOF)
Guido van Rossum8d617a61995-03-09 12:12:11 +0000427
428#define r_byte(p) ((p)->fp ? getc((p)->fp) : rs_byte(p))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000429
430static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000431r_string(char *s, int n, RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000432{
433 if (p->fp != NULL)
Martin v. Löwis18e16552006-02-15 17:27:45 +0000434 /* The result fits into int because it must be <=n. */
435 return (int)fread(s, 1, n, p->fp);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000436 if (p->end - p->ptr < n)
Martin v. Löwis18e16552006-02-15 17:27:45 +0000437 n = (int)(p->end - p->ptr);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000438 memcpy(s, p->ptr, n);
439 p->ptr += n;
440 return n;
441}
442
443static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000444r_short(RFILE *p)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000445{
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000446 register short x;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000447 x = r_byte(p);
448 x |= r_byte(p) << 8;
Tim Peterse84b7402000-09-19 08:54:13 +0000449 /* Sign-extension, in case short greater than 16 bits */
450 x |= -(x & 0x8000);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000451 return x;
452}
453
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000454static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000455r_long(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000456{
457 register long x;
Guido van Rossum8d617a61995-03-09 12:12:11 +0000458 register FILE *fp = p->fp;
459 if (fp) {
460 x = getc(fp);
461 x |= (long)getc(fp) << 8;
462 x |= (long)getc(fp) << 16;
463 x |= (long)getc(fp) << 24;
464 }
465 else {
466 x = rs_byte(p);
467 x |= (long)rs_byte(p) << 8;
468 x |= (long)rs_byte(p) << 16;
469 x |= (long)rs_byte(p) << 24;
470 }
Guido van Rossumc1547d91996-12-10 15:39:04 +0000471#if SIZEOF_LONG > 4
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000472 /* Sign extension for 64-bit machines */
Tim Peterse84b7402000-09-19 08:54:13 +0000473 x |= -(x & 0x80000000L);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000474#endif
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000475 return x;
476}
477
Tim Peters82112372001-08-29 02:28:42 +0000478/* r_long64 deals with the TYPE_INT64 code. On a machine with
479 sizeof(long) > 4, it returns a Python int object, else a Python long
480 object. Note that w_long64 writes out TYPE_INT if 32 bits is enough,
481 so there's no inefficiency here in returning a PyLong on 32-bit boxes
482 for everything written via TYPE_INT64 (i.e., if an int is written via
483 TYPE_INT64, it *needs* more than 32 bits).
484*/
485static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000486r_long64(RFILE *p)
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000487{
Tim Peters82112372001-08-29 02:28:42 +0000488 long lo4 = r_long(p);
489 long hi4 = r_long(p);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000490#if SIZEOF_LONG > 4
Tim Peters82112372001-08-29 02:28:42 +0000491 long x = (hi4 << 32) | (lo4 & 0xFFFFFFFFL);
492 return PyInt_FromLong(x);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000493#else
Tim Peters82112372001-08-29 02:28:42 +0000494 unsigned char buf[8];
495 int one = 1;
496 int is_little_endian = (int)*(char*)&one;
497 if (is_little_endian) {
498 memcpy(buf, &lo4, 4);
499 memcpy(buf+4, &hi4, 4);
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000500 }
Tim Peters82112372001-08-29 02:28:42 +0000501 else {
502 memcpy(buf, &hi4, 4);
503 memcpy(buf+4, &lo4, 4);
504 }
505 return _PyLong_FromByteArray(buf, 8, is_little_endian, 1);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000506#endif
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000507}
508
Guido van Rossum79f25d91997-04-29 20:08:16 +0000509static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000510r_object(RFILE *p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000511{
Armin Rigo01ab2792004-03-26 15:09:27 +0000512 /* NULL is a valid return value, it does not necessarily means that
513 an exception is set. */
Christian Heimes67ac0662008-01-30 11:46:00 +0000514 PyObject *v, *v2;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000515 long i, n;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000516 int type = r_byte(p);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000517 PyObject *retval;
518
519 p->depth++;
520
521 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
522 p->depth--;
523 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
524 return NULL;
525 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000526
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000527 switch (type) {
Tim Petersd9b9ac82001-01-28 00:27:39 +0000528
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000529 case EOF:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000530 PyErr_SetString(PyExc_EOFError,
531 "EOF read where object expected");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000532 retval = NULL;
533 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000534
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000535 case TYPE_NULL:
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000536 retval = NULL;
537 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000538
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000539 case TYPE_NONE:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000540 Py_INCREF(Py_None);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000541 retval = Py_None;
542 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000543
Tim Peters5ca576e2001-06-18 22:08:13 +0000544 case TYPE_STOPITER:
545 Py_INCREF(PyExc_StopIteration);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000546 retval = PyExc_StopIteration;
547 break;
Tim Peters5ca576e2001-06-18 22:08:13 +0000548
Guido van Rossume449af71996-10-11 16:25:41 +0000549 case TYPE_ELLIPSIS:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000550 Py_INCREF(Py_Ellipsis);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000551 retval = Py_Ellipsis;
552 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000553
Guido van Rossum77f6a652002-04-03 22:41:51 +0000554 case TYPE_FALSE:
555 Py_INCREF(Py_False);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000556 retval = Py_False;
557 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000558
559 case TYPE_TRUE:
560 Py_INCREF(Py_True);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000561 retval = Py_True;
562 break;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000563
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000564 case TYPE_INT:
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000565 retval = PyInt_FromLong(r_long(p));
566 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000567
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000568 case TYPE_INT64:
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000569 retval = r_long64(p);
570 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000571
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000572 case TYPE_LONG:
573 {
574 int size;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000575 PyLongObject *ob;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000576 n = r_long(p);
Armin Rigo7ccbca92006-10-04 12:17:45 +0000577 if (n < -INT_MAX || n > INT_MAX) {
578 PyErr_SetString(PyExc_ValueError,
579 "bad marshal data");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000580 retval = NULL;
581 break;
Armin Rigo7ccbca92006-10-04 12:17:45 +0000582 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000583 size = n<0 ? -n : n;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000584 ob = _PyLong_New(size);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000585 if (ob == NULL) {
586 retval = NULL;
587 break;
588 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000589 ob->ob_size = n;
Armin Rigo01ab2792004-03-26 15:09:27 +0000590 for (i = 0; i < size; i++) {
591 int digit = r_short(p);
Mark Dickinsonc3a12772009-10-03 08:15:49 +0000592 if (digit < 0 ||
593 (digit == 0 && i == size-1)) {
Armin Rigo01ab2792004-03-26 15:09:27 +0000594 Py_DECREF(ob);
595 PyErr_SetString(PyExc_ValueError,
596 "bad marshal data");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000597 ob = NULL;
598 break;
Armin Rigo01ab2792004-03-26 15:09:27 +0000599 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000600 if (ob != NULL)
601 ob->ob_digit[i] = digit;
Armin Rigo01ab2792004-03-26 15:09:27 +0000602 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000603 retval = (PyObject *)ob;
604 break;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000605 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000606
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000607 case TYPE_FLOAT:
608 {
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000609 char buf[256];
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000610 double dx;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000611 n = r_byte(p);
Armin Rigo01ab2792004-03-26 15:09:27 +0000612 if (n == EOF || r_string(buf, (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000613 PyErr_SetString(PyExc_EOFError,
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000614 "EOF read where object expected");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000615 retval = NULL;
616 break;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000617 }
618 buf[n] = '\0';
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000619 retval = NULL;
620 PyFPE_START_PROTECT("atof", break)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000621 dx = PyOS_ascii_atof(buf);
Guido van Rossum45b83911997-03-14 04:32:50 +0000622 PyFPE_END_PROTECT(dx)
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000623 retval = PyFloat_FromDouble(dx);
624 break;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000625 }
Tim Petersd9b9ac82001-01-28 00:27:39 +0000626
Michael W. Hudsondf888462005-06-03 14:41:55 +0000627 case TYPE_BINARY_FLOAT:
628 {
Brett Cannonc9371d42005-06-25 08:23:41 +0000629 unsigned char buf[8];
Michael W. Hudsondf888462005-06-03 14:41:55 +0000630 double x;
Brett Cannonc9371d42005-06-25 08:23:41 +0000631 if (r_string((char*)buf, 8, p) != 8) {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000632 PyErr_SetString(PyExc_EOFError,
633 "EOF read where object expected");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000634 retval = NULL;
635 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000636 }
637 x = _PyFloat_Unpack8(buf, 1);
638 if (x == -1.0 && PyErr_Occurred()) {
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000639 retval = NULL;
640 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000641 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000642 retval = PyFloat_FromDouble(x);
643 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000644 }
645
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000646#ifndef WITHOUT_COMPLEX
647 case TYPE_COMPLEX:
648 {
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000649 char buf[256];
Guido van Rossum530956d1996-07-21 02:27:43 +0000650 Py_complex c;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000651 n = r_byte(p);
Armin Rigo01ab2792004-03-26 15:09:27 +0000652 if (n == EOF || r_string(buf, (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000653 PyErr_SetString(PyExc_EOFError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000654 "EOF read where object expected");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000655 retval = NULL;
656 break;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000657 }
658 buf[n] = '\0';
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000659 retval = NULL;
660 PyFPE_START_PROTECT("atof", break;)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000661 c.real = PyOS_ascii_atof(buf);
Guido van Rossum45b83911997-03-14 04:32:50 +0000662 PyFPE_END_PROTECT(c)
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000663 n = r_byte(p);
Armin Rigo01ab2792004-03-26 15:09:27 +0000664 if (n == EOF || r_string(buf, (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000665 PyErr_SetString(PyExc_EOFError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000666 "EOF read where object expected");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000667 retval = NULL;
668 break;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000669 }
670 buf[n] = '\0';
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000671 PyFPE_START_PROTECT("atof", break)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000672 c.imag = PyOS_ascii_atof(buf);
Guido van Rossum45b83911997-03-14 04:32:50 +0000673 PyFPE_END_PROTECT(c)
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000674 retval = PyComplex_FromCComplex(c);
675 break;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000676 }
Michael W. Hudsondf888462005-06-03 14:41:55 +0000677
678 case TYPE_BINARY_COMPLEX:
679 {
Brett Cannonc9371d42005-06-25 08:23:41 +0000680 unsigned char buf[8];
Michael W. Hudsondf888462005-06-03 14:41:55 +0000681 Py_complex c;
Brett Cannonc9371d42005-06-25 08:23:41 +0000682 if (r_string((char*)buf, 8, p) != 8) {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000683 PyErr_SetString(PyExc_EOFError,
684 "EOF read where object expected");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000685 retval = NULL;
686 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000687 }
688 c.real = _PyFloat_Unpack8(buf, 1);
689 if (c.real == -1.0 && PyErr_Occurred()) {
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000690 retval = NULL;
691 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000692 }
Brett Cannonc9371d42005-06-25 08:23:41 +0000693 if (r_string((char*)buf, 8, p) != 8) {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000694 PyErr_SetString(PyExc_EOFError,
695 "EOF read where object expected");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000696 retval = NULL;
697 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000698 }
699 c.imag = _PyFloat_Unpack8(buf, 1);
700 if (c.imag == -1.0 && PyErr_Occurred()) {
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000701 retval = NULL;
702 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000703 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000704 retval = PyComplex_FromCComplex(c);
705 break;
Michael W. Hudsondf888462005-06-03 14:41:55 +0000706 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000707#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +0000708
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000709 case TYPE_INTERNED:
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000710 case TYPE_STRING:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000711 n = r_long(p);
Armin Rigo7ccbca92006-10-04 12:17:45 +0000712 if (n < 0 || n > INT_MAX) {
Guido van Rossuma45cb451998-06-08 20:27:29 +0000713 PyErr_SetString(PyExc_ValueError, "bad marshal data");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000714 retval = NULL;
715 break;
Guido van Rossuma45cb451998-06-08 20:27:29 +0000716 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000717 v = PyString_FromStringAndSize((char *)NULL, n);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000718 if (v == NULL) {
719 retval = NULL;
720 break;
721 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000722 if (r_string(PyString_AS_STRING(v), (int)n, p) != n) {
Michael W. Hudson6d6917b2005-06-03 15:17:16 +0000723 Py_DECREF(v);
724 PyErr_SetString(PyExc_EOFError,
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000725 "EOF read where object expected");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000726 retval = NULL;
727 break;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000728 }
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000729 if (type == TYPE_INTERNED) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000730 PyString_InternInPlace(&v);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000731 if (PyList_Append(p->strings, v) < 0) {
732 retval = NULL;
733 break;
734 }
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000735 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000736 retval = v;
737 break;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000738
739 case TYPE_STRINGREF:
740 n = r_long(p);
Michael W. Hudsonf2ca5af2005-06-13 18:28:46 +0000741 if (n < 0 || n >= PyList_GET_SIZE(p->strings)) {
742 PyErr_SetString(PyExc_ValueError, "bad marshal data");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000743 retval = NULL;
744 break;
Michael W. Hudsonf2ca5af2005-06-13 18:28:46 +0000745 }
Martin v. Löwisef82d2f2004-06-27 16:51:46 +0000746 v = PyList_GET_ITEM(p->strings, n);
747 Py_INCREF(v);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000748 retval = v;
749 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000750
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000751#ifdef Py_USING_UNICODE
Guido van Rossumc279b532000-03-10 23:03:02 +0000752 case TYPE_UNICODE:
753 {
754 char *buffer;
755
756 n = r_long(p);
Armin Rigo7ccbca92006-10-04 12:17:45 +0000757 if (n < 0 || n > INT_MAX) {
Guido van Rossumc279b532000-03-10 23:03:02 +0000758 PyErr_SetString(PyExc_ValueError, "bad marshal data");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000759 retval = NULL;
760 break;
Guido van Rossumc279b532000-03-10 23:03:02 +0000761 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000762 buffer = PyMem_NEW(char, n);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000763 if (buffer == NULL) {
764 retval = PyErr_NoMemory();
765 break;
766 }
Guido van Rossumc279b532000-03-10 23:03:02 +0000767 if (r_string(buffer, (int)n, p) != n) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000768 PyMem_DEL(buffer);
Guido van Rossumc279b532000-03-10 23:03:02 +0000769 PyErr_SetString(PyExc_EOFError,
770 "EOF read where object expected");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000771 retval = NULL;
772 break;
Guido van Rossumc279b532000-03-10 23:03:02 +0000773 }
774 v = PyUnicode_DecodeUTF8(buffer, n, NULL);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000775 PyMem_DEL(buffer);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000776 retval = v;
777 break;
Guido van Rossumc279b532000-03-10 23:03:02 +0000778 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000779#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +0000780
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000781 case TYPE_TUPLE:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000782 n = r_long(p);
Armin Rigo7ccbca92006-10-04 12:17:45 +0000783 if (n < 0 || n > INT_MAX) {
Guido van Rossuma45cb451998-06-08 20:27:29 +0000784 PyErr_SetString(PyExc_ValueError, "bad marshal data");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000785 retval = NULL;
786 break;
Guido van Rossuma45cb451998-06-08 20:27:29 +0000787 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000788 v = PyTuple_New((int)n);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000789 if (v == NULL) {
790 retval = NULL;
791 break;
792 }
Jack Jansen9513f2c1995-10-27 13:21:28 +0000793 for (i = 0; i < n; i++) {
794 v2 = r_object(p);
795 if ( v2 == NULL ) {
Armin Rigo01ab2792004-03-26 15:09:27 +0000796 if (!PyErr_Occurred())
797 PyErr_SetString(PyExc_TypeError,
798 "NULL object in marshal data");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000799 Py_DECREF(v);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000800 v = NULL;
801 break;
802 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000803 PyTuple_SET_ITEM(v, (int)i, v2);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000804 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000805 retval = v;
806 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000807
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000808 case TYPE_LIST:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000809 n = r_long(p);
Armin Rigo7ccbca92006-10-04 12:17:45 +0000810 if (n < 0 || n > INT_MAX) {
Guido van Rossuma45cb451998-06-08 20:27:29 +0000811 PyErr_SetString(PyExc_ValueError, "bad marshal data");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000812 retval = NULL;
813 break;
Guido van Rossuma45cb451998-06-08 20:27:29 +0000814 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000815 v = PyList_New((int)n);
Neal Norwitzb1a9b372007-05-16 20:05:11 +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,
825 "NULL object in marshal data");
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 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000830 PyList_SET_ITEM(v, (int)i, v2);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000831 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000832 retval = v;
833 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000834
Guido van Rossum64b45521991-06-07 13:58:22 +0000835 case TYPE_DICT:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000836 v = PyDict_New();
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000837 if (v == NULL) {
838 retval = NULL;
839 break;
840 }
Guido van Rossum64b45521991-06-07 13:58:22 +0000841 for (;;) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000842 PyObject *key, *val;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000843 key = r_object(p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000844 if (key == NULL)
Armin Rigo01ab2792004-03-26 15:09:27 +0000845 break;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000846 val = r_object(p);
Guido van Rossumf2150601996-06-26 20:41:23 +0000847 if (val != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000848 PyDict_SetItem(v, key, val);
849 Py_DECREF(key);
850 Py_XDECREF(val);
Guido van Rossum64b45521991-06-07 13:58:22 +0000851 }
Armin Rigo01ab2792004-03-26 15:09:27 +0000852 if (PyErr_Occurred()) {
853 Py_DECREF(v);
854 v = NULL;
855 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000856 retval = v;
857 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000858
Raymond Hettingera422c342005-01-11 03:03:27 +0000859 case TYPE_SET:
860 case TYPE_FROZENSET:
861 n = r_long(p);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000862 if (n < 0 || n > INT_MAX) {
Raymond Hettingera422c342005-01-11 03:03:27 +0000863 PyErr_SetString(PyExc_ValueError, "bad marshal data");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000864 retval = NULL;
865 break;
Raymond Hettingera422c342005-01-11 03:03:27 +0000866 }
Raymond Hettinger52716c92008-01-28 21:34:30 +0000867 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000868 if (v == NULL) {
869 retval = NULL;
870 break;
871 }
Raymond Hettingera422c342005-01-11 03:03:27 +0000872 for (i = 0; i < n; i++) {
873 v2 = r_object(p);
874 if ( v2 == NULL ) {
875 if (!PyErr_Occurred())
876 PyErr_SetString(PyExc_TypeError,
877 "NULL object in marshal data");
878 Py_DECREF(v);
879 v = NULL;
880 break;
881 }
Raymond Hettinger52716c92008-01-28 21:34:30 +0000882 if (PySet_Add(v, v2) == -1) {
883 Py_DECREF(v);
884 Py_DECREF(v2);
885 v = NULL;
886 break;
887 }
Neal Norwitzfb43d1e2008-02-01 07:22:59 +0000888 Py_DECREF(v2);
Raymond Hettingera422c342005-01-11 03:03:27 +0000889 }
Raymond Hettingerbf3d1d52008-01-28 21:51:25 +0000890 retval = v;
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000891 break;
Raymond Hettingera422c342005-01-11 03:03:27 +0000892
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000893 case TYPE_CODE:
Michael W. Hudson80199132001-08-30 14:50:20 +0000894 if (PyEval_GetRestricted()) {
895 PyErr_SetString(PyExc_RuntimeError,
896 "cannot unmarshal code objects in "
897 "restricted execution mode");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000898 retval = NULL;
899 break;
Michael W. Hudson80199132001-08-30 14:50:20 +0000900 }
901 else {
Michael W. Hudsondf888462005-06-03 14:41:55 +0000902 int argcount;
903 int nlocals;
904 int stacksize;
905 int flags;
906 PyObject *code = NULL;
907 PyObject *consts = NULL;
908 PyObject *names = NULL;
909 PyObject *varnames = NULL;
910 PyObject *freevars = NULL;
911 PyObject *cellvars = NULL;
912 PyObject *filename = NULL;
913 PyObject *name = NULL;
914 int firstlineno;
915 PyObject *lnotab = NULL;
916
917 v = NULL;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000918
Armin Rigo7ccbca92006-10-04 12:17:45 +0000919 /* XXX ignore long->int overflows for now */
920 argcount = (int)r_long(p);
921 nlocals = (int)r_long(p);
922 stacksize = (int)r_long(p);
923 flags = (int)r_long(p);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000924 code = r_object(p);
925 if (code == NULL)
926 goto code_error;
927 consts = r_object(p);
928 if (consts == NULL)
929 goto code_error;
930 names = r_object(p);
931 if (names == NULL)
932 goto code_error;
933 varnames = r_object(p);
934 if (varnames == NULL)
935 goto code_error;
936 freevars = r_object(p);
937 if (freevars == NULL)
938 goto code_error;
939 cellvars = r_object(p);
940 if (cellvars == NULL)
941 goto code_error;
942 filename = r_object(p);
943 if (filename == NULL)
944 goto code_error;
945 name = r_object(p);
946 if (name == NULL)
947 goto code_error;
Armin Rigo7ccbca92006-10-04 12:17:45 +0000948 firstlineno = (int)r_long(p);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000949 lnotab = r_object(p);
950 if (lnotab == NULL)
951 goto code_error;
952
953 v = (PyObject *) PyCode_New(
Tim Petersd9b9ac82001-01-28 00:27:39 +0000954 argcount, nlocals, stacksize, flags,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000955 code, consts, names, varnames,
Tim Petersd9b9ac82001-01-28 00:27:39 +0000956 freevars, cellvars, filename, name,
957 firstlineno, lnotab);
Michael W. Hudsondf888462005-06-03 14:41:55 +0000958
959 code_error:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000960 Py_XDECREF(code);
961 Py_XDECREF(consts);
962 Py_XDECREF(names);
963 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000964 Py_XDECREF(freevars);
965 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000966 Py_XDECREF(filename);
967 Py_XDECREF(name);
Guido van Rossum6fc06e71997-07-26 23:30:18 +0000968 Py_XDECREF(lnotab);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000969
970 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000971 retval = v;
972 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000973
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000974 default:
Guido van Rossumf2150601996-06-26 20:41:23 +0000975 /* Bogus data got written, which isn't ideal.
976 This will let you keep working and recover. */
Guido van Rossuma45cb451998-06-08 20:27:29 +0000977 PyErr_SetString(PyExc_ValueError, "bad marshal data");
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000978 retval = NULL;
979 break;
Tim Petersd9b9ac82001-01-28 00:27:39 +0000980
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000981 }
Neal Norwitzb1a9b372007-05-16 20:05:11 +0000982 p->depth--;
983 return retval;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000984}
985
Neal Norwitzd85c4522004-06-13 20:31:49 +0000986static PyObject *
Armin Rigo01ab2792004-03-26 15:09:27 +0000987read_object(RFILE *p)
988{
989 PyObject *v;
990 if (PyErr_Occurred()) {
991 fprintf(stderr, "XXX readobject called with exception set\n");
992 return NULL;
993 }
994 v = r_object(p);
995 if (v == NULL && !PyErr_Occurred())
996 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data");
997 return v;
998}
999
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001000int
1001PyMarshal_ReadShortFromFile(FILE *fp)
1002{
1003 RFILE rf;
Thomas Wouters7f401ef2006-03-01 22:30:47 +00001004 assert(fp);
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001005 rf.fp = fp;
Thomas Wouters7464b432006-03-01 22:34:09 +00001006 rf.strings = NULL;
1007 rf.end = rf.ptr = NULL;
Guido van Rossumb8cf3e62001-10-19 01:46:21 +00001008 return r_short(&rf);
1009}
1010
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001011long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001012PyMarshal_ReadLongFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001013{
1014 RFILE rf;
1015 rf.fp = fp;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001016 rf.strings = NULL;
Neal Norwitz15f26612007-10-12 03:05:19 +00001017 rf.ptr = rf.end = NULL;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001018 return r_long(&rf);
1019}
1020
Tim Peters691e0e92001-01-18 04:39:16 +00001021#ifdef HAVE_FSTAT
1022/* Return size of file in bytes; < 0 if unknown. */
1023static off_t
1024getfilesize(FILE *fp)
1025{
1026 struct stat st;
1027 if (fstat(fileno(fp), &st) != 0)
1028 return -1;
1029 else
1030 return st.st_size;
1031}
1032#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001033
Tim Peters691e0e92001-01-18 04:39:16 +00001034/* If we can get the size of the file up-front, and it's reasonably small,
1035 * read it in one gulp and delegate to ...FromString() instead. Much quicker
1036 * than reading a byte at a time from file; speeds .pyc imports.
Tim Petersd9b9ac82001-01-28 00:27:39 +00001037 * CAUTION: since this may read the entire remainder of the file, don't
1038 * call it unless you know you're done with the file.
Tim Peters691e0e92001-01-18 04:39:16 +00001039 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001040PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001041PyMarshal_ReadLastObjectFromFile(FILE *fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001042{
Tim Peters691e0e92001-01-18 04:39:16 +00001043/* 75% of 2.1's .pyc files can exploit SMALL_FILE_LIMIT.
1044 * REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc.
1045 */
1046#define SMALL_FILE_LIMIT (1L << 14)
1047#define REASONABLE_FILE_LIMIT (1L << 18)
Tim Peters691e0e92001-01-18 04:39:16 +00001048#ifdef HAVE_FSTAT
1049 off_t filesize;
1050#endif
Tim Peters691e0e92001-01-18 04:39:16 +00001051#ifdef HAVE_FSTAT
1052 filesize = getfilesize(fp);
1053 if (filesize > 0) {
1054 char buf[SMALL_FILE_LIMIT];
1055 char* pBuf = NULL;
1056 if (filesize <= SMALL_FILE_LIMIT)
1057 pBuf = buf;
1058 else if (filesize <= REASONABLE_FILE_LIMIT)
1059 pBuf = (char *)PyMem_MALLOC(filesize);
1060 if (pBuf != NULL) {
1061 PyObject* v;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001062 size_t n;
1063 /* filesize must fit into an int, because it
1064 is smaller than REASONABLE_FILE_LIMIT */
1065 n = fread(pBuf, 1, (int)filesize, fp);
Tim Peters691e0e92001-01-18 04:39:16 +00001066 v = PyMarshal_ReadObjectFromString(pBuf, n);
1067 if (pBuf != buf)
1068 PyMem_FREE(pBuf);
1069 return v;
1070 }
Tim Petersd9b9ac82001-01-28 00:27:39 +00001071
Tim Peters691e0e92001-01-18 04:39:16 +00001072 }
1073#endif
Tim Petersd9b9ac82001-01-28 00:27:39 +00001074 /* We don't have fstat, or we do but the file is larger than
1075 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
1076 */
1077 return PyMarshal_ReadObjectFromFile(fp);
1078
Tim Peters691e0e92001-01-18 04:39:16 +00001079#undef SMALL_FILE_LIMIT
1080#undef REASONABLE_FILE_LIMIT
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001081}
1082
Guido van Rossum79f25d91997-04-29 20:08:16 +00001083PyObject *
Tim Petersd9b9ac82001-01-28 00:27:39 +00001084PyMarshal_ReadObjectFromFile(FILE *fp)
1085{
1086 RFILE rf;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001087 PyObject *result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001088 rf.fp = fp;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001089 rf.strings = PyList_New(0);
Neal Norwitzb1a9b372007-05-16 20:05:11 +00001090 rf.depth = 0;
Neal Norwitz15f26612007-10-12 03:05:19 +00001091 rf.ptr = rf.end = NULL;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001092 result = r_object(&rf);
1093 Py_DECREF(rf.strings);
1094 return result;
Tim Petersd9b9ac82001-01-28 00:27:39 +00001095}
1096
1097PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001098PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001099{
1100 RFILE rf;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001101 PyObject *result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001102 rf.fp = NULL;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001103 rf.ptr = str;
1104 rf.end = str + len;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001105 rf.strings = PyList_New(0);
Neal Norwitzb1a9b372007-05-16 20:05:11 +00001106 rf.depth = 0;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001107 result = r_object(&rf);
1108 Py_DECREF(rf.strings);
1109 return result;
Guido van Rossumf56e3db1993-04-01 20:59:32 +00001110}
1111
Guido van Rossum79f25d91997-04-29 20:08:16 +00001112PyObject *
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001113PyMarshal_WriteObjectToString(PyObject *x, int version)
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001114{
1115 WFILE wf;
1116 wf.fp = NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001117 wf.str = PyString_FromStringAndSize((char *)NULL, 50);
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001118 if (wf.str == NULL)
1119 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001120 wf.ptr = PyString_AS_STRING((PyStringObject *)wf.str);
1121 wf.end = wf.ptr + PyString_Size(wf.str);
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001122 wf.error = 0;
Fred Drake6da0b912000-06-28 18:47:56 +00001123 wf.depth = 0;
Michael W. Hudsondf888462005-06-03 14:41:55 +00001124 wf.version = version;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001125 wf.strings = (version > 0) ? PyDict_New() : NULL;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001126 w_object(x, &wf);
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001127 Py_XDECREF(wf.strings);
Armin Rigo7ccbca92006-10-04 12:17:45 +00001128 if (wf.str != NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001129 char *base = PyString_AS_STRING((PyStringObject *)wf.str);
Armin Rigo7ccbca92006-10-04 12:17:45 +00001130 if (wf.ptr - base > PY_SSIZE_T_MAX) {
1131 Py_DECREF(wf.str);
1132 PyErr_SetString(PyExc_OverflowError,
1133 "too much marshall data for a string");
1134 return NULL;
1135 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001136 _PyString_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base));
Armin Rigo7ccbca92006-10-04 12:17:45 +00001137 }
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001138 if (wf.error) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001139 Py_XDECREF(wf.str);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001140 PyErr_SetString(PyExc_ValueError,
Fred Drake6da0b912000-06-28 18:47:56 +00001141 (wf.error==1)?"unmarshallable object"
1142 :"object too deeply nested to marshal");
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +00001143 return NULL;
1144 }
1145 return wf.str;
1146}
1147
Guido van Rossum64b45521991-06-07 13:58:22 +00001148/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001149
Guido van Rossum79f25d91997-04-29 20:08:16 +00001150static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001151marshal_dump(PyObject *self, PyObject *args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001152{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001153 WFILE wf;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001154 PyObject *x;
1155 PyObject *f;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001156 int version = Py_MARSHAL_VERSION;
1157 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001158 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001159 if (!PyFile_Check(f)) {
1160 PyErr_SetString(PyExc_TypeError,
1161 "marshal.dump() 2nd arg must be file");
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001162 return NULL;
1163 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001164 wf.fp = PyFile_AsFile(f);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001165 wf.str = NULL;
1166 wf.ptr = wf.end = NULL;
Guido van Rossumf2150601996-06-26 20:41:23 +00001167 wf.error = 0;
Fred Drake6da0b912000-06-28 18:47:56 +00001168 wf.depth = 0;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001169 wf.strings = (version > 0) ? PyDict_New() : 0;
Neal Norwitzef785292005-11-16 05:04:51 +00001170 wf.version = version;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001171 w_object(x, &wf);
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001172 Py_XDECREF(wf.strings);
Guido van Rossumf2150601996-06-26 20:41:23 +00001173 if (wf.error) {
Tim Petersd9b9ac82001-01-28 00:27:39 +00001174 PyErr_SetString(PyExc_ValueError,
Fred Drake6da0b912000-06-28 18:47:56 +00001175 (wf.error==1)?"unmarshallable object"
1176 :"object too deeply nested to marshal");
Guido van Rossumf2150601996-06-26 20:41:23 +00001177 return NULL;
1178 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001179 Py_INCREF(Py_None);
1180 return Py_None;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001181}
1182
R. David Murray666f1832009-05-13 01:08:35 +00001183PyDoc_STRVAR(dump_doc,
1184"dump(value, file[, version])\n\
1185\n\
1186Write the value on the open file. The value must be a supported type.\n\
1187The file must be an open file object such as sys.stdout or returned by\n\
1188open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
1189\n\
1190If the value has (or contains an object that has) an unsupported type, a\n\
1191ValueError exception is raised but garbage data will also be written\n\
1192to the file. The object will not be properly read back by load()\n\
1193\n\
1194New in version 2.4: The version argument indicates the data format that\n\
1195dump should use.");
1196
Guido van Rossum79f25d91997-04-29 20:08:16 +00001197static PyObject *
Georg Brandlbf92f462006-05-29 21:58:42 +00001198marshal_load(PyObject *self, PyObject *f)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001199{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001200 RFILE rf;
Georg Brandlbf92f462006-05-29 21:58:42 +00001201 PyObject *result;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001202 if (!PyFile_Check(f)) {
1203 PyErr_SetString(PyExc_TypeError,
1204 "marshal.load() arg must be file");
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001205 return NULL;
1206 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001207 rf.fp = PyFile_AsFile(f);
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001208 rf.strings = PyList_New(0);
Neal Norwitzb1a9b372007-05-16 20:05:11 +00001209 rf.depth = 0;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001210 result = read_object(&rf);
1211 Py_DECREF(rf.strings);
1212 return result;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001213}
1214
R. David Murray666f1832009-05-13 01:08:35 +00001215PyDoc_STRVAR(load_doc,
1216"load(file)\n\
1217\n\
1218Read one value from the open file and return it. If no valid value is\n\
1219read (e.g. because the data has a different Python versions\n\
1220incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
1221The file must be an open file object opened in binary mode ('rb' or\n\
1222'r+b').\n\
1223\n\
1224Note: If an object containing an unsupported type was marshalled with\n\
1225dump(), load() will substitute None for the unmarshallable type.");
1226
1227
Guido van Rossum79f25d91997-04-29 20:08:16 +00001228static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001229marshal_dumps(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001230{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001231 PyObject *x;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001232 int version = Py_MARSHAL_VERSION;
Armin Rigo2ccea172004-12-20 12:25:57 +00001233 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001234 return NULL;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001235 return PyMarshal_WriteObjectToString(x, version);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001236}
1237
R. David Murray666f1832009-05-13 01:08:35 +00001238PyDoc_STRVAR(dumps_doc,
1239"dumps(value[, version])\n\
1240\n\
1241Return the string that would be written to a file by dump(value, file).\n\
1242The value must be a supported type. Raise a ValueError exception if\n\
1243value has (or contains an object that has) an unsupported type.\n\
1244\n\
1245New in version 2.4: The version argument indicates the data format that\n\
R. David Murray98c78792009-05-13 13:13:18 +00001246dumps should use.");
R. David Murray666f1832009-05-13 01:08:35 +00001247
1248
Guido van Rossum79f25d91997-04-29 20:08:16 +00001249static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001250marshal_loads(PyObject *self, PyObject *args)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001251{
1252 RFILE rf;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001253 char *s;
Thomas Wouters695934a2006-03-01 23:49:13 +00001254 Py_ssize_t n;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001255 PyObject* result;
Michael W. Hudson01fca112005-06-13 17:50:18 +00001256 if (!PyArg_ParseTuple(args, "s#:loads", &s, &n))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001257 return NULL;
1258 rf.fp = NULL;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001259 rf.ptr = s;
1260 rf.end = s + n;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001261 rf.strings = PyList_New(0);
Neal Norwitzb1a9b372007-05-16 20:05:11 +00001262 rf.depth = 0;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001263 result = read_object(&rf);
1264 Py_DECREF(rf.strings);
1265 return result;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001266}
1267
R. David Murray666f1832009-05-13 01:08:35 +00001268PyDoc_STRVAR(loads_doc,
1269"loads(string)\n\
1270\n\
1271Convert the string to a value. If no valid value is found, raise\n\
1272EOFError, ValueError or TypeError. Extra characters in the string are\n\
1273ignored.");
1274
Guido van Rossum79f25d91997-04-29 20:08:16 +00001275static PyMethodDef marshal_methods[] = {
R. David Murray666f1832009-05-13 01:08:35 +00001276 {"dump", marshal_dump, METH_VARARGS, dump_doc},
1277 {"load", marshal_load, METH_O, load_doc},
1278 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
1279 {"loads", marshal_loads, METH_VARARGS, loads_doc},
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001280 {NULL, NULL} /* sentinel */
1281};
1282
R. David Murray666f1832009-05-13 01:08:35 +00001283PyDoc_STRVAR(marshal_doc,
1284"This module contains functions that can read and write Python values in\n\
1285a binary format. The format is specific to Python, but independent of\n\
1286machine architecture issues.\n\
1287\n\
1288Not all Python object types are supported; in general, only objects\n\
1289whose value is independent from a particular invocation of Python can be\n\
1290written and read by this module. The following types are supported:\n\
1291None, integers, long integers, floating point numbers, strings, Unicode\n\
1292objects, tuples, lists, sets, dictionaries, and code objects, where it\n\
1293should be understood that tuples, lists and dictionaries are only\n\
1294supported as long as the values contained therein are themselves\n\
1295supported; and recursive lists and dictionaries should not be written\n\
1296(they will cause infinite loops).\n\
1297\n\
1298Variables:\n\
1299\n\
1300version -- indicates the format that the module uses. Version 0 is the\n\
1301 historical format, version 1 (added in Python 2.4) shares interned\n\
1302 strings and version 2 (added in Python 2.5) uses a binary format for\n\
1303 floating point numbers. (New in version 2.4)\n\
1304\n\
1305Functions:\n\
1306\n\
1307dump() -- write value to a file\n\
1308load() -- read value from a file\n\
1309dumps() -- write value to a string\n\
1310loads() -- read value from a string");
1311
1312
Jason Tishler6bc06ec2003-09-04 11:59:50 +00001313PyMODINIT_FUNC
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001314PyMarshal_Init(void)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001315{
R. David Murray666f1832009-05-13 01:08:35 +00001316 PyObject *mod = Py_InitModule3("marshal", marshal_methods,
1317 marshal_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001318 if (mod == NULL)
1319 return;
Martin v. Löwisef82d2f2004-06-27 16:51:46 +00001320 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001321}