From a6b45cc31d33c166c84866f78d504a99d409895c Mon Sep 17 00:00:00 2001
From: Raymond Hettinger <python@rcn.com>
Date: Tue, 7 Dec 2004 07:05:57 +0000
Subject: Eliminate the deprecated option to return None instead of a tuple of
 arguments in __reduce__().

---
 Doc/lib/libpickle.tex |  8 ++------
 Lib/pickle.py         | 18 ++----------------
 Misc/NEWS             |  6 ++++++
 Modules/cPickle.c     | 17 ++++++-----------
 4 files changed, 16 insertions(+), 33 deletions(-)

diff --git a/Doc/lib/libpickle.tex b/Doc/lib/libpickle.tex
index 067f468..4013432 100644
--- a/Doc/lib/libpickle.tex
+++ b/Doc/lib/libpickle.tex
@@ -515,12 +515,8 @@ Otherwise, an \exception{UnpicklingError} will be raised in the
 unpickling environment.  Note that as usual, the callable itself is
 pickled by name.
 
-\item A tuple of arguments for the callable object, or \code{None}.
-\deprecated{2.3}{If this item is \code{None}, then instead of calling
-the callable directly, its \method{__basicnew__()} method is called
-without arguments; this method should also return the unpickled
-object.  Providing \code{None} is deprecated, however; return a
-tuple of arguments instead.}
+\item A tuple of arguments for the callable object.
+\versionchanged[Formerly, this argument could also be \code{None}]{2.5}
 
 \item Optionally, the object's state, which will be passed to
       the object's \method{__setstate__()} method as described in
diff --git a/Lib/pickle.py b/Lib/pickle.py
index 4c91888..02a1b1d 100644
--- a/Lib/pickle.py
+++ b/Lib/pickle.py
@@ -33,7 +33,6 @@ import marshal
 import sys
 import struct
 import re
-import warnings
 
 __all__ = ["PickleError", "PicklingError", "UnpicklingError", "Pickler",
            "Unpickler", "dump", "dumps", "load", "loads"]
@@ -349,14 +348,7 @@ class Pickler:
 
         # Assert that args is a tuple or None
         if not isinstance(args, TupleType):
-            if args is None:
-                # A hack for Jim Fulton's ExtensionClass, now deprecated.
-                # See load_reduce()
-                warnings.warn("__basicnew__ special case is deprecated",
-                              DeprecationWarning)
-            else:
-                raise PicklingError(
-                    "args from reduce() should be a tuple")
+            raise PicklingError("args from reduce() should be a tuple")
 
         # Assert that func is callable
         if not callable(func):
@@ -1138,13 +1130,7 @@ class Unpickler:
         stack = self.stack
         args = stack.pop()
         func = stack[-1]
-        if args is None:
-            # A hack for Jim Fulton's ExtensionClass, now deprecated
-            warnings.warn("__basicnew__ special case is deprecated",
-                          DeprecationWarning)
-            value = func.__basicnew__()
-        else:
-            value = func(*args)
+        value = func(*args)
         stack[-1] = value
     dispatch[REDUCE] = load_reduce
 
diff --git a/Misc/NEWS b/Misc/NEWS
index ffeb29b..f619829 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -17,6 +17,9 @@ Core and builtins
 Extension Modules
 -----------------
 
+- the cPickle module no longer accepts the deprecated None option in the
+  args tuple returned by __reduce__().
+
 - itertools.islice() now accepts None for the start and step arguments.
   This allows islice() to work more readily with slices:
       islice(s.start, s.stop, s.step)
@@ -25,6 +28,9 @@ Extension Modules
 Library
 -------
 
+- the pickle module no longer accepts the deprecated None option in the
+  args tuple returned by __reduce__().
+
 - optparse now optionally imports gettext.  This allows its use in setup.py.
 
 - the deprecated tzparse module was removed.
diff --git a/Modules/cPickle.c b/Modules/cPickle.c
index dc98772..6af99ba 100644
--- a/Modules/cPickle.c
+++ b/Modules/cPickle.c
@@ -2143,6 +2143,12 @@ save_reduce(Picklerobject *self, PyObject *args, PyObject *ob)
 				&dictitems))
 		return -1;
 
+	if (!PyTuple_Check(argtup)) {
+		PyErr_SetString(PicklingError,
+				"args from reduce() should be a tuple");
+		return -1;
+	}
+
 	if (state == Py_None)
 		state = NULL;
 	if (listitems == Py_None)
@@ -3616,17 +3622,6 @@ Instance_New(PyObject *cls, PyObject *args)
 		else goto err;
 	}
 
-	if (args==Py_None) {
-		/* Special case, call cls.__basicnew__() */
-		PyObject *basicnew;
-
-		basicnew = PyObject_GetAttr(cls, __basicnew___str);
-		if (!basicnew)  return NULL;
-		r=PyObject_CallObject(basicnew, NULL);
-		Py_DECREF(basicnew);
-		if (r) return r;
-	}
-
 	if ((r=PyObject_CallObject(cls, args))) return r;
 
   err:
-- 
cgit v0.12

