blob: 519081d11617ad62bee7a4b59dde4676994667c8 [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
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000042#define TYPE_NULL '0'
43#define TYPE_NONE 'N'
Guido van Rossume449af71996-10-11 16:25:41 +000044#define TYPE_ELLIPSIS '.'
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000045#define TYPE_INT 'i'
Guido van Rossumb0c168c1996-12-05 23:15:02 +000046#define TYPE_INT64 'I'
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000047#define TYPE_FLOAT 'f'
Guido van Rossum8a5c5d21996-01-12 01:09:56 +000048#define TYPE_COMPLEX 'x'
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000049#define TYPE_LONG 'l'
50#define TYPE_STRING 's'
51#define TYPE_TUPLE '('
52#define TYPE_LIST '['
53#define TYPE_DICT '{'
Guido van Rossum681d79a1995-07-18 14:51:37 +000054#define TYPE_CODE 'c'
Guido van Rossumc279b532000-03-10 23:03:02 +000055#define TYPE_UNICODE 'u'
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000056#define TYPE_UNKNOWN '?'
57
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000058typedef struct {
59 FILE *fp;
Guido van Rossumf2150601996-06-26 20:41:23 +000060 int error;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000061 /* If fp == NULL, the following are valid: */
Guido van Rossum79f25d91997-04-29 20:08:16 +000062 PyObject *str;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000063 char *ptr;
64 char *end;
65} WFILE;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000066
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000067#define w_byte(c, p) if (((p)->fp)) putc((c), (p)->fp); \
68 else if ((p)->ptr != (p)->end) *(p)->ptr++ = (c); \
69 else w_more(c, p)
70
71static void
72w_more(c, p)
73 char c;
74 WFILE *p;
75{
76 int size, newsize;
77 if (p->str == NULL)
78 return; /* An error already occurred */
Guido van Rossum79f25d91997-04-29 20:08:16 +000079 size = PyString_Size(p->str);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000080 newsize = size + 1024;
Guido van Rossum79f25d91997-04-29 20:08:16 +000081 if (_PyString_Resize(&p->str, newsize) != 0) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000082 p->ptr = p->end = NULL;
83 }
84 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +000085 p->ptr = PyString_AS_STRING((PyStringObject *)p->str) + size;
86 p->end =
87 PyString_AS_STRING((PyStringObject *)p->str) + newsize;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000088 *p->ptr++ = c;
89 }
90}
91
92static void
93w_string(s, n, p)
94 char *s;
95 int n;
96 WFILE *p;
97{
98 if (p->fp != NULL) {
99 fwrite(s, 1, n, p->fp);
100 }
101 else {
102 while (--n >= 0) {
103 w_byte(*s, p);
104 s++;
105 }
106 }
107}
108
109static void
110w_short(x, p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000111 int x;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000112 WFILE *p;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000113{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000114 w_byte( x & 0xff, p);
115 w_byte((x>> 8) & 0xff, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000116}
117
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000118static void
119w_long(x, p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000120 long x;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000121 WFILE *p;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000122{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000123 w_byte((int)( x & 0xff), p);
124 w_byte((int)((x>> 8) & 0xff), p);
125 w_byte((int)((x>>16) & 0xff), p);
126 w_byte((int)((x>>24) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000127}
128
Guido van Rossumc1547d91996-12-10 15:39:04 +0000129#if SIZEOF_LONG > 4
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000130static void
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000131w_long64(x, p)
132 long x;
133 WFILE *p;
134{
135 w_long(x, p);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000136 w_long(x>>32, p);
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000137}
Guido van Rossumc1547d91996-12-10 15:39:04 +0000138#endif
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000139
140static void
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000141w_object(v, p)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000142 PyObject *v;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000143 WFILE *p;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000144{
Guido van Rossum3a205f71995-02-17 15:10:07 +0000145 int i, n;
Guido van Rossumd076c731998-10-07 19:42:25 +0000146 PyBufferProcs *pb;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000147
Guido van Rossum730806d1998-04-10 22:27:42 +0000148 if (v == NULL) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000149 w_byte(TYPE_NULL, p);
Guido van Rossum730806d1998-04-10 22:27:42 +0000150 }
151 else if (v == Py_None) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000152 w_byte(TYPE_NONE, p);
Guido van Rossum730806d1998-04-10 22:27:42 +0000153 }
154 else if (v == Py_Ellipsis) {
155 w_byte(TYPE_ELLIPSIS, p);
156 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000157 else if (PyInt_Check(v)) {
158 long x = PyInt_AS_LONG((PyIntObject *)v);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000159#if SIZEOF_LONG > 4
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000160 long y = x>>31;
161 if (y && y != -1) {
162 w_byte(TYPE_INT64, p);
163 w_long64(x, p);
164 }
Guido van Rossumc1547d91996-12-10 15:39:04 +0000165 else
166#endif
167 {
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000168 w_byte(TYPE_INT, p);
169 w_long(x, p);
170 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000171 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172 else if (PyLong_Check(v)) {
173 PyLongObject *ob = (PyLongObject *)v;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000174 w_byte(TYPE_LONG, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000175 n = ob->ob_size;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000176 w_long((long)n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000177 if (n < 0)
178 n = -n;
179 for (i = 0; i < n; i++)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000180 w_short(ob->ob_digit[i], p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000181 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000182 else if (PyFloat_Check(v)) {
183 extern void PyFloat_AsString
184 Py_PROTO((char *, PyFloatObject *));
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000185 char buf[256]; /* Plenty to format any double */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000186 PyFloat_AsString(buf, (PyFloatObject *)v);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000187 n = strlen(buf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000188 w_byte(TYPE_FLOAT, p);
Guido van Rossum3a205f71995-02-17 15:10:07 +0000189 w_byte(n, p);
190 w_string(buf, n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000191 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000192#ifndef WITHOUT_COMPLEX
Guido van Rossum79f25d91997-04-29 20:08:16 +0000193 else if (PyComplex_Check(v)) {
194 extern void PyFloat_AsString
195 Py_PROTO((char *, PyFloatObject *));
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000196 char buf[256]; /* Plenty to format any double */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000197 PyFloatObject *temp;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000198 w_byte(TYPE_COMPLEX, p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000199 temp = (PyFloatObject*)PyFloat_FromDouble(
200 PyComplex_RealAsDouble(v));
201 PyFloat_AsString(buf, temp);
202 Py_DECREF(temp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000203 n = strlen(buf);
204 w_byte(n, p);
205 w_string(buf, n, p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000206 temp = (PyFloatObject*)PyFloat_FromDouble(
207 PyComplex_ImagAsDouble(v));
208 PyFloat_AsString(buf, temp);
209 Py_DECREF(temp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000210 n = strlen(buf);
211 w_byte(n, p);
212 w_string(buf, n, p);
213 }
214#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +0000215 else if (PyString_Check(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000216 w_byte(TYPE_STRING, p);
Guido van Rossumc279b532000-03-10 23:03:02 +0000217 n = PyString_GET_SIZE(v);
Guido van Rossum3a205f71995-02-17 15:10:07 +0000218 w_long((long)n, p);
Guido van Rossumc279b532000-03-10 23:03:02 +0000219 w_string(PyString_AS_STRING(v), n, p);
220 }
221 else if (PyUnicode_Check(v)) {
222 PyObject *utf8;
223 utf8 = PyUnicode_AsUTF8String(v);
224 if (utf8 == NULL) {
225 p->error = 1;
226 return;
227 }
228 w_byte(TYPE_UNICODE, p);
229 n = PyString_GET_SIZE(utf8);
230 w_long((long)n, p);
231 w_string(PyString_AS_STRING(utf8), n, p);
232 Py_DECREF(utf8);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000233 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000234 else if (PyTuple_Check(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000235 w_byte(TYPE_TUPLE, p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000236 n = PyTuple_Size(v);
Guido van Rossum3a205f71995-02-17 15:10:07 +0000237 w_long((long)n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000238 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000239 w_object(PyTuple_GET_ITEM(v, i), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000240 }
241 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000242 else if (PyList_Check(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000243 w_byte(TYPE_LIST, p);
Guido van Rossumc279b532000-03-10 23:03:02 +0000244 n = PyList_GET_SIZE(v);
Guido van Rossum3a205f71995-02-17 15:10:07 +0000245 w_long((long)n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000246 for (i = 0; i < n; i++) {
Guido van Rossumc279b532000-03-10 23:03:02 +0000247 w_object(PyList_GET_ITEM(v, i), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000248 }
249 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000250 else if (PyDict_Check(v)) {
Guido van Rossum25831651993-05-19 14:50:45 +0000251 int pos;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000252 PyObject *key, *value;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000253 w_byte(TYPE_DICT, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000254 /* This one is NULL object terminated! */
Guido van Rossum25831651993-05-19 14:50:45 +0000255 pos = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000256 while (PyDict_Next(v, &pos, &key, &value)) {
Guido van Rossum25831651993-05-19 14:50:45 +0000257 w_object(key, p);
258 w_object(value, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000259 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000260 w_object((PyObject *)NULL, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000261 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000262 else if (PyCode_Check(v)) {
263 PyCodeObject *co = (PyCodeObject *)v;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000264 w_byte(TYPE_CODE, p);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000265 w_short(co->co_argcount, p);
266 w_short(co->co_nlocals, p);
Guido van Rossum98a9b311997-01-17 21:07:08 +0000267 w_short(co->co_stacksize, p);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000268 w_short(co->co_flags, p);
Guido van Rossumd076c731998-10-07 19:42:25 +0000269 w_object(co->co_code, p);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000270 w_object(co->co_consts, p);
271 w_object(co->co_names, p);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000272 w_object(co->co_varnames, p);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000273 w_object(co->co_filename, p);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000274 w_object(co->co_name, p);
Guido van Rossumd031c891997-01-24 03:44:17 +0000275 w_short(co->co_firstlineno, p);
276 w_object(co->co_lnotab, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000277 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000278 else if ((pb = v->ob_type->tp_as_buffer) != NULL &&
279 pb->bf_getsegcount != NULL &&
280 pb->bf_getreadbuffer != NULL &&
281 (*pb->bf_getsegcount)(v, NULL) == 1)
282 {
283 /* Write unknown buffer-style objects as a string */
284 char *s;
285 w_byte(TYPE_STRING, p);
286 n = (*pb->bf_getreadbuffer)(v, 0, (void **)&s);
287 w_long((long)n, p);
288 w_string(s, n, p);
289 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000290 else {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000291 w_byte(TYPE_UNKNOWN, p);
Guido van Rossumf2150601996-06-26 20:41:23 +0000292 p->error = 1;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000293 }
294}
295
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000296void
Guido van Rossum79f25d91997-04-29 20:08:16 +0000297PyMarshal_WriteLongToFile(x, fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000298 long x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000299 FILE *fp;
300{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000301 WFILE wf;
302 wf.fp = fp;
Guido van Rossumf2150601996-06-26 20:41:23 +0000303 wf.error = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000304 w_long(x, &wf);
305}
306
307void
Guido van Rossum79f25d91997-04-29 20:08:16 +0000308PyMarshal_WriteObjectToFile(x, fp)
309 PyObject *x;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000310 FILE *fp;
311{
312 WFILE wf;
313 wf.fp = fp;
Guido van Rossumf2150601996-06-26 20:41:23 +0000314 wf.error = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000315 w_object(x, &wf);
316}
317
318typedef WFILE RFILE; /* Same struct with different invariants */
319
Guido van Rossum8d617a61995-03-09 12:12:11 +0000320#define rs_byte(p) (((p)->ptr != (p)->end) ? (unsigned char)*(p)->ptr++ : EOF)
321
322#define r_byte(p) ((p)->fp ? getc((p)->fp) : rs_byte(p))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000323
324static int
325r_string(s, n, p)
326 char *s;
327 int n;
328 RFILE *p;
329{
330 if (p->fp != NULL)
331 return fread(s, 1, n, p->fp);
332 if (p->end - p->ptr < n)
333 n = p->end - p->ptr;
334 memcpy(s, p->ptr, n);
335 p->ptr += n;
336 return n;
337}
338
339static int
340r_short(p)
341 RFILE *p;
342{
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000343 register short x;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000344 x = r_byte(p);
345 x |= r_byte(p) << 8;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000346 /* XXX If your short is > 16 bits, add sign-extension here!!! */
347 return x;
348}
349
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000350static long
351r_long(p)
352 RFILE *p;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000353{
354 register long x;
Guido van Rossum8d617a61995-03-09 12:12:11 +0000355 register FILE *fp = p->fp;
356 if (fp) {
357 x = getc(fp);
358 x |= (long)getc(fp) << 8;
359 x |= (long)getc(fp) << 16;
360 x |= (long)getc(fp) << 24;
361 }
362 else {
363 x = rs_byte(p);
364 x |= (long)rs_byte(p) << 8;
365 x |= (long)rs_byte(p) << 16;
366 x |= (long)rs_byte(p) << 24;
367 }
Guido van Rossumc1547d91996-12-10 15:39:04 +0000368#if SIZEOF_LONG > 4
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000369 /* Sign extension for 64-bit machines */
370 x <<= (8*sizeof(long) - 32);
371 x >>= (8*sizeof(long) - 32);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000372#endif
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000373 return x;
374}
375
376static long
377r_long64(p)
378 RFILE *p;
379{
380 register long x;
Guido van Rossumc1547d91996-12-10 15:39:04 +0000381 x = r_long(p);
382#if SIZEOF_LONG > 4
383 x = (x & 0xFFFFFFFF) | (r_long(p) << 32);
384#else
385 if (r_long(p) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000386 PyObject *f = PySys_GetObject("stderr");
Guido van Rossumc1547d91996-12-10 15:39:04 +0000387 if (f != NULL)
Guido van Rossum7e8d26d1997-05-22 22:35:47 +0000388 (void) PyFile_WriteString(
Guido van Rossumc1547d91996-12-10 15:39:04 +0000389 "Warning: un-marshal 64-bit int in 32-bit mode\n",
390 f);
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000391 }
Guido van Rossumc1547d91996-12-10 15:39:04 +0000392#endif
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000393 return x;
394}
395
Guido van Rossum79f25d91997-04-29 20:08:16 +0000396static PyObject *
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000397r_object(p)
398 RFILE *p;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000399{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000400 PyObject *v, *v2;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000401 long i, n;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000402 int type = r_byte(p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000403
404 switch (type) {
405
406 case EOF:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000407 PyErr_SetString(PyExc_EOFError,
408 "EOF read where object expected");
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000409 return NULL;
410
411 case TYPE_NULL:
412 return NULL;
413
414 case TYPE_NONE:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000415 Py_INCREF(Py_None);
416 return Py_None;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000417
Guido van Rossume449af71996-10-11 16:25:41 +0000418 case TYPE_ELLIPSIS:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000419 Py_INCREF(Py_Ellipsis);
Guido van Rossume449af71996-10-11 16:25:41 +0000420 return Py_Ellipsis;
Guido van Rossum8861b741996-07-30 16:49:37 +0000421
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000422 case TYPE_INT:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000423 return PyInt_FromLong(r_long(p));
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000424
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000425 case TYPE_INT64:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000426 return PyInt_FromLong(r_long64(p));
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000427
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000428 case TYPE_LONG:
429 {
430 int size;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000431 PyLongObject *ob;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000432 n = r_long(p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000433 size = n<0 ? -n : n;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000434 ob = _PyLong_New(size);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000435 if (ob == NULL)
436 return NULL;
437 ob->ob_size = n;
438 for (i = 0; i < size; i++)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000439 ob->ob_digit[i] = r_short(p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000440 return (PyObject *)ob;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000441 }
442
443 case TYPE_FLOAT:
444 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000445 extern double atof Py_PROTO((const char *));
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000446 char buf[256];
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000447 double dx;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000448 n = r_byte(p);
449 if (r_string(buf, (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000450 PyErr_SetString(PyExc_EOFError,
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000451 "EOF read where object expected");
452 return NULL;
453 }
454 buf[n] = '\0';
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000455 PyFPE_START_PROTECT("atof", return 0)
456 dx = atof(buf);
Guido van Rossum45b83911997-03-14 04:32:50 +0000457 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000458 return PyFloat_FromDouble(dx);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000459 }
460
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000461#ifndef WITHOUT_COMPLEX
462 case TYPE_COMPLEX:
463 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000464 extern double atof Py_PROTO((const char *));
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000465 char buf[256];
Guido van Rossum530956d1996-07-21 02:27:43 +0000466 Py_complex c;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000467 n = r_byte(p);
468 if (r_string(buf, (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000469 PyErr_SetString(PyExc_EOFError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000470 "EOF read where object expected");
471 return NULL;
472 }
473 buf[n] = '\0';
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000474 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000475 c.real = atof(buf);
Guido van Rossum45b83911997-03-14 04:32:50 +0000476 PyFPE_END_PROTECT(c)
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000477 n = r_byte(p);
478 if (r_string(buf, (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000479 PyErr_SetString(PyExc_EOFError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000480 "EOF read where object expected");
481 return NULL;
482 }
483 buf[n] = '\0';
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000484 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000485 c.imag = atof(buf);
Guido van Rossum45b83911997-03-14 04:32:50 +0000486 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000487 return PyComplex_FromCComplex(c);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000488 }
489#endif
490
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000491 case TYPE_STRING:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000492 n = r_long(p);
Guido van Rossuma45cb451998-06-08 20:27:29 +0000493 if (n < 0) {
494 PyErr_SetString(PyExc_ValueError, "bad marshal data");
495 return NULL;
496 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000497 v = PyString_FromStringAndSize((char *)NULL, n);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000498 if (v != NULL) {
Guido van Rossumc279b532000-03-10 23:03:02 +0000499 if (r_string(PyString_AS_STRING(v), (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000500 Py_DECREF(v);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000501 v = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000502 PyErr_SetString(PyExc_EOFError,
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000503 "EOF read where object expected");
504 }
505 }
506 return v;
507
Guido van Rossumc279b532000-03-10 23:03:02 +0000508 case TYPE_UNICODE:
509 {
510 char *buffer;
511
512 n = r_long(p);
513 if (n < 0) {
514 PyErr_SetString(PyExc_ValueError, "bad marshal data");
515 return NULL;
516 }
517 buffer = (char *)Py_Malloc(n);
518 if (buffer == NULL)
519 return NULL;
520 if (r_string(buffer, (int)n, p) != n) {
521 free(buffer);
522 PyErr_SetString(PyExc_EOFError,
523 "EOF read where object expected");
524 return NULL;
525 }
526 v = PyUnicode_DecodeUTF8(buffer, n, NULL);
527 free(buffer);
528 return v;
529 }
530
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000531 case TYPE_TUPLE:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000532 n = r_long(p);
Guido van Rossuma45cb451998-06-08 20:27:29 +0000533 if (n < 0) {
534 PyErr_SetString(PyExc_ValueError, "bad marshal data");
535 return NULL;
536 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000537 v = PyTuple_New((int)n);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000538 if (v == NULL)
539 return v;
Jack Jansen9513f2c1995-10-27 13:21:28 +0000540 for (i = 0; i < n; i++) {
541 v2 = r_object(p);
542 if ( v2 == NULL ) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000543 Py_DECREF(v);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000544 v = NULL;
545 break;
546 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000547 PyTuple_SET_ITEM(v, (int)i, v2);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000548 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000549 return v;
550
551 case TYPE_LIST:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000552 n = r_long(p);
Guido van Rossuma45cb451998-06-08 20:27:29 +0000553 if (n < 0) {
554 PyErr_SetString(PyExc_ValueError, "bad marshal data");
555 return NULL;
556 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000557 v = PyList_New((int)n);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000558 if (v == NULL)
559 return v;
Jack Jansen9513f2c1995-10-27 13:21:28 +0000560 for (i = 0; i < n; i++) {
561 v2 = r_object(p);
562 if ( v2 == NULL ) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000563 Py_DECREF(v);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000564 v = NULL;
565 break;
566 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000567 PyList_SetItem(v, (int)i, v2);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000568 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000569 return v;
570
Guido van Rossum64b45521991-06-07 13:58:22 +0000571 case TYPE_DICT:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000572 v = PyDict_New();
Guido van Rossum64b45521991-06-07 13:58:22 +0000573 if (v == NULL)
574 return NULL;
575 for (;;) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000576 PyObject *key, *val;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000577 key = r_object(p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000578 if (key == NULL)
Guido van Rossumf2150601996-06-26 20:41:23 +0000579 break; /* XXX Assume TYPE_NULL, not an error */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000580 val = r_object(p);
Guido van Rossumf2150601996-06-26 20:41:23 +0000581 if (val != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000582 PyDict_SetItem(v, key, val);
583 Py_DECREF(key);
584 Py_XDECREF(val);
Guido van Rossum64b45521991-06-07 13:58:22 +0000585 }
586 return v;
587
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000588 case TYPE_CODE:
589 {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000590 int argcount = r_short(p);
591 int nlocals = r_short(p);
Guido van Rossum98a9b311997-01-17 21:07:08 +0000592 int stacksize = r_short(p);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000593 int flags = r_short(p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000594 PyObject *code = NULL;
595 PyObject *consts = NULL;
596 PyObject *names = NULL;
597 PyObject *varnames = NULL;
598 PyObject *filename = NULL;
599 PyObject *name = NULL;
Guido van Rossum0f4bbd21997-02-14 21:12:56 +0000600 int firstlineno = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000601 PyObject *lnotab = NULL;
Jack Jansen9513f2c1995-10-27 13:21:28 +0000602
603 code = r_object(p);
604 if (code) consts = r_object(p);
605 if (consts) names = r_object(p);
606 if (names) varnames = r_object(p);
607 if (varnames) filename = r_object(p);
608 if (filename) name = r_object(p);
Guido van Rossumd031c891997-01-24 03:44:17 +0000609 if (name) {
610 firstlineno = r_short(p);
611 lnotab = r_object(p);
612 }
Jack Jansen9513f2c1995-10-27 13:21:28 +0000613
Guido van Rossum79f25d91997-04-29 20:08:16 +0000614 if (!PyErr_Occurred()) {
615 v = (PyObject *) PyCode_New(
Guido van Rossum98a9b311997-01-17 21:07:08 +0000616 argcount, nlocals, stacksize, flags,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000617 code, consts, names, varnames,
Guido van Rossumd031c891997-01-24 03:44:17 +0000618 filename, name, firstlineno, lnotab);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000619 }
620 else
621 v = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000622 Py_XDECREF(code);
623 Py_XDECREF(consts);
624 Py_XDECREF(names);
625 Py_XDECREF(varnames);
626 Py_XDECREF(filename);
627 Py_XDECREF(name);
Guido van Rossum6fc06e71997-07-26 23:30:18 +0000628 Py_XDECREF(lnotab);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000629
630 }
631 return v;
632
633 default:
Guido van Rossumf2150601996-06-26 20:41:23 +0000634 /* Bogus data got written, which isn't ideal.
635 This will let you keep working and recover. */
Guido van Rossuma45cb451998-06-08 20:27:29 +0000636 PyErr_SetString(PyExc_ValueError, "bad marshal data");
637 return NULL;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000638
639 }
640}
641
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000642long
Guido van Rossum79f25d91997-04-29 20:08:16 +0000643PyMarshal_ReadLongFromFile(fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000644 FILE *fp;
645{
646 RFILE rf;
647 rf.fp = fp;
648 return r_long(&rf);
649}
650
Guido van Rossum79f25d91997-04-29 20:08:16 +0000651PyObject *
652PyMarshal_ReadObjectFromFile(fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000653 FILE *fp;
654{
655 RFILE rf;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000656 if (PyErr_Occurred()) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000657 fprintf(stderr, "XXX rd_object called with exception set\n");
658 return NULL;
659 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000660 rf.fp = fp;
661 return r_object(&rf);
662}
663
Guido van Rossum79f25d91997-04-29 20:08:16 +0000664PyObject *
665PyMarshal_ReadObjectFromString(str, len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000666 char *str;
667 int len;
668{
669 RFILE rf;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000670 if (PyErr_Occurred()) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000671 fprintf(stderr, "XXX rds_object called with exception set\n");
672 return NULL;
673 }
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000674 rf.fp = NULL;
675 rf.str = NULL;
676 rf.ptr = str;
677 rf.end = str + len;
678 return r_object(&rf);
679}
680
Guido van Rossum79f25d91997-04-29 20:08:16 +0000681PyObject *
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000682PyMarshal_WriteObjectToString(x) /* wrs_object() */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000683 PyObject *x;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000684{
685 WFILE wf;
686 wf.fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000687 wf.str = PyString_FromStringAndSize((char *)NULL, 50);
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000688 if (wf.str == NULL)
689 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000690 wf.ptr = PyString_AS_STRING((PyStringObject *)wf.str);
691 wf.end = wf.ptr + PyString_Size(wf.str);
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000692 wf.error = 0;
693 w_object(x, &wf);
694 if (wf.str != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000695 _PyString_Resize(&wf.str,
696 (int) (wf.ptr -
697 PyString_AS_STRING((PyStringObject *)wf.str)));
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000698 if (wf.error) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000699 Py_XDECREF(wf.str);
700 PyErr_SetString(PyExc_ValueError, "unmarshallable object");
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000701 return NULL;
702 }
703 return wf.str;
704}
705
Guido van Rossum64b45521991-06-07 13:58:22 +0000706/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000707
Guido van Rossum79f25d91997-04-29 20:08:16 +0000708static PyObject *
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000709marshal_dump(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000710 PyObject *self;
711 PyObject *args;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000712{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000713 WFILE wf;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000714 PyObject *x;
715 PyObject *f;
716 if (!PyArg_Parse(args, "(OO)", &x, &f))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000717 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000718 if (!PyFile_Check(f)) {
719 PyErr_SetString(PyExc_TypeError,
720 "marshal.dump() 2nd arg must be file");
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000721 return NULL;
722 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000723 wf.fp = PyFile_AsFile(f);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000724 wf.str = NULL;
725 wf.ptr = wf.end = NULL;
Guido van Rossumf2150601996-06-26 20:41:23 +0000726 wf.error = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000727 w_object(x, &wf);
Guido van Rossumf2150601996-06-26 20:41:23 +0000728 if (wf.error) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000729 PyErr_SetString(PyExc_ValueError, "unmarshallable object");
Guido van Rossumf2150601996-06-26 20:41:23 +0000730 return NULL;
731 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000732 Py_INCREF(Py_None);
733 return Py_None;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000734}
735
Guido van Rossum79f25d91997-04-29 20:08:16 +0000736static PyObject *
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000737marshal_load(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000738 PyObject *self;
739 PyObject *args;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000740{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000741 RFILE rf;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000742 PyObject *f;
743 PyObject *v;
744 if (!PyArg_Parse(args, "O", &f))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000745 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000746 if (!PyFile_Check(f)) {
747 PyErr_SetString(PyExc_TypeError,
748 "marshal.load() arg must be file");
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000749 return NULL;
750 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000751 rf.fp = PyFile_AsFile(f);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000752 rf.str = NULL;
753 rf.ptr = rf.end = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000754 PyErr_Clear();
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000755 v = r_object(&rf);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000756 if (PyErr_Occurred()) {
757 Py_XDECREF(v);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000758 v = NULL;
759 }
760 return v;
761}
762
Guido van Rossum79f25d91997-04-29 20:08:16 +0000763static PyObject *
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000764marshal_dumps(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000765 PyObject *self;
766 PyObject *args;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000767{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000768 PyObject *x;
769 if (!PyArg_Parse(args, "O", &x))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000770 return NULL;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000771 return PyMarshal_WriteObjectToString(x);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000772}
773
Guido van Rossum79f25d91997-04-29 20:08:16 +0000774static PyObject *
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000775marshal_loads(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000776 PyObject *self;
777 PyObject *args;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000778{
779 RFILE rf;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000780 PyObject *v;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000781 char *s;
782 int n;
Guido van Rossum5bd893b1998-10-08 01:45:47 +0000783 if (!PyArg_Parse(args, "s#", &s, &n))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000784 return NULL;
785 rf.fp = NULL;
786 rf.str = args;
787 rf.ptr = s;
788 rf.end = s + n;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000789 PyErr_Clear();
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000790 v = r_object(&rf);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000791 if (PyErr_Occurred()) {
792 Py_XDECREF(v);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000793 v = NULL;
794 }
795 return v;
796}
797
Guido van Rossum79f25d91997-04-29 20:08:16 +0000798static PyMethodDef marshal_methods[] = {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000799 {"dump", marshal_dump},
800 {"load", marshal_load},
801 {"dumps", marshal_dumps},
802 {"loads", marshal_loads},
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000803 {NULL, NULL} /* sentinel */
804};
805
806void
Guido van Rossum79f25d91997-04-29 20:08:16 +0000807PyMarshal_Init()
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000808{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000809 (void) Py_InitModule("marshal", marshal_methods);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000810}