New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Parenthesized expression has incorrect line numbers #78553
Comments
If this is a duplicate, please excuse me. In particular, the most noticeable inaccuracy happens when the postfix if-else expression is involved. Maybe there are more of them. >>> import dis
>>> code = """(
... [
... call1(),
... call2()
... ]
... + call3()
... * call4()
... )"""
>>> dis.dis(code)
3 0 LOAD_NAME 0 (call1)
3 CALL_FUNCTION 0 (0 positional, 0 keyword pair) 4 6 LOAD_NAME 1 (call2) 6 15 LOAD_NAME 2 (call3) 7 21 LOAD_NAME 3 (call4)
24 CALL_FUNCTION 0 (0 positional, 0 keyword pair)
27 BINARY_MULTIPLY
28 BINARY_ADD
29 RETURN_VALUE
>>> dis.dis(code.replace("+", "if").replace("*", "else"))
6 0 LOAD_NAME 0 (call3)
3 CALL_FUNCTION 0 (0 positional, 0 keyword pair)
6 POP_JUMP_IF_FALSE 25
9 LOAD_NAME 1 (call1)
12 CALL_FUNCTION 0 (0 positional, 0 keyword pair)
15 LOAD_NAME 2 (call2)
18 CALL_FUNCTION 0 (0 positional, 0 keyword pair)
21 BUILD_LIST 2
24 RETURN_VALUE 7 >> 25 LOAD_NAME 3 (call4) I used this code to show the difference between if-else and some arithmetics. AFAICT the feature is possible to implement, as lnotab can contain negative line differences. I don't know whether it is just a bug or a fully intended feature, but it would be quite an enhancement to have better line number tracking, useful for debugging. If this is implemented, it may be worth further backporting. Possible reasons in the upstream Python/compile.c (using < instead of !=): Line 4092 in 077059e
Line 4438 in 077059e
|
Note that even just adding an extra arithmetic in your first expression breaks the line numbers: >>> code = """(
... [
... call1(),
... call2()
... ]
... + call3()
... * call4()
... + call5()
... )"""
>>> dis.dis(code)
8 0 LOAD_NAME 0 (call1)
2 CALL_FUNCTION 0
4 LOAD_NAME 1 (call2)
6 CALL_FUNCTION 0
8 BUILD_LIST 2
10 LOAD_NAME 2 (call3)
12 CALL_FUNCTION 0
14 LOAD_NAME 3 (call4)
16 CALL_FUNCTION 0
18 BINARY_MULTIPLY
20 BINARY_ADD
22 LOAD_NAME 4 (call5)
24 CALL_FUNCTION 0
26 BINARY_ADD
28 RETURN_VALUE The closest existing bug to this would be bpo-12458, specifically with Serhiy's last comment. |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: