Eugene Toder <[email protected]> added the comment:
I found a problem in constant de-duplication, already performed by compiler,
that needs to be fixed before this change can be merged.
Compiler tries to eliminate duplicate constants by putting them into a dict.
However, "duplicate" in this case doesn't mean just "equal", we need a stronger
relationship, as there are many equal values that behave differently in some
contexts, e.g. 0 and 0.0 and False or 0.0 and -0.0. To this end for each value
we create a tuple of the value and it's type and have some logic for -0.0. This
is handled in compiler_add_o in Python/compile.c.
This logic, however, only works for scalar values -- if we get a container with
0 and the same container with False we collapse them into one. This was not a
problem before, because constant tuples were only created by peephole, which
doesn't attempt de-duplication. If tuple folding is moved to AST we start
hitting this problem:
>>> dis(lambda: print((0,1),(False,True)))
1 0 LOAD_GLOBAL 0 (print)
3 LOAD_CONST 1 ((0, 1))
6 LOAD_CONST 1 ((0, 1))
9 CALL_FUNCTION 2
12 RETURN_VALUE
The cleanest solution seems to be to introduce a new rich comparison code:
Py_EQUIV (equivalent) and implement it at least in types that we support in
marshal. This will simplify compiler_add_o quite a bit and make it work for
tuples and frozensets.
I'm open to other suggestions.
----------
_______________________________________
Python tracker <[email protected]>
<http://bugs.python.org/issue11549>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com