Make cPickle.Unpickler.noload() handle dict subclasses. noload() is
an obscure, undocumentated feature so no test was added. Closes
issue #1101399.
diff --git a/Modules/cPickle.c b/Modules/cPickle.c
index a849424..bbc14bf 100644
--- a/Modules/cPickle.c
+++ b/Modules/cPickle.c
@@ -5049,6 +5049,33 @@
return 0;
}
+static int
+noload_append(Unpicklerobject *self)
+{
+ return Pdata_clear(self->stack, self->stack->length - 1);
+}
+
+static int
+noload_appends(Unpicklerobject *self)
+{
+ int i;
+ if ((i = marker(self)) < 0) return -1;
+ return Pdata_clear(self->stack, i);
+}
+
+static int
+noload_setitem(Unpicklerobject *self)
+{
+ return Pdata_clear(self->stack, self->stack->length - 2);
+}
+
+static int
+noload_setitems(Unpicklerobject *self)
+{
+ int i;
+ if ((i = marker(self)) < 0) return -1;
+ return Pdata_clear(self->stack, i);
+}
static PyObject *
noload(Unpicklerobject *self)
@@ -5207,12 +5234,12 @@
continue;
case APPEND:
- if (load_append(self) < 0)
+ if (noload_append(self) < 0)
break;
continue;
case APPENDS:
- if (load_appends(self) < 0)
+ if (noload_appends(self) < 0)
break;
continue;
@@ -5287,12 +5314,12 @@
continue;
case SETITEM:
- if (load_setitem(self) < 0)
+ if (noload_setitem(self) < 0)
break;
continue;
case SETITEMS:
- if (load_setitems(self) < 0)
+ if (noload_setitems(self) < 0)
break;
continue;