diff options
Diffstat (limited to 'Python/marshal.c')
| -rw-r--r-- | Python/marshal.c | 35 | 
1 files changed, 19 insertions, 16 deletions
| diff --git a/Python/marshal.c b/Python/marshal.c index 76d5690..35fcd3a 100644 --- a/Python/marshal.c +++ b/Python/marshal.c @@ -59,9 +59,9 @@ typedef struct {      /* If fp == NULL, the following are valid: */      PyObject * readable;    /* Stream-like object being read from */      PyObject *str; +    PyObject *current_filename;      char *ptr;      char *end; -    PyObject *strings; /* dict on marshal, list on unmarshal */      int version;  } WFILE; @@ -445,7 +445,6 @@ PyMarshal_WriteLongToFile(long x, FILE *fp, int version)      wf.fp = fp;      wf.error = WFERR_OK;      wf.depth = 0; -    wf.strings = NULL;      wf.version = version;      w_long(x, &wf);  } @@ -457,10 +456,8 @@ PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)      wf.fp = fp;      wf.error = WFERR_OK;      wf.depth = 0; -    wf.strings = (version > 0) ? PyDict_New() : NULL;      wf.version = version;      w_object(x, &wf); -    Py_XDECREF(wf.strings);  }  typedef WFILE RFILE; /* Same struct with different invariants */ @@ -1069,6 +1066,18 @@ r_object(RFILE *p)              filename = r_object(p);              if (filename == NULL)                  goto code_error; +            if (PyUnicode_CheckExact(filename)) { +                if (p->current_filename != NULL) { +                    if (!PyUnicode_Compare(filename, p->current_filename)) { +                        Py_DECREF(filename); +                        Py_INCREF(p->current_filename); +                        filename = p->current_filename; +                    } +                } +                else { +                    p->current_filename = filename; +                } +            }              name = r_object(p);              if (name == NULL)                  goto code_error; @@ -1131,7 +1140,7 @@ PyMarshal_ReadShortFromFile(FILE *fp)      assert(fp);      rf.readable = NULL;      rf.fp = fp; -    rf.strings = NULL; +    rf.current_filename = NULL;      rf.end = rf.ptr = NULL;      return r_short(&rf);  } @@ -1142,7 +1151,7 @@ PyMarshal_ReadLongFromFile(FILE *fp)      RFILE rf;      rf.fp = fp;      rf.readable = NULL; -    rf.strings = NULL; +    rf.current_filename = NULL;      rf.ptr = rf.end = NULL;      return r_long(&rf);  } @@ -1204,11 +1213,10 @@ PyMarshal_ReadObjectFromFile(FILE *fp)      PyObject *result;      rf.fp = fp;      rf.readable = NULL; -    rf.strings = PyList_New(0); +    rf.current_filename = NULL;      rf.depth = 0;      rf.ptr = rf.end = NULL;      result = r_object(&rf); -    Py_DECREF(rf.strings);      return result;  } @@ -1219,12 +1227,11 @@ PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)      PyObject *result;      rf.fp = NULL;      rf.readable = NULL; +    rf.current_filename = NULL;      rf.ptr = str;      rf.end = str + len; -    rf.strings = PyList_New(0);      rf.depth = 0;      result = r_object(&rf); -    Py_DECREF(rf.strings);      return result;  } @@ -1244,9 +1251,7 @@ PyMarshal_WriteObjectToString(PyObject *x, int version)      wf.error = WFERR_OK;      wf.depth = 0;      wf.version = version; -    wf.strings = (version > 0) ? PyDict_New() : NULL;      w_object(x, &wf); -    Py_XDECREF(wf.strings);      if (wf.str != NULL) {          char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);          if (wf.ptr - base > PY_SSIZE_T_MAX) { @@ -1331,12 +1336,11 @@ marshal_load(PyObject *self, PyObject *f)          result = NULL;      }      else { -        rf.strings = PyList_New(0);          rf.depth = 0;          rf.fp = NULL;          rf.readable = f; +        rf.current_filename = NULL;          result = read_object(&rf); -        Py_DECREF(rf.strings);      }      Py_DECREF(data);      return result; @@ -1389,12 +1393,11 @@ marshal_loads(PyObject *self, PyObject *args)      n = p.len;      rf.fp = NULL;      rf.readable = NULL; +    rf.current_filename = NULL;      rf.ptr = s;      rf.end = s + n; -    rf.strings = PyList_New(0);      rf.depth = 0;      result = read_object(&rf); -    Py_DECREF(rf.strings);      PyBuffer_Release(&p);      return result;  } | 
