Skip to content

Derby #9: Convert 52 sites to Argument Clinic across 11 files #64377

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

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

Derby #9: Convert 52 sites to Argument Clinic across 11 files #64377

larryhastings opened this issue Jan 8, 2014 · 14 comments
Assignees
Labels
3.8 (EOL) end of life extension-modules C modules in the Modules dir topic-argument-clinic type-feature A feature request or enhancement

Comments

@larryhastings
Copy link
Contributor

BPO 20178
Nosy @larryhastings, @meadori, @berkerpeksag, @serhiy-storchaka, @erlend-aasland
Files
  • issue20178-cyptes-01.patch
  • issue20178-sqlite-01.patch
  • issue20178-cyptes-02.patch
  • 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 = 'https://github.com/meadori'
    closed_at = None
    created_at = <Date 2014-01-08.00:14:38.886>
    labels = ['extension-modules', 'type-feature', '3.8', 'expert-argument-clinic']
    title = 'Derby #9: Convert 52 sites to Argument Clinic across 11 files'
    updated_at = <Date 2021-06-22.22:57:35.751>
    user = 'https://github.com/larryhastings'

    bugs.python.org fields:

    activity = <Date 2021-06-22.22:57:35.751>
    actor = 'erlendaasland'
    assignee = 'meador.inge'
    closed = False
    closed_date = None
    closer = None
    components = ['Extension Modules', 'Argument Clinic']
    creation = <Date 2014-01-08.00:14:38.886>
    creator = 'larry'
    dependencies = []
    files = ['33438', '33470', '39296']
    hgrepos = []
    issue_num = 20178
    keywords = ['patch']
    message_count = 14.0
    messages = ['207634', '207740', '208000', '208001', '208130', '208186', '208187', '208381', '208414', '224759', '242607', '242649', '324851', '396373']
    nosy_count = 5.0
    nosy_names = ['larry', 'meador.inge', 'berker.peksag', 'serhiy.storchaka', 'erlendaasland']
    pr_nums = []
    priority = 'normal'
    resolution = None
    stage = 'patch review'
    status = 'open'
    superseder = None
    type = 'enhancement'
    url = 'https://bugs.python.org/issue20178'
    versions = ['Python 3.8']

    @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/_ctypes/_ctypes.c: 8 sites
    Modules/_ctypes/_ctypes_test.c: 1 sites
    Modules/_ctypes/callproc.c: 14 sites
    Modules/_ctypes/stgdict.c: 0 sites
    Modules/_curses_panel.c: 3 sites
    Modules/_sqlite/cache.c: 1 sites
    Modules/_sqlite/connection.c: 12 sites
    Modules/_sqlite/cursor.c: 5 sites
    Modules/_sqlite/microprotocols.c: 1 sites
    Modules/_sqlite/module.c: 6 sites
    Modules/_sqlite/row.c: 1 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
    @meadori
    Copy link
    Member

    meadori commented Jan 9, 2014

    I will pick this one up.

    @meadori meadori self-assigned this Jan 9, 2014
    @meadori
    Copy link
    Member

    meadori commented Jan 13, 2014

    Larry, the attached patch converts what is convertible of
    Modules/_ctypes/_ctypes. Although, I ran into an odd case
    with this conversion: the converted functions are each used
    in *multiple* PyMethodDef tables. So while clinic can generate
    equivalent code, the builtins are not all pinned to one type.
    The type I pinned it to is the same type that the methods
    are documented against:
    http://docs.python.org/2/library/ctypes.html#ctypes.\_CData

    Since clinic makes you explicitly specify the fully qualified method
    name, I assume sharing like this is not allowed.

    Thoughts?

    @meadori
    Copy link
    Member

    meadori commented Jan 13, 2014

    None of the sites in Modules/_curses_panel.c look convertible.

    @meadori
    Copy link
    Member

    meadori commented Jan 15, 2014

    Attached is a first cut for sqlite3. It is generally OK, but I have the following
    nits:

    * As is probably expected, __init__ and __call__ procs can't be converted.
    
    * sqlite3.Connection.{execute, executemany, executescript} don't use
      PyArg_Parse*.
    
    * The clinic version of 'sqlite3.adapt' has an argument string of "O|OO".
      The first optional parameter defaults to 'pysqlite_PrepareProtocolType'
      in C and 'sqlite3.ProtocolType' in Python.  However, I don't know how to
      represent the Python value because Python default values are 'eval'd by
      clinic *and* the 'sqlite3' module is not imported for the eval.
    
    * The clinic version of 'sqlite3.Cursor.fetchmany' has an arguments string
      of "|i".  The first parameter defaults to
      '((pysqlite_Cursor *)self)->arraysize' in C and 'self.arraysize' in
      Python.  I don't know how to express the Python initialization.
    
    * 'sqlite3.complete' uses 'as module_complete' because 'sqlite3_complete'
      is a public SQLite API function: http://www.sqlite.org/c3ref/complete.html.
      I used 'as' on all the other functions in 'module.c' as well.  Mainly
      for local consistency.
    
    * '_pysqlite_query_execute' required a little refactoring due to the fact
      that it is a utility function used to implement 'sqlite3.Cursor.execute'
      and 'sqlite3.Cursor.executemany'.  'PyArg_ParseTuple' was being called in
      different way depending on a control parameter.
    
    * I didn't convert 'sqlite3.Cursor.setinputsizes' and
      'sqlite3.Cursor.setoutputsize' because they share a docstring and
      simple no-op method def.
    
    * I didn't convert 'sqlite.connect' because it would have required packaing
      the arguments back up to pass to 'PyObject_Call'.
    

    @larryhastings
    Copy link
    Contributor Author

    In the past few days I added "cloning" functions, which lets you reuse the parameters and return converter from an existing function. That might help with Modules/_ctypes/_ctypes.

    @larryhastings
    Copy link
    Contributor Author

    All the functions in curses_panel are convertable. The threeMETH_NOARGS functions simply get no arguments. And here's new_panel:

    new_panel
    window: object(subclass_of='&PyCursesWindow_Type')
    /

    @larryhastings
    Copy link
    Contributor Author

    Meador: I'm going to change Argument Clinic so you can get the "args" and "kwargs" values passed in to the impl. That's issue bpo-20291; I already added you to it "nosy" list. With that change in you'll be able to convert "sqlite3.connect".

    @larryhastings
    Copy link
    Contributor Author

    Larry Hastings added the comment:

    • As is probably expected, __init__ and __call__ procs
      can't be converted.

    I should have a fix in for __init__ and __call__ later today. (Issue bpo-20294.)
    For the record, you could convert them, you just had to wrap the parsing function
    to deal with the return type difference, and *args / **kwargs might be tricky too.

    * sqlite3.Connection.{execute, executemany, executescript} don't use
      PyArg_Parse*.
    

    In the next few days I'm going to add support for "*args" and "**kwargs", and
    then you'll be able to convert these functions. (Issue bpo-20291.) Again, even
    if Argument Clinic doesn't do any parsing, it's still helpful to have it
    generate signatures.

    * The clinic version of 'sqlite3.adapt' has an argument string of "O|OO".
      The first optional parameter defaults to 'pysqlite_PrepareProtocolType'
      in C and 'sqlite3.ProtocolType' in Python.  However, I don't know how to
      represent the Python value because Python default values are 'eval'd by
      clinic \*and* the 'sqlite3' module is not imported for the eval.
    

    You'll be able to do this soon:

    parameter: object(c_default='pysqlite_PrepareProtocolType') = ProtocolType

    This feature isn't checked in yet, I'm waiting for a review. It's part of
    bpo-20226, which I guess you already noticed.

    • The clinic version of 'sqlite3.Cursor.fetchmany' has an arguments string
      of "|i". The first parameter defaults to
      '((pysqlite_Cursor *)self)->arraysize' in C and 'self.arraysize' in
      Python. I don't know how to express the Python initialization.

    You can't. How about you use a default of -1 and then:

    if (maxrows == -1)
    maxrows = self->arraysize

    • I didn't convert 'sqlite3.Cursor.setinputsizes' and
      'sqlite3.Cursor.setoutputsize' because they share a docstring and
      simple no-op method def.

    I'd prefer it if you converted them anyway. Converting them means they'll
    have signature information which is an unconditional good.

    • I didn't convert 'sqlite.connect' because it would have required
      packaing the arguments back up to pass to 'PyObject_Call'.

    Once I add the ability to pass in *args and **kwargs, you'll be able to
    convert sqlite.connect.

    I think I responded to all your other comments when I reviewed the patch.

    Thanks!

    @larryhastings
    Copy link
    Contributor Author

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

    @serhiy-storchaka
    Copy link
    Member

    bpo-20178-cyptes-01.patch is outdated due to changes in Argument Clinic and ctypes. Here is updated and extended patch.

    @serhiy-storchaka
    Copy link
    Member

    For Modules/_curses_panel.c there is special issue, bpo-20171, with the patch.

    bpo-20178-sqlite-01.patch is applied almost clearly, but due to changes to Argument Clinic it should be updated. Perhaps more functions can be converted (functions that don't use PyArg_Parse* are worth to be converted too).

    @berkerpeksag
    Copy link
    Member

    I'm working on converting Modules/_sqlite/* to Argument Clinic.

    @berkerpeksag berkerpeksag added the 3.8 (EOL) end of life label Sep 8, 2018
    @erlend-aasland
    Copy link
    Contributor

    FYI, sqlite3 was converted to Argument Clinic in bpo-40956.

    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Labels
    3.8 (EOL) end of life 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

    6 participants