[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)