diff options
Diffstat (limited to 'Python/marshal.c')
-rw-r--r-- | Python/marshal.c | 118 |
1 files changed, 50 insertions, 68 deletions
diff --git a/Python/marshal.c b/Python/marshal.c index 627a8428e5..5b8de99192 100644 --- a/Python/marshal.c +++ b/Python/marshal.c @@ -263,10 +263,10 @@ w_ref(PyObject *v, char *flag, WFILE *p) if (Py_REFCNT(v) == 1) return 0; - entry = _Py_HASHTABLE_GET_ENTRY(p->hashtable, v); + entry = _Py_hashtable_get_entry(p->hashtable, v); if (entry != NULL) { /* write the reference index to the stream */ - _Py_HASHTABLE_ENTRY_READ_DATA(p->hashtable, entry, w); + _Py_HASHTABLE_ENTRY_READ_DATA(p->hashtable, &w, sizeof(w), entry); /* we don't store "long" indices in the dict */ assert(0 <= w && w <= 0x7fffffff); w_byte(TYPE_REF, p); @@ -571,8 +571,7 @@ static int w_init_refs(WFILE *wf, int version) { if (version >= 3) { - wf->hashtable = _Py_hashtable_new(sizeof(PyObject *), sizeof(int), - _Py_hashtable_hash_ptr, + wf->hashtable = _Py_hashtable_new(sizeof(int), _Py_hashtable_hash_ptr, _Py_hashtable_compare_direct); if (wf->hashtable == NULL) { PyErr_NoMemory(); @@ -583,13 +582,9 @@ w_init_refs(WFILE *wf, int version) } static int -w_decref_entry(_Py_hashtable_t *ht, _Py_hashtable_entry_t *entry, - void *Py_UNUSED(data)) +w_decref_entry(_Py_hashtable_entry_t *entry, void *Py_UNUSED(data)) { - PyObject *entry_key; - - _Py_HASHTABLE_ENTRY_READ_KEY(ht, entry, entry_key); - Py_XDECREF(entry_key); + Py_XDECREF(entry->key); return 0; } @@ -648,7 +643,7 @@ typedef struct { PyObject *refs; /* a list */ } RFILE; -static const char * +static char * r_string(Py_ssize_t n, RFILE *p) { Py_ssize_t read = -1; @@ -734,7 +729,7 @@ r_byte(RFILE *p) c = getc(p->fp); } else { - const char *ptr = r_string(1, p); + char *ptr = r_string(1, p); if (ptr != NULL) c = *(unsigned char *) ptr; } @@ -745,9 +740,9 @@ static int r_short(RFILE *p) { short x = -1; - const unsigned char *buffer; + unsigned char *buffer; - buffer = (const unsigned char *) r_string(2, p); + buffer = (unsigned char *) r_string(2, p); if (buffer != NULL) { x = buffer[0]; x |= buffer[1] << 8; @@ -761,9 +756,9 @@ static long r_long(RFILE *p) { long x = -1; - const unsigned char *buffer; + unsigned char *buffer; - buffer = (const unsigned char *) r_string(4, p); + buffer = (unsigned char *) r_string(4, p); if (buffer != NULL) { x = buffer[0]; x |= (long)buffer[1] << 8; @@ -983,8 +978,7 @@ r_object(RFILE *p) case TYPE_FLOAT: { - char buf[256]; - const char *ptr; + char buf[256], *ptr; double dx; n = r_byte(p); if (n == EOF) { @@ -1007,9 +1001,9 @@ r_object(RFILE *p) case TYPE_BINARY_FLOAT: { - const unsigned char *buf; + unsigned char *buf; double x; - buf = (const unsigned char *) r_string(8, p); + buf = (unsigned char *) r_string(8, p); if (buf == NULL) break; x = _PyFloat_Unpack8(buf, 1); @@ -1022,8 +1016,7 @@ r_object(RFILE *p) case TYPE_COMPLEX: { - char buf[256]; - const char *ptr; + char buf[256], *ptr; Py_complex c; n = r_byte(p); if (n == EOF) { @@ -1060,15 +1053,15 @@ r_object(RFILE *p) case TYPE_BINARY_COMPLEX: { - const unsigned char *buf; + unsigned char *buf; Py_complex c; - buf = (const unsigned char *) r_string(8, p); + buf = (unsigned char *) r_string(8, p); if (buf == NULL) break; c.real = _PyFloat_Unpack8(buf, 1); if (c.real == -1.0 && PyErr_Occurred()) break; - buf = (const unsigned char *) r_string(8, p); + buf = (unsigned char *) r_string(8, p); if (buf == NULL) break; c.imag = _PyFloat_Unpack8(buf, 1); @@ -1081,7 +1074,7 @@ r_object(RFILE *p) case TYPE_STRING: { - const char *ptr; + char *ptr; n = r_long(p); if (PyErr_Occurred()) break; @@ -1126,7 +1119,7 @@ r_object(RFILE *p) } _read_ascii: { - const char *ptr; + char *ptr; ptr = r_string(n, p); if (ptr == NULL) break; @@ -1144,7 +1137,7 @@ r_object(RFILE *p) is_interned = 1; case TYPE_UNICODE: { - const char *buffer; + char *buffer; n = r_long(p); if (PyErr_Occurred()) @@ -1271,52 +1264,41 @@ r_object(RFILE *p) PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)"); break; } - - if (n == 0 && type == TYPE_FROZENSET) { - /* call frozenset() to get the empty frozenset singleton */ - v = PyObject_CallFunction((PyObject*)&PyFrozenSet_Type, NULL); - if (v == NULL) - break; + v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL); + if (type == TYPE_SET) { R_REF(v); - retval = v; + } else { + /* must use delayed registration of frozensets because they must + * be init with a refcount of 1 + */ + idx = r_ref_reserve(flag, p); + if (idx < 0) + Py_CLEAR(v); /* signal error */ } - else { - v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL); - if (type == TYPE_SET) { - R_REF(v); - } else { - /* must use delayed registration of frozensets because they must - * be init with a refcount of 1 - */ - idx = r_ref_reserve(flag, p); - if (idx < 0) - Py_CLEAR(v); /* signal error */ - } - if (v == NULL) - break; + if (v == NULL) + break; - for (i = 0; i < n; i++) { - v2 = r_object(p); - if ( v2 == NULL ) { - if (!PyErr_Occurred()) - PyErr_SetString(PyExc_TypeError, - "NULL object in marshal data for set"); - Py_DECREF(v); - v = NULL; - break; - } - if (PySet_Add(v, v2) == -1) { - Py_DECREF(v); - Py_DECREF(v2); - v = NULL; - break; - } + for (i = 0; i < n; i++) { + v2 = r_object(p); + if ( v2 == NULL ) { + if (!PyErr_Occurred()) + PyErr_SetString(PyExc_TypeError, + "NULL object in marshal data for set"); + Py_DECREF(v); + v = NULL; + break; + } + if (PySet_Add(v, v2) == -1) { + Py_DECREF(v); Py_DECREF(v2); + v = NULL; + break; } - if (type != TYPE_SET) - v = r_ref_insert(v, idx, flag, p); - retval = v; + Py_DECREF(v2); } + if (type != TYPE_SET) + v = r_ref_insert(v, idx, flag, p); + retval = v; break; case TYPE_CODE: |