blob: 3853ff9fb3d19960cd25857915f3c5394701d776 [file] [log] [blame]
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00001/***********************************************************
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00002Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
3Amsterdam, The Netherlands.
Guido van Rossumdce2e3d1991-06-04 19:42:30 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
25/* Write Python objects to files and read them back.
26 This is intended for writing and reading compiled Python code only;
27 a true persistent storage facility would be much harder, since
28 it would have to take circular links and sharing into account. */
29
30#include "allobjects.h"
Guido van Rossum2807d191992-03-27 17:23:17 +000031#include "modsupport.h"
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000032#include "longintrepr.h"
33#include "compile.h"
34#include "marshal.h"
35
36#include <errno.h>
Guido van Rossum065d71e1991-06-04 20:23:28 +000037extern int errno;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000038
39#define TYPE_NULL '0'
40#define TYPE_NONE 'N'
41#define TYPE_INT 'i'
42#define TYPE_FLOAT 'f'
43#define TYPE_LONG 'l'
44#define TYPE_STRING 's'
45#define TYPE_TUPLE '('
46#define TYPE_LIST '['
47#define TYPE_DICT '{'
48#define TYPE_CODE 'C'
49#define TYPE_UNKNOWN '?'
50
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000051typedef struct {
52 FILE *fp;
53 /* If fp == NULL, the following are valid: */
54 object *str;
55 char *ptr;
56 char *end;
57} WFILE;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +000058
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000059#define w_byte(c, p) if (((p)->fp)) putc((c), (p)->fp); \
60 else if ((p)->ptr != (p)->end) *(p)->ptr++ = (c); \
61 else w_more(c, p)
62
63static void
64w_more(c, p)
65 char c;
66 WFILE *p;
67{
68 int size, newsize;
69 if (p->str == NULL)
70 return; /* An error already occurred */
71 size = getstringsize(p->str);
72 newsize = size + 1024;
73 if (resizestring(&p->str, newsize) != 0) {
74 p->ptr = p->end = NULL;
75 }
76 else {
77 p->ptr = GETSTRINGVALUE((stringobject *)p->str) + size;
78 p->end = GETSTRINGVALUE((stringobject *)p->str) + newsize;
79 *p->ptr++ = c;
80 }
81}
82
83static void
84w_string(s, n, p)
85 char *s;
86 int n;
87 WFILE *p;
88{
89 if (p->fp != NULL) {
90 fwrite(s, 1, n, p->fp);
91 }
92 else {
93 while (--n >= 0) {
94 w_byte(*s, p);
95 s++;
96 }
97 }
98}
99
100static void
101w_short(x, p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000102 int x;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000103 WFILE *p;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000104{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000105 w_byte( x & 0xff, p);
106 w_byte((x>> 8) & 0xff, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000107}
108
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000109static void
110w_long(x, p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000111 long 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((int)( x & 0xff), p);
115 w_byte((int)((x>> 8) & 0xff), p);
116 w_byte((int)((x>>16) & 0xff), p);
117 w_byte((int)((x>>24) & 0xff), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000118}
119
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000120static void
121w_object(v, p)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000122 object *v;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000123 WFILE *p;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000124{
125 long i, n;
126
127 if (v == NULL)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000128 w_byte(TYPE_NULL, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000129 else if (v == None)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000130 w_byte(TYPE_NONE, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000131 else if (is_intobject(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000132 w_byte(TYPE_INT, p);
133 w_long(getintvalue(v), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000134 }
135 else if (is_longobject(v)) {
136 longobject *ob = (longobject *)v;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000137 w_byte(TYPE_LONG, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000138 n = ob->ob_size;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000139 w_long((long)n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000140 if (n < 0)
141 n = -n;
142 for (i = 0; i < n; i++)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000143 w_short(ob->ob_digit[i], p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000144 }
145 else if (is_floatobject(v)) {
146 extern void float_buf_repr PROTO((char *, floatobject *));
147 char buf[256]; /* Plenty to format any double */
148 float_buf_repr(buf, (floatobject *)v);
149 n = strlen(buf);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000150 w_byte(TYPE_FLOAT, p);
151 w_byte((int)n, p);
152 w_string(buf, (int)n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000153 }
154 else if (is_stringobject(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000155 w_byte(TYPE_STRING, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000156 n = getstringsize(v);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000157 w_long(n, p);
158 w_string(getstringvalue(v), (int)n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000159 }
160 else if (is_tupleobject(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000161 w_byte(TYPE_TUPLE, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000162 n = gettuplesize(v);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000163 w_long(n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000164 for (i = 0; i < n; i++) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000165 w_object(gettupleitem(v, (int)i), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000166 }
167 }
168 else if (is_listobject(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000169 w_byte(TYPE_LIST, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000170 n = getlistsize(v);
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000171 w_long(n, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000172 for (i = 0; i < n; i++) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000173 w_object(getlistitem(v, (int)i), p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000174 }
175 }
Guido van Rossum64b45521991-06-07 13:58:22 +0000176 else if (is_dictobject(v)) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000177 w_byte(TYPE_DICT, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000178 /* This one is NULL object terminated! */
179 n = getdictsize(v);
180 for (i = 0; i < n; i++) {
181 object *key, *val;
Guido van Rossum64b45521991-06-07 13:58:22 +0000182 key = getdict2key(v, (int)i);
183 if (key != NULL) {
Guido van Rossumb8813141991-08-16 09:01:55 +0000184 val = dict2lookup(v, key); /* Can't be NULL */
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000185 w_object(key, p);
186 w_object(val, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000187 }
188 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000189 w_object((object *)NULL, p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000190 }
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000191 else if (is_codeobject(v)) {
192 codeobject *co = (codeobject *)v;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000193 w_byte(TYPE_CODE, p);
194 w_object((object *)co->co_code, p);
195 w_object(co->co_consts, p);
196 w_object(co->co_names, p);
197 w_object(co->co_filename, p);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000198 w_object(co->co_name, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000199 }
200 else {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000201 w_byte(TYPE_UNKNOWN, p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000202 }
203}
204
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000205void
206wr_long(x, fp)
207 long x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000208 FILE *fp;
209{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000210 WFILE wf;
211 wf.fp = fp;
212 w_long(x, &wf);
213}
214
215void
216wr_object(x, fp)
217 object *x;
218 FILE *fp;
219{
220 WFILE wf;
221 wf.fp = fp;
222 w_object(x, &wf);
223}
224
225typedef WFILE RFILE; /* Same struct with different invariants */
226
227#define r_byte(p) ((p)->fp ? getc((p)->fp) \
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000228 : ((p)->ptr != (p)->end) ? \
229 (unsigned char)*(p)->ptr++ : EOF)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000230
231static int
232r_string(s, n, p)
233 char *s;
234 int n;
235 RFILE *p;
236{
237 if (p->fp != NULL)
238 return fread(s, 1, n, p->fp);
239 if (p->end - p->ptr < n)
240 n = p->end - p->ptr;
241 memcpy(s, p->ptr, n);
242 p->ptr += n;
243 return n;
244}
245
246static int
247r_short(p)
248 RFILE *p;
249{
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000250 register short x;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000251 x = r_byte(p);
252 x |= r_byte(p) << 8;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000253 /* XXX If your short is > 16 bits, add sign-extension here!!! */
254 return x;
255}
256
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000257static long
258r_long(p)
259 RFILE *p;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000260{
261 register long x;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000262 x = r_byte(p);
263 x |= (long)r_byte(p) << 8;
264 x |= (long)r_byte(p) << 16;
265 x |= (long)r_byte(p) << 24;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000266 /* XXX If your long is > 32 bits, add sign-extension here!!! */
267 return x;
268}
269
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000270static object *
271r_object(p)
272 RFILE *p;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000273{
274 object *v;
275 long i, n;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000276 int type = r_byte(p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000277
278 switch (type) {
279
280 case EOF:
Guido van Rossum87e7ea71991-12-10 14:00:03 +0000281 err_setstr(EOFError, "EOF read where object expected");
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000282 return NULL;
283
284 case TYPE_NULL:
285 return NULL;
286
287 case TYPE_NONE:
288 INCREF(None);
289 return None;
290
291 case TYPE_INT:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000292 return newintobject(r_long(p));
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000293
294 case TYPE_LONG:
295 {
296 int size;
297 longobject *ob;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000298 n = r_long(p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000299 size = n<0 ? -n : n;
300 ob = alloclongobject(size);
301 if (ob == NULL)
302 return NULL;
303 ob->ob_size = n;
304 for (i = 0; i < size; i++)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000305 ob->ob_digit[i] = r_short(p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000306 return (object *)ob;
307 }
308
309 case TYPE_FLOAT:
310 {
Guido van Rossum2807d191992-03-27 17:23:17 +0000311 extern double strtod PROTO((const char *, char **));
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000312 char buf[256];
313 double res;
314 char *end;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000315 n = r_byte(p);
316 if (r_string(buf, (int)n, p) != n) {
Guido van Rossum87e7ea71991-12-10 14:00:03 +0000317 err_setstr(EOFError,
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000318 "EOF read where object expected");
319 return NULL;
320 }
321 buf[n] = '\0';
322 errno = 0;
323 res = strtod(buf, &end);
324 if (*end != '\0') {
Guido van Rossum87e7ea71991-12-10 14:00:03 +0000325 err_setstr(ValueError, "bad float syntax");
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000326 return NULL;
327 }
328 if (errno != 0) {
Guido van Rossum87e7ea71991-12-10 14:00:03 +0000329 err_setstr(ValueError,
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000330 "float constant too large");
331 return NULL;
332 }
333 return newfloatobject(res);
334 }
335
336 case TYPE_STRING:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000337 n = r_long(p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000338 v = newsizedstringobject((char *)NULL, n);
339 if (v != NULL) {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000340 if (r_string(getstringvalue(v), (int)n, p) != n) {
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000341 DECREF(v);
342 v = NULL;
Guido van Rossum87e7ea71991-12-10 14:00:03 +0000343 err_setstr(EOFError,
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000344 "EOF read where object expected");
345 }
346 }
347 return v;
348
349 case TYPE_TUPLE:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000350 n = r_long(p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000351 v = newtupleobject((int)n);
352 if (v == NULL)
353 return v;
354 for (i = 0; i < n; i++)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000355 settupleitem(v, (int)i, r_object(p));
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000356 return v;
357
358 case TYPE_LIST:
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000359 n = r_long(p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000360 v = newlistobject((int)n);
361 if (v == NULL)
362 return v;
363 for (i = 0; i < n; i++)
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000364 setlistitem(v, (int)i, r_object(p));
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000365 return v;
366
Guido van Rossum64b45521991-06-07 13:58:22 +0000367 case TYPE_DICT:
368 v = newdictobject();
369 if (v == NULL)
370 return NULL;
371 for (;;) {
372 object *key, *val;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000373 key = r_object(p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000374 if (key == NULL)
375 break;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000376 val = r_object(p);
Guido van Rossum64b45521991-06-07 13:58:22 +0000377 dict2insert(v, key, val);
378 DECREF(key);
379 XDECREF(val);
380 }
381 return v;
382
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000383 case TYPE_CODE:
384 {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000385 object *code = r_object(p);
386 object *consts = r_object(p);
387 object *names = r_object(p);
388 object *filename = r_object(p);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000389 object *name = r_object(p);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000390 if (!err_occurred()) {
391 v = (object *) newcodeobject(code,
Guido van Rossum9bfef441993-03-29 10:43:31 +0000392 consts, names, filename, name);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000393 }
394 else
395 v = NULL;
396 XDECREF(code);
397 XDECREF(consts);
398 XDECREF(names);
399 XDECREF(filename);
400
401 }
402 return v;
403
404 default:
Guido van Rossum87e7ea71991-12-10 14:00:03 +0000405 err_setstr(TypeError, "read unknown object");
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000406 return NULL;
407
408 }
409}
410
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000411long
412rd_long(fp)
413 FILE *fp;
414{
415 RFILE rf;
416 rf.fp = fp;
417 return r_long(&rf);
418}
419
420object *
421rd_object(fp)
422 FILE *fp;
423{
424 RFILE rf;
425 rf.fp = fp;
426 return r_object(&rf);
427}
428
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000429object *
430rds_object(str, len)
431 char *str;
432 int len;
433{
434 RFILE rf;
435 rf.fp = NULL;
436 rf.str = NULL;
437 rf.ptr = str;
438 rf.end = str + len;
439 return r_object(&rf);
440}
441
Guido van Rossum64b45521991-06-07 13:58:22 +0000442/* And an interface for Python programs... */
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000443
444static object *
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000445marshal_dump(self, args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000446 object *self;
447 object *args;
448{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000449 WFILE wf;
450 object *x;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000451 object *f;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000452 if (!getargs(args, "(OO)", &x, &f))
453 return NULL;
454 if (!is_fileobject(f)) {
455 err_setstr(TypeError, "marshal.dump() 2nd arg must be file");
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000456 return NULL;
457 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000458 wf.fp = getfilefile(f);
459 wf.str = NULL;
460 wf.ptr = wf.end = NULL;
461 w_object(x, &wf);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000462 INCREF(None);
463 return None;
464}
465
466static object *
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000467marshal_load(self, args)
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000468 object *self;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000469 object *args;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000470{
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000471 RFILE rf;
472 object *f;
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000473 object *v;
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000474 if (!getargs(args, "O", &f))
475 return NULL;
476 if (!is_fileobject(f)) {
477 err_setstr(TypeError, "marshal.load() arg must be file");
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000478 return NULL;
479 }
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000480 rf.fp = getfilefile(f);
481 rf.str = NULL;
482 rf.ptr = rf.end = NULL;
483 err_clear();
484 v = r_object(&rf);
485 if (err_occurred()) {
486 XDECREF(v);
487 v = NULL;
488 }
489 return v;
490}
491
492static object *
493marshal_dumps(self, args)
494 object *self;
495 object *args;
496{
497 WFILE wf;
498 object *x;
499 if (!getargs(args, "O", &x))
500 return NULL;
501 wf.fp = NULL;
502 wf.str = newsizedstringobject((char *)NULL, 50);
503 if (wf.str == NULL)
504 return NULL;
505 wf.ptr = GETSTRINGVALUE((stringobject *)wf.str);
506 wf.end = wf.ptr + getstringsize(wf.str);
507 w_object(x, &wf);
508 if (wf.str != NULL)
509 resizestring(&wf.str,
510 (int) (wf.ptr - GETSTRINGVALUE((stringobject *)wf.str)));
511 return wf.str;
512}
513
514static object *
515marshal_loads(self, args)
516 object *self;
517 object *args;
518{
519 RFILE rf;
520 object *v;
521 char *s;
522 int n;
523 if (!getargs(args, "s#", &s, &n))
524 return NULL;
525 rf.fp = NULL;
526 rf.str = args;
527 rf.ptr = s;
528 rf.end = s + n;
529 err_clear();
530 v = r_object(&rf);
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000531 if (err_occurred()) {
532 XDECREF(v);
533 v = NULL;
534 }
535 return v;
536}
537
538static struct methodlist marshal_methods[] = {
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000539 {"dump", marshal_dump},
540 {"load", marshal_load},
541 {"dumps", marshal_dumps},
542 {"loads", marshal_loads},
Guido van Rossumdce2e3d1991-06-04 19:42:30 +0000543 {NULL, NULL} /* sentinel */
544};
545
546void
547initmarshal()
548{
549 (void) initmodule("marshal", marshal_methods);
550}