2 /* Write Python objects to files and read them back.
3 This is intended for writing and reading compiled Python code only;
4 a true persistent storage facility would be much harder, since
5 it would have to take circular links and sharing into account. */
7 #define PY_SSIZE_T_CLEAN
10 #include "longintrepr.h"
14 /* High water mark to determine when the marshalled object is dangerously deep
15 * and risks coring the interpreter. When the object stack gets this deep,
16 * raise an exception instead of continuing.
18 #define MAX_MARSHAL_STACK_DEPTH 5000
22 #define TYPE_FALSE 'F'
24 #define TYPE_STOPITER 'S'
25 #define TYPE_ELLIPSIS '.'
27 #define TYPE_INT64 'I'
28 #define TYPE_FLOAT 'f'
29 #define TYPE_BINARY_FLOAT 'g'
30 #define TYPE_COMPLEX 'x'
31 #define TYPE_BINARY_COMPLEX 'y'
33 #define TYPE_STRING 's'
34 #define TYPE_INTERNED 't'
35 #define TYPE_STRINGREF 'R'
36 #define TYPE_TUPLE '('
40 #define TYPE_UNICODE 'u'
41 #define TYPE_UNKNOWN '?'
43 #define TYPE_FROZENSET '>'
49 /* If fp == NULL, the following are valid: */
53 PyObject
*strings
; /* dict on marshal, list on unmarshal */
57 #define w_byte(c, p) if (((p)->fp)) putc((c), (p)->fp); \
58 else if ((p)->ptr != (p)->end) *(p)->ptr++ = (c); \
62 w_more(int c
, WFILE
*p
)
64 Py_ssize_t size
, newsize
;
66 return; /* An error already occurred */
67 size
= PyString_Size(p
->str
);
68 newsize
= size
+ 1024;
69 if (_PyString_Resize(&p
->str
, newsize
) != 0) {
70 p
->ptr
= p
->end
= NULL
;
73 p
->ptr
= PyString_AS_STRING((PyStringObject
*)p
->str
) + size
;
75 PyString_AS_STRING((PyStringObject
*)p
->str
) + newsize
;
76 *p
->ptr
++ = Py_SAFE_DOWNCAST(c
, int, char);
81 w_string(char *s
, int n
, WFILE
*p
)
84 fwrite(s
, 1, n
, p
->fp
);
95 w_short(int x
, WFILE
*p
)
97 w_byte((char)( x
& 0xff), p
);
98 w_byte((char)((x
>> 8) & 0xff), p
);
102 w_long(long x
, WFILE
*p
)
104 w_byte((char)( x
& 0xff), p
);
105 w_byte((char)((x
>> 8) & 0xff), p
);
106 w_byte((char)((x
>>16) & 0xff), p
);
107 w_byte((char)((x
>>24) & 0xff), p
);
112 w_long64(long x
, WFILE
*p
)
120 w_object(PyObject
*v
, WFILE
*p
)
126 if (p
->depth
> MAX_MARSHAL_STACK_DEPTH
) {
129 else if (v
== NULL
) {
130 w_byte(TYPE_NULL
, p
);
132 else if (v
== Py_None
) {
133 w_byte(TYPE_NONE
, p
);
135 else if (v
== PyExc_StopIteration
) {
136 w_byte(TYPE_STOPITER
, p
);
138 else if (v
== Py_Ellipsis
) {
139 w_byte(TYPE_ELLIPSIS
, p
);
141 else if (v
== Py_False
) {
142 w_byte(TYPE_FALSE
, p
);
144 else if (v
== Py_True
) {
145 w_byte(TYPE_TRUE
, p
);
147 else if (PyInt_Check(v
)) {
148 long x
= PyInt_AS_LONG((PyIntObject
*)v
);
150 long y
= Py_ARITHMETIC_RIGHT_SHIFT(long, x
, 31);
152 w_byte(TYPE_INT64
, p
);
162 else if (PyLong_Check(v
)) {
163 PyLongObject
*ob
= (PyLongObject
*)v
;
164 w_byte(TYPE_LONG
, p
);
169 for (i
= 0; i
< n
; i
++)
170 w_short(ob
->ob_digit
[i
], p
);
172 else if (PyFloat_Check(v
)) {
173 if (p
->version
> 1) {
174 unsigned char buf
[8];
175 if (_PyFloat_Pack8(PyFloat_AsDouble(v
),
180 w_byte(TYPE_BINARY_FLOAT
, p
);
181 w_string((char*)buf
, 8, p
);
184 char buf
[256]; /* Plenty to format any double */
185 PyFloat_AsReprString(buf
, (PyFloatObject
*)v
);
187 w_byte(TYPE_FLOAT
, p
);
189 w_string(buf
, (int)n
, p
);
192 #ifndef WITHOUT_COMPLEX
193 else if (PyComplex_Check(v
)) {
194 if (p
->version
> 1) {
195 unsigned char buf
[8];
196 if (_PyFloat_Pack8(PyComplex_RealAsDouble(v
),
201 w_byte(TYPE_BINARY_COMPLEX
, p
);
202 w_string((char*)buf
, 8, p
);
203 if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v
),
208 w_string((char*)buf
, 8, p
);
211 char buf
[256]; /* Plenty to format any double */
213 w_byte(TYPE_COMPLEX
, p
);
214 temp
= (PyFloatObject
*)PyFloat_FromDouble(
215 PyComplex_RealAsDouble(v
));
220 PyFloat_AsReprString(buf
, temp
);
224 w_string(buf
, (int)n
, p
);
225 temp
= (PyFloatObject
*)PyFloat_FromDouble(
226 PyComplex_ImagAsDouble(v
));
231 PyFloat_AsReprString(buf
, temp
);
235 w_string(buf
, (int)n
, p
);
239 else if (PyString_Check(v
)) {
240 if (p
->strings
&& PyString_CHECK_INTERNED(v
)) {
241 PyObject
*o
= PyDict_GetItem(p
->strings
, v
);
243 long w
= PyInt_AsLong(o
);
244 w_byte(TYPE_STRINGREF
, p
);
249 o
= PyInt_FromSsize_t(PyDict_Size(p
->strings
));
250 PyDict_SetItem(p
->strings
, v
, o
);
252 w_byte(TYPE_INTERNED
, p
);
256 w_byte(TYPE_STRING
, p
);
258 n
= PyString_GET_SIZE(v
);
260 /* huge strings are not supported */
266 w_string(PyString_AS_STRING(v
), (int)n
, p
);
268 #ifdef Py_USING_UNICODE
269 else if (PyUnicode_Check(v
)) {
271 utf8
= PyUnicode_AsUTF8String(v
);
277 w_byte(TYPE_UNICODE
, p
);
278 n
= PyString_GET_SIZE(utf8
);
285 w_string(PyString_AS_STRING(utf8
), (int)n
, p
);
289 else if (PyTuple_Check(v
)) {
290 w_byte(TYPE_TUPLE
, p
);
293 for (i
= 0; i
< n
; i
++) {
294 w_object(PyTuple_GET_ITEM(v
, i
), p
);
297 else if (PyList_Check(v
)) {
298 w_byte(TYPE_LIST
, p
);
299 n
= PyList_GET_SIZE(v
);
301 for (i
= 0; i
< n
; i
++) {
302 w_object(PyList_GET_ITEM(v
, i
), p
);
305 else if (PyDict_Check(v
)) {
307 PyObject
*key
, *value
;
308 w_byte(TYPE_DICT
, p
);
309 /* This one is NULL object terminated! */
311 while (PyDict_Next(v
, &pos
, &key
, &value
)) {
315 w_object((PyObject
*)NULL
, p
);
317 else if (PyAnySet_Check(v
)) {
318 PyObject
*value
, *it
;
320 if (PyObject_TypeCheck(v
, &PySet_Type
))
323 w_byte(TYPE_FROZENSET
, p
);
324 n
= PyObject_Size(v
);
331 it
= PyObject_GetIter(v
);
337 while ((value
= PyIter_Next(it
)) != NULL
) {
342 if (PyErr_Occurred()) {
348 else if (PyCode_Check(v
)) {
349 PyCodeObject
*co
= (PyCodeObject
*)v
;
350 w_byte(TYPE_CODE
, p
);
351 w_long(co
->co_argcount
, p
);
352 w_long(co
->co_nlocals
, p
);
353 w_long(co
->co_stacksize
, p
);
354 w_long(co
->co_flags
, p
);
355 w_object(co
->co_code
, p
);
356 w_object(co
->co_consts
, p
);
357 w_object(co
->co_names
, p
);
358 w_object(co
->co_varnames
, p
);
359 w_object(co
->co_freevars
, p
);
360 w_object(co
->co_cellvars
, p
);
361 w_object(co
->co_filename
, p
);
362 w_object(co
->co_name
, p
);
363 w_long(co
->co_firstlineno
, p
);
364 w_object(co
->co_lnotab
, p
);
366 else if (PyObject_CheckReadBuffer(v
)) {
367 /* Write unknown buffer-style objects as a string */
369 PyBufferProcs
*pb
= v
->ob_type
->tp_as_buffer
;
370 w_byte(TYPE_STRING
, p
);
371 n
= (*pb
->bf_getreadbuffer
)(v
, 0, (void **)&s
);
378 w_string(s
, (int)n
, p
);
381 w_byte(TYPE_UNKNOWN
, p
);
388 /* version currently has no effect for writing longs. */
390 PyMarshal_WriteLongToFile(long x
, FILE *fp
, int version
)
397 wf
.version
= version
;
402 PyMarshal_WriteObjectToFile(PyObject
*x
, FILE *fp
, int version
)
408 wf
.strings
= (version
> 0) ? PyDict_New() : NULL
;
409 wf
.version
= version
;
411 Py_XDECREF(wf
.strings
);
414 typedef WFILE RFILE
; /* Same struct with different invariants */
416 #define rs_byte(p) (((p)->ptr != (p)->end) ? (unsigned char)*(p)->ptr++ : EOF)
418 #define r_byte(p) ((p)->fp ? getc((p)->fp) : rs_byte(p))
421 r_string(char *s
, int n
, RFILE
*p
)
424 /* The result fits into int because it must be <=n. */
425 return (int)fread(s
, 1, n
, p
->fp
);
426 if (p
->end
- p
->ptr
< n
)
427 n
= (int)(p
->end
- p
->ptr
);
428 memcpy(s
, p
->ptr
, n
);
439 /* Sign-extension, in case short greater than 16 bits */
448 register FILE *fp
= p
->fp
;
451 x
|= (long)getc(fp
) << 8;
452 x
|= (long)getc(fp
) << 16;
453 x
|= (long)getc(fp
) << 24;
457 x
|= (long)rs_byte(p
) << 8;
458 x
|= (long)rs_byte(p
) << 16;
459 x
|= (long)rs_byte(p
) << 24;
462 /* Sign extension for 64-bit machines */
463 x
|= -(x
& 0x80000000L
);
468 /* r_long64 deals with the TYPE_INT64 code. On a machine with
469 sizeof(long) > 4, it returns a Python int object, else a Python long
470 object. Note that w_long64 writes out TYPE_INT if 32 bits is enough,
471 so there's no inefficiency here in returning a PyLong on 32-bit boxes
472 for everything written via TYPE_INT64 (i.e., if an int is written via
473 TYPE_INT64, it *needs* more than 32 bits).
478 long lo4
= r_long(p
);
479 long hi4
= r_long(p
);
481 long x
= (hi4
<< 32) | (lo4
& 0xFFFFFFFFL
);
482 return PyInt_FromLong(x
);
484 unsigned char buf
[8];
486 int is_little_endian
= (int)*(char*)&one
;
487 if (is_little_endian
) {
488 memcpy(buf
, &lo4
, 4);
489 memcpy(buf
+4, &hi4
, 4);
492 memcpy(buf
, &hi4
, 4);
493 memcpy(buf
+4, &lo4
, 4);
495 return _PyLong_FromByteArray(buf
, 8, is_little_endian
, 1);
502 /* NULL is a valid return value, it does not necessarily means that
503 an exception is set. */
504 PyObject
*v
, *v2
, *v3
;
506 int type
= r_byte(p
);
511 PyErr_SetString(PyExc_EOFError
,
512 "EOF read where object expected");
523 Py_INCREF(PyExc_StopIteration
);
524 return PyExc_StopIteration
;
527 Py_INCREF(Py_Ellipsis
);
539 return PyInt_FromLong(r_long(p
));
549 if (n
< -INT_MAX
|| n
> INT_MAX
) {
550 PyErr_SetString(PyExc_ValueError
,
555 ob
= _PyLong_New(size
);
559 for (i
= 0; i
< size
; i
++) {
560 int digit
= r_short(p
);
563 PyErr_SetString(PyExc_ValueError
,
567 ob
->ob_digit
[i
] = digit
;
569 return (PyObject
*)ob
;
577 if (n
== EOF
|| r_string(buf
, (int)n
, p
) != n
) {
578 PyErr_SetString(PyExc_EOFError
,
579 "EOF read where object expected");
583 PyFPE_START_PROTECT("atof", return 0)
584 dx
= PyOS_ascii_atof(buf
);
585 PyFPE_END_PROTECT(dx
)
586 return PyFloat_FromDouble(dx
);
589 case TYPE_BINARY_FLOAT
:
591 unsigned char buf
[8];
593 if (r_string((char*)buf
, 8, p
) != 8) {
594 PyErr_SetString(PyExc_EOFError
,
595 "EOF read where object expected");
598 x
= _PyFloat_Unpack8(buf
, 1);
599 if (x
== -1.0 && PyErr_Occurred()) {
602 return PyFloat_FromDouble(x
);
605 #ifndef WITHOUT_COMPLEX
611 if (n
== EOF
|| r_string(buf
, (int)n
, p
) != n
) {
612 PyErr_SetString(PyExc_EOFError
,
613 "EOF read where object expected");
617 PyFPE_START_PROTECT("atof", return 0)
618 c
.real
= PyOS_ascii_atof(buf
);
621 if (n
== EOF
|| r_string(buf
, (int)n
, p
) != n
) {
622 PyErr_SetString(PyExc_EOFError
,
623 "EOF read where object expected");
627 PyFPE_START_PROTECT("atof", return 0)
628 c
.imag
= PyOS_ascii_atof(buf
);
630 return PyComplex_FromCComplex(c
);
633 case TYPE_BINARY_COMPLEX
:
635 unsigned char buf
[8];
637 if (r_string((char*)buf
, 8, p
) != 8) {
638 PyErr_SetString(PyExc_EOFError
,
639 "EOF read where object expected");
642 c
.real
= _PyFloat_Unpack8(buf
, 1);
643 if (c
.real
== -1.0 && PyErr_Occurred()) {
646 if (r_string((char*)buf
, 8, p
) != 8) {
647 PyErr_SetString(PyExc_EOFError
,
648 "EOF read where object expected");
651 c
.imag
= _PyFloat_Unpack8(buf
, 1);
652 if (c
.imag
== -1.0 && PyErr_Occurred()) {
655 return PyComplex_FromCComplex(c
);
662 if (n
< 0 || n
> INT_MAX
) {
663 PyErr_SetString(PyExc_ValueError
, "bad marshal data");
666 v
= PyString_FromStringAndSize((char *)NULL
, n
);
669 if (r_string(PyString_AS_STRING(v
), (int)n
, p
) != n
) {
671 PyErr_SetString(PyExc_EOFError
,
672 "EOF read where object expected");
675 if (type
== TYPE_INTERNED
) {
676 PyString_InternInPlace(&v
);
677 PyList_Append(p
->strings
, v
);
683 if (n
< 0 || n
>= PyList_GET_SIZE(p
->strings
)) {
684 PyErr_SetString(PyExc_ValueError
, "bad marshal data");
687 v
= PyList_GET_ITEM(p
->strings
, n
);
691 #ifdef Py_USING_UNICODE
697 if (n
< 0 || n
> INT_MAX
) {
698 PyErr_SetString(PyExc_ValueError
, "bad marshal data");
701 buffer
= PyMem_NEW(char, n
);
703 return PyErr_NoMemory();
704 if (r_string(buffer
, (int)n
, p
) != n
) {
706 PyErr_SetString(PyExc_EOFError
,
707 "EOF read where object expected");
710 v
= PyUnicode_DecodeUTF8(buffer
, n
, NULL
);
718 if (n
< 0 || n
> INT_MAX
) {
719 PyErr_SetString(PyExc_ValueError
, "bad marshal data");
722 v
= PyTuple_New((int)n
);
725 for (i
= 0; i
< n
; i
++) {
728 if (!PyErr_Occurred())
729 PyErr_SetString(PyExc_TypeError
,
730 "NULL object in marshal data");
735 PyTuple_SET_ITEM(v
, (int)i
, v2
);
741 if (n
< 0 || n
> INT_MAX
) {
742 PyErr_SetString(PyExc_ValueError
, "bad marshal data");
745 v
= PyList_New((int)n
);
748 for (i
= 0; i
< n
; i
++) {
751 if (!PyErr_Occurred())
752 PyErr_SetString(PyExc_TypeError
,
753 "NULL object in marshal data");
758 PyList_SetItem(v
, (int)i
, v2
);
773 PyDict_SetItem(v
, key
, val
);
777 if (PyErr_Occurred()) {
787 PyErr_SetString(PyExc_ValueError
, "bad marshal data");
790 v
= PyTuple_New((int)n
);
793 for (i
= 0; i
< n
; i
++) {
796 if (!PyErr_Occurred())
797 PyErr_SetString(PyExc_TypeError
,
798 "NULL object in marshal data");
803 PyTuple_SET_ITEM(v
, (int)i
, v2
);
807 if (type
== TYPE_SET
)
810 v3
= PyFrozenSet_New(v
);
815 if (PyEval_GetRestricted()) {
816 PyErr_SetString(PyExc_RuntimeError
,
817 "cannot unmarshal code objects in "
818 "restricted execution mode");
826 PyObject
*code
= NULL
;
827 PyObject
*consts
= NULL
;
828 PyObject
*names
= NULL
;
829 PyObject
*varnames
= NULL
;
830 PyObject
*freevars
= NULL
;
831 PyObject
*cellvars
= NULL
;
832 PyObject
*filename
= NULL
;
833 PyObject
*name
= NULL
;
835 PyObject
*lnotab
= NULL
;
839 /* XXX ignore long->int overflows for now */
840 argcount
= (int)r_long(p
);
841 nlocals
= (int)r_long(p
);
842 stacksize
= (int)r_long(p
);
843 flags
= (int)r_long(p
);
847 consts
= r_object(p
);
853 varnames
= r_object(p
);
854 if (varnames
== NULL
)
856 freevars
= r_object(p
);
857 if (freevars
== NULL
)
859 cellvars
= r_object(p
);
860 if (cellvars
== NULL
)
862 filename
= r_object(p
);
863 if (filename
== NULL
)
868 firstlineno
= (int)r_long(p
);
869 lnotab
= r_object(p
);
873 v
= (PyObject
*) PyCode_New(
874 argcount
, nlocals
, stacksize
, flags
,
875 code
, consts
, names
, varnames
,
876 freevars
, cellvars
, filename
, name
,
877 firstlineno
, lnotab
);
883 Py_XDECREF(varnames
);
884 Py_XDECREF(freevars
);
885 Py_XDECREF(cellvars
);
886 Py_XDECREF(filename
);
894 /* Bogus data got written, which isn't ideal.
895 This will let you keep working and recover. */
896 PyErr_SetString(PyExc_ValueError
, "bad marshal data");
903 read_object(RFILE
*p
)
906 if (PyErr_Occurred()) {
907 fprintf(stderr
, "XXX readobject called with exception set\n");
911 if (v
== NULL
&& !PyErr_Occurred())
912 PyErr_SetString(PyExc_TypeError
, "NULL object in marshal data");
917 PyMarshal_ReadShortFromFile(FILE *fp
)
923 rf
.end
= rf
.ptr
= NULL
;
928 PyMarshal_ReadLongFromFile(FILE *fp
)
937 /* Return size of file in bytes; < 0 if unknown. */
939 getfilesize(FILE *fp
)
942 if (fstat(fileno(fp
), &st
) != 0)
949 /* If we can get the size of the file up-front, and it's reasonably small,
950 * read it in one gulp and delegate to ...FromString() instead. Much quicker
951 * than reading a byte at a time from file; speeds .pyc imports.
952 * CAUTION: since this may read the entire remainder of the file, don't
953 * call it unless you know you're done with the file.
956 PyMarshal_ReadLastObjectFromFile(FILE *fp
)
958 /* 75% of 2.1's .pyc files can exploit SMALL_FILE_LIMIT.
959 * REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc.
961 #define SMALL_FILE_LIMIT (1L << 14)
962 #define REASONABLE_FILE_LIMIT (1L << 18)
967 filesize
= getfilesize(fp
);
969 char buf
[SMALL_FILE_LIMIT
];
971 if (filesize
<= SMALL_FILE_LIMIT
)
973 else if (filesize
<= REASONABLE_FILE_LIMIT
)
974 pBuf
= (char *)PyMem_MALLOC(filesize
);
978 /* filesize must fit into an int, because it
979 is smaller than REASONABLE_FILE_LIMIT */
980 n
= fread(pBuf
, 1, (int)filesize
, fp
);
981 v
= PyMarshal_ReadObjectFromString(pBuf
, n
);
989 /* We don't have fstat, or we do but the file is larger than
990 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
992 return PyMarshal_ReadObjectFromFile(fp
);
994 #undef SMALL_FILE_LIMIT
995 #undef REASONABLE_FILE_LIMIT
999 PyMarshal_ReadObjectFromFile(FILE *fp
)
1004 rf
.strings
= PyList_New(0);
1005 result
= r_object(&rf
);
1006 Py_DECREF(rf
.strings
);
1011 PyMarshal_ReadObjectFromString(char *str
, Py_ssize_t len
)
1018 rf
.strings
= PyList_New(0);
1019 result
= r_object(&rf
);
1020 Py_DECREF(rf
.strings
);
1025 PyMarshal_WriteObjectToString(PyObject
*x
, int version
)
1029 wf
.str
= PyString_FromStringAndSize((char *)NULL
, 50);
1032 wf
.ptr
= PyString_AS_STRING((PyStringObject
*)wf
.str
);
1033 wf
.end
= wf
.ptr
+ PyString_Size(wf
.str
);
1036 wf
.version
= version
;
1037 wf
.strings
= (version
> 0) ? PyDict_New() : NULL
;
1039 Py_XDECREF(wf
.strings
);
1040 if (wf
.str
!= NULL
) {
1041 char *base
= PyString_AS_STRING((PyStringObject
*)wf
.str
);
1042 if (wf
.ptr
- base
> PY_SSIZE_T_MAX
) {
1044 PyErr_SetString(PyExc_OverflowError
,
1045 "too much marshall data for a string");
1048 _PyString_Resize(&wf
.str
, (Py_ssize_t
)(wf
.ptr
- base
));
1052 PyErr_SetString(PyExc_ValueError
,
1053 (wf
.error
==1)?"unmarshallable object"
1054 :"object too deeply nested to marshal");
1060 /* And an interface for Python programs... */
1063 marshal_dump(PyObject
*self
, PyObject
*args
)
1068 int version
= Py_MARSHAL_VERSION
;
1069 if (!PyArg_ParseTuple(args
, "OO|i:dump", &x
, &f
, &version
))
1071 if (!PyFile_Check(f
)) {
1072 PyErr_SetString(PyExc_TypeError
,
1073 "marshal.dump() 2nd arg must be file");
1076 wf
.fp
= PyFile_AsFile(f
);
1078 wf
.ptr
= wf
.end
= NULL
;
1081 wf
.strings
= (version
> 0) ? PyDict_New() : 0;
1082 wf
.version
= version
;
1084 Py_XDECREF(wf
.strings
);
1086 PyErr_SetString(PyExc_ValueError
,
1087 (wf
.error
==1)?"unmarshallable object"
1088 :"object too deeply nested to marshal");
1096 marshal_load(PyObject
*self
, PyObject
*f
)
1100 if (!PyFile_Check(f
)) {
1101 PyErr_SetString(PyExc_TypeError
,
1102 "marshal.load() arg must be file");
1105 rf
.fp
= PyFile_AsFile(f
);
1106 rf
.strings
= PyList_New(0);
1107 result
= read_object(&rf
);
1108 Py_DECREF(rf
.strings
);
1113 marshal_dumps(PyObject
*self
, PyObject
*args
)
1116 int version
= Py_MARSHAL_VERSION
;
1117 if (!PyArg_ParseTuple(args
, "O|i:dumps", &x
, &version
))
1119 return PyMarshal_WriteObjectToString(x
, version
);
1123 marshal_loads(PyObject
*self
, PyObject
*args
)
1129 if (!PyArg_ParseTuple(args
, "s#:loads", &s
, &n
))
1134 rf
.strings
= PyList_New(0);
1135 result
= read_object(&rf
);
1136 Py_DECREF(rf
.strings
);
1140 static PyMethodDef marshal_methods
[] = {
1141 {"dump", marshal_dump
, METH_VARARGS
},
1142 {"load", marshal_load
, METH_O
},
1143 {"dumps", marshal_dumps
, METH_VARARGS
},
1144 {"loads", marshal_loads
, METH_VARARGS
},
1145 {NULL
, NULL
} /* sentinel */
1149 PyMarshal_Init(void)
1151 PyObject
*mod
= Py_InitModule("marshal", marshal_methods
);
1154 PyModule_AddIntConstant(mod
, "version", Py_MARSHAL_VERSION
);