[pypy-svn] r28246 - in pypy/dist/pypy: interpreter interpreter/test module/_pickle_support

tismer at codespeak.net tismer at codespeak.net
Sun Jun 4 13:11:49 CEST 2006


Author: tismer
Date: Sun Jun  4 13:11:48 2006
New Revision: 28246

Modified:
   pypy/dist/pypy/interpreter/generator.py
   pypy/dist/pypy/interpreter/pyframe.py
   pypy/dist/pypy/interpreter/pytraceback.py
   pypy/dist/pypy/interpreter/test/test_pickle.py
   pypy/dist/pypy/interpreter/typedef.py
   pypy/dist/pypy/module/_pickle_support/__init__.py
Log:
pickling now passes all tests, but this doesn't say too much, frame pickling is not ready, yet.

Modified: pypy/dist/pypy/interpreter/generator.py
==============================================================================
--- pypy/dist/pypy/interpreter/generator.py	(original)
+++ pypy/dist/pypy/interpreter/generator.py	Sun Jun  4 13:11:48 2006
@@ -44,7 +44,6 @@
         self.exhausted = False
 
     def descr__reduce__(self, space):
-        raise Exception('generator pickling is work in progress')
         from pypy.interpreter.mixedmodule import MixedModule
         w_mod    = space.getbuiltinmodule('_pickle_support')
         mod      = space.interp_w(MixedModule, w_mod)

Modified: pypy/dist/pypy/interpreter/pyframe.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyframe.py	(original)
+++ pypy/dist/pypy/interpreter/pyframe.py	Sun Jun  4 13:11:48 2006
@@ -68,37 +68,25 @@
         self.instr_prev = -1
 
     def descr__reduce__(self, space):
-        '''
-        >>>> dir(frame)
-        ['__class__', '__delattr__', '__doc__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', 'f_back', 'f_builtins', 'f_code', 'f_exc_traceback', 'f_exc_type', 'f_exc_value', 'f_globals', 'f_lasti', 'f_lineno', 'f_locals', 'f_restricted', 'f_trace']
-        '''
-        raise Exception('frame pickling is work in progress')
         from pypy.interpreter.mixedmodule import MixedModule
         w_mod    = space.getbuiltinmodule('_pickle_support')
         mod      = space.interp_w(MixedModule, w_mod)
         new_inst = mod.get('frame_new')
         w        = space.wrap
 
-        #XXX how to call PyFrame.fget_f_lineno(..) from here? just make it a staticmethod?
-        #f_lineno = PyFrame.fget_f_lineno(space, self)   #TypeError: unbound method fget_f_lineno() must be called with PyFrame instance as first argument (got StdObjSpace instance instead)
         if self.w_f_trace is None:
             f_lineno = self.get_last_lineno()
         else:
             f_lineno = self.f_lineno
 
         valuestack = [w(item) for item in self.valuestack.items]
-        #print 'XXX valuestack=', valuestack
-
         blockstack = [w(item) for item in self.blockstack.items]
-        #print 'XXX blockstack=', blockstack
 
         tup = [
             w(self.f_back),
             w(self.builtin),
             w(self.pycode),
             space.w_None, #space.newtuple(valuestack),  #XXX <pypy.interpreter.nestedscope.PyNestedScopeFrame object at 0x25545d0> causes AttributeError: 'NoneType' object has no attribute 'getclass'
-            #YYY sure! the stack can contain NULLs.
-            #YYY I'm again and again strongly recommending to *read* the existing implementation.
             space.w_None, #space.newtuple(blockstack),
             w(self.last_exception), #f_exc_traceback, f_exc_type, f_exc_value
             self.w_globals,
@@ -118,11 +106,6 @@
             w(self.instr_prev),
             ]
 
-        #XXX what to do with valuestack and blockstack here?
-        #YYY well, we build the valuestack as a tuple (with a marker for NULL objects)
-        #YYY and we pickle the blockstack as well.
-        #YYY see frameobject_reduce line 722 in prickelpit.c in the stackless distro.
-            
         return space.newtuple([new_inst, space.newtuple(tup)])
 
     def hide(self):

