Skip to content
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

Derby #13: Convert 50 sites to Argument Clinic across 5 files #64381

Closed
larryhastings opened this issue Jan 8, 2014 · 47 comments
Closed

Derby #13: Convert 50 sites to Argument Clinic across 5 files #64381

larryhastings opened this issue Jan 8, 2014 · 47 comments
Labels
extension-modules C modules in the Modules dir topic-argument-clinic type-feature A feature request or enhancement

Comments

@larryhastings
Copy link
Contributor

BPO 20182
Nosy @loewis, @birkenfeld, @vstinner, @taleinat, @larryhastings, @serhiy-storchaka
PRs
  • bpo-31938: Convert selectmodule.c to Argument Clinic #4265
  • bpo-20182: AC convert remaining functions/methods in _hashopenssl.c #9213
  • bpo-20182: AC convert Python/sysmodule.c #11328
  • bpo-20182: AC convert Python/sysmodule.c #11328
  • bpo-20182: remove doc-string declaration no longer used after AC conversion #11444
  • Files
  • modules_issue20182.patch
  • modules_issue20182_v2.patch
  • modules_issue20182_v3.patch: updated version of Georg's patch, now applies cleanly to default branch with tests passing
  • issue20182.signalmodule.patch: updated patch for signalmodule after Serhiy's review
  • issue20182.selectmodule.patch: updated patch for selectmodule after Serhiy's review
  • issue20182.selectmodule.v2.patch: updated patch; set epoll method function names back to what they were
  • issue20182.sysmodule.patch: updated patch for sysmodule after Serhiy's review
  • issue20182._hashopenssl.patch: AC conversion of Modules/_hashopenssl.c
  • 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:

    assignee = None
    closed_at = <Date 2019-01-01.08:59:22.836>
    created_at = <Date 2014-01-08.00:17:37.422>
    labels = ['extension-modules', 'type-feature', 'expert-argument-clinic']
    title = 'Derby #13: Convert 50 sites to Argument Clinic across 5 files'
    updated_at = <Date 2019-01-06.07:04:54.833>
    user = 'https://github.com/larryhastings'

    bugs.python.org fields:

    activity = <Date 2019-01-06.07:04:54.833>
    actor = 'taleinat'
    assignee = 'none'
    closed = True
    closed_date = <Date 2019-01-01.08:59:22.836>
    closer = 'taleinat'
    components = ['Extension Modules', 'Argument Clinic']
    creation = <Date 2014-01-08.00:17:37.422>
    creator = 'larry'
    dependencies = []
    files = ['33441', '33491', '39188', '39194', '39201', '39203', '39387', '39389']
    hgrepos = []
    issue_num = 20182
    keywords = ['patch']
    message_count = 47.0
    messages = ['207639', '207941', '207945', '207951', '208010', '208258', '224138', '224763', '241864', '241868', '241872', '241900', '241916', '241917', '241919', '241922', '241936', '241989', '242003', '242476', '242488', '242489', '242492', '243302', '243305', '243308', '243309', '243310', '243312', '304907', '304932', '305168', '305410', '305429', '305483', '305484', '305519', '325127', '332587', '332589', '332594', '332749', '332820', '332822', '332823', '333062', '333091']
    nosy_count = 8.0
    nosy_names = ['loewis', 'georg.brandl', 'vstinner', 'taleinat', 'larry', 'nadeem.vawda', 'python-dev', 'serhiy.storchaka']
    pr_nums = ['4265', '9213', '11328', '11328', '11444']
    priority = 'normal'
    resolution = 'fixed'
    stage = 'resolved'
    status = 'closed'
    superseder = None
    type = 'enhancement'
    url = 'https://bugs.python.org/issue20182'
    versions = ['Python 3.5']

    @larryhastings
    Copy link
    Contributor Author

    This issue is part of the Great Argument Clinic Conversion Derby,
    where we're trying to convert as much of Python 3.4 to use
    Argument Clinic as we can before Release Candidate 1 on January 19.

    This issue asks you to change the following bundle of files:
    Modules/signalmodule.c: 12 sites
    Modules/selectmodule.c: 12 sites
    Modules/zlibmodule.c: 11 sites
    Python/sysmodule.c: 10 sites
    Modules/_hashopenssl.c: 5 sites

    Talk to me (larry) if you only want to attack part of a bundle.

    For instructions on how to convert a function to work with Argument
    Clinic, read the "howto":
    http://docs.python.org/dev/howto/clinic.html

    @larryhastings larryhastings added extension-modules C modules in the Modules dir type-feature A feature request or enhancement labels Jan 8, 2014
    @birkenfeld
    Copy link
    Member

    Here's the signalmodule.

    @birkenfeld
    Copy link
    Member

    Now without crap.

    @birkenfeld
    Copy link
    Member

    Here's sys.

    For it to generate the correct code you need to add "args" to c_keywords in clinic.py.

    @birkenfeld
    Copy link
    Member

    New patch.

    In selectmodule.c I haven't touched devpoll and kqueue, which I can't compile here.

    _hashopenssl does weird things with macros, I'm waiting with that.

    @birkenfeld
    Copy link
    Member

    New patch addressing comments.

    @loewis
    Copy link
    Mannequin

    loewis mannequin commented Jul 27, 2014

    The patch does not apply anymore. Can you please update it, and rerun AC on it?

    @larryhastings
    Copy link
    Contributor Author

    All the Derby patches should only go into trunk at this point.

    @taleinat
    Copy link
    Contributor

    Note: Despite not appearing in any of these patches, the zlib module seems to have already been converted.

    @taleinat
    Copy link
    Contributor

    I'm working on a new version of Georg's patch which applies to the current default branch.

    I'm having trouble with AC output going into a separate file, since this requires a lot of things to be declared before the #include of the .c.h file. Should I move all of those definitions to the top of the file, even if they are currently spread all over it? Should I just add forward declarations? And if the latter, how do I forward-declare a struct typedef?

    @serhiy-storchaka
    Copy link
    Member

    You only need include generated file before defining PyMethodDef arrays and PyTypeObject instances. There shouldn't be problems if only one class is defined in a file, otherwise you can move these static initializations together to the end of the file.

    @taleinat
    Copy link
    Contributor

    Here's a new version of Georg's patch which applies to the current default branch. On my OSX 10.8, CPython compiles fine and all tests pass, though test_devpoll and test_epoll were skipped.

    I haven't made additional changes, so there is still AC-related work to be done here. For example, there are legacy converters used throughout the code, which should be replaced.

    Changes I had to make to get this working:

    Updated the class declarations in selectmodule.c with the additional parameters.

    The doc-string for signal.sigwaitinfo was changed since Georg made his patch, and its first line was now too long. I shortened the first line from:

    Wait synchronously for a signal until one of the signals in *sigset* is delivered.

    to:

    Wait synchronously until one of the signals in *sigset* is delivered.

    Converted the new sys.is_finalizing function.

    Reverted the signal.set_wakeup_fd function, since it has since been changed, and now depending on #ifdef MS_WINDOWS it interprets the argument as either 'O' or 'i'. I'm not sure what to do with this one, so I reverted it back to not use AC for now.

    I haven't converted the new signal.default_int_handler function, since it seems to accept any number of arguments, and ignores them. Is there a way to do this with AC?

    Moved the definitions of object structs and PyTypeObject types to the top of selectmodule.c, so that they are defined when Modules/clinic/selectmodule.c.h is imported.

    @serhiy-storchaka
    Copy link
    Member

    It would be more helpful to split the patch on three independent patches for three modules.

    @serhiy-storchaka
    Copy link
    Member

    And it would be more helpful to use self-descriptive converter names instead of cryptic format units.

    @taleinat
    Copy link
    Contributor

    Serhiy, I agree on both points. I can easily replace all of the converters and upload it as three separate patches. If you haven't started reviewing the patch yet, let me know and I'll do these things ASAP.

    @serhiy-storchaka
    Copy link
    Member

    I already have reviewed changes to select and signal.

    @taleinat
    Copy link
    Contributor

    Here's a patch just for Modules/signalmodule.c (and related files), based on Georg's patch, updated to apply against current default, including fixes thanks to Serhiy's review.

    This include one minor doc change, since I changed the name of the second parameter to signal.pthread_kill from "signum" to "signalnum" to be consistent with the rest of the signal module. This will not break existing code since this parameter is positional-only.

    @taleinat
    Copy link
    Contributor

    Here's a patch just for Modules/selectmodule.c (and related files), based on Georg's patch, updated to apply against current default, including fixes thanks to Serhiy's review.

    It took a while since I had to get a Linux VM up to run the epoll tests. And it was good that I did, since Georg's patch had several errors in that area.

    It is important to note that epoll.poll now raises a different exception when called with invalid arguments after it has been closed. It used to raise ValueError since it first checked whether it was closed before checking the parameters. With this patch, the parameters are checked first so a TypeError is raised. This behavior wasn't documented and wasn't tested, so it seems relatively safe to change. At Serhiy's suggestion, I added a test for the new behavior. Perhaps this should be mentioned in the release notes and/or "what's new"?

    @taleinat
    Copy link
    Contributor

    Here's a slightly modified version of the most recent patch for Modules/selectmodule.c. The only difference relative to the previous version is that I've set the epoll method function names back to what they used to be. My reasoning is to stay consistent with the other epoll method function names in the file and to keep the code familiar for the maintainers.

    @serhiy-storchaka
    Copy link
    Member

    Added new comments. bpo-20182.signalmodule.patch LGTM.

    @taleinat
    Copy link
    Contributor

    taleinat commented May 3, 2015

    Do you mean the v2.patch file, or the one before it?

    @serhiy-storchaka
    Copy link
    Member

    I don't see the v2 patch for the signal module.

    @taleinat
    Copy link
    Contributor

    taleinat commented May 3, 2015

    Sorry, my mistake, got mixed up with selectmodule.

    @taleinat
    Copy link
    Contributor

    Here's a patch just for Modules/sysmodule.c (and related files), based on Georg's patch, updated to apply against current default, including fixes thanks to Serhiy's review.

    Despite Serhiy's suggestions, I've not used parameter groups, due to Larry's statement of his dislike of this (ab)use of the feature.

    I've left an alias of the form "args as args_value:" since the latest clinic.py doesn't automatically alias "args" (causing a compile error).

    At Serhiy's suggestion, I've also converted sys.callstats. I couldn't find any tests for it, so someone should definitely review this conversion!

    All tests pass on my OSX 10.10.

    @serhiy-storchaka
    Copy link
    Member

    The signature of sys.getsizeof() is not correct. sys.getsizeof(obj) is not the same as sys.getsizeof(obj, None). If not use optional group, then this function should not be converted to Argument Clinic. See also dict.get() with similar signature.

    Opened new issue (bpo-24207) for the bug with the args parameter.

    You can commit the patch for the signal module Tal.

    @taleinat
    Copy link
    Contributor

    Attached in a conversion patch for Modules/_hashopenssl.c.

    Since it appear that zlib has already been converted, that's the last file to convert in this batch!

    All tests pass on my OSX 10.10 (after running "touch Modules/hashlib.h" to get make to recompile things that use _hashopenssl).

    Notes:

    In HASH.__init__, the "name" parameter must be a string. However, the current code accepts any object and checks something else before checking whether the given object is a string. Therefore, changing the type from "object" to "str" would slightly change the parameter checking behavior. For now I've left it as it was. Also, since HASH.__new__ mirrors this, I've left it as-is as well.

    I slightly changed the first line of the HASH object's doc-string, to make it fit in one line. It was: "A hash represents the object used to calculate a checksum of a string of information." I've changed the beginning to "A hash is an object used to calculate ..."

    pbkdb_hmac accepts an optional "dklen" parameter which may be either a long or None. I left this as an "object", since long(accept={int, NoneType}) gives "long_converter: default value None for field dklen_obj is not of type int".

    @python-dev
    Copy link
    Mannequin

    python-dev mannequin commented May 16, 2015

    New changeset 5342fad7cd59 by Tal Einat in branch 'default':
    Issue bpo-20182: converted the signal module to use Argument Clinic
    https://hg.python.org/cpython/rev/5342fad7cd59

    @taleinat
    Copy link
    Contributor

    Serhiy: Indeed, you're right about sys.getsizeof(). I'm tending towards changign it to use an optional group and per Serhiy's suggestion. Larry?

    @python-dev
    Copy link
    Mannequin

    python-dev mannequin commented May 16, 2015

    New changeset 738ac3ad9ee4 by Serhiy Storchaka in branch 'default':
    Fixed compilation error in signalmodule.c (issue bpo-20182).
    https://hg.python.org/cpython/rev/738ac3ad9ee4

    @serhiy-storchaka
    Copy link
    Member

    Tal, do you mind to update your patches and create pull requests?

    @taleinat
    Copy link
    Contributor

    I'd be happy to update the patches.

    I asked for a bit of clarification on what this entails in msg304931 on issue bpo-20180, once that's clear I'll do the same for these patches and create PRs.

    @taleinat
    Copy link
    Contributor

    Regarding the select module, the existing patch moves typedefs and object type declarations to the top of the file with the #include clinic/selectmodule.c.h statement can come afterwards. Should I keep it this way, or instead move the method list and type definitions to the bottom of the file, as Serhiy said was preferable with itertoolsmodule.c?

    @taleinat
    Copy link
    Contributor

    taleinat commented Nov 2, 2017

    I have a complete, up-to-date AC conversion of Modules/selectmodule.c ready on a branch in my GitHub CPython fork:

    https://github.com/taleinat/cpython/tree/bpo-20182_AC_selectmodule

    I haven't created a PR because there's currently an issue with the generated selectmodule.c.h missing a few "safety" #defines, causing compilation errors e.g. on Windows where poll is unavailable. Any help resolving this issue would be welcome!

    @taleinat
    Copy link
    Contributor

    taleinat commented Nov 2, 2017

    See issue bpo-31926 and PR 4230 regarding the aforementioned argument clinic bug and a fix for it.

    @vstinner
    Copy link
    Member

    vstinner commented Nov 3, 2017

    I really hate the title of these issues "Derby #13: Convert 50 sites to Argument Clinic across 5 files". I would prefer to have one issue per file. Would it possible to close this one and open a new issue once someone has a PR for one file?

    @taleinat
    Copy link
    Contributor

    taleinat commented Nov 3, 2017

    As the author of all of the updated patches, I wouldn't mind opening new issues separately for each of the remaining modules. Actually I would prefer it :)

    @taleinat
    Copy link
    Contributor

    taleinat commented Nov 3, 2017

    See issue bpo-31938 regarding Modules/selectmodule.c.

    @taleinat
    Copy link
    Contributor

    See new updated PR9213 for completing the _hashopenssl.c conversion.

    @taleinat
    Copy link
    Contributor

    New changeset c6c7237 by Tal Einat in branch 'master':
    bpo-20182: AC convert remaining functions/methods in _hashopenssl.c (GH-9213)
    c6c7237

    @taleinat
    Copy link
    Contributor

    The conversion of Modules/_hashopenssl.c leaves just Python/sysmodule.c to be converted from this batch.

    There's an old patch here from 3.5 years ago that will likely need to be heavily updated.

    @taleinat
    Copy link
    Contributor

    See new PR #55537 with updated AC conversion of Python/sysmodule.c.

    @serhiy-storchaka
    Copy link
    Member

    PR 9213 added a compiler warning:

    In file included from /home/serhiy/py/cpython/Modules/_hashopenssl.c:69:0:
    /home/serhiy/py/cpython/Modules/clinic/_hashopenssl.c.h:90:1: warning: ‘EVP_tp_init’ defined but not used [-Wunused-function]
    EVP_tp_init(PyObject *self, PyObject *args, PyObject *kwargs)
    ^~~~~~~~~~~

    help(_hashlib.HASH) shows now the signature of the constructor of the object. But a hash object can not be created using it.

    class HASH(builtins.object)
     |  HASH(name, string=b'')
     |  
     |  A hash is an object used to calculate a checksum of a string of information.
    ...

    @taleinat
    Copy link
    Contributor

    New changeset ede0b6f by Tal Einat in branch 'master':
    bpo-20182: AC convert Python/sysmodule.c (GH-11328)
    ede0b6f

    @taleinat
    Copy link
    Contributor

    Note that the problematic part of the Modules/_hashopenssl.c AC conversion was reverted, as part of #55588.

    @taleinat
    Copy link
    Contributor

    AFAICT, this issue can finally be closed!

    @taleinat taleinat closed this as completed Jan 1, 2019
    @serhiy-storchaka
    Copy link
    Member

    Seems PR 11328 introduced a compiler warning:

    In file included from ./Include/Python.h:64:0,
                     from ./Python/sysmodule.c:17:
    ./Python/sysmodule.c:1597:14: warning: ‘sys_clear_type_cache__doc__’ defined but not used [-Wunused-variable]
     PyDoc_STRVAR(sys_clear_type_cache__doc__,
                  ^
    ./Include/pymacro.h:70:37: note: in definition of macroPyDoc_VAR#define PyDoc_VAR(name) static char name[]
                                         ^~~~
    ./Python/sysmodule.c:1597:1: note: in expansion of macroPyDoc_STRVARPyDoc_STRVAR(sys_clear_type_cache__doc__,
     ^~~~~~~~~~~~

    @taleinat
    Copy link
    Contributor

    taleinat commented Jan 6, 2019

    Thanks Serhiy! The compiler doesn't warn about that on Windows.

    See PR #55653 with a fix.

    @ezio-melotti ezio-melotti transferred this issue from another repository Apr 10, 2022
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Labels
    extension-modules C modules in the Modules dir topic-argument-clinic type-feature A feature request or enhancement
    Projects
    None yet
    Development

    No branches or pull requests

    5 participants