[pypy-commit] pypy continulet-pickle: Pickling and unpickling of empty continulets.

arigo noreply at buildbot.pypy.org
Mon Sep 12 15:36:14 CEST 2011


Author: Armin Rigo <arigo at tunes.org>
Branch: continulet-pickle
Changeset: r47222:b3847d33555e
Date: 2011-09-12 14:02 +0200
http://bitbucket.org/pypy/pypy/changeset/b3847d33555e/

Log:	Pickling and unpickling of empty continulets.

diff --git a/pypy/module/_continuation/__init__.py b/pypy/module/_continuation/__init__.py
--- a/pypy/module/_continuation/__init__.py
+++ b/pypy/module/_continuation/__init__.py
@@ -37,4 +37,5 @@
     interpleveldefs = {
         'continulet': 'interp_continuation.W_Continulet',
         'permute': 'interp_continuation.permute',
+        '_p': 'interp_continuation.unpickle',      # pickle support
     }
diff --git a/pypy/module/_continuation/interp_continuation.py b/pypy/module/_continuation/interp_continuation.py
--- a/pypy/module/_continuation/interp_continuation.py
+++ b/pypy/module/_continuation/interp_continuation.py
@@ -102,12 +102,22 @@
                  and not self.sthread.is_empty_handle(self.h))
         return self.space.newbool(valid)
 
+    def descr__reduce__(self):
+        space = self.space
+        w_continulet_type = space.type(space.wrap(self))
+        return space.newtuple([getunpickle(space),
+                               space.newtuple([w_continulet_type])])
+
 
 def W_Continulet___new__(space, w_subtype, __args__):
     r = space.allocate_instance(W_Continulet, w_subtype)
     r.__init__(space)
     return space.wrap(r)
 
+def unpickle(space, w_subtype):
+    """Pickle support."""
+    return W_Continulet___new__(space, w_subtype, None)
+
 
 W_Continulet.typedef = TypeDef(
     'continulet',
@@ -117,6 +127,7 @@
     switch      = interp2app(W_Continulet.descr_switch),
     throw       = interp2app(W_Continulet.descr_throw),
     is_pending  = interp2app(W_Continulet.descr_is_pending),
+    __reduce__  = interp2app(W_Continulet.descr__reduce__),
     )
 
 
@@ -137,6 +148,7 @@
                                    '', [], [], [], '',
                                    '<bottom of continulet>', 0, '', [], [],
                                    hidden_applevel=True)
+        self.w_unpickle = w_module.get('_p')
 
 def geterror(space, message):
     cs = space.fromcache(State)
@@ -150,6 +162,10 @@
     cs = space.fromcache(State)
     return space.FrameClass(space, cs.dummy_pycode, None, None)
 
+def getunpickle(space):
+    cs = space.fromcache(State)
+    return cs.w_unpickle
+
 # ____________________________________________________________
 
 


More information about the pypy-commit mailing list