From: Neil Schemenauer Date: Wed, 14 Oct 2009 19:33:31 +0000 (+0000) Subject: Make cPickle.Unpickler.noload() handle dict subclasses. noload() is X-Git-Tag: v2.7a1~346 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=973f8b4ca6b2614968d76760c38f5adc31da2727;p=python 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 a84942403b..bbc14bf4d4 100644 --- a/Modules/cPickle.c +++ b/Modules/cPickle.c @@ -5049,6 +5049,33 @@ noload_extension(Unpicklerobject *self, int nbytes) 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 @@ noload(Unpicklerobject *self) 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 @@ noload(Unpicklerobject *self) 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;