[Zope-Checkins] CVS: Zope3/lib/python/Persistence - Function.py:1.7

Jeremy Hylton jeremy@zope.com
Wed, 10 Jul 2002 19:03:09 -0400


Update of /cvs-repository/Zope3/lib/python/Persistence
In directory cvs.zope.org:/tmp/cvs-serv26790

Modified Files:
	Function.py 
Log Message:
Use a CodeWrapper to pickle code objects instead of a tuple.

The wrapper object provides more flexibility.


=== Zope3/lib/python/Persistence/Function.py 1.6 => 1.7 ===
 def has_side_effect(func):
     return _STORE_GLOBAL in func.func_code.co_code
 
+class CodeWrapper:
+    """Package a code object so that it can be pickled."""
+
+    def __init__(self, co):
+        self.args = (co.co_argcount,
+                     co.co_nlocals,
+                     co.co_stacksize,
+                     co.co_flags,
+                     co.co_code,
+                     co.co_consts,
+                     co.co_names,
+                     co.co_varnames,
+                     co.co_filename,
+                     co.co_name,
+                     co.co_firstlineno,
+                     co.co_lnotab,
+                     co.co_freevars,
+                     co.co_cellvars)
+
+    def ascode(self):
+        return new.code(*self.args)
+
 def get_code_args(co):
     """Return args from code object suitable for passing to constructor."""
-    return (co.co_argcount,
-            co.co_nlocals,
-            co.co_stacksize,
-            co.co_flags,
-            co.co_code,
-            co.co_consts,
-            co.co_names,
-            co.co_varnames,
-            co.co_filename,
-            co.co_name,
-            co.co_firstlineno,
-            co.co_lnotab,
-            co.co_freevars,
-            co.co_cellvars)
 
 class PersistentFunction(Persistent):
 
@@ -139,7 +147,7 @@
 
         key = sys.version_info, __debug__
         if key not in self._pf_code:
-            self._pf_code[key] = get_code_args(code)
+            self._pf_code[key] = CodeWrapper(code)
 
         return func_state, self._pf_code, self._pf_module
 
@@ -150,11 +158,11 @@
         # recreate the code object
         code = None
         key = sys.version_info, __debug__
-        co_args = self._pf_code.get(key, None)
-        if co_args is None:
+        cowrap = self._pf_code.get(key, None)
+        if cowrap is None:
             assert False, "not implemented yet"
         else:
-            code = new.code(*co_args)
+            code = cowrap.ascode()
 
         func_defaults, func_dict = func
         func = new.function(code, mod.__dict__, func_defaults)