summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/pickle.py40
1 files changed, 12 insertions, 28 deletions
diff --git a/Lib/pickle.py b/Lib/pickle.py
index d767d85..9a5747e 100644
--- a/Lib/pickle.py
+++ b/Lib/pickle.py
@@ -27,7 +27,7 @@ Misc variables:
__version__ = "$Revision$" # Code version
from types import *
-from copy_reg import dispatch_table, safe_constructors, _reconstructor
+from copy_reg import dispatch_table, _reconstructor
import marshal
import sys
import struct
@@ -375,8 +375,8 @@ class Pickler:
if getnewargs:
args = getnewargs() # This bette not reference obj
else:
- for cls in int, long, float, complex, str, unicode, tuple:
- if isinstance(obj, cls):
+ for cls in int, long, float, complex, str, UnicodeType, tuple:
+ if cls and isinstance(obj, cls):
args = (cls(obj),)
break
else:
@@ -1030,10 +1030,7 @@ class Unpickler:
pass
if not instantiated:
try:
- if not hasattr(klass, '__safe_for_unpickling__'):
- raise UnpicklingError('%s is not safe for unpickling' %
- klass)
- value = apply(klass, args)
+ value = klass(*args)
except TypeError, err:
raise TypeError, "in constructor for %s: %s" % (
klass.__name__, str(err)), sys.exc_info()[2]
@@ -1059,7 +1056,7 @@ class Unpickler:
# prohibited
pass
if not instantiated:
- value = apply(klass, args)
+ value = klass(*args)
self.append(value)
dispatch[OBJ] = load_obj
@@ -1078,6 +1075,7 @@ class Unpickler:
dispatch[GLOBAL] = load_global
def find_class(self, module, name):
+ # Subclasses may override this
__import__(module)
mod = sys.modules[module]
klass = getattr(mod, name)
@@ -1085,30 +1083,16 @@ class Unpickler:
def load_reduce(self):
stack = self.stack
-
- callable = stack[-2]
- arg_tup = stack[-1]
- del stack[-2:]
-
- if type(callable) is not ClassType:
- if not callable in safe_constructors:
- try:
- safe = callable.__safe_for_unpickling__
- except AttributeError:
- safe = None
-
- if not safe:
- raise UnpicklingError, "%s is not safe for " \
- "unpickling" % callable
-
- if arg_tup is None:
+ 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 = callable.__basicnew__()
+ value = func.__basicnew__()
else:
- value = apply(callable, arg_tup)
- self.append(value)
+ value = func(*args)
+ stack[-1] = value
dispatch[REDUCE] = load_reduce
def load_pop(self):