load_inst(), load_obj():  Put the bulk of these into a common new
_instantiate() method.
diff --git a/Lib/pickle.py b/Lib/pickle.py
index 4c4bf86..fa6df34 100644
--- a/Lib/pickle.py
+++ b/Lib/pickle.py
@@ -1065,16 +1065,18 @@
         self.stack[k:] = [d]
     dispatch[DICT] = load_dict
 
-    def load_inst(self):
-        k = self.marker()
+    # INST and OBJ differ only in how they get a class object.  It's not
+    # only sensible to do the rest in a common routine, the two routines
+    # previously diverged and grew different bugs.
+    # klass is the class to instantiate, and k points to the topmost mark
+    # object, following which are the arguments for klass.__init__.
+    def _instantiate(self, klass, k):
         args = tuple(self.stack[k+1:])
         del self.stack[k:]
-        module = self.readline()[:-1]
-        name = self.readline()[:-1]
-        klass = self.find_class(module, name)
         instantiated = 0
-        if (not args and type(klass) is ClassType and
-            not hasattr(klass, "__getinitargs__")):
+        if (not args and
+                type(klass) is ClassType and
+                not hasattr(klass, "__getinitargs__")):
             try:
                 value = _EmptyClass()
                 value.__class__ = klass
@@ -1090,29 +1092,19 @@
                 raise TypeError, "in constructor for %s: %s" % (
                     klass.__name__, str(err)), sys.exc_info()[2]
         self.append(value)
+
+    def load_inst(self):
+        module = self.readline()[:-1]
+        name = self.readline()[:-1]
+        klass = self.find_class(module, name)
+        self._instantiate(klass, self.marker())
     dispatch[INST] = load_inst
 
     def load_obj(self):
-        stack = self.stack
+        # Stack is ... markobject classobject arg1 arg2 ...
         k = self.marker()
-        klass = stack[k + 1]
-        del stack[k + 1]
-        args = tuple(stack[k + 1:])
-        del stack[k:]
-        instantiated = 0
-        if (not args and type(klass) is ClassType and
-            not hasattr(klass, "__getinitargs__")):
-            try:
-                value = _EmptyClass()
-                value.__class__ = klass
-                instantiated = 1
-            except RuntimeError:
-                # In restricted execution, assignment to inst.__class__ is
-                # prohibited
-                pass
-        if not instantiated:
-            value = klass(*args)
-        self.append(value)
+        klass = self.stack.pop(k+1)
+        self._instantiate(klass, k)
     dispatch[OBJ] = load_obj
 
     def load_newobj(self):