blob: 8fcbe3a840d4de580df4dabfaed38c4606df6ae9 [file] [log] [blame]
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00009******************************************************************/
10
11/* Write Python objects to files and read them back.
12 This is intended for writing and reading compiled Python code only;
13 a true persistent storage facility would be much harder, since
14 it would have to take circular links and sharing into account. */
15
Guido van Rossum79f25d91997-04-29 20:08:16 +000016#include "Python.h"
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000017#include "longintrepr.h"
18#include "compile.h"
19#include "marshal.h"
20
Fred Drake6da0b912000-06-28 18:47:56 +000021/* High water mark to determine when the marshalled object is dangerously deep
22 * and risks coring the interpreter. When the object stack gets this deep,
23 * raise an exception instead of continuing.
24 */
25#define MAX_MARSHAL_STACK_DEPTH 5000
26
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000027#define TYPE_NULL '0'
28#define TYPE_NONE 'N'
Guido van Rossume449af71996-10-11 16:25:41 +000029#define TYPE_ELLIPSIS '.'
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000030#define TYPE_INT 'i'
Guido van Rossumb0c168c1996-12-05 23:15:02 +000031#define TYPE_INT64 'I'
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000032#define TYPE_FLOAT 'f'
Guido van Rossum8a5c5d21996-01-12 01:09:56 +000033#define TYPE_COMPLEX 'x'
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000034#define TYPE_LONG 'l'
35#define TYPE_STRING 's'
36#define TYPE_TUPLE '('
37#define TYPE_LIST '['
38#define TYPE_DICT '{'
Guido van Rossum681d79a1995-07-18 14:51:37 +000039#define TYPE_CODE 'c'
Guido van Rossumc279b532000-03-10 23:03:02 +000040#define TYPE_UNICODE 'u'
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000041#define TYPE_UNKNOWN '?'
42
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000043typedef struct {
44 FILE *fp;
Guido van Rossumf2150601996-06-26 20:41:23 +000045 int error;
Fred Drake6da0b912000-06-28 18:47:56 +000046 int depth;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000047 /* If fp == NULL, the following are valid: */
Guido van Rossum79f25d91997-04-29 20:08:16 +000048 PyObject *str;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000049 char *ptr;
50 char *end;
51} WFILE;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000052
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000053#define w_byte(c, p) if (((p)->fp)) putc((c), (p)->fp); \
54 else if ((p)->ptr != (p)->end) *(p)->ptr++ = (c); \
55 else w_more(c, p)
56
57static void
58w_more(c, p)
59 char c;
60 WFILE *p;
61{
62 int size, newsize;
63 if (p->str == NULL)
64 return; /* An error already occurred */
Guido van Rossum79f25d91997-04-29 20:08:16 +000065 size = PyString_Size(p->str);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000066 newsize = size + 1024;
Guido van Rossum79f25d91997-04-29 20:08:16 +000067 if (_PyString_Resize(&p->str, newsize) != 0) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000068 p->ptr = p->end = NULL;
69 }
70 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +000071 p->ptr = PyString_AS_STRING((PyStringObject *)p->str) + size;
72 p->end =
73 PyString_AS_STRING((PyStringObject *)p->str) + newsize;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000074 *p->ptr++ = c;
75 }
76}
77
78static void
79w_string(s, n, p)
80 char *s;
81 int n;
82 WFILE *p;
83{
84 if (p->fp != NULL) {
85 fwrite(s, 1, n, p->fp);
86 }
87 else {
88 while (--n >= 0) {
89 w_byte(*s, p);
90 s++;
91 }
92 }
93}
94
95static void
96w_short(x, p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000097 int x;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000098 WFILE *p;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000099{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000100 w_byte( x & 0xff, p);
101 w_byte((x>> 8) & 0xff, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000102}
103
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000104static void
105w_long(x, p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000106 long x;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000107 WFILE *p;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000108{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000109 w_byte((int)( x & 0xff), p);
110 w_byte((int)((x>> 8) & 0xff), p);
111 w_byte((int)((x>>16) & 0xff), p);
112 w_byte((int)((x>>24) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000113}
114
Guido van Rossumc1547d91996-12-10 15:39:04 +0000115#if SIZEOF_LONG > 4
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000116static void
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000117w_long64(x, p)
118 long x;
119 WFILE *p;
120{
121 w_long(x, p);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000122 w_long(x>>32, p);
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000123}
Guido van Rossumc1547d91996-12-10 15:39:04 +0000124#endif
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000125
126static void
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000127w_object(v, p)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000128 PyObject *v;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000129 WFILE *p;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000130{
Guido van Rossum3a205f71995-02-17 15:10:07 +0000131 int i, n;
Guido van Rossumd076c731998-10-07 19:42:25 +0000132 PyBufferProcs *pb;
Fred Drake6da0b912000-06-28 18:47:56 +0000133
134 p->depth++;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000135
Fred Drake6da0b912000-06-28 18:47:56 +0000136 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
137 p->error = 2;
138 }
139 else if (v == NULL) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000140 w_byte(TYPE_NULL, p);
Guido van Rossum730806d1998-04-10 22:27:42 +0000141 }
142 else if (v == Py_None) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000143 w_byte(TYPE_NONE, p);
Guido van Rossum730806d1998-04-10 22:27:42 +0000144 }
145 else if (v == Py_Ellipsis) {
146 w_byte(TYPE_ELLIPSIS, p);
147 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000148 else if (PyInt_Check(v)) {
149 long x = PyInt_AS_LONG((PyIntObject *)v);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000150#if SIZEOF_LONG > 4
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000151 long y = x>>31;
152 if (y && y != -1) {
153 w_byte(TYPE_INT64, p);
154 w_long64(x, p);
155 }
Guido van Rossumc1547d91996-12-10 15:39:04 +0000156 else
157#endif
158 {
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000159 w_byte(TYPE_INT, p);
160 w_long(x, p);
161 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000162 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000163 else if (PyLong_Check(v)) {
164 PyLongObject *ob = (PyLongObject *)v;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000165 w_byte(TYPE_LONG, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000166 n = ob->ob_size;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000167 w_long((long)n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000168 if (n < 0)
169 n = -n;
170 for (i = 0; i < n; i++)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000171 w_short(ob->ob_digit[i], p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000172 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000173 else if (PyFloat_Check(v)) {
174 extern void PyFloat_AsString
175 Py_PROTO((char *, PyFloatObject *));
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000176 char buf[256]; /* Plenty to format any double */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000177 PyFloat_AsString(buf, (PyFloatObject *)v);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000178 n = strlen(buf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000179 w_byte(TYPE_FLOAT, p);
Guido van Rossum3a205f71995-02-17 15:10:07 +0000180 w_byte(n, p);
181 w_string(buf, n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000182 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000183#ifndef WITHOUT_COMPLEX
Guido van Rossum79f25d91997-04-29 20:08:16 +0000184 else if (PyComplex_Check(v)) {
185 extern void PyFloat_AsString
186 Py_PROTO((char *, PyFloatObject *));
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000187 char buf[256]; /* Plenty to format any double */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000188 PyFloatObject *temp;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000189 w_byte(TYPE_COMPLEX, p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000190 temp = (PyFloatObject*)PyFloat_FromDouble(
191 PyComplex_RealAsDouble(v));
192 PyFloat_AsString(buf, temp);
193 Py_DECREF(temp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000194 n = strlen(buf);
195 w_byte(n, p);
196 w_string(buf, n, p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000197 temp = (PyFloatObject*)PyFloat_FromDouble(
198 PyComplex_ImagAsDouble(v));
199 PyFloat_AsString(buf, temp);
200 Py_DECREF(temp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000201 n = strlen(buf);
202 w_byte(n, p);
203 w_string(buf, n, p);
204 }
205#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +0000206 else if (PyString_Check(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000207 w_byte(TYPE_STRING, p);
Guido van Rossumc279b532000-03-10 23:03:02 +0000208 n = PyString_GET_SIZE(v);
Guido van Rossum3a205f71995-02-17 15:10:07 +0000209 w_long((long)n, p);
Guido van Rossumc279b532000-03-10 23:03:02 +0000210 w_string(PyString_AS_STRING(v), n, p);
211 }
212 else if (PyUnicode_Check(v)) {
213 PyObject *utf8;
214 utf8 = PyUnicode_AsUTF8String(v);
215 if (utf8 == NULL) {
Guido van Rossum98626cd2000-06-28 23:24:19 +0000216 p->depth--;
217 p->error = 1;
218 return;
Guido van Rossumc279b532000-03-10 23:03:02 +0000219 }
220 w_byte(TYPE_UNICODE, p);
221 n = PyString_GET_SIZE(utf8);
222 w_long((long)n, p);
223 w_string(PyString_AS_STRING(utf8), n, p);
224 Py_DECREF(utf8);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000225 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 else if (PyTuple_Check(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000227 w_byte(TYPE_TUPLE, p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000228 n = PyTuple_Size(v);
Guido van Rossum3a205f71995-02-17 15:10:07 +0000229 w_long((long)n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000230 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000231 w_object(PyTuple_GET_ITEM(v, i), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000232 }
233 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000234 else if (PyList_Check(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000235 w_byte(TYPE_LIST, p);
Guido van Rossumc279b532000-03-10 23:03:02 +0000236 n = PyList_GET_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 Rossumc279b532000-03-10 23:03:02 +0000239 w_object(PyList_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 (PyDict_Check(v)) {
Guido van Rossum25831651993-05-19 14:50:45 +0000243 int pos;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 PyObject *key, *value;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000245 w_byte(TYPE_DICT, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000246 /* This one is NULL object terminated! */
Guido van Rossum25831651993-05-19 14:50:45 +0000247 pos = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000248 while (PyDict_Next(v, &pos, &key, &value)) {
Guido van Rossum25831651993-05-19 14:50:45 +0000249 w_object(key, p);
250 w_object(value, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000251 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000252 w_object((PyObject *)NULL, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000253 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000254 else if (PyCode_Check(v)) {
255 PyCodeObject *co = (PyCodeObject *)v;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000256 w_byte(TYPE_CODE, p);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000257 w_short(co->co_argcount, p);
258 w_short(co->co_nlocals, p);
Guido van Rossum98a9b311997-01-17 21:07:08 +0000259 w_short(co->co_stacksize, p);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000260 w_short(co->co_flags, p);
Guido van Rossumd076c731998-10-07 19:42:25 +0000261 w_object(co->co_code, p);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000262 w_object(co->co_consts, p);
263 w_object(co->co_names, p);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000264 w_object(co->co_varnames, p);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000265 w_object(co->co_filename, p);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000266 w_object(co->co_name, p);
Guido van Rossumd031c891997-01-24 03:44:17 +0000267 w_short(co->co_firstlineno, p);
268 w_object(co->co_lnotab, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000269 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000270 else if ((pb = v->ob_type->tp_as_buffer) != NULL &&
271 pb->bf_getsegcount != NULL &&
272 pb->bf_getreadbuffer != NULL &&
273 (*pb->bf_getsegcount)(v, NULL) == 1)
274 {
275 /* Write unknown buffer-style objects as a string */
276 char *s;
277 w_byte(TYPE_STRING, p);
278 n = (*pb->bf_getreadbuffer)(v, 0, (void **)&s);
279 w_long((long)n, p);
280 w_string(s, n, p);
281 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000282 else {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000283 w_byte(TYPE_UNKNOWN, p);
Guido van Rossumf2150601996-06-26 20:41:23 +0000284 p->error = 1;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000285 }
Guido van Rossum98626cd2000-06-28 23:24:19 +0000286
287 p->depth--;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000288}
289
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000290void
Guido van Rossum79f25d91997-04-29 20:08:16 +0000291PyMarshal_WriteLongToFile(x, fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000292 long x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000293 FILE *fp;
294{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000295 WFILE wf;
296 wf.fp = fp;
Guido van Rossumf2150601996-06-26 20:41:23 +0000297 wf.error = 0;
Fred Drake6da0b912000-06-28 18:47:56 +0000298 wf.depth = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000299 w_long(x, &wf);
300}
301
302void
Guido van Rossum79f25d91997-04-29 20:08:16 +0000303PyMarshal_WriteObjectToFile(x, fp)
304 PyObject *x;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000305 FILE *fp;
306{
307 WFILE wf;
308 wf.fp = fp;
Guido van Rossumf2150601996-06-26 20:41:23 +0000309 wf.error = 0;
Guido van Rossum98626cd2000-06-28 23:24:19 +0000310 wf.depth = 0;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000311 w_object(x, &wf);
312}
313
314typedef WFILE RFILE; /* Same struct with different invariants */
315
Guido van Rossum8d617a61995-03-09 12:12:11 +0000316#define rs_byte(p) (((p)->ptr != (p)->end) ? (unsigned char)*(p)->ptr++ : EOF)
317
318#define r_byte(p) ((p)->fp ? getc((p)->fp) : rs_byte(p))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000319
320static int
321r_string(s, n, p)
322 char *s;
323 int n;
324 RFILE *p;
325{
326 if (p->fp != NULL)
327 return fread(s, 1, n, p->fp);
328 if (p->end - p->ptr < n)
329 n = p->end - p->ptr;
330 memcpy(s, p->ptr, n);
331 p->ptr += n;
332 return n;
333}
334
335static int
336r_short(p)
337 RFILE *p;
338{
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000339 register short x;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000340 x = r_byte(p);
341 x |= r_byte(p) << 8;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000342 /* XXX If your short is > 16 bits, add sign-extension here!!! */
343 return x;
344}
345
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000346static long
347r_long(p)
348 RFILE *p;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000349{
350 register long x;
Guido van Rossum8d617a61995-03-09 12:12:11 +0000351 register FILE *fp = p->fp;
352 if (fp) {
353 x = getc(fp);
354 x |= (long)getc(fp) << 8;
355 x |= (long)getc(fp) << 16;
356 x |= (long)getc(fp) << 24;
357 }
358 else {
359 x = rs_byte(p);
360 x |= (long)rs_byte(p) << 8;
361 x |= (long)rs_byte(p) << 16;
362 x |= (long)rs_byte(p) << 24;
363 }
Guido van Rossumc1547d91996-12-10 15:39:04 +0000364#if SIZEOF_LONG > 4
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000365 /* Sign extension for 64-bit machines */
366 x <<= (8*sizeof(long) - 32);
367 x >>= (8*sizeof(long) - 32);
Guido van Rossumc1547d91996-12-10 15:39:04 +0000368#endif
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000369 return x;
370}
371
372static long
373r_long64(p)
374 RFILE *p;
375{
376 register long x;
Guido van Rossumc1547d91996-12-10 15:39:04 +0000377 x = r_long(p);
378#if SIZEOF_LONG > 4
379 x = (x & 0xFFFFFFFF) | (r_long(p) << 32);
380#else
381 if (r_long(p) != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000382 PyObject *f = PySys_GetObject("stderr");
Guido van Rossumc1547d91996-12-10 15:39:04 +0000383 if (f != NULL)
Guido van Rossum7e8d26d1997-05-22 22:35:47 +0000384 (void) PyFile_WriteString(
Guido van Rossumc1547d91996-12-10 15:39:04 +0000385 "Warning: un-marshal 64-bit int in 32-bit mode\n",
386 f);
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000387 }
Guido van Rossumc1547d91996-12-10 15:39:04 +0000388#endif
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000389 return x;
390}
391
Guido van Rossum79f25d91997-04-29 20:08:16 +0000392static PyObject *
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000393r_object(p)
394 RFILE *p;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000395{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000396 PyObject *v, *v2;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000397 long i, n;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000398 int type = r_byte(p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000399
400 switch (type) {
401
402 case EOF:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000403 PyErr_SetString(PyExc_EOFError,
404 "EOF read where object expected");
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000405 return NULL;
406
407 case TYPE_NULL:
408 return NULL;
409
410 case TYPE_NONE:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000411 Py_INCREF(Py_None);
412 return Py_None;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000413
Guido van Rossume449af71996-10-11 16:25:41 +0000414 case TYPE_ELLIPSIS:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000415 Py_INCREF(Py_Ellipsis);
Guido van Rossume449af71996-10-11 16:25:41 +0000416 return Py_Ellipsis;
Guido van Rossum8861b741996-07-30 16:49:37 +0000417
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000418 case TYPE_INT:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000419 return PyInt_FromLong(r_long(p));
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000420
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000421 case TYPE_INT64:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000422 return PyInt_FromLong(r_long64(p));
Guido van Rossumb0c168c1996-12-05 23:15:02 +0000423
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000424 case TYPE_LONG:
425 {
426 int size;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000427 PyLongObject *ob;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000428 n = r_long(p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000429 size = n<0 ? -n : n;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000430 ob = _PyLong_New(size);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000431 if (ob == NULL)
432 return NULL;
433 ob->ob_size = n;
434 for (i = 0; i < size; i++)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000435 ob->ob_digit[i] = r_short(p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000436 return (PyObject *)ob;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000437 }
438
439 case TYPE_FLOAT:
440 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000441 extern double atof Py_PROTO((const char *));
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000442 char buf[256];
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000443 double dx;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000444 n = r_byte(p);
445 if (r_string(buf, (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000446 PyErr_SetString(PyExc_EOFError,
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000447 "EOF read where object expected");
448 return NULL;
449 }
450 buf[n] = '\0';
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000451 PyFPE_START_PROTECT("atof", return 0)
452 dx = atof(buf);
Guido van Rossum45b83911997-03-14 04:32:50 +0000453 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000454 return PyFloat_FromDouble(dx);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000455 }
456
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000457#ifndef WITHOUT_COMPLEX
458 case TYPE_COMPLEX:
459 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000460 extern double atof Py_PROTO((const char *));
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000461 char buf[256];
Guido van Rossum530956d1996-07-21 02:27:43 +0000462 Py_complex c;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000463 n = r_byte(p);
464 if (r_string(buf, (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000465 PyErr_SetString(PyExc_EOFError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000466 "EOF read where object expected");
467 return NULL;
468 }
469 buf[n] = '\0';
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000470 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000471 c.real = atof(buf);
Guido van Rossum45b83911997-03-14 04:32:50 +0000472 PyFPE_END_PROTECT(c)
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000473 n = r_byte(p);
474 if (r_string(buf, (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000475 PyErr_SetString(PyExc_EOFError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000476 "EOF read where object expected");
477 return NULL;
478 }
479 buf[n] = '\0';
Guido van Rossum0ae748d1997-02-14 22:58:07 +0000480 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000481 c.imag = atof(buf);
Guido van Rossum45b83911997-03-14 04:32:50 +0000482 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000483 return PyComplex_FromCComplex(c);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000484 }
485#endif
486
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000487 case TYPE_STRING:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000488 n = r_long(p);
Guido van Rossuma45cb451998-06-08 20:27:29 +0000489 if (n < 0) {
490 PyErr_SetString(PyExc_ValueError, "bad marshal data");
491 return NULL;
492 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000493 v = PyString_FromStringAndSize((char *)NULL, n);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000494 if (v != NULL) {
Guido van Rossumc279b532000-03-10 23:03:02 +0000495 if (r_string(PyString_AS_STRING(v), (int)n, p) != n) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000496 Py_DECREF(v);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000497 v = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000498 PyErr_SetString(PyExc_EOFError,
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000499 "EOF read where object expected");
500 }
501 }
502 return v;
503
Guido van Rossumc279b532000-03-10 23:03:02 +0000504 case TYPE_UNICODE:
505 {
506 char *buffer;
507
508 n = r_long(p);
509 if (n < 0) {
510 PyErr_SetString(PyExc_ValueError, "bad marshal data");
511 return NULL;
512 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000513 buffer = PyMem_NEW(char, n);
Guido van Rossumc279b532000-03-10 23:03:02 +0000514 if (buffer == NULL)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000515 return PyErr_NoMemory();
Guido van Rossumc279b532000-03-10 23:03:02 +0000516 if (r_string(buffer, (int)n, p) != n) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000517 PyMem_DEL(buffer);
Guido van Rossumc279b532000-03-10 23:03:02 +0000518 PyErr_SetString(PyExc_EOFError,
519 "EOF read where object expected");
520 return NULL;
521 }
522 v = PyUnicode_DecodeUTF8(buffer, n, NULL);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000523 PyMem_DEL(buffer);
Guido van Rossumc279b532000-03-10 23:03:02 +0000524 return v;
525 }
526
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000527 case TYPE_TUPLE:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000528 n = r_long(p);
Guido van Rossuma45cb451998-06-08 20:27:29 +0000529 if (n < 0) {
530 PyErr_SetString(PyExc_ValueError, "bad marshal data");
531 return NULL;
532 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000533 v = PyTuple_New((int)n);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000534 if (v == NULL)
535 return v;
Jack Jansen9513f2c1995-10-27 13:21:28 +0000536 for (i = 0; i < n; i++) {
537 v2 = r_object(p);
538 if ( v2 == NULL ) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000539 Py_DECREF(v);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000540 v = NULL;
541 break;
542 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000543 PyTuple_SET_ITEM(v, (int)i, v2);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000544 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000545 return v;
546
547 case TYPE_LIST:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000548 n = r_long(p);
Guido van Rossuma45cb451998-06-08 20:27:29 +0000549 if (n < 0) {
550 PyErr_SetString(PyExc_ValueError, "bad marshal data");
551 return NULL;
552 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000553 v = PyList_New((int)n);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000554 if (v == NULL)
555 return v;
Jack Jansen9513f2c1995-10-27 13:21:28 +0000556 for (i = 0; i < n; i++) {
557 v2 = r_object(p);
558 if ( v2 == NULL ) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000559 Py_DECREF(v);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000560 v = NULL;
561 break;
562 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000563 PyList_SetItem(v, (int)i, v2);
Jack Jansen9513f2c1995-10-27 13:21:28 +0000564 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000565 return v;
566
Guido van Rossum64b45521991-06-07 13:58:22 +0000567 case TYPE_DICT:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000568 v = PyDict_New();
Guido van Rossum64b45521991-06-07 13:58:22 +0000569 if (v == NULL)
570 return NULL;
571 for (;;) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000572 PyObject *key, *val;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000573 key = r_object(p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000574 if (key == NULL)
Guido van Rossumf2150601996-06-26 20:41:23 +0000575 break; /* XXX Assume TYPE_NULL, not an error */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000576 val = r_object(p);
Guido van Rossumf2150601996-06-26 20:41:23 +0000577 if (val != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000578 PyDict_SetItem(v, key, val);
579 Py_DECREF(key);
580 Py_XDECREF(val);
Guido van Rossum64b45521991-06-07 13:58:22 +0000581 }
582 return v;
583
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000584 case TYPE_CODE:
585 {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000586 int argcount = r_short(p);
587 int nlocals = r_short(p);
Guido van Rossum98a9b311997-01-17 21:07:08 +0000588 int stacksize = r_short(p);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000589 int flags = r_short(p);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000590 PyObject *code = NULL;
591 PyObject *consts = NULL;
592 PyObject *names = NULL;
593 PyObject *varnames = NULL;
594 PyObject *filename = NULL;
595 PyObject *name = NULL;
Guido van Rossum0f4bbd21997-02-14 21:12:56 +0000596 int firstlineno = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000597 PyObject *lnotab = NULL;
Jack Jansen9513f2c1995-10-27 13:21:28 +0000598
599 code = r_object(p);
600 if (code) consts = r_object(p);
601 if (consts) names = r_object(p);
602 if (names) varnames = r_object(p);
603 if (varnames) filename = r_object(p);
604 if (filename) name = r_object(p);
Guido van Rossumd031c891997-01-24 03:44:17 +0000605 if (name) {
606 firstlineno = r_short(p);
607 lnotab = r_object(p);
608 }
Jack Jansen9513f2c1995-10-27 13:21:28 +0000609
Guido van Rossum79f25d91997-04-29 20:08:16 +0000610 if (!PyErr_Occurred()) {
611 v = (PyObject *) PyCode_New(
Guido van Rossum98a9b311997-01-17 21:07:08 +0000612 argcount, nlocals, stacksize, flags,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000613 code, consts, names, varnames,
Guido van Rossumd031c891997-01-24 03:44:17 +0000614 filename, name, firstlineno, lnotab);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000615 }
616 else
617 v = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000618 Py_XDECREF(code);
619 Py_XDECREF(consts);
620 Py_XDECREF(names);
621 Py_XDECREF(varnames);
622 Py_XDECREF(filename);
623 Py_XDECREF(name);
Guido van Rossum6fc06e71997-07-26 23:30:18 +0000624 Py_XDECREF(lnotab);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000625
626 }
627 return v;
628
629 default:
Guido van Rossumf2150601996-06-26 20:41:23 +0000630 /* Bogus data got written, which isn't ideal.
631 This will let you keep working and recover. */
Guido van Rossuma45cb451998-06-08 20:27:29 +0000632 PyErr_SetString(PyExc_ValueError, "bad marshal data");
633 return NULL;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000634
635 }
636}
637
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000638long
Guido van Rossum79f25d91997-04-29 20:08:16 +0000639PyMarshal_ReadLongFromFile(fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000640 FILE *fp;
641{
642 RFILE rf;
643 rf.fp = fp;
644 return r_long(&rf);
645}
646
Guido van Rossum79f25d91997-04-29 20:08:16 +0000647PyObject *
648PyMarshal_ReadObjectFromFile(fp)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000649 FILE *fp;
650{
651 RFILE rf;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000652 if (PyErr_Occurred()) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000653 fprintf(stderr, "XXX rd_object called with exception set\n");
654 return NULL;
655 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000656 rf.fp = fp;
657 return r_object(&rf);
658}
659
Guido van Rossum79f25d91997-04-29 20:08:16 +0000660PyObject *
661PyMarshal_ReadObjectFromString(str, len)
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000662 char *str;
663 int len;
664{
665 RFILE rf;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000666 if (PyErr_Occurred()) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000667 fprintf(stderr, "XXX rds_object called with exception set\n");
668 return NULL;
669 }
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000670 rf.fp = NULL;
671 rf.str = NULL;
672 rf.ptr = str;
673 rf.end = str + len;
674 return r_object(&rf);
675}
676
Guido van Rossum79f25d91997-04-29 20:08:16 +0000677PyObject *
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000678PyMarshal_WriteObjectToString(x) /* wrs_object() */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000679 PyObject *x;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000680{
681 WFILE wf;
682 wf.fp = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000683 wf.str = PyString_FromStringAndSize((char *)NULL, 50);
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000684 if (wf.str == NULL)
685 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000686 wf.ptr = PyString_AS_STRING((PyStringObject *)wf.str);
687 wf.end = wf.ptr + PyString_Size(wf.str);
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000688 wf.error = 0;
Fred Drake6da0b912000-06-28 18:47:56 +0000689 wf.depth = 0;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000690 w_object(x, &wf);
691 if (wf.str != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000692 _PyString_Resize(&wf.str,
693 (int) (wf.ptr -
694 PyString_AS_STRING((PyStringObject *)wf.str)));
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000695 if (wf.error) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000696 Py_XDECREF(wf.str);
Fred Drake6da0b912000-06-28 18:47:56 +0000697 PyErr_SetString(PyExc_ValueError,
698 (wf.error==1)?"unmarshallable object"
699 :"object too deeply nested to marshal");
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000700 return NULL;
701 }
702 return wf.str;
703}
704
Guido van Rossum64b45521991-06-07 13:58:22 +0000705/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000706
Guido van Rossum79f25d91997-04-29 20:08:16 +0000707static PyObject *
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000708marshal_dump(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000709 PyObject *self;
710 PyObject *args;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000711{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000712 WFILE wf;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000713 PyObject *x;
714 PyObject *f;
Guido van Rossum2efa3692000-03-31 00:37:41 +0000715 if (!PyArg_ParseTuple(args, "OO:dump", &x, &f))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000716 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000717 if (!PyFile_Check(f)) {
718 PyErr_SetString(PyExc_TypeError,
719 "marshal.dump() 2nd arg must be file");
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000720 return NULL;
721 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000722 wf.fp = PyFile_AsFile(f);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000723 wf.str = NULL;
724 wf.ptr = wf.end = NULL;
Guido van Rossumf2150601996-06-26 20:41:23 +0000725 wf.error = 0;
Fred Drake6da0b912000-06-28 18:47:56 +0000726 wf.depth = 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) {
Fred Drake6da0b912000-06-28 18:47:56 +0000729 PyErr_SetString(PyExc_ValueError,
730 (wf.error==1)?"unmarshallable object"
731 :"object too deeply nested to marshal");
Guido van Rossumf2150601996-06-26 20:41:23 +0000732 return NULL;
733 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000734 Py_INCREF(Py_None);
735 return Py_None;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000736}
737
Guido van Rossum79f25d91997-04-29 20:08:16 +0000738static PyObject *
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000739marshal_load(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000740 PyObject *self;
741 PyObject *args;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000742{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000743 RFILE rf;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000744 PyObject *f;
745 PyObject *v;
Guido van Rossum2efa3692000-03-31 00:37:41 +0000746 if (!PyArg_ParseTuple(args, "O:load", &f))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000747 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000748 if (!PyFile_Check(f)) {
749 PyErr_SetString(PyExc_TypeError,
750 "marshal.load() arg must be file");
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000751 return NULL;
752 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000753 rf.fp = PyFile_AsFile(f);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000754 rf.str = NULL;
755 rf.ptr = rf.end = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000756 PyErr_Clear();
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000757 v = r_object(&rf);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000758 if (PyErr_Occurred()) {
759 Py_XDECREF(v);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000760 v = NULL;
761 }
762 return v;
763}
764
Guido van Rossum79f25d91997-04-29 20:08:16 +0000765static PyObject *
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000766marshal_dumps(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000767 PyObject *self;
768 PyObject *args;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000769{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000770 PyObject *x;
Guido van Rossum2efa3692000-03-31 00:37:41 +0000771 if (!PyArg_ParseTuple(args, "O:dumps", &x))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000772 return NULL;
Guido van Rossum3f3bb3d1996-08-19 22:07:17 +0000773 return PyMarshal_WriteObjectToString(x);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000774}
775
Guido van Rossum79f25d91997-04-29 20:08:16 +0000776static PyObject *
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000777marshal_loads(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000778 PyObject *self;
779 PyObject *args;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000780{
781 RFILE rf;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000782 PyObject *v;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000783 char *s;
784 int n;
Guido van Rossum2efa3692000-03-31 00:37:41 +0000785 if (!PyArg_ParseTuple(args, "s#:loads", &s, &n))
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000786 return NULL;
787 rf.fp = NULL;
788 rf.str = args;
789 rf.ptr = s;
790 rf.end = s + n;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000791 PyErr_Clear();
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000792 v = r_object(&rf);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000793 if (PyErr_Occurred()) {
794 Py_XDECREF(v);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000795 v = NULL;
796 }
797 return v;
798}
799
Guido van Rossum79f25d91997-04-29 20:08:16 +0000800static PyMethodDef marshal_methods[] = {
Guido van Rossum2efa3692000-03-31 00:37:41 +0000801 {"dump", marshal_dump, 1},
802 {"load", marshal_load, 1},
803 {"dumps", marshal_dumps, 1},
804 {"loads", marshal_loads, 1},
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000805 {NULL, NULL} /* sentinel */
806};
807
808void
Guido van Rossum79f25d91997-04-29 20:08:16 +0000809PyMarshal_Init()
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000810{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000811 (void) Py_InitModule("marshal", marshal_methods);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000812}