Modified: pypy/dist/pypy/interpreter/pytraceback.py
==============================================================================
--- pypy/dist/pypy/interpreter/pytraceback.py	(original)
+++ pypy/dist/pypy/interpreter/pytraceback.py	Sun Jun  4 13:11:48 2006
@@ -19,7 +19,6 @@
         self.next = next
 
     def descr__reduce__(self, space):
-        raise Exception('traceback pickling is work in progress')
         from pypy.interpreter.mixedmodule import MixedModule
         w_mod    = space.getbuiltinmodule('_pickle_support')
         mod      = space.interp_w(MixedModule, w_mod)

Modified: pypy/dist/pypy/interpreter/test/test_pickle.py
==============================================================================
--- pypy/dist/pypy/interpreter/test/test_pickle.py	(original)
+++ pypy/dist/pypy/interpreter/test/test_pickle.py	Sun Jun  4 13:11:48 2006
@@ -14,15 +14,17 @@
         mod = new.module('mod')
         import sys
         sys.modules['mod'] = mod
-        def func():
-            return 42
-        mod.__dict__['func'] = func
-        func.__module__ = 'mod'
-        import pickle
-        pckl = pickle.dumps(func)
-        result = pickle.loads(pckl)
-        assert func is result
-        del sys.modules['mod']
+        try:
+            def func():
+                return 42
+            mod.__dict__['func'] = func
+            func.__module__ = 'mod'
+            import pickle
+            pckl = pickle.dumps(func)
+            result = pickle.loads(pckl)
+            assert func is result
+        finally:
+            del sys.modules['mod']
     
     def test_pickle_not_imported_module(self):
         import new
@@ -33,7 +35,6 @@
         result = pickle.loads(pckl)
         assert mod.__name__ == result.__name__
         assert mod.__dict__ == result.__dict__
-        #print mod.__dict__
     
     def test_pickle_builtin_func(self):
         import pickle
@@ -73,11 +74,6 @@
         assert not (cell != result)
 
     def test_pickle_frame(self):
-        '''
-        >>>> dir(frame)
-        ['__class__', '__delattr__', '__doc__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', 'f_back', 'f_builtins', 'f_code', 'f_exc_traceback', 'f_exc_type', 'f_exc_value', 'f_globals', 'f_lasti', 'f_lineno', 'f_locals', 'f_restricted', 'f_trace']
-        '''
-        skip("work in progress")
         from sys import exc_info
         def f():
             try:
@@ -115,7 +111,6 @@
         assert f1.f_trace is f2.f_trace
 
     def test_pickle_traceback(self):
-        skip("work in progress")
         def f():
             try:
                 raise Exception()
@@ -196,43 +191,54 @@
         assert a == result
     
     def test_pickle_method(self):
-        skip("work in progress")
         class myclass(object):
             def f(self):
-                pass
+                return 42
             def __reduce__(self):
-                return (myclass,())
-        import pickle
+                return (myclass, ())
+        import pickle, sys, new
+        myclass.__module__ = 'mod'
         myclass_inst = myclass()
-        method   = myclass_inst.f
-        pckl     = pickle.dumps(method)
-        result   = pickle.loads(pckl)
-        assert method == result
-        
+        mod = new.module('mod')
+        mod.myclass = myclass
+        sys.modules['mod'] = mod
+        try:
+            method   = myclass_inst.f
+            pckl     = pickle.dumps(method)
+            result   = pickle.loads(pckl)
+            # we cannot compare the objects, because the method will be a fresh one
+            assert method() == result()
+        finally:
+            del sys.modules['mod']
     
     def test_pickle_staticmethod(self):
-        skip("work in progress")
         class myclass(object):
-            def f(self):
-                pass
+            def f():
+                return 42
             f = staticmethod(f)
         import pickle
         method   = myclass.f
         pckl     = pickle.dumps(method)
         result   = pickle.loads(pckl)
-        assert method == result
+        assert method() == result()
     
     def test_pickle_classmethod(self):
-        skip("work in progress")
         class myclass(object):
-            def f(self):
-                pass
+            def f(cls):
+                return cls
             f = classmethod(f)
-        import pickle
-        method   = myclass.f
-        pckl     = pickle.dumps(method)
-        result   = pickle.loads(pckl)
-        assert method == result
+        import pickle, sys, new
+        myclass.__module__ = 'mod'
+        mod = new.module('mod')
+        mod.myclass = myclass
+        sys.modules['mod'] = mod
+        try:
+            method   = myclass.f
+            pckl     = pickle.dumps(method)
+            result   = pickle.loads(pckl)
+            assert method() == result()
+        finally:
+            del sys.modules['mod']
     
     def test_pickle_sequenceiter(self):
         '''
@@ -296,7 +302,6 @@
         assert list(result) == [2,3,4]
     
     def test_pickle_generator(self):
-        skip("work in progress (implement after frame pickling)")
         import pickle
         def giveme(n):
             x = 0

Modified: pypy/dist/pypy/interpreter/typedef.py
==============================================================================
--- pypy/dist/pypy/interpreter/typedef.py	(original)
+++ pypy/dist/pypy/interpreter/typedef.py	Sun Jun  4 13:11:48 2006
@@ -521,8 +521,8 @@
     )
 
 PyFrame.typedef = TypeDef('frame',
-    #__reduce__   = interp2app(PyFrame.descr__reduce__,
-    #                              unwrap_spec=['self', ObjSpace]),
+    __reduce__   = interp2app(PyFrame.descr__reduce__,
+                              unwrap_spec=['self', ObjSpace]),
     f_builtins = GetSetProperty(PyFrame.fget_f_builtins),
     f_lineno = GetSetProperty(PyFrame.fget_f_lineno, PyFrame.fset_f_lineno),
     f_back = GetSetProperty(PyFrame.fget_f_back),
@@ -623,8 +623,8 @@
 del BuiltinFunction.typedef.rawdict['__get__']
 
 PyTraceback.typedef = TypeDef("traceback",
-    #__reduce__   = interp2app(PyTraceback.descr__reduce__,
-    #                              unwrap_spec=['self', ObjSpace]),
+    __reduce__   = interp2app(PyTraceback.descr__reduce__,
+                              unwrap_spec=['self', ObjSpace]),
     tb_frame  = interp_attrproperty('frame', cls=PyTraceback),
     tb_lasti  = interp_attrproperty('lasti', cls=PyTraceback),
     tb_lineno = interp_attrproperty('lineno', cls=PyTraceback),
@@ -632,8 +632,8 @@
     )
 
 GeneratorIterator.typedef = TypeDef("generator",
-    #__reduce__   = interp2app(GeneratorIterator.descr__reduce__,
-    #                              unwrap_spec=['self', ObjSpace]),
+    __reduce__   = interp2app(GeneratorIterator.descr__reduce__,
+                              unwrap_spec=['self', ObjSpace]),
     next       = interp2app(GeneratorIterator.descr_next),
     __iter__   = interp2app(GeneratorIterator.descr__iter__),
     gi_running = interp_attrproperty('running', cls=GeneratorIterator),

Modified: pypy/dist/pypy/module/_pickle_support/__init__.py
==============================================================================
--- pypy/dist/pypy/module/_pickle_support/__init__.py	(original)
+++ pypy/dist/pypy/module/_pickle_support/__init__.py	Sun Jun  4 13:11:48 2006
@@ -15,7 +15,7 @@
         'dictiter_surrogate_new' : 'maker.dictiter_surrogate_new',
         'seqiter_new'  : 'maker.seqiter_new',
         'reverseseqiter_new' : 'maker.reverseseqiter_new',
-        #'frame_new'    : 'maker.frame_new',
-        #'traceback_new' : 'maker.traceback_new',
-        #'generator_new' : 'maker.generator_new',
+        'frame_new'    : 'maker.frame_new',
+        'traceback_new' : 'maker.traceback_new',
+        'generator_new' : 'maker.generator_new',
     }



More information about the Pypy-commit mailing list