[issue34093] Reproducible pyc: FLAG_REF is not stable.
Eric Snow
report at bugs.python.org
Mon Sep 20 11:21:12 EDT 2021
Eric Snow <ericsnowcurrently at gmail.com> added the comment:
FWIW, I found a faster solution than calling `w_object()` twice.
Currently the logic for w_ref() (used for each "complex" object) looks like this:
* if ob_ref == 1
* do not apply FLAG_REF
* marshal normally
* else if seen for the first time
* apply FLAG_REF
* marshal normally
* otherwise
* emit TYPE_REF
* emit the ref index of the first instance
The faster solution looks like this:
* if seen for the first time
* do not apply FLAG_REF
* marshal normally
* record the index of the type byte in the output stream
* else if seen for a second time
* apply FLAG_REF to the byte at the earlier-recorded position
* emit TYPE_REF
* emit the ref index of the first instance
* otherwise
* emit TYPE_REF
* emit the ref index of the first instance
While this is faster, there are two downsides: extra memory usage and it isn't practical when writing to a file. However, I don't think either is a significant problem. For the former, it can be mostly mitigated by using the negative values in WFILE.hashtable to store the type byte position. For the latter, "marshal.dump()" is already a light wrapper around "marshal.dump()" and for PyMarshal_WriteObjectToFile() we simply stick with the current unstable approach (or change it to do what "marshal.dump()" does).
FYI, I mostly have that implemented in a branch, but am not sure when I'll get back to it.
----------
_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue34093>
_______________________________________
More information about the Python-bugs-list
mailing list