Skip to content

Add PyFrame_SetLineNumber() for Cython #118720

Description

@methane

Feature or enhancement

Proposal:

CPython hides PyFrameObject internals so Cython include pycore_frame.h to set f_lineno.
Let's provide PyFrame_SetLineNumber() for Cython.

Has this already been discussed elsewhere?

This is a minor feature, which does not need previous discussion elsewhere

Links to previous discussion of this feature:

#117551 (comment)

Linked PRs

Activity

  1. Ben4C commented on Aug 14, 2024

    @Ben4C

    Hello, I've been working on this for a little while, but I'm a bit lost on implementing the changes.

    From what I understand think I'm supposed to create a public API to set the f_fileno variable so I used PyAPI_FUNC(int) PyFrame_SetLineNumber(PyFrameObject *f, int lineno) in Include/cpython/frameobject.h which uses frame_setlineno from frameobject.c to change the f_lineno. I've been trying to get a test to pass to verify that this works in
    Lib/test/test_frame.py but I'm not sure if my approach or logic is correct.

    This is what I have so far: Ben4C@1e82093

  2. added 3 commits that reference this issue on Mar 14, 2025
  3. vstinner commented on Mar 14, 2025

    @vstinner
    Member

    This function was also discussed at #130931.

  4. vstinner commented on Mar 14, 2025

    @vstinner
    Member

    I wrote PR gh-131246 to add PyFrame_SetLineNumber().

  5. markshannon commented on Mar 17, 2025

    @markshannon
    Member

    I think is going to be very confusing if PyFrame_SetLineNumber has different behavior from setting the line number in Python frame.f_lineno = ....

    The f_lineno field in the the frame object is a cache for the computed line number.
    It may overwritten by the interpreter, so setting it will not work reliably.

  6. vstinner commented on Mar 17, 2025

    @vstinner
    Member

    I wrote this function to replace the Cython macro:

    #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno)

    I suppose that Cython sets f_lineno to produce a traceback with specific line number.

    cc @scoder @da-woods

  7. da-woods commented on Mar 17, 2025

    @da-woods
    Contributor

    I suppose that Cython sets f_lineno to produce a traceback with specific line number.

    Yes - it's used directly after creating a frame for that purpose.

    (It's also used in the old, pre-sys-monitoring code. I would not worry about replacing that usage because I think that's only on older Python versions)

  8. markshannon commented on Mar 18, 2025

    @markshannon
    Member

    So what are the proposed semantics of PyFrame_SetLineNumber(), how do we test it?

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions