Added a HIGHEST_PROTOCOL module attribute to pickle and cPickle.
diff --git a/Lib/pickle.py b/Lib/pickle.py
index 00f5834..74748f8 100644
--- a/Lib/pickle.py
+++ b/Lib/pickle.py
@@ -47,6 +47,10 @@
                       "2.0",            # Protocol 2
                       ]                 # Old format versions we can read
 
+# Keep in synch with cPickle.  This is the highest protocol number we
+# know how to read.
+HIGHEST_PROTOCOL = 2
+
 # Why use struct.pack() for pickling but marshal.loads() for
 # unpickling?  struct.pack() is 40% faster than marshal.dumps(), but
 # marshal.loads() is twice as fast as struct.unpack()!
@@ -200,9 +204,9 @@
         if protocol is None:
             protocol = 0
         if protocol < 0:
-            protocol = 2
-        elif protocol not in (0, 1, 2):
-            raise ValueError, "pickle protocol must be 0, 1 or 2"
+            protocol = HIGHEST_PROTOCOL
+        elif not 0 <= protocol <= HIGHEST_PROTOCOL:
+            raise ValueError("pickle protocol must be <= %d" % HIGHEST_PROTOCOL)
         self.write = file.write
         self.memo = {}
         self.proto = int(protocol)
diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py
index 734f2a3..8479d43 100644
--- a/Lib/test/pickletester.py
+++ b/Lib/test/pickletester.py
@@ -1,5 +1,6 @@
 import unittest
 import pickle
+import cPickle
 import pickletools
 import copy_reg
 
@@ -7,8 +8,9 @@
 
 # Tests that try a number of pickle protocols should have a
 #     for proto in protocols:
-# kind of outer loop.  Bump the 3 to 4 if/when protocol 3 is invented.
-protocols = range(3)
+# kind of outer loop.
+assert pickle.HIGHEST_PROTOCOL == cPickle.HIGHEST_PROTOCOL == 2
+protocols = range(pickle.HIGHEST_PROTOCOL + 1)
 
 
 # Return True if opcode code appears in the pickle, else False.
diff --git a/Modules/cPickle.c b/Modules/cPickle.c
index a9bbd36..17da7d7 100644
--- a/Modules/cPickle.c
+++ b/Modules/cPickle.c
@@ -15,7 +15,7 @@
 #define WRITE_BUF_SIZE 256
 
 /* Bump this when new opcodes are added to the pickle protocol. */
-#define CURRENT_PROTOCOL_NUMBER 2
+#define HIGHEST_PROTOCOL 2
 
 /*
  * Pickle opcodes.  These must be kept in synch with pickle.py.  Extensive
@@ -2743,11 +2743,11 @@
 	Picklerobject *self;
 
 	if (proto < 0)
-		proto = CURRENT_PROTOCOL_NUMBER;
-	if (proto > CURRENT_PROTOCOL_NUMBER) {
+		proto = HIGHEST_PROTOCOL;
+	if (proto > HIGHEST_PROTOCOL) {
 		PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
 			     "the highest available protocol is %d",
-			     proto, CURRENT_PROTOCOL_NUMBER);
+			     proto, HIGHEST_PROTOCOL);
 		return NULL;
 	}
 
@@ -4308,7 +4308,7 @@
 	 * int when chewing on 1 byte.
 	 */
 	assert(i >= 0);
-	if (i <= CURRENT_PROTOCOL_NUMBER)
+	if (i <= HIGHEST_PROTOCOL)
 		return 0;
 
 	PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
@@ -5562,6 +5562,10 @@
 	}
 	Py_DECREF(di);
 
+	i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
+	if (i < 0)
+		return;
+
 	/* These are purely informational; no code uses them. */
 	/* File format version we write. */
 	format_version = PyString_FromString("2.0");