Skip to content

bpo-43950: Initial base implementation for PEP 657 #26955

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

Merged
merged 1 commit into from
Jul 2, 2021

Conversation

pablogsal
Copy link
Member

@pablogsal pablogsal commented Jun 29, 2021

⚠️ This is not the full feature and contains no optimizations for the time being, just the base implementation to avoid merge conflicts in the future ⚠️

All the internal structures, and data representation are subjected to change in future PRs as we add optimizations

This PR is part of PEP 657 and augments the compiler to emit ending
line numbers as well as starting and ending columns from the AST
into compiled code objects. This allows bytecodes to be correlated
to the exact source code ranges that generated them.

This information is made available through the following public APIs:

  • The co_positions method on code objects.
  • The C API function PyCode_Addr2Location.

Co-authored-by: Pablo Galindo [email protected]
Co-authored-by: Batuhan Taskaya [email protected]
Co-authored-by: Ammar Asker [email protected]

https://bugs.python.org/issue43950

@isidentical
Copy link
Member

A couple doctest failures FYI: https://travis-ci.com/github/python/cpython/jobs/520228793

@ammaraskar ammaraskar force-pushed the bpo-43950 branch 2 times, most recently from b53b276 to 0673116 Compare June 30, 2021 04:49
@pablogsal pablogsal added the 🔨 test-with-buildbots Test PR w/ buildbots; report in status section label Jun 30, 2021
@bedevere-bot
Copy link

🤖 New build scheduled with the buildbot fleet by @pablogsal for commit 0673116a6fa30547c1138fd3f96059412d99a979 🤖

If you want to schedule another build, you need to add the ":hammer: test-with-buildbots" label again.

@bedevere-bot bedevere-bot removed the 🔨 test-with-buildbots Test PR w/ buildbots; report in status section label Jun 30, 2021
@markshannon
Copy link
Member

Instead of adding three additional location fields to each instruction, and continually update the equivalent fields in the scope struct, why not change i_lineno to i_ast_node to hold the AST node with the matching location?

Doesn't PEP 657 require that the locations match those of the AST exactly?

@pablogsal
Copy link
Member Author

pablogsal commented Jun 30, 2021

Instead of adding three additional location fields to each instruction, and continually update the equivalent fields in the scope struct, why not change i_lineno to i_ast_node to hold the AST node with the matching location?

That would be basically the same because you are modifiying these fields in the compilation and assembler steps. For example:

...
b->b_instr[i].i_lineno = prev_lineno;
...

that means that if we use a i_ast_node pointer all instructions will share the same ast node, so changes to the lineno of one instruction will affect others, which is a big problem. So either we start adding a bunch of macros to get and set to handle the default case a NULL pointer for i_ast_node or we would end copiying the ast node location structure, which is almost exactly what we are doing currently.

Doesn't PEP 657 require that the locations match those of the AST exactly?

No, the PEP just states what is the source of the information, but it doesn't explain how is propagated. So we have some freedom to select from which nodes do we pick the information or to "fix it" if we ever need to.

@pablogsal
Copy link
Member Author

@isidentical By the way, it seems that there are more places where we are setting lineno = -1 that we didn't update to also account for the new fields

@pablogsal pablogsal force-pushed the bpo-43950 branch 2 times, most recently from 9ca2578 to 2498168 Compare July 1, 2021 00:12
@ammaraskar
Copy link
Member

@terryjreedy Adding you as a reviewer as requested. You might not be too interested in this part, it's just exposing the lower level offset data but the tests might give you sort of an idea on how they can be used from Python. The follow up PRs will add the traceback.py changes that you might be more interested in.

@ammaraskar ammaraskar requested a review from terryjreedy July 1, 2021 17:09
@isidentical isidentical added the 🔨 test-with-buildbots Test PR w/ buildbots; report in status section label Jul 1, 2021
@bedevere-bot
Copy link

🤖 New build scheduled with the buildbot fleet by @isidentical for commit ba64180d3f61ee75b2b624ae2055ec22a2fb27fc 🤖

If you want to schedule another build, you need to add the ":hammer: test-with-buildbots" label again.

@bedevere-bot bedevere-bot removed the 🔨 test-with-buildbots Test PR w/ buildbots; report in status section label Jul 1, 2021
Copy link
Member

@terryjreedy terryjreedy left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If I understand, the only officially visible change is the addition of code.co_positions, which returns an iterable of (start_line, end_line, start_column, end_column) tuples, where column numbers are 1-based. Suggested title after bpo tag: "Add code.co_positions (PEP 657)" or "Add PEP-657 code.co_positions".

I presume a doc change will come. I will review it for readability if pinged.

I read the tests and have two suggestions.

This PR is part of PEP 657 and augments the compiler to emit ending
line numbers as well as starting and ending columns from the AST
into compiled code objects. This allows bytecodes to be correlated
to the exact source code ranges that generated them.

This information is made available through the following public APIs:

* The `co_positions` method on code objects.
* The C API function `PyCode_Addr2Location`.

Co-authored-by: Batuhan Taskaya <[email protected]>
Co-authored-by: Pablo Galindo <[email protected]>
@ammaraskar
Copy link
Member

ammaraskar commented Jul 2, 2021

Amended the commit message as per Terry's recommendation and rebased #26958 on top of the latest changes, tests for the traceback changes are still passing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

9 participants