blob: a316d18e696bd144ca8a4a3044566ded94b0d059 [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) {
237 p->error = 1;
238 return;
239 }
240 w_byte(TYPE_UNICODE, p);
241 n = PyString_GET_SIZE(utf8);
242 w_long((long)n, p);
243 w_string(PyString_AS_STRING(utf8), n, p);
244 Py_DECREF(utf8);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000245 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000246 else if (PyTuple_Check(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000247 w_byte(TYPE_TUPLE, p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000248 n = PyTuple_Size(v);
Guido van Rossum3a205f71995-02-17 15:10:07 +0000249 w_long((long)n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000250 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000251 w_object(PyTuple_GET_ITEM(v, i), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000252 }
253 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000254 else if (PyList_Check(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000255 w_byte(TYPE_LIST, p);
Guido van Rossumc279b532000-03-10 23:03:02 +0000256 n = PyList_GET_SIZE(v);
Guido van Rossum3a205f71995-02-17 15:10:07 +0000257 w_long((long)n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000258 for (i = 0; i < n; i++) {
Guido van Rossumc279b532000-03-10 23:03:02 +0000259 w_object(PyList_GET_ITEM(v, i), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000260 }
261 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000262 else if (PyDict_Check(v)) {
Guido van Rossum25831651993-05-19 14:50:45 +0000263 int pos;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000264 PyObject *key, *value;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000265 w_byte(TYPE_DICT, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000266 /* This one is NULL object terminated! */
Guido van Rossum25831651993-05-19 14:50:45 +0000267 pos = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000268 while (PyDict_Next(v, &pos, &key, &value)) {
Guido van Rossum25831651993-05-19 14:50:45 +0000269 w_object(key, p);
270 w_object(value, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000271 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000272 w_object((PyObject *)NULL, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000273 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000274 else if (PyCode_Check(v)) {
275 PyCodeObject *co = (PyCodeObject *)v;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000276 w_byte(TYPE_CODE, p);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000277 w_short(co->co_argcount, p);
278 w_short(co->co_nlocals, p);
Guido van Rossum98a9b311997-01-17 21:07:08 +0000279 w_short(co->co_stacksize, p);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000280 w_short(co->co_flags, p);
Guido van Rossumd076c731998-10-07 19:42:25 +0000281 w_object(co->co_code, p);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000282 w_object(co->co_consts, p);
283 w_object(co->co_names, p);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000284 w_object(co->co_varnames, p);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000285 w_object(co->co_filename, p);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000286 w_object(co->co_name, p);
Guido van Rossumd031c891997-01-24 03:44:17 +0000287 w_short(co->co_firstlineno, p);
288 w_object(co->co_lnotab, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000289 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000290 else if ((pb = v->ob_type->tp_as_buffer) != NULL &&
291 pb->bf_getsegcount != NULL &&
292 pb->bf_getreadbuffer != NULL &&
293 (*pb->bf_getsegcount)(v, NULL) == 1)
294 {
295 /* Write unknown buffer-style objects as a string */
296 char *s;
297 w_byte(TYPE_STRING, p);
298 n = (*pb->bf_getreadbuffer)(v, 0, (void **)&s);
299 w_long((long)n, p);
300 w_string(s, n, p);
301 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000302 else {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000303 w_byte(TYPE_UNKNOWN, p);
Guido van Rossumf2150601996-06-26 20:41:23 +0000304 p->error = 1;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000305 }
306}
307
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000308void
Guido van Rossum79f25d91997-04-29 20:08:16 +0000309PyMarshal_WriteLongToFile(x, fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000310 long x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000311 FILE *fp;
312{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000313 WFILE wf;
314 wf.fp = fp;
Guido van Rossumf2150601996-06-26 20:41:23 +0000315 wf.error = 0;
Fred Drake6da0b912000-06-28 18:47:56 +0000316 wf.depth = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000317 w_long(x, &wf);
318}
319
320void
Guido van Rossum79f25d91997-04-29 20:08:16 +0000321PyMarshal_WriteObjectToFile(x, fp)
322 PyObject *x;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000323 FILE *fp;
324{
325 WFILE wf;
326 wf.fp = fp;
Guido van Rossumf2150601996-06-26 20:41:23 +0000327 wf.error = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000328 w_object(x, &wf);
329}
330
331typedef WFILE RFILE; /* Same struct with different invariants */
332
Guido van Rossum8d617a61995-03-09 12:12:11 +0000333#define rs_byte(p) (((p)->ptr != (p)->end) ? (unsigned char)*(p)->ptr++ : EOF)
334
335#define r_byte(p) ((p)->fp ? getc((p)->fp) : rs_byte(p))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000336
337static int
338r_string(s, n, p)
339 char *s;
340 int n;
341 RFILE *p;
342{
343 if (p->fp != NULL)
344 return fread(s, 1, n, p->fp);
345 if (p->end - p->ptr < n)
346 n = p->end - p->ptr;
347 memcpy(s, p->ptr, n);
348 p->ptr += n;
349 return n;
350}
351
352static int
353r_short(p)
354 RFILE *p;
355{
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000356 register short x;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000357 x = r_byte(p);
358 x |= r_byte(p) << 8;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000359 /* XXX If your short is > 16 bits, add sign-extension here!!! */
360 return x;
361}
362
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000363static long
364r_long(p)
365 RFILE *p;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000366{
367 register long x;
Guido van Rossum8d617a61995-03-09 12:12:11 +0000368 register FILE *fp = p->fp;
369 if (fp) {
370 x = getc(fp);
371 x |= (long)getc(fp) << 8;
372 x |= (long)getc(fp) << 16;
373 x |= (long)getc(fp) << 24;
374 }
375 else {
376 x = rs_byte(p);
377 x |= (long)rs_byte(p) << 8;
378 x |= (long)rs_byte(p) << 16;
379 x |= (long)rs_byte(p) << 24;
380 }
Guido van Rossumc1547d91996-12-10 15:39:04 +0000381#if SIZEOF_LONG > 4
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000382 /* Sign extension for 64-bit machines */
383 x <<= (8*sizeof(long) - 32);
384 x >>= (8*sizeof(long) - 32);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000385#endif
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000386 return x;
387}
388
389static long
390r_long64(p)
391 RFILE *p;
392{
393 register long x;
Guido van Rossumc1547d91996-12-10 15:39:04 +0000394 x = r_long(p);
395#if SIZEOF_LONG > 4
396 x = (x & 0xFFFFFFFF) | (r_long(p) << 32);
397#else
398 if (r_long(p) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000399 PyObject *f = PySys_GetObject("stderr");
Guido van Rossumc1547d91996-12-10 15:39:04 +0000400 if (f != NULL)
Guido van Rossum7e8d26d1997-05-22 22:35:47 +0000401 (void) PyFile_WriteString(
Guido van Rossumc1547d91996-12-10 15:39:04 +0000402 "Warning: un-marshal 64-bit int in 32-bit mode\n",
403 f);
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000404 }
Guido van Rossumc1547d91996-12-10 15:39:04 +0000405#endif
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000406 return x;
407}
408
Guido van Rossum79f25d91997-04-29 20:08:16 +0000409static PyObject *
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000410r_object(p)
411 RFILE *p;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000412{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000413 PyObject *v, *v2;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000414 long i, n;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000415 int type = r_byte(p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000416
417 switch (type) {
418
419 case EOF:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000420 PyErr_SetString(PyExc_EOFError,
421 "EOF read where object expected");
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000422 return NULL;
423
424 case TYPE_NULL:
425 return NULL;
426
427 case TYPE_NONE:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000428 Py_INCREF(Py_None);
429 return Py_None;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000430
Guido van Rossume449af71996-10-11 16:25:41 +0000431 case TYPE_ELLIPSIS:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000432 Py_INCREF(Py_Ellipsis);
Guido van Rossume449af71996-10-11 16:25:41 +0000433 return Py_Ellipsis;
Guido van Rossum8861b741996-07-30 16:49:37 +0000434
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000435 case TYPE_INT:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000436 return PyInt_FromLong(r_long(p));
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000437
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000438 case TYPE_INT64:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000439 return PyInt_FromLong(r_long64(p));
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000440
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000441 case TYPE_LONG:
442 {
443 int size;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000444 PyLongObject *ob;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000445 n = r_long(p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000446 size = n<0 ? -n : n;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000447 ob = _PyLong_New(size);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000448 if (ob == NULL)
449 return NULL;
450 ob->ob_size = n;
451 for (i = 0; i < size; i++)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000452 ob->ob_digit[i] = r_short(p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000453 return (PyObject *)ob;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000454 }
455
456 case TYPE_FLOAT:
457 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000458 extern double atof Py_PROTO((const char *));
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000459 char buf[256];
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000460 double dx;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000461 n = r_byte(p);
462 if (r_string(buf, (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000463 PyErr_SetString(PyExc_EOFError,
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000464 "EOF read where object expected");
465 return NULL;
466 }
467 buf[n] = '\0';
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000468 PyFPE_START_PROTECT("atof", return 0)
469 dx = atof(buf);
Guido van Rossum45b83911997-03-14 04:32:50 +0000470 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000471 return PyFloat_FromDouble(dx);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000472 }
473
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000474#ifndef WITHOUT_COMPLEX
475 case TYPE_COMPLEX:
476 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000477 extern double atof Py_PROTO((const char *));
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000478 char buf[256];
Guido van Rossum530956d1996-07-21 02:27:43 +0000479 Py_complex c;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000480 n = r_byte(p);
481 if (r_string(buf, (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000482 PyErr_SetString(PyExc_EOFError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000483 "EOF read where object expected");
484 return NULL;
485 }
486 buf[n] = '\0';
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000487 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000488 c.real = atof(buf);
Guido van Rossum45b83911997-03-14 04:32:50 +0000489 PyFPE_END_PROTECT(c)
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000490 n = r_byte(p);
491 if (r_string(buf, (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000492 PyErr_SetString(PyExc_EOFError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000493 "EOF read where object expected");
494 return NULL;
495 }
496 buf[n] = '\0';
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000497 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000498 c.imag = atof(buf);
Guido van Rossum45b83911997-03-14 04:32:50 +0000499 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000500 return PyComplex_FromCComplex(c);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000501 }
502#endif
503
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000504 case TYPE_STRING:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000505 n = r_long(p);
Guido van Rossuma45cb451998-06-08 20:27:29 +0000506 if (n < 0) {
507 PyErr_SetString(PyExc_ValueError, "bad marshal data");
508 return NULL;
509 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000510 v = PyString_FromStringAndSize((char *)NULL, n);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000511 if (v != NULL) {
Guido van Rossumc279b532000-03-10 23:03:02 +0000512 if (r_string(PyString_AS_STRING(v), (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000513 Py_DECREF(v);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000514 v = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000515 PyErr_SetString(PyExc_EOFError,
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000516 "EOF read where object expected");
517 }
518 }
519 return v;
520
Guido van Rossumc279b532000-03-10 23:03:02 +0000521 case TYPE_UNICODE:
522 {
523 char *buffer;
524
525 n = r_long(p);
526 if (n < 0) {
527 PyErr_SetString(PyExc_ValueError, "bad marshal data");
528 return NULL;
529 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000530 buffer = PyMem_NEW(char, n);
Guido van Rossumc279b532000-03-10 23:03:02 +0000531 if (buffer == NULL)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000532 return PyErr_NoMemory();
Guido van Rossumc279b532000-03-10 23:03:02 +0000533 if (r_string(buffer, (int)n, p) != n) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000534 PyMem_DEL(buffer);
Guido van Rossumc279b532000-03-10 23:03:02 +0000535 PyErr_SetString(PyExc_EOFError,
536 "EOF read where object expected");
537 return NULL;
538 }
539 v = PyUnicode_DecodeUTF8(buffer, n, NULL);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000540 PyMem_DEL(buffer);
Guido van Rossumc279b532000-03-10 23:03:02 +0000541 return v;
542 }
543
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000544 case TYPE_TUPLE:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000545 n = r_long(p);
Guido van Rossuma45cb451998-06-08 20:27:29 +0000546 if (n < 0) {
547 PyErr_SetString(PyExc_ValueError, "bad marshal data");
548 return NULL;
549 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000550 v = PyTuple_New((int)n);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000551 if (v == NULL)
552 return v;
Jack Jansen9513f2c1995-10-27 13:21:28 +0000553 for (i = 0; i < n; i++) {
554 v2 = r_object(p);
555 if ( v2 == NULL ) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000556 Py_DECREF(v);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000557 v = NULL;
558 break;
559 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000560 PyTuple_SET_ITEM(v, (int)i, v2);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000561 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000562 return v;
563
564 case TYPE_LIST:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000565 n = r_long(p);
Guido van Rossuma45cb451998-06-08 20:27:29 +0000566 if (n < 0) {
567 PyErr_SetString(PyExc_ValueError, "bad marshal data");
568 return NULL;
569 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000570 v = PyList_New((int)n);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000571 if (v == NULL)
572 return v;
Jack Jansen9513f2c1995-10-27 13:21:28 +0000573 for (i = 0; i < n; i++) {
574 v2 = r_object(p);
575 if ( v2 == NULL ) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000576 Py_DECREF(v);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000577 v = NULL;
578 break;
579 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000580 PyList_SetItem(v, (int)i, v2);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000581 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000582 return v;
583
Guido van Rossum64b45521991-06-07 13:58:22 +0000584 case TYPE_DICT:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000585 v = PyDict_New();
Guido van Rossum64b45521991-06-07 13:58:22 +0000586 if (v == NULL)
587 return NULL;
588 for (;;) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000589 PyObject *key, *val;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000590 key = r_object(p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000591 if (key == NULL)
Guido van Rossumf2150601996-06-26 20:41:23 +0000592 break; /* XXX Assume TYPE_NULL, not an error */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000593 val = r_object(p);
Guido van Rossumf2150601996-06-26 20:41:23 +0000594 if (val != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000595 PyDict_SetItem(v, key, val);
596 Py_DECREF(key);
597 Py_XDECREF(val);
Guido van Rossum64b45521991-06-07 13:58:22 +0000598 }
599 return v;
600
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000601 case TYPE_CODE:
602 {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000603 int argcount = r_short(p);
604 int nlocals = r_short(p);
Guido van Rossum98a9b311997-01-17 21:07:08 +0000605 int stacksize = r_short(p);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000606 int flags = r_short(p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000607 PyObject *code = NULL;
608 PyObject *consts = NULL;
609 PyObject *names = NULL;
610 PyObject *varnames = NULL;
611 PyObject *filename = NULL;
612 PyObject *name = NULL;
Guido van Rossum0f4bbd21997-02-14 21:12:56 +0000613 int firstlineno = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000614 PyObject *lnotab = NULL;
Jack Jansen9513f2c1995-10-27 13:21:28 +0000615
616 code = r_object(p);
617 if (code) consts = r_object(p);
618 if (consts) names = r_object(p);
619 if (names) varnames = r_object(p);
620 if (varnames) filename = r_object(p);
621 if (filename) name = r_object(p);
Guido van Rossumd031c891997-01-24 03:44:17 +0000622 if (name) {
623 firstlineno = r_short(p);
624 lnotab = r_object(p);
625 }
Jack Jansen9513f2c1995-10-27 13:21:28 +0000626
Guido van Rossum79f25d91997-04-29 20:08:16 +0000627 if (!PyErr_Occurred()) {
628 v = (PyObject *) PyCode_New(
Guido van Rossum98a9b311997-01-17 21:07:08 +0000629 argcount, nlocals, stacksize, flags,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000630 code, consts, names, varnames,
Guido van Rossumd031c891997-01-24 03:44:17 +0000631 filename, name, firstlineno, lnotab);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000632 }
633 else
634 v = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000635 Py_XDECREF(code);
636 Py_XDECREF(consts);
637 Py_XDECREF(names);
638 Py_XDECREF(varnames);
639 Py_XDECREF(filename);
640 Py_XDECREF(name);
Guido van Rossum6fc06e71997-07-26 23:30:18 +0000641 Py_XDECREF(lnotab);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000642
643 }
644 return v;
645
646 default:
Guido van Rossumf2150601996-06-26 20:41:23 +0000647 /* Bogus data got written, which isn't ideal.
648 This will let you keep working and recover. */
Guido van Rossuma45cb451998-06-08 20:27:29 +0000649 PyErr_SetString(PyExc_ValueError, "bad marshal data");
650 return NULL;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000651
652 }
653}
654
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000655long
Guido van Rossum79f25d91997-04-29 20:08:16 +0000656PyMarshal_ReadLongFromFile(fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000657 FILE *fp;
658{
659 RFILE rf;
660 rf.fp = fp;
661 return r_long(&rf);
662}
663
Guido van Rossum79f25d91997-04-29 20:08:16 +0000664PyObject *
665PyMarshal_ReadObjectFromFile(fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000666 FILE *fp;
667{
668 RFILE rf;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000669 if (PyErr_Occurred()) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000670 fprintf(stderr, "XXX rd_object called with exception set\n");
671 return NULL;
672 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000673 rf.fp = fp;
674 return r_object(&rf);
675}
676
Guido van Rossum79f25d91997-04-29 20:08:16 +0000677PyObject *
678PyMarshal_ReadObjectFromString(str, len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000679 char *str;
680 int len;
681{
682 RFILE rf;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000683 if (PyErr_Occurred()) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000684 fprintf(stderr, "XXX rds_object called with exception set\n");
685 return NULL;
686 }
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000687 rf.fp = NULL;
688 rf.str = NULL;
689 rf.ptr = str;
690 rf.end = str + len;
691 return r_object(&rf);
692}
693
Guido van Rossum79f25d91997-04-29 20:08:16 +0000694PyObject *
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000695PyMarshal_WriteObjectToString(x) /* wrs_object() */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000696 PyObject *x;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000697{
698 WFILE wf;
699 wf.fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000700 wf.str = PyString_FromStringAndSize((char *)NULL, 50);
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000701 if (wf.str == NULL)
702 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000703 wf.ptr = PyString_AS_STRING((PyStringObject *)wf.str);
704 wf.end = wf.ptr + PyString_Size(wf.str);
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000705 wf.error = 0;
Fred Drake6da0b912000-06-28 18:47:56 +0000706 wf.depth = 0;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000707 w_object(x, &wf);
708 if (wf.str != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000709 _PyString_Resize(&wf.str,
710 (int) (wf.ptr -
711 PyString_AS_STRING((PyStringObject *)wf.str)));
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000712 if (wf.error) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000713 Py_XDECREF(wf.str);
Fred Drake6da0b912000-06-28 18:47:56 +0000714 PyErr_SetString(PyExc_ValueError,
715 (wf.error==1)?"unmarshallable object"
716 :"object too deeply nested to marshal");
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000717 return NULL;
718 }
719 return wf.str;
720}
721
Guido van Rossum64b45521991-06-07 13:58:22 +0000722/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000723
Guido van Rossum79f25d91997-04-29 20:08:16 +0000724static PyObject *
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000725marshal_dump(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000726 PyObject *self;
727 PyObject *args;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000728{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000729 WFILE wf;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000730 PyObject *x;
731 PyObject *f;
Guido van Rossum2efa3692000-03-31 00:37:41 +0000732 if (!PyArg_ParseTuple(args, "OO:dump", &x, &f))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000733 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000734 if (!PyFile_Check(f)) {
735 PyErr_SetString(PyExc_TypeError,
736 "marshal.dump() 2nd arg must be file");
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000737 return NULL;
738 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000739 wf.fp = PyFile_AsFile(f);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000740 wf.str = NULL;
741 wf.ptr = wf.end = NULL;
Guido van Rossumf2150601996-06-26 20:41:23 +0000742 wf.error = 0;
Fred Drake6da0b912000-06-28 18:47:56 +0000743 wf.depth = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000744 w_object(x, &wf);
Guido van Rossumf2150601996-06-26 20:41:23 +0000745 if (wf.error) {
Fred Drake6da0b912000-06-28 18:47:56 +0000746 PyErr_SetString(PyExc_ValueError,
747 (wf.error==1)?"unmarshallable object"
748 :"object too deeply nested to marshal");
Guido van Rossumf2150601996-06-26 20:41:23 +0000749 return NULL;
750 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000751 Py_INCREF(Py_None);
752 return Py_None;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000753}
754
Guido van Rossum79f25d91997-04-29 20:08:16 +0000755static PyObject *
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000756marshal_load(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000757 PyObject *self;
758 PyObject *args;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000759{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000760 RFILE rf;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000761 PyObject *f;
762 PyObject *v;
Guido van Rossum2efa3692000-03-31 00:37:41 +0000763 if (!PyArg_ParseTuple(args, "O:load", &f))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000764 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000765 if (!PyFile_Check(f)) {
766 PyErr_SetString(PyExc_TypeError,
767 "marshal.load() arg must be file");
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000768 return NULL;
769 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000770 rf.fp = PyFile_AsFile(f);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000771 rf.str = NULL;
772 rf.ptr = rf.end = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000773 PyErr_Clear();
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000774 v = r_object(&rf);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000775 if (PyErr_Occurred()) {
776 Py_XDECREF(v);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000777 v = NULL;
778 }
779 return v;
780}
781
Guido van Rossum79f25d91997-04-29 20:08:16 +0000782static PyObject *
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000783marshal_dumps(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000784 PyObject *self;
785 PyObject *args;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000786{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000787 PyObject *x;
Guido van Rossum2efa3692000-03-31 00:37:41 +0000788 if (!PyArg_ParseTuple(args, "O:dumps", &x))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000789 return NULL;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000790 return PyMarshal_WriteObjectToString(x);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000791}
792
Guido van Rossum79f25d91997-04-29 20:08:16 +0000793static PyObject *
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000794marshal_loads(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000795 PyObject *self;
796 PyObject *args;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000797{
798 RFILE rf;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000799 PyObject *v;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000800 char *s;
801 int n;
Guido van Rossum2efa3692000-03-31 00:37:41 +0000802 if (!PyArg_ParseTuple(args, "s#:loads", &s, &n))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000803 return NULL;
804 rf.fp = NULL;
805 rf.str = args;
806 rf.ptr = s;
807 rf.end = s + n;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000808 PyErr_Clear();
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000809 v = r_object(&rf);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000810 if (PyErr_Occurred()) {
811 Py_XDECREF(v);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000812 v = NULL;
813 }
814 return v;
815}
816
Guido van Rossum79f25d91997-04-29 20:08:16 +0000817static PyMethodDef marshal_methods[] = {
Guido van Rossum2efa3692000-03-31 00:37:41 +0000818 {"dump", marshal_dump, 1},
819 {"load", marshal_load, 1},
820 {"dumps", marshal_dumps, 1},
821 {"loads", marshal_loads, 1},
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000822 {NULL, NULL} /* sentinel */
823};
824
825void
Guido van Rossum79f25d91997-04-29 20:08:16 +0000826PyMarshal_Init()
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000827{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000828 (void) Py_InitModule("marshal", marshal_methods);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000829}