Message138413
| Author |
eltoder |
| Recipients |
Trundle, alex, benjamin.peterson, brett.cannon, daniel.urban, dmalcolm, eltoder, georg.brandl, mark.dickinson, nadeem.vawda, ncoghlan, pitrou, rhettinger, santoso.wijaya, techtonik, terry.reedy |
| Date |
2011年06月16日.03:26:02 |
| SpamBayes Score |
2.0594637e-14 |
| Marked as misclassified |
No |
| Message-id |
<1308194764.13.0.874160684299.issue11549@psf.upfronthosting.co.za> |
| In-reply-to |
| Content |
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. |
|
History
|
|---|
| Date |
User |
Action |
Args |
| 2011年06月16日 03:26:04 | eltoder | set | recipients:
+ eltoder, brett.cannon, georg.brandl, rhettinger, terry.reedy, mark.dickinson, ncoghlan, pitrou, techtonik, nadeem.vawda, benjamin.peterson, alex, Trundle, dmalcolm, daniel.urban, santoso.wijaya |
| 2011年06月16日 03:26:04 | eltoder | set | messageid: <1308194764.13.0.874160684299.issue11549@psf.upfronthosting.co.za> |
| 2011年06月16日 03:26:03 | eltoder | link | issue11549 messages |
| 2011年06月16日 03:26:03 | eltoder | create |
|