blob: 46b3fa09af39874cc32e8b6256adc1c8c416b7aa [file] [log] [blame]
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000029
30******************************************************************/
31
32/* Write Python objects to files and read them back.
33 This is intended for writing and reading compiled Python code only;
34 a true persistent storage facility would be much harder, since
35 it would have to take circular links and sharing into account. */
36
Guido van Rossum79f25d91997-04-29 20:08:16 +000037#include "Python.h"
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000038#include "longintrepr.h"
39#include "compile.h"
40#include "marshal.h"
41
Fred Drake6da0b912000-06-28 18:47:56 +000042/* High water mark to determine when the marshalled object is dangerously deep
43 * and risks coring the interpreter. When the object stack gets this deep,
44 * raise an exception instead of continuing.
45 */
46#define MAX_MARSHAL_STACK_DEPTH 5000
47
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000048#define TYPE_NULL '0'
49#define TYPE_NONE 'N'
Guido van Rossume449af71996-10-11 16:25:41 +000050#define TYPE_ELLIPSIS '.'
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000051#define TYPE_INT 'i'
Guido van Rossumb0c168c1996-12-05 23:15:02 +000052#define TYPE_INT64 'I'
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000053#define TYPE_FLOAT 'f'
Guido van Rossum8a5c5d21996-01-12 01:09:56 +000054#define TYPE_COMPLEX 'x'
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000055#define TYPE_LONG 'l'
56#define TYPE_STRING 's'
57#define TYPE_TUPLE '('
58#define TYPE_LIST '['
59#define TYPE_DICT '{'
Guido van Rossum681d79a1995-07-18 14:51:37 +000060#define TYPE_CODE 'c'
Guido van Rossumc279b532000-03-10 23:03:02 +000061#define TYPE_UNICODE 'u'
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000062#define TYPE_UNKNOWN '?'
63
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000064typedef struct {
65 FILE *fp;
Guido van Rossumf2150601996-06-26 20:41:23 +000066 int error;
Fred Drake6da0b912000-06-28 18:47:56 +000067 int depth;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000068 /* If fp == NULL, the following are valid: */
Guido van Rossum79f25d91997-04-29 20:08:16 +000069 PyObject *str;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000070 char *ptr;
71 char *end;
72} WFILE;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000073
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000074#define w_byte(c, p) if (((p)->fp)) putc((c), (p)->fp); \
75 else if ((p)->ptr != (p)->end) *(p)->ptr++ = (c); \
76 else w_more(c, p)
77
78static void
79w_more(c, p)
80 char c;
81 WFILE *p;
82{
83 int size, newsize;
84 if (p->str == NULL)
85 return; /* An error already occurred */
Guido van Rossum79f25d91997-04-29 20:08:16 +000086 size = PyString_Size(p->str);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000087 newsize = size + 1024;
Guido van Rossum79f25d91997-04-29 20:08:16 +000088 if (_PyString_Resize(&p->str, newsize) != 0) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000089 p->ptr = p->end = NULL;
90 }
91 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +000092 p->ptr = PyString_AS_STRING((PyStringObject *)p->str) + size;
93 p->end =
94 PyString_AS_STRING((PyStringObject *)p->str) + newsize;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000095 *p->ptr++ = c;
96 }
97}
98
99static void
100w_string(s, n, p)
101 char *s;
102 int n;
103 WFILE *p;
104{
105 if (p->fp != NULL) {
106 fwrite(s, 1, n, p->fp);
107 }
108 else {
109 while (--n >= 0) {
110 w_byte(*s, p);
111 s++;
112 }
113 }
114}
115
116static void
117w_short(x, p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000118 int x;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000119 WFILE *p;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000120{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000121 w_byte( x & 0xff, p);
122 w_byte((x>> 8) & 0xff, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000123}
124
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000125static void
126w_long(x, p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000127 long x;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000128 WFILE *p;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000129{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000130 w_byte((int)( x & 0xff), p);
131 w_byte((int)((x>> 8) & 0xff), p);
132 w_byte((int)((x>>16) & 0xff), p);
133 w_byte((int)((x>>24) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000134}
135
Guido van Rossumc1547d91996-12-10 15:39:04 +0000136#if SIZEOF_LONG > 4
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000137static void
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000138w_long64(x, p)
139 long x;
140 WFILE *p;
141{
142 w_long(x, p);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000143 w_long(x>>32, p);
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000144}
Guido van Rossumc1547d91996-12-10 15:39:04 +0000145#endif
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000146
147static void
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000148w_object(v, p)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000149 PyObject *v;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000150 WFILE *p;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000151{
Guido van Rossum3a205f71995-02-17 15:10:07 +0000152 int i, n;
Guido van Rossumd076c731998-10-07 19:42:25 +0000153 PyBufferProcs *pb;
Fred Drake6da0b912000-06-28 18:47:56 +0000154
155 p->depth++;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000156
Fred Drake6da0b912000-06-28 18:47:56 +0000157 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
158 p->error = 2;
159 }
160 else if (v == NULL) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000161 w_byte(TYPE_NULL, p);
Guido van Rossum730806d1998-04-10 22:27:42 +0000162 }
163 else if (v == Py_None) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000164 w_byte(TYPE_NONE, p);
Guido van Rossum730806d1998-04-10 22:27:42 +0000165 }
166 else if (v == Py_Ellipsis) {
167 w_byte(TYPE_ELLIPSIS, p);
168 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000169 else if (PyInt_Check(v)) {
170 long x = PyInt_AS_LONG((PyIntObject *)v);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000171#if SIZEOF_LONG > 4
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000172 long y = x>>31;
173 if (y && y != -1) {
174 w_byte(TYPE_INT64, p);
175 w_long64(x, p);
176 }
Guido van Rossumc1547d91996-12-10 15:39:04 +0000177 else
178#endif
179 {
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000180 w_byte(TYPE_INT, p);
181 w_long(x, p);
182 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000183 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000184 else if (PyLong_Check(v)) {
185 PyLongObject *ob = (PyLongObject *)v;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000186 w_byte(TYPE_LONG, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000187 n = ob->ob_size;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000188 w_long((long)n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000189 if (n < 0)
190 n = -n;
191 for (i = 0; i < n; i++)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000192 w_short(ob->ob_digit[i], p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000193 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000194 else if (PyFloat_Check(v)) {
195 extern void PyFloat_AsString
196 Py_PROTO((char *, PyFloatObject *));
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000197 char buf[256]; /* Plenty to format any double */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000198 PyFloat_AsString(buf, (PyFloatObject *)v);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000199 n = strlen(buf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000200 w_byte(TYPE_FLOAT, p);
Guido van Rossum3a205f71995-02-17 15:10:07 +0000201 w_byte(n, p);
202 w_string(buf, n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000203 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000204#ifndef WITHOUT_COMPLEX
Guido van Rossum79f25d91997-04-29 20:08:16 +0000205 else if (PyComplex_Check(v)) {
206 extern void PyFloat_AsString
207 Py_PROTO((char *, PyFloatObject *));
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000208 char buf[256]; /* Plenty to format any double */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000209 PyFloatObject *temp;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000210 w_byte(TYPE_COMPLEX, p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000211 temp = (PyFloatObject*)PyFloat_FromDouble(
212 PyComplex_RealAsDouble(v));
213 PyFloat_AsString(buf, temp);
214 Py_DECREF(temp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000215 n = strlen(buf);
216 w_byte(n, p);
217 w_string(buf, n, p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000218 temp = (PyFloatObject*)PyFloat_FromDouble(
219 PyComplex_ImagAsDouble(v));
220 PyFloat_AsString(buf, temp);
221 Py_DECREF(temp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000222 n = strlen(buf);
223 w_byte(n, p);
224 w_string(buf, n, p);
225 }
226#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +0000227 else if (PyString_Check(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000228 w_byte(TYPE_STRING, p);
Guido van Rossumc279b532000-03-10 23:03:02 +0000229 n = PyString_GET_SIZE(v);
Guido van Rossum3a205f71995-02-17 15:10:07 +0000230 w_long((long)n, p);
Guido van Rossumc279b532000-03-10 23:03:02 +0000231 w_string(PyString_AS_STRING(v), n, p);
232 }
233 else if (PyUnicode_Check(v)) {
234 PyObject *utf8;
235 utf8 = PyUnicode_AsUTF8String(v);
236 if (utf8 == NULL) {
Guido van Rossum98626cd2000-06-28 23:24:19 +0000237 p->depth--;
238 p->error = 1;
239 return;
Guido van Rossumc279b532000-03-10 23:03:02 +0000240 }
241 w_byte(TYPE_UNICODE, p);
242 n = PyString_GET_SIZE(utf8);
243 w_long((long)n, p);
244 w_string(PyString_AS_STRING(utf8), n, p);
245 Py_DECREF(utf8);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000246 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000247 else if (PyTuple_Check(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000248 w_byte(TYPE_TUPLE, p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000249 n = PyTuple_Size(v);
Guido van Rossum3a205f71995-02-17 15:10:07 +0000250 w_long((long)n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000251 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000252 w_object(PyTuple_GET_ITEM(v, i), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000253 }
254 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000255 else if (PyList_Check(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000256 w_byte(TYPE_LIST, p);
Guido van Rossumc279b532000-03-10 23:03:02 +0000257 n = PyList_GET_SIZE(v);
Guido van Rossum3a205f71995-02-17 15:10:07 +0000258 w_long((long)n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000259 for (i = 0; i < n; i++) {
Guido van Rossumc279b532000-03-10 23:03:02 +0000260 w_object(PyList_GET_ITEM(v, i), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000261 }
262 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000263 else if (PyDict_Check(v)) {
Guido van Rossum25831651993-05-19 14:50:45 +0000264 int pos;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000265 PyObject *key, *value;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000266 w_byte(TYPE_DICT, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000267 /* This one is NULL object terminated! */
Guido van Rossum25831651993-05-19 14:50:45 +0000268 pos = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000269 while (PyDict_Next(v, &pos, &key, &value)) {
Guido van Rossum25831651993-05-19 14:50:45 +0000270 w_object(key, p);
271 w_object(value, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000272 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000273 w_object((PyObject *)NULL, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000274 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000275 else if (PyCode_Check(v)) {
276 PyCodeObject *co = (PyCodeObject *)v;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000277 w_byte(TYPE_CODE, p);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000278 w_short(co->co_argcount, p);
279 w_short(co->co_nlocals, p);
Guido van Rossum98a9b311997-01-17 21:07:08 +0000280 w_short(co->co_stacksize, p);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000281 w_short(co->co_flags, p);
Guido van Rossumd076c731998-10-07 19:42:25 +0000282 w_object(co->co_code, p);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000283 w_object(co->co_consts, p);
284 w_object(co->co_names, p);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000285 w_object(co->co_varnames, p);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000286 w_object(co->co_filename, p);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000287 w_object(co->co_name, p);
Guido van Rossumd031c891997-01-24 03:44:17 +0000288 w_short(co->co_firstlineno, p);
289 w_object(co->co_lnotab, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000290 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000291 else if ((pb = v->ob_type->tp_as_buffer) != NULL &&
292 pb->bf_getsegcount != NULL &&
293 pb->bf_getreadbuffer != NULL &&
294 (*pb->bf_getsegcount)(v, NULL) == 1)
295 {
296 /* Write unknown buffer-style objects as a string */
297 char *s;
298 w_byte(TYPE_STRING, p);
299 n = (*pb->bf_getreadbuffer)(v, 0, (void **)&s);
300 w_long((long)n, p);
301 w_string(s, n, p);
302 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000303 else {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000304 w_byte(TYPE_UNKNOWN, p);
Guido van Rossumf2150601996-06-26 20:41:23 +0000305 p->error = 1;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000306 }
Guido van Rossum98626cd2000-06-28 23:24:19 +0000307
308 p->depth--;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000309}
310
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000311void
Guido van Rossum79f25d91997-04-29 20:08:16 +0000312PyMarshal_WriteLongToFile(x, fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000313 long x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000314 FILE *fp;
315{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000316 WFILE wf;
317 wf.fp = fp;
Guido van Rossumf2150601996-06-26 20:41:23 +0000318 wf.error = 0;
Fred Drake6da0b912000-06-28 18:47:56 +0000319 wf.depth = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000320 w_long(x, &wf);
321}
322
323void
Guido van Rossum79f25d91997-04-29 20:08:16 +0000324PyMarshal_WriteObjectToFile(x, fp)
325 PyObject *x;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000326 FILE *fp;
327{
328 WFILE wf;
329 wf.fp = fp;
Guido van Rossumf2150601996-06-26 20:41:23 +0000330 wf.error = 0;
Guido van Rossum98626cd2000-06-28 23:24:19 +0000331 wf.depth = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000332 w_object(x, &wf);
333}
334
335typedef WFILE RFILE; /* Same struct with different invariants */
336
Guido van Rossum8d617a61995-03-09 12:12:11 +0000337#define rs_byte(p) (((p)->ptr != (p)->end) ? (unsigned char)*(p)->ptr++ : EOF)
338
339#define r_byte(p) ((p)->fp ? getc((p)->fp) : rs_byte(p))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000340
341static int
342r_string(s, n, p)
343 char *s;
344 int n;
345 RFILE *p;
346{
347 if (p->fp != NULL)
348 return fread(s, 1, n, p->fp);
349 if (p->end - p->ptr < n)
350 n = p->end - p->ptr;
351 memcpy(s, p->ptr, n);
352 p->ptr += n;
353 return n;
354}
355
356static int
357r_short(p)
358 RFILE *p;
359{
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000360 register short x;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000361 x = r_byte(p);
362 x |= r_byte(p) << 8;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000363 /* XXX If your short is > 16 bits, add sign-extension here!!! */
364 return x;
365}
366
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000367static long
368r_long(p)
369 RFILE *p;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000370{
371 register long x;
Guido van Rossum8d617a61995-03-09 12:12:11 +0000372 register FILE *fp = p->fp;
373 if (fp) {
374 x = getc(fp);
375 x |= (long)getc(fp) << 8;
376 x |= (long)getc(fp) << 16;
377 x |= (long)getc(fp) << 24;
378 }
379 else {
380 x = rs_byte(p);
381 x |= (long)rs_byte(p) << 8;
382 x |= (long)rs_byte(p) << 16;
383 x |= (long)rs_byte(p) << 24;
384 }
Guido van Rossumc1547d91996-12-10 15:39:04 +0000385#if SIZEOF_LONG > 4
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000386 /* Sign extension for 64-bit machines */
387 x <<= (8*sizeof(long) - 32);
388 x >>= (8*sizeof(long) - 32);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000389#endif
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000390 return x;
391}
392
393static long
394r_long64(p)
395 RFILE *p;
396{
397 register long x;
Guido van Rossumc1547d91996-12-10 15:39:04 +0000398 x = r_long(p);
399#if SIZEOF_LONG > 4
400 x = (x & 0xFFFFFFFF) | (r_long(p) << 32);
401#else
402 if (r_long(p) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000403 PyObject *f = PySys_GetObject("stderr");
Guido van Rossumc1547d91996-12-10 15:39:04 +0000404 if (f != NULL)
Guido van Rossum7e8d26d1997-05-22 22:35:47 +0000405 (void) PyFile_WriteString(
Guido van Rossumc1547d91996-12-10 15:39:04 +0000406 "Warning: un-marshal 64-bit int in 32-bit mode\n",
407 f);
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000408 }
Guido van Rossumc1547d91996-12-10 15:39:04 +0000409#endif
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000410 return x;
411}
412
Guido van Rossum79f25d91997-04-29 20:08:16 +0000413static PyObject *
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000414r_object(p)
415 RFILE *p;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000416{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000417 PyObject *v, *v2;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000418 long i, n;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000419 int type = r_byte(p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000420
421 switch (type) {
422
423 case EOF:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000424 PyErr_SetString(PyExc_EOFError,
425 "EOF read where object expected");
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000426 return NULL;
427
428 case TYPE_NULL:
429 return NULL;
430
431 case TYPE_NONE:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000432 Py_INCREF(Py_None);
433 return Py_None;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000434
Guido van Rossume449af71996-10-11 16:25:41 +0000435 case TYPE_ELLIPSIS:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000436 Py_INCREF(Py_Ellipsis);
Guido van Rossume449af71996-10-11 16:25:41 +0000437 return Py_Ellipsis;
Guido van Rossum8861b741996-07-30 16:49:37 +0000438
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000439 case TYPE_INT:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000440 return PyInt_FromLong(r_long(p));
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000441
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000442 case TYPE_INT64:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000443 return PyInt_FromLong(r_long64(p));
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000444
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000445 case TYPE_LONG:
446 {
447 int size;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000448 PyLongObject *ob;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000449 n = r_long(p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000450 size = n<0 ? -n : n;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000451 ob = _PyLong_New(size);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000452 if (ob == NULL)
453 return NULL;
454 ob->ob_size = n;
455 for (i = 0; i < size; i++)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000456 ob->ob_digit[i] = r_short(p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457 return (PyObject *)ob;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000458 }
459
460 case TYPE_FLOAT:
461 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000462 extern double atof Py_PROTO((const char *));
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000463 char buf[256];
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000464 double dx;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000465 n = r_byte(p);
466 if (r_string(buf, (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000467 PyErr_SetString(PyExc_EOFError,
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000468 "EOF read where object expected");
469 return NULL;
470 }
471 buf[n] = '\0';
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000472 PyFPE_START_PROTECT("atof", return 0)
473 dx = atof(buf);
Guido van Rossum45b83911997-03-14 04:32:50 +0000474 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000475 return PyFloat_FromDouble(dx);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000476 }
477
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000478#ifndef WITHOUT_COMPLEX
479 case TYPE_COMPLEX:
480 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000481 extern double atof Py_PROTO((const char *));
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000482 char buf[256];
Guido van Rossum530956d1996-07-21 02:27:43 +0000483 Py_complex c;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000484 n = r_byte(p);
485 if (r_string(buf, (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000486 PyErr_SetString(PyExc_EOFError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000487 "EOF read where object expected");
488 return NULL;
489 }
490 buf[n] = '\0';
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000491 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000492 c.real = atof(buf);
Guido van Rossum45b83911997-03-14 04:32:50 +0000493 PyFPE_END_PROTECT(c)
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000494 n = r_byte(p);
495 if (r_string(buf, (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000496 PyErr_SetString(PyExc_EOFError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000497 "EOF read where object expected");
498 return NULL;
499 }
500 buf[n] = '\0';
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000501 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000502 c.imag = atof(buf);
Guido van Rossum45b83911997-03-14 04:32:50 +0000503 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000504 return PyComplex_FromCComplex(c);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000505 }
506#endif
507
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000508 case TYPE_STRING:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000509 n = r_long(p);
Guido van Rossuma45cb451998-06-08 20:27:29 +0000510 if (n < 0) {
511 PyErr_SetString(PyExc_ValueError, "bad marshal data");
512 return NULL;
513 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000514 v = PyString_FromStringAndSize((char *)NULL, n);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000515 if (v != NULL) {
Guido van Rossumc279b532000-03-10 23:03:02 +0000516 if (r_string(PyString_AS_STRING(v), (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000517 Py_DECREF(v);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000518 v = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000519 PyErr_SetString(PyExc_EOFError,
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000520 "EOF read where object expected");
521 }
522 }
523 return v;
524
Guido van Rossumc279b532000-03-10 23:03:02 +0000525 case TYPE_UNICODE:
526 {
527 char *buffer;
528
529 n = r_long(p);
530 if (n < 0) {
531 PyErr_SetString(PyExc_ValueError, "bad marshal data");
532 return NULL;
533 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000534 buffer = PyMem_NEW(char, n);
Guido van Rossumc279b532000-03-10 23:03:02 +0000535 if (buffer == NULL)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000536 return PyErr_NoMemory();
Guido van Rossumc279b532000-03-10 23:03:02 +0000537 if (r_string(buffer, (int)n, p) != n) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000538 PyMem_DEL(buffer);
Guido van Rossumc279b532000-03-10 23:03:02 +0000539 PyErr_SetString(PyExc_EOFError,
540 "EOF read where object expected");
541 return NULL;
542 }
543 v = PyUnicode_DecodeUTF8(buffer, n, NULL);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000544 PyMem_DEL(buffer);
Guido van Rossumc279b532000-03-10 23:03:02 +0000545 return v;
546 }
547
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000548 case TYPE_TUPLE:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000549 n = r_long(p);
Guido van Rossuma45cb451998-06-08 20:27:29 +0000550 if (n < 0) {
551 PyErr_SetString(PyExc_ValueError, "bad marshal data");
552 return NULL;
553 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000554 v = PyTuple_New((int)n);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000555 if (v == NULL)
556 return v;
Jack Jansen9513f2c1995-10-27 13:21:28 +0000557 for (i = 0; i < n; i++) {
558 v2 = r_object(p);
559 if ( v2 == NULL ) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000560 Py_DECREF(v);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000561 v = NULL;
562 break;
563 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000564 PyTuple_SET_ITEM(v, (int)i, v2);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000565 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000566 return v;
567
568 case TYPE_LIST:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000569 n = r_long(p);
Guido van Rossuma45cb451998-06-08 20:27:29 +0000570 if (n < 0) {
571 PyErr_SetString(PyExc_ValueError, "bad marshal data");
572 return NULL;
573 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000574 v = PyList_New((int)n);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000575 if (v == NULL)
576 return v;
Jack Jansen9513f2c1995-10-27 13:21:28 +0000577 for (i = 0; i < n; i++) {
578 v2 = r_object(p);
579 if ( v2 == NULL ) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000580 Py_DECREF(v);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000581 v = NULL;
582 break;
583 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000584 PyList_SetItem(v, (int)i, v2);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000585 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000586 return v;
587
Guido van Rossum64b45521991-06-07 13:58:22 +0000588 case TYPE_DICT:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000589 v = PyDict_New();
Guido van Rossum64b45521991-06-07 13:58:22 +0000590 if (v == NULL)
591 return NULL;
592 for (;;) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000593 PyObject *key, *val;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000594 key = r_object(p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000595 if (key == NULL)
Guido van Rossumf2150601996-06-26 20:41:23 +0000596 break; /* XXX Assume TYPE_NULL, not an error */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000597 val = r_object(p);
Guido van Rossumf2150601996-06-26 20:41:23 +0000598 if (val != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000599 PyDict_SetItem(v, key, val);
600 Py_DECREF(key);
601 Py_XDECREF(val);
Guido van Rossum64b45521991-06-07 13:58:22 +0000602 }
603 return v;
604
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000605 case TYPE_CODE:
606 {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000607 int argcount = r_short(p);
608 int nlocals = r_short(p);
Guido van Rossum98a9b311997-01-17 21:07:08 +0000609 int stacksize = r_short(p);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000610 int flags = r_short(p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000611 PyObject *code = NULL;
612 PyObject *consts = NULL;
613 PyObject *names = NULL;
614 PyObject *varnames = NULL;
615 PyObject *filename = NULL;
616 PyObject *name = NULL;
Guido van Rossum0f4bbd21997-02-14 21:12:56 +0000617 int firstlineno = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000618 PyObject *lnotab = NULL;
Jack Jansen9513f2c1995-10-27 13:21:28 +0000619
620 code = r_object(p);
621 if (code) consts = r_object(p);
622 if (consts) names = r_object(p);
623 if (names) varnames = r_object(p);
624 if (varnames) filename = r_object(p);
625 if (filename) name = r_object(p);
Guido van Rossumd031c891997-01-24 03:44:17 +0000626 if (name) {
627 firstlineno = r_short(p);
628 lnotab = r_object(p);
629 }
Jack Jansen9513f2c1995-10-27 13:21:28 +0000630
Guido van Rossum79f25d91997-04-29 20:08:16 +0000631 if (!PyErr_Occurred()) {
632 v = (PyObject *) PyCode_New(
Guido van Rossum98a9b311997-01-17 21:07:08 +0000633 argcount, nlocals, stacksize, flags,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000634 code, consts, names, varnames,
Guido van Rossumd031c891997-01-24 03:44:17 +0000635 filename, name, firstlineno, lnotab);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000636 }
637 else
638 v = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000639 Py_XDECREF(code);
640 Py_XDECREF(consts);
641 Py_XDECREF(names);
642 Py_XDECREF(varnames);
643 Py_XDECREF(filename);
644 Py_XDECREF(name);
Guido van Rossum6fc06e71997-07-26 23:30:18 +0000645 Py_XDECREF(lnotab);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000646
647 }
648 return v;
649
650 default:
Guido van Rossumf2150601996-06-26 20:41:23 +0000651 /* Bogus data got written, which isn't ideal.
652 This will let you keep working and recover. */
Guido van Rossuma45cb451998-06-08 20:27:29 +0000653 PyErr_SetString(PyExc_ValueError, "bad marshal data");
654 return NULL;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000655
656 }
657}
658
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000659long
Guido van Rossum79f25d91997-04-29 20:08:16 +0000660PyMarshal_ReadLongFromFile(fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000661 FILE *fp;
662{
663 RFILE rf;
664 rf.fp = fp;
665 return r_long(&rf);
666}
667
Guido van Rossum79f25d91997-04-29 20:08:16 +0000668PyObject *
669PyMarshal_ReadObjectFromFile(fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000670 FILE *fp;
671{
672 RFILE rf;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000673 if (PyErr_Occurred()) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000674 fprintf(stderr, "XXX rd_object called with exception set\n");
675 return NULL;
676 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000677 rf.fp = fp;
678 return r_object(&rf);
679}
680
Guido van Rossum79f25d91997-04-29 20:08:16 +0000681PyObject *
682PyMarshal_ReadObjectFromString(str, len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000683 char *str;
684 int len;
685{
686 RFILE rf;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000687 if (PyErr_Occurred()) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000688 fprintf(stderr, "XXX rds_object called with exception set\n");
689 return NULL;
690 }
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000691 rf.fp = NULL;
692 rf.str = NULL;
693 rf.ptr = str;
694 rf.end = str + len;
695 return r_object(&rf);
696}
697
Guido van Rossum79f25d91997-04-29 20:08:16 +0000698PyObject *
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000699PyMarshal_WriteObjectToString(x) /* wrs_object() */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000700 PyObject *x;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000701{
702 WFILE wf;
703 wf.fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000704 wf.str = PyString_FromStringAndSize((char *)NULL, 50);
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000705 if (wf.str == NULL)
706 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000707 wf.ptr = PyString_AS_STRING((PyStringObject *)wf.str);
708 wf.end = wf.ptr + PyString_Size(wf.str);
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000709 wf.error = 0;
Fred Drake6da0b912000-06-28 18:47:56 +0000710 wf.depth = 0;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000711 w_object(x, &wf);
712 if (wf.str != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000713 _PyString_Resize(&wf.str,
714 (int) (wf.ptr -
715 PyString_AS_STRING((PyStringObject *)wf.str)));
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000716 if (wf.error) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000717 Py_XDECREF(wf.str);
Fred Drake6da0b912000-06-28 18:47:56 +0000718 PyErr_SetString(PyExc_ValueError,
719 (wf.error==1)?"unmarshallable object"
720 :"object too deeply nested to marshal");
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000721 return NULL;
722 }
723 return wf.str;
724}
725
Guido van Rossum64b45521991-06-07 13:58:22 +0000726/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000727
Guido van Rossum79f25d91997-04-29 20:08:16 +0000728static PyObject *
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000729marshal_dump(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000730 PyObject *self;
731 PyObject *args;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000732{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000733 WFILE wf;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000734 PyObject *x;
735 PyObject *f;
Guido van Rossum2efa3692000-03-31 00:37:41 +0000736 if (!PyArg_ParseTuple(args, "OO:dump", &x, &f))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000737 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000738 if (!PyFile_Check(f)) {
739 PyErr_SetString(PyExc_TypeError,
740 "marshal.dump() 2nd arg must be file");
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000741 return NULL;
742 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000743 wf.fp = PyFile_AsFile(f);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000744 wf.str = NULL;
745 wf.ptr = wf.end = NULL;
Guido van Rossumf2150601996-06-26 20:41:23 +0000746 wf.error = 0;
Fred Drake6da0b912000-06-28 18:47:56 +0000747 wf.depth = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000748 w_object(x, &wf);
Guido van Rossumf2150601996-06-26 20:41:23 +0000749 if (wf.error) {
Fred Drake6da0b912000-06-28 18:47:56 +0000750 PyErr_SetString(PyExc_ValueError,
751 (wf.error==1)?"unmarshallable object"
752 :"object too deeply nested to marshal");
Guido van Rossumf2150601996-06-26 20:41:23 +0000753 return NULL;
754 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000755 Py_INCREF(Py_None);
756 return Py_None;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000757}
758
Guido van Rossum79f25d91997-04-29 20:08:16 +0000759static PyObject *
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000760marshal_load(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000761 PyObject *self;
762 PyObject *args;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000763{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000764 RFILE rf;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000765 PyObject *f;
766 PyObject *v;
Guido van Rossum2efa3692000-03-31 00:37:41 +0000767 if (!PyArg_ParseTuple(args, "O:load", &f))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000768 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000769 if (!PyFile_Check(f)) {
770 PyErr_SetString(PyExc_TypeError,
771 "marshal.load() arg must be file");
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000772 return NULL;
773 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000774 rf.fp = PyFile_AsFile(f);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000775 rf.str = NULL;
776 rf.ptr = rf.end = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000777 PyErr_Clear();
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000778 v = r_object(&rf);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000779 if (PyErr_Occurred()) {
780 Py_XDECREF(v);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000781 v = NULL;
782 }
783 return v;
784}
785
Guido van Rossum79f25d91997-04-29 20:08:16 +0000786static PyObject *
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000787marshal_dumps(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000788 PyObject *self;
789 PyObject *args;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000790{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000791 PyObject *x;
Guido van Rossum2efa3692000-03-31 00:37:41 +0000792 if (!PyArg_ParseTuple(args, "O:dumps", &x))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000793 return NULL;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000794 return PyMarshal_WriteObjectToString(x);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000795}
796
Guido van Rossum79f25d91997-04-29 20:08:16 +0000797static PyObject *
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000798marshal_loads(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000799 PyObject *self;
800 PyObject *args;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000801{
802 RFILE rf;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000803 PyObject *v;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000804 char *s;
805 int n;
Guido van Rossum2efa3692000-03-31 00:37:41 +0000806 if (!PyArg_ParseTuple(args, "s#:loads", &s, &n))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000807 return NULL;
808 rf.fp = NULL;
809 rf.str = args;
810 rf.ptr = s;
811 rf.end = s + n;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000812 PyErr_Clear();
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000813 v = r_object(&rf);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000814 if (PyErr_Occurred()) {
815 Py_XDECREF(v);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000816 v = NULL;
817 }
818 return v;
819}
820
Guido van Rossum79f25d91997-04-29 20:08:16 +0000821static PyMethodDef marshal_methods[] = {
Guido van Rossum2efa3692000-03-31 00:37:41 +0000822 {"dump", marshal_dump, 1},
823 {"load", marshal_load, 1},
824 {"dumps", marshal_dumps, 1},
825 {"loads", marshal_loads, 1},
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000826 {NULL, NULL} /* sentinel */
827};
828
829void
Guido van Rossum79f25d91997-04-29 20:08:16 +0000830PyMarshal_Init()
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000831{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000832 (void) Py_InitModule("marshal", marshal_methods);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000833}