Three independent changes:

- Don't use "from copy_reg import *".

- Use cls.__module__ instead of calling whichobject(cls, cls.__name__);
  also try __module__ in whichmodule(), just in case.

- After calling save_reduce(), add the object to the memo.
diff --git a/Lib/pickle.py b/Lib/pickle.py
index 7458792..a38f4f6 100644
--- a/Lib/pickle.py
+++ b/Lib/pickle.py
@@ -131,7 +131,7 @@
 __version__ = "1.8"                     # Code version
 
 from types import *
-from copy_reg import *
+from copy_reg import dispatch_table, safe_constructors
 import string, marshal
 
 format_version = "1.2"                  # File format version we write
@@ -290,6 +290,9 @@
                                      "by %s must be a tuple" % reduce
 
             self.save_reduce(callable, arg_tup, state) 
+	    memo_len = len(memo)
+	    self.write(self.put(memo_len))
+	    memo[d] = (memo_len, object)
             return
 
         f(self, object)
@@ -489,9 +492,7 @@
         if (self.bin):
             write(OBJ + self.put(memo_len))
         else:
-            module = whichmodule(cls, cls.__name__)
-            name = cls.__name__
-            write(INST + module + '\n' + name + '\n' +
+            write(INST + cls.__module__ + '\n' + cls.__name__ + '\n' +
                 self.put(memo_len))
 
         memo[d] = (memo_len, object)
@@ -514,7 +515,10 @@
         if (name is None):
             name = object.__name__
 
-        module = whichmodule(object, name)
+	try:
+	    module = object.__module__
+	except AttributeError:
+	    module = whichmodule(object, name)
 
         memo_len = len(memo)
         write(GLOBAL + module + '\n' + name + '\n' +
@@ -544,6 +548,7 @@
 
 classmap = {}
 
+# This is no longer used to find classes, but still for functions
 def whichmodule(cls, clsname):
     """Figure out the module in which a class occurs.