Home | History | Annotate | Download | only in Python
      1 /** @file
      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.
      6 
      7   Copyright (c) 2015, Daryl McDaniel. All rights reserved.<BR>
      8   This program and the accompanying materials are licensed and made available under
      9   the terms and conditions of the BSD License that accompanies this distribution.
     10   The full text of the license may be found at
     11   http://opensource.org/licenses/bsd-license.
     12 
     13   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     14   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     15 **/
     16 
     17 #define PY_SSIZE_T_CLEAN
     18 
     19 #include "Python.h"
     20 #include "longintrepr.h"
     21 #include "code.h"
     22 #include "marshal.h"
     23 
     24 #undef ABS
     25 #define ABS(x) ((x) < 0 ? -(x) : (x))
     26 
     27 /* High water mark to determine when the marshalled object is dangerously deep
     28  * and risks coring the interpreter.  When the object stack gets this deep,
     29  * raise an exception instead of continuing.
     30  */
     31 #define MAX_MARSHAL_STACK_DEPTH 2000
     32 
     33 #define TYPE_NULL               '0'
     34 #define TYPE_NONE               'N'
     35 #define TYPE_FALSE              'F'
     36 #define TYPE_TRUE               'T'
     37 #define TYPE_STOPITER           'S'
     38 #define TYPE_ELLIPSIS           '.'
     39 #define TYPE_INT                'i'
     40 #define TYPE_INT64              'I'
     41 #define TYPE_FLOAT              'f'
     42 #define TYPE_BINARY_FLOAT       'g'
     43 #define TYPE_COMPLEX            'x'
     44 #define TYPE_BINARY_COMPLEX     'y'
     45 #define TYPE_LONG               'l'
     46 #define TYPE_STRING             's'
     47 #define TYPE_INTERNED           't'
     48 #define TYPE_STRINGREF          'R'
     49 #define TYPE_TUPLE              '('
     50 #define TYPE_LIST               '['
     51 #define TYPE_DICT               '{'
     52 #define TYPE_CODE               'c'
     53 #define TYPE_UNICODE            'u'
     54 #define TYPE_UNKNOWN            '?'
     55 #define TYPE_SET                '<'
     56 #define TYPE_FROZENSET          '>'
     57 
     58 #define WFERR_OK 0
     59 #define WFERR_UNMARSHALLABLE 1
     60 #define WFERR_NESTEDTOODEEP 2
     61 #define WFERR_NOMEMORY 3
     62 
     63 typedef struct {
     64     FILE *fp;
     65     int error;  /* see WFERR_* values */
     66     int depth;
     67     /* If fp == NULL, the following are valid: */
     68     PyObject *str;
     69     char *ptr;
     70     char *end;
     71     PyObject *strings; /* dict on marshal, list on unmarshal */
     72     int version;
     73 } WFILE;
     74 
     75 #define w_byte(c, p) if (((p)->fp)) putc((c), (p)->fp); \
     76                       else if ((p)->ptr != (p)->end) *(p)->ptr++ = (c); \
     77                            else w_more(c, p)
     78 
     79 static void
     80 w_more(int c, WFILE *p)
     81 {
     82     Py_ssize_t size, newsize;
     83     if (p->str == NULL)
     84         return; /* An error already occurred */
     85     size = PyString_Size(p->str);
     86     newsize = size + size + 1024;
     87     if (newsize > 32*1024*1024) {
     88         newsize = size + (size >> 3);           /* 12.5% overallocation */
     89     }
     90     if (_PyString_Resize(&p->str, newsize) != 0) {
     91         p->ptr = p->end = NULL;
     92     }
     93     else {
     94         p->ptr = PyString_AS_STRING((PyStringObject *)p->str) + size;
     95         p->end =
     96             PyString_AS_STRING((PyStringObject *)p->str) + newsize;
     97         *p->ptr++ = Py_SAFE_DOWNCAST(c, int, char);
     98     }
     99 }
    100 
    101 static void
    102 w_string(const char *s, Py_ssize_t n, WFILE *p)
    103 {
    104     if (p->fp != NULL) {
    105         fwrite(s, 1, n, p->fp);
    106     }
    107     else {
    108         while (--n >= 0) {
    109             w_byte(*s, p);
    110             s++;
    111         }
    112     }
    113 }
    114 
    115 static void
    116 w_short(int x, WFILE *p)
    117 {
    118     w_byte((char)( x      & 0xff), p);
    119     w_byte((char)((x>> 8) & 0xff), p);
    120 }
    121 
    122 static void
    123 w_long(long x, WFILE *p)
    124 {
    125     w_byte((char)( x      & 0xff), p);
    126     w_byte((char)((x>> 8) & 0xff), p);
    127     w_byte((char)((x>>16) & 0xff), p);
    128     w_byte((char)((x>>24) & 0xff), p);
    129 }
    130 
    131 #if SIZEOF_LONG > 4
    132 static void
    133 w_long64(long x, WFILE *p)
    134 {
    135     w_long(x, p);
    136     w_long(x>>32, p);
    137 }
    138 #endif
    139 
    140 #define SIZE32_MAX  0x7FFFFFFF
    141 
    142 #if SIZEOF_SIZE_T > 4
    143 # define W_SIZE(n, p)  do {                     \
    144         if ((n) > SIZE32_MAX) {                 \
    145             (p)->depth--;                       \
    146             (p)->error = WFERR_UNMARSHALLABLE;  \
    147             return;                             \
    148         }                                       \
    149         w_long((long)(n), p);                   \
    150     } while(0)
    151 #else
    152 # define W_SIZE  w_long
    153 #endif
    154 
    155 static void
    156 w_pstring(const char *s, Py_ssize_t n, WFILE *p)
    157 {
    158         W_SIZE(n, p);
    159         w_string(s, n, p);
    160 }
    161 
    162 /* We assume that Python longs are stored internally in base some power of
    163    2**15; for the sake of portability we'll always read and write them in base
    164    exactly 2**15. */
    165 
    166 #define PyLong_MARSHAL_SHIFT 15
    167 #define PyLong_MARSHAL_BASE ((short)1 << PyLong_MARSHAL_SHIFT)
    168 #define PyLong_MARSHAL_MASK (PyLong_MARSHAL_BASE - 1)
    169 #if PyLong_SHIFT % PyLong_MARSHAL_SHIFT != 0
    170 #error "PyLong_SHIFT must be a multiple of PyLong_MARSHAL_SHIFT"
    171 #endif
    172 #define PyLong_MARSHAL_RATIO (PyLong_SHIFT / PyLong_MARSHAL_SHIFT)
    173 
    174 static void
    175 w_PyLong(const PyLongObject *ob, WFILE *p)
    176 {
    177     Py_ssize_t i, j, n, l;
    178     digit d;
    179 
    180     w_byte(TYPE_LONG, p);
    181     if (Py_SIZE(ob) == 0) {
    182         w_long((long)0, p);
    183         return;
    184     }
    185 
    186     /* set l to number of base PyLong_MARSHAL_BASE digits */
    187     n = ABS(Py_SIZE(ob));
    188     l = (n-1) * PyLong_MARSHAL_RATIO;
    189     d = ob->ob_digit[n-1];
    190     assert(d != 0); /* a PyLong is always normalized */
    191     do {
    192         d >>= PyLong_MARSHAL_SHIFT;
    193         l++;
    194     } while (d != 0);
    195     if (l > SIZE32_MAX) {
    196         p->depth--;
    197         p->error = WFERR_UNMARSHALLABLE;
    198         return;
    199     }
    200     w_long((long)(Py_SIZE(ob) > 0 ? l : -l), p);
    201 
    202     for (i=0; i < n-1; i++) {
    203         d = ob->ob_digit[i];
    204         for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
    205             w_short(d & PyLong_MARSHAL_MASK, p);
    206             d >>= PyLong_MARSHAL_SHIFT;
    207         }
    208         assert (d == 0);
    209     }
    210     d = ob->ob_digit[n-1];
    211     do {
    212         w_short(d & PyLong_MARSHAL_MASK, p);
    213         d >>= PyLong_MARSHAL_SHIFT;
    214     } while (d != 0);
    215 }
    216 
    217 static void
    218 w_object(PyObject *v, WFILE *p)
    219 {
    220     Py_ssize_t i, n;
    221 
    222     p->depth++;
    223 
    224     if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
    225         p->error = WFERR_NESTEDTOODEEP;
    226     }
    227     else if (v == NULL) {
    228         w_byte(TYPE_NULL, p);
    229     }
    230     else if (v == Py_None) {
    231         w_byte(TYPE_NONE, p);
    232     }
    233     else if (v == PyExc_StopIteration) {
    234         w_byte(TYPE_STOPITER, p);
    235     }
    236     else if (v == Py_Ellipsis) {
    237         w_byte(TYPE_ELLIPSIS, p);
    238     }
    239     else if (v == Py_False) {
    240         w_byte(TYPE_FALSE, p);
    241     }
    242     else if (v == Py_True) {
    243         w_byte(TYPE_TRUE, p);
    244     }
    245     else if (PyInt_CheckExact(v)) {
    246         long x = PyInt_AS_LONG((PyIntObject *)v);
    247 #if SIZEOF_LONG > 4
    248         long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
    249         if (y && y != -1) {
    250             w_byte(TYPE_INT64, p);
    251             w_long64(x, p);
    252         }
    253         else
    254 #endif
    255             {
    256             w_byte(TYPE_INT, p);
    257             w_long(x, p);
    258         }
    259     }
    260     else if (PyLong_CheckExact(v)) {
    261         PyLongObject *ob = (PyLongObject *)v;
    262         w_PyLong(ob, p);
    263     }
    264     else if (PyFloat_CheckExact(v)) {
    265         if (p->version > 1) {
    266             unsigned char buf[8];
    267             if (_PyFloat_Pack8(PyFloat_AsDouble(v),
    268                                buf, 1) < 0) {
    269                 p->error = WFERR_UNMARSHALLABLE;
    270                 return;
    271             }
    272             w_byte(TYPE_BINARY_FLOAT, p);
    273             w_string((char*)buf, 8, p);
    274         }
    275         else {
    276             char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
    277                                               'g', 17, 0, NULL);
    278             if (!buf) {
    279                 p->error = WFERR_NOMEMORY;
    280                 return;
    281             }
    282             n = strlen(buf);
    283             w_byte(TYPE_FLOAT, p);
    284             w_byte((int)n, p);
    285             w_string(buf, n, p);
    286             PyMem_Free(buf);
    287         }
    288     }
    289 #ifndef WITHOUT_COMPLEX
    290     else if (PyComplex_CheckExact(v)) {
    291         if (p->version > 1) {
    292             unsigned char buf[8];
    293             if (_PyFloat_Pack8(PyComplex_RealAsDouble(v),
    294                                buf, 1) < 0) {
    295                 p->error = WFERR_UNMARSHALLABLE;
    296                 return;
    297             }
    298             w_byte(TYPE_BINARY_COMPLEX, p);
    299             w_string((char*)buf, 8, p);
    300             if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v),
    301                                buf, 1) < 0) {
    302                 p->error = WFERR_UNMARSHALLABLE;
    303                 return;
    304             }
    305             w_string((char*)buf, 8, p);
    306         }
    307         else {
    308             char *buf;
    309             w_byte(TYPE_COMPLEX, p);
    310             buf = PyOS_double_to_string(PyComplex_RealAsDouble(v),
    311                                         'g', 17, 0, NULL);
    312             if (!buf) {
    313                 p->error = WFERR_NOMEMORY;
    314                 return;
    315             }
    316             n = strlen(buf);
    317             w_byte((int)n, p);
    318             w_string(buf, n, p);
    319             PyMem_Free(buf);
    320             buf = PyOS_double_to_string(PyComplex_ImagAsDouble(v),
    321                                         'g', 17, 0, NULL);
    322             if (!buf) {
    323                 p->error = WFERR_NOMEMORY;
    324                 return;
    325             }
    326             n = strlen(buf);
    327             w_byte((int)n, p);
    328             w_string(buf, n, p);
    329             PyMem_Free(buf);
    330         }
    331     }
    332 #endif
    333     else if (PyString_CheckExact(v)) {
    334         if (p->strings && PyString_CHECK_INTERNED(v)) {
    335             PyObject *o = PyDict_GetItem(p->strings, v);
    336             if (o) {
    337                 long w = PyInt_AsLong(o);
    338                 w_byte(TYPE_STRINGREF, p);
    339                 w_long(w, p);
    340                 goto exit;
    341             }
    342             else {
    343                 int ok;
    344                 o = PyInt_FromSsize_t(PyDict_Size(p->strings));
    345                 ok = o &&
    346                      PyDict_SetItem(p->strings, v, o) >= 0;
    347                 Py_XDECREF(o);
    348                 if (!ok) {
    349                     p->depth--;
    350                     p->error = WFERR_UNMARSHALLABLE;
    351                     return;
    352                 }
    353                 w_byte(TYPE_INTERNED, p);
    354             }
    355         }
    356         else {
    357             w_byte(TYPE_STRING, p);
    358         }
    359         w_pstring(PyBytes_AS_STRING(v), PyString_GET_SIZE(v), p);
    360     }
    361 #ifdef Py_USING_UNICODE
    362     else if (PyUnicode_CheckExact(v)) {
    363         PyObject *utf8;
    364         utf8 = PyUnicode_AsUTF8String(v);
    365         if (utf8 == NULL) {
    366             p->depth--;
    367             p->error = WFERR_UNMARSHALLABLE;
    368             return;
    369         }
    370         w_byte(TYPE_UNICODE, p);
    371         w_pstring(PyString_AS_STRING(utf8), PyString_GET_SIZE(utf8), p);
    372         Py_DECREF(utf8);
    373     }
    374 #endif
    375     else if (PyTuple_CheckExact(v)) {
    376         w_byte(TYPE_TUPLE, p);
    377         n = PyTuple_Size(v);
    378         W_SIZE(n, p);
    379         for (i = 0; i < n; i++) {
    380             w_object(PyTuple_GET_ITEM(v, i), p);
    381         }
    382     }
    383     else if (PyList_CheckExact(v)) {
    384         w_byte(TYPE_LIST, p);
    385         n = PyList_GET_SIZE(v);
    386         W_SIZE(n, p);
    387         for (i = 0; i < n; i++) {
    388             w_object(PyList_GET_ITEM(v, i), p);
    389         }
    390     }
    391     else if (PyDict_CheckExact(v)) {
    392         Py_ssize_t pos;
    393         PyObject *key, *value;
    394         w_byte(TYPE_DICT, p);
    395         /* This one is NULL object terminated! */
    396         pos = 0;
    397         while (PyDict_Next(v, &pos, &key, &value)) {
    398             w_object(key, p);
    399             w_object(value, p);
    400         }
    401         w_object((PyObject *)NULL, p);
    402     }
    403     else if (PyAnySet_CheckExact(v)) {
    404         PyObject *value, *it;
    405 
    406         if (PyObject_TypeCheck(v, &PySet_Type))
    407             w_byte(TYPE_SET, p);
    408         else
    409             w_byte(TYPE_FROZENSET, p);
    410         n = PyObject_Size(v);
    411         if (n == -1) {
    412             p->depth--;
    413             p->error = WFERR_UNMARSHALLABLE;
    414             return;
    415         }
    416         W_SIZE(n, p);
    417         it = PyObject_GetIter(v);
    418         if (it == NULL) {
    419             p->depth--;
    420             p->error = WFERR_UNMARSHALLABLE;
    421             return;
    422         }
    423         while ((value = PyIter_Next(it)) != NULL) {
    424             w_object(value, p);
    425             Py_DECREF(value);
    426         }
    427         Py_DECREF(it);
    428         if (PyErr_Occurred()) {
    429             p->depth--;
    430             p->error = WFERR_UNMARSHALLABLE;
    431             return;
    432         }
    433     }
    434     else if (PyCode_Check(v)) {
    435         PyCodeObject *co = (PyCodeObject *)v;
    436         w_byte(TYPE_CODE, p);
    437         w_long(co->co_argcount, p);
    438         w_long(co->co_nlocals, p);
    439         w_long(co->co_stacksize, p);
    440         w_long(co->co_flags, p);
    441         w_object(co->co_code, p);
    442         w_object(co->co_consts, p);
    443         w_object(co->co_names, p);
    444         w_object(co->co_varnames, p);
    445         w_object(co->co_freevars, p);
    446         w_object(co->co_cellvars, p);
    447         w_object(co->co_filename, p);
    448         w_object(co->co_name, p);
    449         w_long(co->co_firstlineno, p);
    450         w_object(co->co_lnotab, p);
    451     }
    452     else if (PyObject_CheckReadBuffer(v)) {
    453         /* Write unknown buffer-style objects as a string */
    454         char *s;
    455         PyBufferProcs *pb = v->ob_type->tp_as_buffer;
    456         w_byte(TYPE_STRING, p);
    457         n = (*pb->bf_getreadbuffer)(v, 0, (void **)&s);
    458         w_pstring(s, n, p);
    459     }
    460     else {
    461         w_byte(TYPE_UNKNOWN, p);
    462         p->error = WFERR_UNMARSHALLABLE;
    463     }
    464    exit:
    465     p->depth--;
    466 }
    467 
    468 /* version currently has no effect for writing longs. */
    469 void
    470 PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
    471 {
    472     WFILE wf;
    473     wf.fp = fp;
    474     wf.error = WFERR_OK;
    475     wf.depth = 0;
    476     wf.strings = NULL;
    477     wf.version = version;
    478     w_long(x, &wf);
    479 }
    480 
    481 void
    482 PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
    483 {
    484     WFILE wf;
    485     wf.fp = fp;
    486     wf.error = WFERR_OK;
    487     wf.depth = 0;
    488     wf.strings = (version > 0) ? PyDict_New() : NULL;
    489     wf.version = version;
    490     w_object(x, &wf);
    491     Py_XDECREF(wf.strings);
    492 }
    493 
    494 typedef WFILE RFILE; /* Same struct with different invariants */
    495 
    496 #define rs_byte(p) (((p)->ptr < (p)->end) ? (unsigned char)*(p)->ptr++ : EOF)
    497 
    498 #define r_byte(p) ((p)->fp ? getc((p)->fp) : rs_byte(p))
    499 
    500 static Py_ssize_t
    501 r_string(char *s, Py_ssize_t n, RFILE *p)
    502 {
    503     if (p->fp != NULL)
    504         /* The result fits into int because it must be <=n. */
    505         return fread(s, 1, n, p->fp);
    506     if (p->end - p->ptr < n)
    507         n = p->end - p->ptr;
    508     memcpy(s, p->ptr, n);
    509     p->ptr += n;
    510     return n;
    511 }
    512 
    513 static int
    514 r_short(RFILE *p)
    515 {
    516     register short x;
    517     x = r_byte(p);
    518     x |= r_byte(p) << 8;
    519     /* Sign-extension, in case short greater than 16 bits */
    520     x |= -(x & 0x8000);
    521     return x;
    522 }
    523 
    524 static long
    525 r_long(RFILE *p)
    526 {
    527     register long x;
    528     register FILE *fp = p->fp;
    529     if (fp) {
    530         x = getc(fp);
    531         x |= (long)getc(fp) << 8;
    532         x |= (long)getc(fp) << 16;
    533         x |= (long)getc(fp) << 24;
    534     }
    535     else {
    536         x = rs_byte(p);
    537         x |= (long)rs_byte(p) << 8;
    538         x |= (long)rs_byte(p) << 16;
    539         x |= (long)rs_byte(p) << 24;
    540     }
    541 #if SIZEOF_LONG > 4
    542     /* Sign extension for 64-bit machines */
    543     x |= -(x & 0x80000000L);
    544 #endif
    545     return x;
    546 }
    547 
    548 /* r_long64 deals with the TYPE_INT64 code.  On a machine with
    549    sizeof(long) > 4, it returns a Python int object, else a Python long
    550    object.  Note that w_long64 writes out TYPE_INT if 32 bits is enough,
    551    so there's no inefficiency here in returning a PyLong on 32-bit boxes
    552    for everything written via TYPE_INT64 (i.e., if an int is written via
    553    TYPE_INT64, it *needs* more than 32 bits).
    554 */
    555 static PyObject *
    556 r_long64(RFILE *p)
    557 {
    558     long lo4 = r_long(p);
    559     long hi4 = r_long(p);
    560 #if SIZEOF_LONG > 4
    561     long x = (hi4 << 32) | (lo4 & 0xFFFFFFFFL);
    562     return PyInt_FromLong(x);
    563 #else
    564     unsigned char buf[8];
    565     int one = 1;
    566     int is_little_endian = (int)*(char*)&one;
    567     if (is_little_endian) {
    568         memcpy(buf, &lo4, 4);
    569         memcpy(buf+4, &hi4, 4);
    570     }
    571     else {
    572         memcpy(buf, &hi4, 4);
    573         memcpy(buf+4, &lo4, 4);
    574     }
    575     return _PyLong_FromByteArray(buf, 8, is_little_endian, 1);
    576 #endif
    577 }
    578 
    579 static PyObject *
    580 r_PyLong(RFILE *p)
    581 {
    582     PyLongObject *ob;
    583     long n, size, i;
    584     int j, md, shorts_in_top_digit;
    585     digit d;
    586 
    587     n = r_long(p);
    588     if (n == 0)
    589         return (PyObject *)_PyLong_New(0);
    590     if (n < -SIZE32_MAX || n > SIZE32_MAX) {
    591         PyErr_SetString(PyExc_ValueError,
    592                        "bad marshal data (long size out of range)");
    593         return NULL;
    594     }
    595 
    596     size = 1 + (ABS(n) - 1) / PyLong_MARSHAL_RATIO;
    597     shorts_in_top_digit = 1 + (ABS(n) - 1) % PyLong_MARSHAL_RATIO;
    598     ob = _PyLong_New(size);
    599     if (ob == NULL)
    600         return NULL;
    601     Py_SIZE(ob) = n > 0 ? size : -size;
    602 
    603     for (i = 0; i < size-1; i++) {
    604         d = 0;
    605         for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
    606             md = r_short(p);
    607             if (md < 0 || md > PyLong_MARSHAL_BASE)
    608                 goto bad_digit;
    609             d += (digit)md << j*PyLong_MARSHAL_SHIFT;
    610         }
    611         ob->ob_digit[i] = d;
    612     }
    613     d = 0;
    614     for (j=0; j < shorts_in_top_digit; j++) {
    615         md = r_short(p);
    616         if (md < 0 || md > PyLong_MARSHAL_BASE)
    617             goto bad_digit;
    618         /* topmost marshal digit should be nonzero */
    619         if (md == 0 && j == shorts_in_top_digit - 1) {
    620             Py_DECREF(ob);
    621             PyErr_SetString(PyExc_ValueError,
    622                 "bad marshal data (unnormalized long data)");
    623             return NULL;
    624         }
    625         d += (digit)md << j*PyLong_MARSHAL_SHIFT;
    626     }
    627     /* top digit should be nonzero, else the resulting PyLong won't be
    628        normalized */
    629     ob->ob_digit[size-1] = d;
    630     return (PyObject *)ob;
    631   bad_digit:
    632     Py_DECREF(ob);
    633     PyErr_SetString(PyExc_ValueError,
    634                     "bad marshal data (digit out of range in long)");
    635     return NULL;
    636 }
    637 
    638 
    639 static PyObject *
    640 r_object(RFILE *p)
    641 {
    642     /* NULL is a valid return value, it does not necessarily means that
    643        an exception is set. */
    644     PyObject *v, *v2;
    645     long i, n;
    646     int type = r_byte(p);
    647     PyObject *retval;
    648 
    649     p->depth++;
    650 
    651     if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
    652         p->depth--;
    653         PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
    654         return NULL;
    655     }
    656 
    657     switch (type) {
    658 
    659     case EOF:
    660         PyErr_SetString(PyExc_EOFError,
    661                         "EOF read where object expected");
    662         retval = NULL;
    663         break;
    664 
    665     case TYPE_NULL:
    666         retval = NULL;
    667         break;
    668 
    669     case TYPE_NONE:
    670         Py_INCREF(Py_None);
    671         retval = Py_None;
    672         break;
    673 
    674     case TYPE_STOPITER:
    675         Py_INCREF(PyExc_StopIteration);
    676         retval = PyExc_StopIteration;
    677         break;
    678 
    679     case TYPE_ELLIPSIS:
    680         Py_INCREF(Py_Ellipsis);
    681         retval = Py_Ellipsis;
    682         break;
    683 
    684     case TYPE_FALSE:
    685         Py_INCREF(Py_False);
    686         retval = Py_False;
    687         break;
    688 
    689     case TYPE_TRUE:
    690         Py_INCREF(Py_True);
    691         retval = Py_True;
    692         break;
    693 
    694     case TYPE_INT:
    695         retval = PyInt_FromLong(r_long(p));
    696         break;
    697 
    698     case TYPE_INT64:
    699         retval = r_long64(p);
    700         break;
    701 
    702     case TYPE_LONG:
    703         retval = r_PyLong(p);
    704         break;
    705 
    706     case TYPE_FLOAT:
    707         {
    708             char buf[256];
    709             double dx;
    710             n = r_byte(p);
    711             if (n == EOF || r_string(buf, n, p) != n) {
    712                 PyErr_SetString(PyExc_EOFError,
    713                     "EOF read where object expected");
    714                 retval = NULL;
    715                 break;
    716             }
    717             buf[n] = '\0';
    718             dx = PyOS_string_to_double(buf, NULL, NULL);
    719             if (dx == -1.0 && PyErr_Occurred()) {
    720                 retval = NULL;
    721                 break;
    722             }
    723             retval = PyFloat_FromDouble(dx);
    724             break;
    725         }
    726 
    727     case TYPE_BINARY_FLOAT:
    728         {
    729             unsigned char buf[8];
    730             double x;
    731             if (r_string((char*)buf, 8, p) != 8) {
    732                 PyErr_SetString(PyExc_EOFError,
    733                     "EOF read where object expected");
    734                 retval = NULL;
    735                 break;
    736             }
    737             x = _PyFloat_Unpack8(buf, 1);
    738             if (x == -1.0 && PyErr_Occurred()) {
    739                 retval = NULL;
    740                 break;
    741             }
    742             retval = PyFloat_FromDouble(x);
    743             break;
    744         }
    745 
    746 #ifndef WITHOUT_COMPLEX
    747     case TYPE_COMPLEX:
    748         {
    749             char buf[256];
    750             Py_complex c;
    751             n = r_byte(p);
    752             if (n == EOF || r_string(buf, n, p) != n) {
    753                 PyErr_SetString(PyExc_EOFError,
    754                     "EOF read where object expected");
    755                 retval = NULL;
    756                 break;
    757             }
    758             buf[n] = '\0';
    759             c.real = PyOS_string_to_double(buf, NULL, NULL);
    760             if (c.real == -1.0 && PyErr_Occurred()) {
    761                 retval = NULL;
    762                 break;
    763             }
    764             n = r_byte(p);
    765             if (n == EOF || r_string(buf, n, p) != n) {
    766                 PyErr_SetString(PyExc_EOFError,
    767                     "EOF read where object expected");
    768                 retval = NULL;
    769                 break;
    770             }
    771             buf[n] = '\0';
    772             c.imag = PyOS_string_to_double(buf, NULL, NULL);
    773             if (c.imag == -1.0 && PyErr_Occurred()) {
    774                 retval = NULL;
    775                 break;
    776             }
    777             retval = PyComplex_FromCComplex(c);
    778             break;
    779         }
    780 
    781     case TYPE_BINARY_COMPLEX:
    782         {
    783             unsigned char buf[8];
    784             Py_complex c;
    785             if (r_string((char*)buf, 8, p) != 8) {
    786                 PyErr_SetString(PyExc_EOFError,
    787                     "EOF read where object expected");
    788                 retval = NULL;
    789                 break;
    790             }
    791             c.real = _PyFloat_Unpack8(buf, 1);
    792             if (c.real == -1.0 && PyErr_Occurred()) {
    793                 retval = NULL;
    794                 break;
    795             }
    796             if (r_string((char*)buf, 8, p) != 8) {
    797                 PyErr_SetString(PyExc_EOFError,
    798                     "EOF read where object expected");
    799                 retval = NULL;
    800                 break;
    801             }
    802             c.imag = _PyFloat_Unpack8(buf, 1);
    803             if (c.imag == -1.0 && PyErr_Occurred()) {
    804                 retval = NULL;
    805                 break;
    806             }
    807             retval = PyComplex_FromCComplex(c);
    808             break;
    809         }
    810 #endif
    811 
    812     case TYPE_INTERNED:
    813     case TYPE_STRING:
    814         n = r_long(p);
    815         if (n < 0 || n > SIZE32_MAX) {
    816             PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
    817             retval = NULL;
    818             break;
    819         }
    820         v = PyString_FromStringAndSize((char *)NULL, n);
    821         if (v == NULL) {
    822             retval = NULL;
    823             break;
    824         }
    825         if (r_string(PyString_AS_STRING(v), n, p) != n) {
    826             Py_DECREF(v);
    827             PyErr_SetString(PyExc_EOFError,
    828                             "EOF read where object expected");
    829             retval = NULL;
    830             break;
    831         }
    832         if (type == TYPE_INTERNED) {
    833             PyString_InternInPlace(&v);
    834             if (PyList_Append(p->strings, v) < 0) {
    835                 retval = NULL;
    836                 break;
    837             }
    838         }
    839         retval = v;
    840         break;
    841 
    842     case TYPE_STRINGREF:
    843         n = r_long(p);
    844         if (n < 0 || n >= PyList_GET_SIZE(p->strings)) {
    845             PyErr_SetString(PyExc_ValueError, "bad marshal data (string ref out of range)");
    846             retval = NULL;
    847             break;
    848         }
    849         v = PyList_GET_ITEM(p->strings, n);
    850         Py_INCREF(v);
    851         retval = v;
    852         break;
    853 
    854 #ifdef Py_USING_UNICODE
    855     case TYPE_UNICODE:
    856         {
    857         char *buffer;
    858 
    859         n = r_long(p);
    860         if (n < 0 || n > SIZE32_MAX) {
    861             PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
    862             retval = NULL;
    863             break;
    864         }
    865         buffer = PyMem_NEW(char, n);
    866         if (buffer == NULL) {
    867             retval = PyErr_NoMemory();
    868             break;
    869         }
    870         if (r_string(buffer, n, p) != n) {
    871             PyMem_DEL(buffer);
    872             PyErr_SetString(PyExc_EOFError,
    873                 "EOF read where object expected");
    874             retval = NULL;
    875             break;
    876         }
    877         v = PyUnicode_DecodeUTF8(buffer, n, NULL);
    878         PyMem_DEL(buffer);
    879         retval = v;
    880         break;
    881         }
    882 #endif
    883 
    884     case TYPE_TUPLE:
    885         n = r_long(p);
    886         if (n < 0 || n > SIZE32_MAX) {
    887             PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
    888             retval = NULL;
    889             break;
    890         }
    891         v = PyTuple_New(n);
    892         if (v == NULL) {
    893             retval = NULL;
    894             break;
    895         }
    896         for (i = 0; i < n; i++) {
    897             v2 = r_object(p);
    898             if ( v2 == NULL ) {
    899                 if (!PyErr_Occurred())
    900                     PyErr_SetString(PyExc_TypeError,
    901                         "NULL object in marshal data for tuple");
    902                 Py_DECREF(v);
    903                 v = NULL;
    904                 break;
    905             }
    906             PyTuple_SET_ITEM(v, i, v2);
    907         }
    908         retval = v;
    909         break;
    910 
    911     case TYPE_LIST:
    912         n = r_long(p);
    913         if (n < 0 || n > SIZE32_MAX) {
    914             PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
    915             retval = NULL;
    916             break;
    917         }
    918         v = PyList_New(n);
    919         if (v == NULL) {
    920             retval = NULL;
    921             break;
    922         }
    923         for (i = 0; i < n; i++) {
    924             v2 = r_object(p);
    925             if ( v2 == NULL ) {
    926                 if (!PyErr_Occurred())
    927                     PyErr_SetString(PyExc_TypeError,
    928                         "NULL object in marshal data for list");
    929                 Py_DECREF(v);
    930                 v = NULL;
    931                 break;
    932             }
    933             PyList_SET_ITEM(v, i, v2);
    934         }
    935         retval = v;
    936         break;
    937 
    938     case TYPE_DICT:
    939         v = PyDict_New();
    940         if (v == NULL) {
    941             retval = NULL;
    942             break;
    943         }
    944         for (;;) {
    945             PyObject *key, *val;
    946             key = r_object(p);
    947             if (key == NULL)
    948                 break;
    949             val = r_object(p);
    950             if (val != NULL)
    951                 PyDict_SetItem(v, key, val);
    952             Py_DECREF(key);
    953             Py_XDECREF(val);
    954         }
    955         if (PyErr_Occurred()) {
    956             Py_DECREF(v);
    957             v = NULL;
    958         }
    959         retval = v;
    960         break;
    961 
    962     case TYPE_SET:
    963     case TYPE_FROZENSET:
    964         n = r_long(p);
    965         if (n < 0 || n > SIZE32_MAX) {
    966             PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
    967             retval = NULL;
    968             break;
    969         }
    970         v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
    971         if (v == NULL) {
    972             retval = NULL;
    973             break;
    974         }
    975         for (i = 0; i < n; i++) {
    976             v2 = r_object(p);
    977             if ( v2 == NULL ) {
    978                 if (!PyErr_Occurred())
    979                     PyErr_SetString(PyExc_TypeError,
    980                         "NULL object in marshal data for set");
    981                 Py_DECREF(v);
    982                 v = NULL;
    983                 break;
    984             }
    985             if (PySet_Add(v, v2) == -1) {
    986                 Py_DECREF(v);
    987                 Py_DECREF(v2);
    988                 v = NULL;
    989                 break;
    990             }
    991             Py_DECREF(v2);
    992         }
    993         retval = v;
    994         break;
    995 
    996     case TYPE_CODE:
    997         if (PyEval_GetRestricted()) {
    998             PyErr_SetString(PyExc_RuntimeError,
    999                 "cannot unmarshal code objects in "
   1000                 "restricted execution mode");
   1001             retval = NULL;
   1002             break;
   1003         }
   1004         else {
   1005             int argcount;
   1006             int nlocals;
   1007             int stacksize;
   1008             int flags;
   1009             PyObject *code = NULL;
   1010             PyObject *consts = NULL;
   1011             PyObject *names = NULL;
   1012             PyObject *varnames = NULL;
   1013             PyObject *freevars = NULL;
   1014             PyObject *cellvars = NULL;
   1015             PyObject *filename = NULL;
   1016             PyObject *name = NULL;
   1017             int firstlineno;
   1018             PyObject *lnotab = NULL;
   1019 
   1020             v = NULL;
   1021 
   1022             /* XXX ignore long->int overflows for now */
   1023             argcount = (int)r_long(p);
   1024             nlocals = (int)r_long(p);
   1025             stacksize = (int)r_long(p);
   1026             flags = (int)r_long(p);
   1027             code = r_object(p);
   1028             if (code == NULL)
   1029                 goto code_error;
   1030             consts = r_object(p);
   1031             if (consts == NULL)
   1032                 goto code_error;
   1033             names = r_object(p);
   1034             if (names == NULL)
   1035                 goto code_error;
   1036             varnames = r_object(p);
   1037             if (varnames == NULL)
   1038                 goto code_error;
   1039             freevars = r_object(p);
   1040             if (freevars == NULL)
   1041                 goto code_error;
   1042             cellvars = r_object(p);
   1043             if (cellvars == NULL)
   1044                 goto code_error;
   1045             filename = r_object(p);
   1046             if (filename == NULL)
   1047                 goto code_error;
   1048             name = r_object(p);
   1049             if (name == NULL)
   1050                 goto code_error;
   1051             firstlineno = (int)r_long(p);
   1052             lnotab = r_object(p);
   1053             if (lnotab == NULL)
   1054                 goto code_error;
   1055 
   1056             v = (PyObject *) PyCode_New(
   1057                             argcount, nlocals, stacksize, flags,
   1058                             code, consts, names, varnames,
   1059                             freevars, cellvars, filename, name,
   1060                             firstlineno, lnotab);
   1061 
   1062           code_error:
   1063             Py_XDECREF(code);
   1064             Py_XDECREF(consts);
   1065             Py_XDECREF(names);
   1066             Py_XDECREF(varnames);
   1067             Py_XDECREF(freevars);
   1068             Py_XDECREF(cellvars);
   1069             Py_XDECREF(filename);
   1070             Py_XDECREF(name);
   1071             Py_XDECREF(lnotab);
   1072 
   1073         }
   1074         retval = v;
   1075         break;
   1076 
   1077     default:
   1078         /* Bogus data got written, which isn't ideal.
   1079            This will let you keep working and recover. */
   1080         PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
   1081         retval = NULL;
   1082         break;
   1083 
   1084     }
   1085     p->depth--;
   1086     return retval;
   1087 }
   1088 
   1089 static PyObject *
   1090 read_object(RFILE *p)
   1091 {
   1092     PyObject *v;
   1093     if (PyErr_Occurred()) {
   1094         fprintf(stderr, "XXX readobject called with exception set\n");
   1095         return NULL;
   1096     }
   1097     v = r_object(p);
   1098     if (v == NULL && !PyErr_Occurred())
   1099         PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
   1100     return v;
   1101 }
   1102 
   1103 int
   1104 PyMarshal_ReadShortFromFile(FILE *fp)
   1105 {
   1106     RFILE rf;
   1107     assert(fp);
   1108     rf.fp = fp;
   1109     rf.strings = NULL;
   1110     rf.end = rf.ptr = NULL;
   1111     return r_short(&rf);
   1112 }
   1113 
   1114 long
   1115 PyMarshal_ReadLongFromFile(FILE *fp)
   1116 {
   1117     RFILE rf;
   1118     rf.fp = fp;
   1119     rf.strings = NULL;
   1120     rf.ptr = rf.end = NULL;
   1121     return r_long(&rf);
   1122 }
   1123 
   1124 #ifdef HAVE_FSTAT
   1125 /* Return size of file in bytes; < 0 if unknown. */
   1126 static off_t
   1127 getfilesize(FILE *fp)
   1128 {
   1129     struct stat st;
   1130     if (fstat(fileno(fp), &st) != 0)
   1131         return -1;
   1132     else
   1133         return st.st_size;
   1134 }
   1135 #endif
   1136 
   1137 /* If we can get the size of the file up-front, and it's reasonably small,
   1138  * read it in one gulp and delegate to ...FromString() instead.  Much quicker
   1139  * than reading a byte at a time from file; speeds .pyc imports.
   1140  * CAUTION:  since this may read the entire remainder of the file, don't
   1141  * call it unless you know you're done with the file.
   1142  */
   1143 PyObject *
   1144 PyMarshal_ReadLastObjectFromFile(FILE *fp)
   1145 {
   1146 /* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */
   1147 #define REASONABLE_FILE_LIMIT (1L << 18)
   1148 #ifdef HAVE_FSTAT
   1149     off_t filesize;
   1150     filesize = getfilesize(fp);
   1151     if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
   1152         char* pBuf = (char *)PyMem_MALLOC(filesize);
   1153         if (pBuf != NULL) {
   1154             size_t n = fread(pBuf, 1, (size_t)filesize, fp);
   1155             PyObject* v = PyMarshal_ReadObjectFromString(pBuf, n);
   1156             PyMem_FREE(pBuf);
   1157             return v;
   1158         }
   1159 
   1160     }
   1161 #endif
   1162     /* We don't have fstat, or we do but the file is larger than
   1163      * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
   1164      */
   1165     return PyMarshal_ReadObjectFromFile(fp);
   1166 
   1167 #undef REASONABLE_FILE_LIMIT
   1168 }
   1169 
   1170 PyObject *
   1171 PyMarshal_ReadObjectFromFile(FILE *fp)
   1172 {
   1173     RFILE rf;
   1174     PyObject *result;
   1175     rf.fp = fp;
   1176     rf.strings = PyList_New(0);
   1177     rf.depth = 0;
   1178     rf.ptr = rf.end = NULL;
   1179     result = r_object(&rf);
   1180     Py_DECREF(rf.strings);
   1181     return result;
   1182 }
   1183 
   1184 PyObject *
   1185 PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)
   1186 {
   1187     RFILE rf;
   1188     PyObject *result;
   1189     rf.fp = NULL;
   1190     rf.ptr = str;
   1191     rf.end = str + len;
   1192     rf.strings = PyList_New(0);
   1193     rf.depth = 0;
   1194     result = r_object(&rf);
   1195     Py_DECREF(rf.strings);
   1196     return result;
   1197 }
   1198 
   1199 static void
   1200 set_error(int error)
   1201 {
   1202     switch (error) {
   1203     case WFERR_NOMEMORY:
   1204         PyErr_NoMemory();
   1205         break;
   1206     case WFERR_UNMARSHALLABLE:
   1207         PyErr_SetString(PyExc_ValueError, "unmarshallable object");
   1208         break;
   1209     case WFERR_NESTEDTOODEEP:
   1210     default:
   1211         PyErr_SetString(PyExc_ValueError,
   1212             "object too deeply nested to marshal");
   1213         break;
   1214     }
   1215 }
   1216 
   1217 PyObject *
   1218 PyMarshal_WriteObjectToString(PyObject *x, int version)
   1219 {
   1220     WFILE wf;
   1221     wf.fp = NULL;
   1222     wf.str = PyString_FromStringAndSize((char *)NULL, 50);
   1223     if (wf.str == NULL)
   1224         return NULL;
   1225     wf.ptr = PyString_AS_STRING((PyStringObject *)wf.str);
   1226     wf.end = wf.ptr + PyString_Size(wf.str);
   1227     wf.error = WFERR_OK;
   1228     wf.depth = 0;
   1229     wf.version = version;
   1230     wf.strings = (version > 0) ? PyDict_New() : NULL;
   1231     w_object(x, &wf);
   1232     Py_XDECREF(wf.strings);
   1233     if (wf.str != NULL) {
   1234         char *base = PyString_AS_STRING((PyStringObject *)wf.str);
   1235         if (wf.ptr - base > PY_SSIZE_T_MAX) {
   1236             Py_DECREF(wf.str);
   1237             PyErr_SetString(PyExc_OverflowError,
   1238                             "too much marshall data for a string");
   1239             return NULL;
   1240         }
   1241         if (_PyString_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)))
   1242             return NULL;
   1243     }
   1244     if (wf.error != WFERR_OK) {
   1245         Py_XDECREF(wf.str);
   1246         set_error(wf.error);
   1247         return NULL;
   1248     }
   1249     return wf.str;
   1250 }
   1251 
   1252 /* And an interface for Python programs... */
   1253 
   1254 static PyObject *
   1255 marshal_dump(PyObject *self, PyObject *args)
   1256 {
   1257     WFILE wf;
   1258     PyObject *x;
   1259     PyObject *f;
   1260     int version = Py_MARSHAL_VERSION;
   1261     if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
   1262         return NULL;
   1263     if (!PyFile_Check(f)) {
   1264         PyErr_SetString(PyExc_TypeError,
   1265                         "marshal.dump() 2nd arg must be file");
   1266         return NULL;
   1267     }
   1268     wf.fp = PyFile_AsFile(f);
   1269     wf.str = NULL;
   1270     wf.ptr = wf.end = NULL;
   1271     wf.error = WFERR_OK;
   1272     wf.depth = 0;
   1273     wf.strings = (version > 0) ? PyDict_New() : 0;
   1274     wf.version = version;
   1275     w_object(x, &wf);
   1276     Py_XDECREF(wf.strings);
   1277     if (wf.error != WFERR_OK) {
   1278         set_error(wf.error);
   1279         return NULL;
   1280     }
   1281     Py_INCREF(Py_None);
   1282     return Py_None;
   1283 }
   1284 
   1285 PyDoc_STRVAR(dump_doc,
   1286 "dump(value, file[, version])\n\
   1287 \n\
   1288 Write the value on the open file. The value must be a supported type.\n\
   1289 The file must be an open file object such as sys.stdout or returned by\n\
   1290 open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\
   1291 \n\
   1292 If the value has (or contains an object that has) an unsupported type, a\n\
   1293 ValueError exception is raised  but garbage data will also be written\n\
   1294 to the file. The object will not be properly read back by load()\n\
   1295 \n\
   1296 New in version 2.4: The version argument indicates the data format that\n\
   1297 dump should use.");
   1298 
   1299 static PyObject *
   1300 marshal_load(PyObject *self, PyObject *f)
   1301 {
   1302     RFILE rf;
   1303     PyObject *result;
   1304     if (!PyFile_Check(f)) {
   1305         PyErr_SetString(PyExc_TypeError,
   1306                         "marshal.load() arg must be file");
   1307         return NULL;
   1308     }
   1309     rf.fp = PyFile_AsFile(f);
   1310     rf.strings = PyList_New(0);
   1311     rf.depth = 0;
   1312     result = read_object(&rf);
   1313     Py_DECREF(rf.strings);
   1314     return result;
   1315 }
   1316 
   1317 PyDoc_STRVAR(load_doc,
   1318 "load(file)\n\
   1319 \n\
   1320 Read one value from the open file and return it. If no valid value is\n\
   1321 read (e.g. because the data has a different Python versions\n\
   1322 incompatible marshal format), raise EOFError, ValueError or TypeError.\n\
   1323 The file must be an open file object opened in binary mode ('rb' or\n\
   1324 'r+b').\n\
   1325 \n\
   1326 Note: If an object containing an unsupported type was marshalled with\n\
   1327 dump(), load() will substitute None for the unmarshallable type.");
   1328 
   1329 
   1330 static PyObject *
   1331 marshal_dumps(PyObject *self, PyObject *args)
   1332 {
   1333     PyObject *x;
   1334     int version = Py_MARSHAL_VERSION;
   1335     if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
   1336         return NULL;
   1337     return PyMarshal_WriteObjectToString(x, version);
   1338 }
   1339 
   1340 PyDoc_STRVAR(dumps_doc,
   1341 "dumps(value[, version])\n\
   1342 \n\
   1343 Return the string that would be written to a file by dump(value, file).\n\
   1344 The value must be a supported type. Raise a ValueError exception if\n\
   1345 value has (or contains an object that has) an unsupported type.\n\
   1346 \n\
   1347 New in version 2.4: The version argument indicates the data format that\n\
   1348 dumps should use.");
   1349 
   1350 
   1351 static PyObject *
   1352 marshal_loads(PyObject *self, PyObject *args)
   1353 {
   1354     RFILE rf;
   1355     char *s;
   1356     Py_ssize_t n;
   1357     PyObject* result;
   1358     if (!PyArg_ParseTuple(args, "s#:loads", &s, &n))
   1359         return NULL;
   1360     rf.fp = NULL;
   1361     rf.ptr = s;
   1362     rf.end = s + n;
   1363     rf.strings = PyList_New(0);
   1364     rf.depth = 0;
   1365     result = read_object(&rf);
   1366     Py_DECREF(rf.strings);
   1367     return result;
   1368 }
   1369 
   1370 PyDoc_STRVAR(loads_doc,
   1371 "loads(string)\n\
   1372 \n\
   1373 Convert the string to a value. If no valid value is found, raise\n\
   1374 EOFError, ValueError or TypeError. Extra characters in the string are\n\
   1375 ignored.");
   1376 
   1377 static PyMethodDef marshal_methods[] = {
   1378     {"dump",            marshal_dump,   METH_VARARGS,   dump_doc},
   1379     {"load",            marshal_load,   METH_O,         load_doc},
   1380     {"dumps",           marshal_dumps,  METH_VARARGS,   dumps_doc},
   1381     {"loads",           marshal_loads,  METH_VARARGS,   loads_doc},
   1382     {NULL,              NULL}           /* sentinel */
   1383 };
   1384 
   1385 PyDoc_STRVAR(marshal_doc,
   1386 "This module contains functions that can read and write Python values in\n\
   1387 a binary format. The format is specific to Python, but independent of\n\
   1388 machine architecture issues.\n\
   1389 \n\
   1390 Not all Python object types are supported; in general, only objects\n\
   1391 whose value is independent from a particular invocation of Python can be\n\
   1392 written and read by this module. The following types are supported:\n\
   1393 None, integers, long integers, floating point numbers, strings, Unicode\n\
   1394 objects, tuples, lists, sets, dictionaries, and code objects, where it\n\
   1395 should be understood that tuples, lists and dictionaries are only\n\
   1396 supported as long as the values contained therein are themselves\n\
   1397 supported; and recursive lists and dictionaries should not be written\n\
   1398 (they will cause infinite loops).\n\
   1399 \n\
   1400 Variables:\n\
   1401 \n\
   1402 version -- indicates the format that the module uses. Version 0 is the\n\
   1403     historical format, version 1 (added in Python 2.4) shares interned\n\
   1404     strings and version 2 (added in Python 2.5) uses a binary format for\n\
   1405     floating point numbers. (New in version 2.4)\n\
   1406 \n\
   1407 Functions:\n\
   1408 \n\
   1409 dump() -- write value to a file\n\
   1410 load() -- read value from a file\n\
   1411 dumps() -- write value to a string\n\
   1412 loads() -- read value from a string");
   1413 
   1414 
   1415 PyMODINIT_FUNC
   1416 PyMarshal_Init(void)
   1417 {
   1418     PyObject *mod = Py_InitModule3("marshal", marshal_methods,
   1419         marshal_doc);
   1420     if (mod == NULL)
   1421         return;
   1422     PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
   1423 }
   1424