-
-
Notifications
You must be signed in to change notification settings - Fork 32.2k
bpo-36127: Argument Clinic: inline parsing code for keyword parameters. #12058
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
Changes from all commits
06f7117
8f8b05a
41e0a00
0e83072
acf77d9
ae9283a
2521f95
0af20f3
b7c9f60
0ec3da8
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -118,6 +118,18 @@ PyAPI_FUNC(int) _PyArg_ParseStackAndKeywords( | |
...); | ||
PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywordsFast(PyObject *, PyObject *, | ||
struct _PyArg_Parser *, va_list); | ||
PyAPI_FUNC(PyObject * const *) _PyArg_UnpackKeywords( | ||
PyObject *const *args, Py_ssize_t nargs, | ||
PyObject *kwargs, PyObject *kwnames, | ||
struct _PyArg_Parser *parser, | ||
int minpos, int maxpos, int minkw, | ||
PyObject **buf); | ||
#define _PyArg_UnpackKeywords(args, nargs, kwargs, kwnames, parser, minpos, maxpos, minkw, buf) \ | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I dislike such long and complex macros. Can't you use "static inline" function instead? You should rename _PyArg_UnpackKeywords function (ex: rename it to _PyArg_UnpackKeywords_impl). There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The "static inline" function would be even longer (you need to specify types of all parameters. The macro guaranties inlining the code. And I dislike non-local names like |
||
(((minkw) == 0 && (kwargs) == NULL && (kwnames) == NULL && \ | ||
(minpos) <= (nargs) && (nargs) <= (maxpos) && args != NULL) ? (args) : \ | ||
_PyArg_UnpackKeywords((args), (nargs), (kwargs), (kwnames), (parser), \ | ||
(minpos), (maxpos), (minkw), (buf))) | ||
|
||
void _PyArg_Fini(void); | ||
#endif /* Py_LIMITED_API */ | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Would it make sense to have one function for dict kwargs and one function for tuple kwnames?
Maybe the implementation can remain unchanged, but at least in term of API it would look better. In the generated code, we never have kwargs and kwnames defined at the same time. It's either one or the other.
Maybe it doesn't make sense, I'm not sure.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I considered this idea from the beginning.
But currently
PyTuple_GET_SIZE(args)
is evaluated only once for__new__
and__init__
. It is passes to_PyArg_UnpackKeywords
and used in the following code. With specialized macros/functions it will be evaluated several times. I do not know how this will affect performance, but this looks like a waste of CPU cycles.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't understand why you are talking about PyTuple_GET_SIZE(args). I'm not proposing to remove nargs parameter from _PyArg_UnpackKeywords().
I'm asking if it would make sense to have _PyArg_UnpackKwdict() for dict kwargs, and _PyArg_UnpackKwnames() for tuple kwnames. But maybe it's not worth it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
With removing just
kwargs
orkwnames
, I do not think it is worth.