[Stackless] exceptions.TypeError: arg 5 (closure) expected cell, found stackless._wrap.cell when unpickling stackless thread

Richard Tew richard.m.tew at gmail.com
Fri Oct 9 20:21:28 CEST 2009


On Fri, Oct 9, 2009 at 10:38 PM, Crispin Wellington
<retrogradeorbit at gmail.com> wrote:
> I have written a server that contains stackless threads. When the server
> shuts down these threads are serialised to disk. This all happens without
> incident and I end up with a reasonably sized file per pickled object.
>
> When I go to deserialise them I hit a problem. I get this...
> -------------------
>       File
> "/home/cwellington/Development/yabi/yabi-be-twisted/trunk/TaskManager/Tasklets.py",
> line 54, in load
>         task = pickle.loads(data)
>       File "/usr/local/stackless/lib/python2.6/pickle.py", line 1415, in
> loads
>         return Unpickler(file).load()
>       File "/usr/local/stackless/lib/python2.6/pickle.py", line 898, in load
>         dispatch[key](self)
>       File "/usr/local/stackless/lib/python2.6/pickle.py", line 1258, in
> load_build
>         setstate(state)
>     exceptions.TypeError: arg 5 (closure) expected cell, found
> stackless._wrap.cell
> --------------------
>
> I think this might be a bug. The arguments are being passed back into the
> constructor of the stackless._wrap.function and the constructor is throwing
> that exception. So in essence, the __reduce__ or __reduce_ex__ functions are
> creating instatiation values that do not work on reinstantiation.
>
> I changed pickle.py to print out some debug. setstate is... <built-in method
> __setstate__ of stackless._wrap.function object at 0x21ca0c8> and (state)[4]
> is... (<cell at 0x2605f30: empty>, <cell at 0x2940718: list object at
> 0x259f518>, <cell at 0x2940670: str object at 0x2940768>, <cell at
> 0x2940750: str object at 0x29407d8>, <cell at 0x29407c0: int object at
> 0x25cd338>)
>
> These all seem to be "cell" objects. Why aren't they (stackless._wrap.cell)
> recognised as "cells"?
>
> I can provide a pickletools.dis() dump of the pickle stream if wanted.
>
> Using Stackless Python 2.6.2 on 64 bit linux (x86_64).
>
> Can anybody help me decode my objects? or even find a way to encode them so
> the are decodable? Is this a bug, or am I doing it wrong?

It definitely looks like a bug.  If you can provide the smallest
possible reproduction case, it would help us look into it and we could
add it to the test suite as a regression test.

If you want your objects back in the meantime, you might try compiling
2.6 with the relevant code raising these errors commented out.

Richard.




More information about the Stackless mailing list