Author: Matti Picus <[email protected]>
Branch: vendor/stdlib-2.7.16
Changeset: r96639:9aa8f255fa02
Date: 2019-05-20 09:12 +0300
http://bitbucket.org/pypy/pypy/changeset/9aa8f255fa02/
Log: revert pickle.py to pypy version, fix _remove_dead_weakref
diff --git a/lib-python/2.7/pickle.py b/lib-python/2.7/pickle.py
--- a/lib-python/2.7/pickle.py
+++ b/lib-python/2.7/pickle.py
@@ -168,7 +168,7 @@
# Pickling machinery
-class Pickler:
+class Pickler(object):
def __init__(self, file, protocol=None):
"""This takes a file-like object for writing a pickle data stream.
@@ -351,7 +351,9 @@
raise PicklingError("args from reduce() should be a tuple")
# Assert that func is callable
- if not hasattr(func, '__call__'):
+ try:
+ func.__call__
+ except AttributeError:
raise PicklingError("func from reduce should be callable")
save = self.save
@@ -644,6 +646,10 @@
# else tmp is empty, and we're done
def save_dict(self, obj):
+ modict_saver = self._pickle_maybe_moduledict(obj)
+ if modict_saver is not None:
+ return self.save_reduce(*modict_saver)
+
write = self.write
if self.bin:
@@ -693,6 +699,23 @@
write(SETITEM)
# else tmp is empty, and we're done
+ def _pickle_maybe_moduledict(self, obj):
+ # save module dictionary as "getattr(module, '__dict__')"
+ try:
+ name = obj['__name__']
+ if type(name) is not str:
+ return None
+ themodule = sys.modules[name]
+ if type(themodule) is not ModuleType:
+ return None
+ if themodule.__dict__ is not obj:
+ return None
+ except (AttributeError, KeyError, TypeError):
+ return None
+
+ return getattr, (themodule, '__dict__')
+
+
def save_inst(self, obj):
cls = obj.__class__
@@ -733,6 +756,29 @@
dispatch[InstanceType] = save_inst
+ def save_function(self, obj):
+ try:
+ return self.save_global(obj)
+ except PicklingError, e:
+ pass
+ # Check copy_reg.dispatch_table
+ reduce = dispatch_table.get(type(obj))
+ if reduce:
+ rv = reduce(obj)
+ else:
+ # Check for a __reduce_ex__ method, fall back to __reduce__
+ reduce = getattr(obj, "__reduce_ex__", None)
+ if reduce:
+ rv = reduce(self.proto)
+ else:
+ reduce = getattr(obj, "__reduce__", None)
+ if reduce:
+ rv = reduce()
+ else:
+ raise e
+ return self.save_reduce(obj=obj, *rv)
+ dispatch[FunctionType] = save_function
+
def save_global(self, obj, name=None, pack=struct.pack):
write = self.write
memo = self.memo
@@ -774,7 +820,6 @@
self.memoize(obj)
dispatch[ClassType] = save_global
- dispatch[FunctionType] = save_global
dispatch[BuiltinFunctionType] = save_global
dispatch[TypeType] = save_global
@@ -830,7 +875,7 @@
# Unpickling machinery
-class Unpickler:
+class Unpickler(object):
def __init__(self, file):
"""This takes a file-like object for reading a pickle data stream.
@@ -1339,6 +1384,7 @@
def decode_long(data):
r"""Decode a long from a two's complement little-endian binary string.
+ This is overriden on PyPy by a RPython version that has linear complexity.
>>> decode_long('')
0L
@@ -1365,6 +1411,11 @@
n -= 1L << (nbytes * 8)
return n
+try:
+ from __pypy__ import decode_long
+except ImportError:
+ pass
+
# Shorthands
try:
diff --git a/pypy/module/_weakref/interp__weakref.py
b/pypy/module/_weakref/interp__weakref.py
--- a/pypy/module/_weakref/interp__weakref.py
+++ b/pypy/module/_weakref/interp__weakref.py
@@ -320,7 +320,7 @@
return
if w_value is None:
return
- if not space.isinstance_w(w_value, W_WeakrefBase):
+ if not isinstance(w_value, W_WeakrefBase):
raise oefmt(space.w_TypeError, "not a weakref")
w_ref = w_value.dereference()
if w_ref is None or space.isinstance_w(w_ref, space.w_None):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit