Skip to content

Creation of an internal decimal context for _pylong has side effects on decimal #123284

Closed as not planned

Description

@picnixz

Bug report

Bug description:

The _decimal module was recently fixed in #123243. I also found that _pylong leaks globals due to the creation of a global context to use as a local context:

_unbounded_dec_context = decimal.getcontext().copy()
_unbounded_dec_context.prec = decimal.MAX_PREC
_unbounded_dec_context.Emax = decimal.MAX_EMAX
_unbounded_dec_context.Emin = decimal.MIN_EMIN
_unbounded_dec_context.traps[decimal.Inexact] = 1 # sanity check

This context is used as with decimal.localcontext(_unbounded_dec_context). On the other hand decimal.getcontext().copy() returns a copy of the decimal context for the current thread (or set it to decimal.DefaultContext if none exists). Instead of setting it like that, I suggest that we construct a decimal.Context() object directly in _pylong instead of possibly polluting the decimal module (whether it's the C or the python implementation).

CPython versions tested on:

CPython main branch

Operating systems tested on:

Linux

Linked PRs

Activity

  1. added
    type-bugAn unexpected behavior, bug, or error
    stdlibStandard Library Python modules in the Lib/ directory
    on Aug 24, 2024
  2. self-assigned this
    on Aug 24, 2024
  3. changed the title [-]Creation of an internal decimal context for `_pylong` has side effects on `decimal` (and refleaks)[/-] [+]Creation of an internal decimal context for `_pylong` has side effects on `decimal`[/+] on Aug 24, 2024
  4. vstinner commented on Sep 5, 2024

    @vstinner
    Member

    _pylong leaks globals due to the creation of a global context to use as a local context

    How do you see such leak?

  5. picnixz commented on Sep 5, 2024

    @picnixz
    MemberAuthor

    I just used ./python -X showrefcounts -c 'import _pylong'. I don't really know if it's the _pylong module itself that leaks or if it's the decimal module that leaks because decimal.getcontext() was called.

    What I however know is that there is a side-effect on decimal because _pylong calls decimal.getcontext() and thus sets the decimal default's context. I'm not really sure whether it's an issue or not, but I was just looking at all ./python -X showrefcounts -c 'import MODULE' for every module in Lib to see whether a module leaked or not. Feel free to close if you think this is a non-issue though.

  6. vstinner commented on Sep 5, 2024

    @vstinner
    Member

    The problem is unrelated to _pylong, but related to decimal:

    $ ./python -X showrefcount -c 'import decimal; decimal.getcontext()'
    [207 refs, 138 blocks]
    
  7. picnixz commented on Sep 5, 2024

    @picnixz
    MemberAuthor

    Ok, one interrogation confirmed. I'll try to see what I can do tomorrow (not sure if I'll be able to though).

  8. picnixz commented on Sep 6, 2024

    @picnixz
    MemberAuthor

    So the reference leaks will be fixed by another PR. I won't bother about setting the decimal's default thread context

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

Metadata

Metadata

Assignees

Labels

stdlibStandard Library Python modules in the Lib/ directorytype-bugAn unexpected behavior, bug, or error

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions