Skip to content

_PyFunction_FromConstructor doesn't support closures #92173

Closed

Description

@larryhastings

Bug report

_PyFunction_FromConstructor creates a PyFunctionObject, populating its fields by pulling them from a PyFrameConstructor object. But it ignores the fc_closure field, which means it always creates a function that has no closure. Creating functions with closures is a totally legitimate use case and this is just a bug.

Your environment

  • CPython versions tested on: main
  • Operating system and architecture: linux

Activity

  1. self-assigned this
    on May 2, 2022
  2. larryhastings commented on May 2, 2022

    @larryhastings
    ContributorAuthor

    PyEval_EvalCodeEx populates the fc_closure field with the closure argument passed in. CPython doesn't itself use PyEval_EvalCodeEx, it's a "legacy API". But it's an externally visible and supported API call.

  3. larryhastings commented on May 2, 2022

    @larryhastings
    ContributorAuthor

    Unfortunately, there's no straightforward way to test this change right now. I'm in the process of adding a use of PyEval_EvalCodeEx (adding support for a closure argument to exec) but that PR depends on fixing this bug first. So I'll make you a deal: my PR won't test this fix, but I'll test it in advance in my other PR, and that PR will add a test for this code path. Deal?

  4. MatthieuDartiailh commented on Jan 16, 2023

    @MatthieuDartiailh
    Contributor

    This looks like it has been addressed in #92175, should the issue be closed ?

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

Metadata

Metadata

Assignees

Labels

type-bugAn unexpected behavior, bug, or error

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions