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

tismer at codespeak.net tismer at codespeak.net
Mon Jun 5 12:41:15 CEST 2006


Author: tismer
Date: Mon Jun  5 12:41:14 2006
New Revision: 28322

Modified:
   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/maker.py
Log:
traceback pickling works now, using __setstate__ or course

Modified: pypy/dist/pypy/interpreter/pyframe.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyframe.py	(original)
+++ pypy/dist/pypy/interpreter/pyframe.py	Mon Jun  5 12:41:14 2006
@@ -115,7 +115,8 @@
             w_cells,
             ]
 
-        return space.newtuple([new_inst, space.newtuple(tup_base), space.newtuple(tup_state)])
+        nt = space.newtuple
+        return nt([new_inst, nt(tup_base), nt(tup_state)])
 
     def descr__setstate__(self, space, w_args):
         from pypy.module._pickle_support import maker # helper fns

Modified: pypy/dist/pypy/interpreter/pytraceback.py
==============================================================================
--- pypy/dist/pypy/interpreter/pytraceback.py	(original)
+++ pypy/dist/pypy/interpreter/pytraceback.py	Mon Jun  5 12:41:14 2006
@@ -25,14 +25,24 @@
         new_inst = mod.get('traceback_new')
         w        = space.wrap
 
-        tup = [
+        tup_base = []
+        tup_state = [
             w(self.frame),
             w(self.lasti),
             w(self.lineno),
             w(self.next),
             ]
+        nt = space.newtuple
+        return nt([new_inst, nt(tup_base), nt(tup_state)])
 
-        return space.newtuple([new_inst, space.newtuple(tup)])
+    def descr__setstate__(self, space, w_args):
+        from pypy.interpreter.pyframe import PyFrame
+        args_w = space.unpackiterable(w_args)
+        w_frame, w_lasti, w_lineno, w_next = args_w
+        self.frame = space.interp_w(PyFrame, w_frame)
+        self.lasti = space.int_w(w_lasti)
+        self.lineno = space.int_w(w_lineno)
+        self.next = space.interp_w(PyTraceback, w_next, can_be_None=True)
 
 def record_application_traceback(space, operror, frame, last_instruction):
     if frame.pycode.hidden_applevel:

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	Mon Jun  5 12:41:14 2006
@@ -162,7 +162,7 @@
         f2     = pickle.loads(pckl)
 
     def test_pickle_traceback(self):
-        skip("in-progress: recursion problem")
+        #skip("in-progress: recursion problem")
         def f():
             try:
                 raise Exception()

Modified: pypy/dist/pypy/interpreter/typedef.py
==============================================================================
--- pypy/dist/pypy/interpreter/typedef.py	(original)
+++ pypy/dist/pypy/interpreter/typedef.py	Mon Jun  5 12:41:14 2006
@@ -627,6 +627,8 @@
 PyTraceback.typedef = TypeDef("traceback",
     __reduce__   = interp2app(PyTraceback.descr__reduce__,
                               unwrap_spec=['self', ObjSpace]),
+    __setstate__ = interp2app(PyTraceback.descr__setstate__,
+                              unwrap_spec=['self', ObjSpace, W_Root]),
     tb_frame  = interp_attrproperty('frame', cls=PyTraceback),
     tb_lasti  = interp_attrproperty('lasti', cls=PyTraceback),
     tb_lineno = interp_attrproperty('lineno', cls=PyTraceback),

Modified: pypy/dist/pypy/module/_pickle_support/maker.py
==============================================================================
--- pypy/dist/pypy/module/_pickle_support/maker.py	(original)
+++ pypy/dist/pypy/module/_pickle_support/maker.py	Mon Jun  5 12:41:14 2006
@@ -53,7 +53,7 @@
     return W_ReverseSeqIterObject(space, w_seq, index)
     
 def frame_new(space, __args__):
-    args_w, kwds_w = __args__.unpack()  #stolen from std/fake.py
+    args_w, kwds_w = __args__.unpack()
     w_pycode, = args_w
     pycode = space.interp_w(PyCode, w_pycode)
     w = space.wrap
@@ -65,15 +65,10 @@
     return space.wrap(new_frame)
 frame_new.unwrap_spec = [ObjSpace, Arguments]
 
-def traceback_new(space, __args__):
-    args_w, kwds_w = __args__.unpack()  #stolen from std/fake.py
-    w_frame, w_lasti, w_lineno, w_next = args_w
-    frame = space.interp_w(PyFrame, w_frame)
-    lasti = space.int_w(w_lasti)
-    lineno = space.int_w(w_lineno)
-    next = space.interp_w(PyTraceback, w_next, can_be_None=True)
-    return space.wrap(PyTraceback(space, frame, lasti, lineno, next))
-traceback_new.unwrap_spec = [ObjSpace, Arguments]
+def traceback_new(space):
+    tb = instantiate(PyTraceback)
+    return space.wrap(tb)
+traceback_new.unwrap_spec = [ObjSpace]
 
 def generator_new(space, __args__):
     args_w, kwds_w = __args__.unpack()  #stolen from std/fake.py



More information about the Pypy-commit mailing list