Implemented proto 2 NEWTRUE and NEWFALSE in cPickle.
diff --git a/Modules/cPickle.c b/Modules/cPickle.c
index c284056..215157e 100644
--- a/Modules/cPickle.c
+++ b/Modules/cPickle.c
@@ -963,9 +963,13 @@
static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
long l = PyInt_AS_LONG((PyIntObject *)args);
- if ((*self->write_func)(self, buf[l], len[l]) < 0)
+ if (self->proto >= 2) {
+ char opcode = l ? NEWTRUE : NEWFALSE;
+ if (self->write_func(self, &opcode, 1) < 0)
+ return -1;
+ }
+ else if (self->write_func(self, buf[l], len[l]) < 0)
return -1;
-
return 0;
}
@@ -2789,6 +2793,15 @@
return res;
}
+static int
+load_bool(Unpicklerobject *self, PyObject *boolean)
+{
+ assert(boolean == Py_True || boolean == Py_False);
+ Py_INCREF(boolean);
+ PDATA_PUSH(self->stack, boolean, -1);
+ return 0;
+}
+
/* s contains x bytes of a little-endian integer. Return its value as a
* C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
* int, but when x is 4 it's a signed one. This is an historical source
@@ -4144,6 +4157,16 @@
break;
continue;
+ case NEWTRUE:
+ if (load_bool(self, Py_True) < 0)
+ break;
+ continue;
+
+ case NEWFALSE:
+ if (load_bool(self, Py_False) < 0)
+ break;
+ continue;
+
case '\0':
/* end of file */
PyErr_SetNone(PyExc_EOFError);
@@ -4462,6 +4485,15 @@
break;
continue;
+ case NEWTRUE:
+ if (load_bool(self, Py_True) < 0)
+ break;
+ continue;
+
+ case NEWFALSE:
+ if (load_bool(self, Py_False) < 0)
+ break;
+ continue;
default:
cPickle_ErrFormat(UnpicklingError,
"invalid load key, '%s'.",