Skip to content

Commit a907c48

Browse files
committed
marshal: add TYPE_FROZENDICT
1 parent 48e9b40 commit a907c48

File tree

1 file changed

+19
-3
lines changed

1 file changed

+19
-3
lines changed

Python/marshal.c

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ module marshal
6767
#define TYPE_TUPLE '(' // See also TYPE_SMALL_TUPLE.
6868
#define TYPE_LIST '['
6969
#define TYPE_DICT '{'
70+
#define TYPE_FROZENDICT '}'
7071
#define TYPE_CODE 'c'
7172
#define TYPE_UNICODE 'u'
7273
#define TYPE_UNKNOWN '?'
@@ -571,10 +572,15 @@ w_complex_object(PyObject *v, char flag, WFILE *p)
571572
w_object(PyList_GET_ITEM(v, i), p);
572573
}
573574
}
574-
else if (PyDict_CheckExact(v)) {
575+
else if (_PyAnyDict_CheckExact(v)) {
575576
Py_ssize_t pos;
576577
PyObject *key, *value;
577-
W_TYPE(TYPE_DICT, p);
578+
if (PyFrozenDict_CheckExact(v)) {
579+
W_TYPE(TYPE_FROZENDICT, p);
580+
}
581+
else {
582+
W_TYPE(TYPE_DICT, p);
583+
}
578584
/* This one is NULL object terminated! */
579585
pos = 0;
580586
while (PyDict_Next(v, &pos, &key, &value)) {
@@ -1416,6 +1422,7 @@ r_object(RFILE *p)
14161422
break;
14171423

14181424
case TYPE_DICT:
1425+
case TYPE_FROZENDICT:
14191426
v = PyDict_New();
14201427
R_REF(v);
14211428
if (v == NULL)
@@ -1439,7 +1446,16 @@ r_object(RFILE *p)
14391446
Py_DECREF(val);
14401447
}
14411448
if (PyErr_Occurred()) {
1442-
Py_SETREF(v, NULL);
1449+
Py_CLEAR(v);
1450+
}
1451+
if (type == TYPE_FROZENDICT && v != NULL) {
1452+
PyObject *frozendict = PyFrozenDict_New(v);
1453+
if (frozendict != NULL) {
1454+
Py_SETREF(v, frozendict);
1455+
}
1456+
else {
1457+
Py_CLEAR(v);
1458+
}
14431459
}
14441460
retval = v;
14451461
break;

0 commit comments

Comments
 (0)