close
Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
b68176d
Avoid temporary `varargs` tuple creation in argument passing
colorfulappl Dec 31, 2021
43b9410
Optimize argument passing of builtin print() with modified Argument C…
colorfulappl Dec 31, 2021
9b37a77
Revert modification of PyAPI_FUNC _PyArg_UnpackKeywordsWithVararg to …
colorfulappl Jan 4, 2022
46e4472
📜🤖 Added by blurb_it.
blurb-it[bot] Jan 4, 2022
e06f343
Revert _PyArg_UnpackKeywordsWithVararg and add _PyArg_UnpackKeywordsW…
colorfulappl Jan 4, 2022
d35410b
Fix a bug which allows more than one varargs
colorfulappl Feb 22, 2022
0a9fe91
Do not copy posargs and vararg during argument parsing
colorfulappl Mar 22, 2022
9188052
Rename _PyArg_UnpackKeywordsWithVarargFast, it returns kwargs only now
colorfulappl Mar 23, 2022
d245ec0
Check type of varargs when generating argument parser
colorfulappl Mar 23, 2022
8d16685
Fix varargssize calculation in class init and add test cases
colorfulappl Mar 23, 2022
f4213ea
Merge branch 'main' into opt_ac
colorfulappl Mar 23, 2022
156f8d6
Rerun make clinic
colorfulappl Mar 23, 2022
c32aed4
Edit documentation
colorfulappl Mar 23, 2022
7ef5623
Merge branch 'main' into opt_ac
colorfulappl Feb 3, 2023
3ac2821
Fix errors introduced by merging and rerun make clinic
colorfulappl Feb 3, 2023
f63a704
Update news
colorfulappl Feb 3, 2023
8f61f5e
Fix varargssize in new_or_init
colorfulappl Feb 6, 2023
1eff215
Simplify the code a bit
colorfulappl Feb 6, 2023
5baf0f5
Optimize generated varargssize assignment
colorfulappl Feb 6, 2023
30c0606
Fix argument passing in new_or_init
colorfulappl Feb 7, 2023
d9e7408
Add tests for class method `__new__`
colorfulappl Feb 7, 2023
0f04a95
Merge branch 'main' into opt_ac
colorfulappl Feb 7, 2023
85a8ac5
Correct test function name
colorfulappl Feb 8, 2023
a9d1424
Fix vararg parsing when its name is not `args`
colorfulappl Feb 8, 2023
d6ff01a
Merge branch 'main' into opt_ac
colorfulappl Feb 8, 2023
597152e
Add testcases for undeclared keyword arguments
colorfulappl Feb 8, 2023
3119fa6
Merge branch 'main' into opt_ac
erlend-aasland Apr 29, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Fix errors introduced by merging and rerun make clinic
  • Loading branch information
colorfulappl committed Feb 3, 2023
commit 3ac2821b0d4923af3f3cb20d5eb2780841dc2f97
7 changes: 7 additions & 0 deletions Include/cpython/modsupport.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,13 @@ PyAPI_FUNC(PyObject * const *) _PyArg_UnpackKeywordsWithVararg(
int minpos, int maxpos, int minkw,
int vararg, PyObject **buf);

PyAPI_FUNC(PyObject * const *) _PyArg_UnpackKeywordsWithVarargKwonly(
PyObject *const *args, Py_ssize_t nargs,
PyObject *kwargs, PyObject *kwnames,
struct _PyArg_Parser *parser,
int minpos, int maxpos, int minkw,
int vararg, PyObject **buf);

#define _PyArg_UnpackKeywords(args, nargs, kwargs, kwnames, parser, minpos, maxpos, minkw, buf) \
(((minkw) == 0 && (kwargs) == NULL && (kwnames) == NULL && \
(minpos) <= (nargs) && (nargs) <= (maxpos) && (args) != NULL) ? (args) : \
Expand Down
78 changes: 50 additions & 28 deletions Lib/test/clinic.test
Original file line number Diff line number Diff line change
Expand Up @@ -3792,7 +3792,7 @@ exit:
static PyObject *
test_vararg_and_posonly_impl(PyObject *module, PyObject *a,
Py_ssize_t varargssize, PyObject *const *args)
/*[clinic end generated code: output=23a9d5c5c3cbc015 input=08dc2bf7afbf1613]*/
/*[clinic end generated code: output=0c242df582a012d1 input=08dc2bf7afbf1613]*/

/*[clinic input]
test_vararg
Expand Down Expand Up @@ -3847,7 +3847,6 @@ test_vararg(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject
PyObject *argsbuf[0];
Py_ssize_t varargssize = Py_MAX(nargs - 1, 0);
PyObject *const *fastargs;
Py_ssize_t noptargs = 0 + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
PyObject *a;
PyObject *const *__clinic_args;

Expand All @@ -3866,7 +3865,7 @@ exit:
static PyObject *
test_vararg_impl(PyObject *module, PyObject *a, Py_ssize_t varargssize,
PyObject *const *args)
/*[clinic end generated code: output=c200ba15688e2a36 input=81d33815ad1bae6e]*/
/*[clinic end generated code: output=fb100afa02682813 input=81d33815ad1bae6e]*/

/*[clinic input]
test_vararg_with_default
Expand Down Expand Up @@ -3923,7 +3922,7 @@ test_vararg_with_default(PyObject *module, PyObject *const *args, Py_ssize_t nar
PyObject *argsbuf[1];
Py_ssize_t varargssize = Py_MAX(nargs - 1, 0);
PyObject *const *fastargs;
Py_ssize_t noptargs = 0 + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
Py_ssize_t noptargs = Py_MIN(nargs, 1) + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
PyObject *a;
PyObject *const *__clinic_args;
int b = 0;
Expand Down Expand Up @@ -3952,7 +3951,7 @@ static PyObject *
test_vararg_with_default_impl(PyObject *module, PyObject *a,
Py_ssize_t varargssize, PyObject *const *args,
int b)
/*[clinic end generated code: output=880cc2e95cfff4dd input=6e110b54acd9b22d]*/
/*[clinic end generated code: output=c724b7a1b327f798 input=6e110b54acd9b22d]*/

/*[clinic input]
test_vararg_with_only_defaults
Expand Down Expand Up @@ -4043,7 +4042,7 @@ static PyObject *
test_vararg_with_only_defaults_impl(PyObject *module, Py_ssize_t varargssize,
PyObject *const *args, int b,
PyObject *c)
/*[clinic end generated code: output=dd21b28f0db26a4b input=fa56a709a035666e]*/
/*[clinic end generated code: output=bdc061cc11a3abde input=fa56a709a035666e]*/

/*[clinic input]
test_paramname_module
Expand Down Expand Up @@ -4125,20 +4124,20 @@ TestModule.TestClass1.__init__

[clinic start generated code]*/

static int
TestModule_TestClass1___init___impl(TestClassObject *self,
Py_ssize_t varargssize,
PyObject *const *args);
static int
TestModule_TestClass1___init___impl(TestClassObject *self,
Py_ssize_t varargssize,
PyObject *const *args);

static int
TestModule_TestClass1___init__(PyObject *self, PyObject *args, PyObject *kwargs)
static int
TestModule_TestClass1___init__(PyObject *self, PyObject *args, PyObject *kwargs)
{
int return_value = -1;
Py_ssize_t varargssize = Py_MAX(PyTuple_GET_SIZE(args) - 0, 0);
PyTypeObject *base_tp = &TestModule_Type;
PyObject *const *__clinic_args;

if ((Py_IS_TYPE(self, &TestModule_Type) ||
Py_TYPE(self)->tp_new == TestModule_Type.tp_new) &&
if ((Py_IS_TYPE(self, base_tp) ||
Py_TYPE(self)->tp_new == base_tp->tp_new) &&
!_PyArg_NoKeywords("TestClass1", kwargs)) {
goto exit;
}
Expand All @@ -4148,15 +4147,15 @@ TestModule.TestClass1.__init__
__clinic_args = _PyTuple_CAST(args)->ob_item;
return_value = TestModule_TestClass1___init___impl((TestClassObject *)self, varargssize, __clinic_args);

exit:
exit:
return return_value;
}

static int
TestModule_TestClass1___init___impl(TestClassObject *self,
Py_ssize_t varargssize,
PyObject *const *args)
/*[clinic end generated code: output=6cc55e8fae8d8bf2 input=3e093b8ea0b74b0c]*/
/*[clinic end generated code: output=89fc8cfb766b0097 input=3e093b8ea0b74b0c]*/


/*[clinic input]
Expand All @@ -4168,22 +4167,45 @@ TestModule.TestClass1.__init__

[clinic start generated code]*/

static int
TestModule_TestClass1___init___impl(TestClassObject *self, PyObject *pos,
Py_ssize_t varargssize,
PyObject *const *args, PyObject *kw);
static int
TestModule_TestClass1___init___impl(TestClassObject *self, PyObject *pos,
Py_ssize_t varargssize,
PyObject *const *args, PyObject *kw);

static int
TestModule_TestClass1___init__(PyObject *self, PyObject *args, PyObject *kwargs)
static int
TestModule_TestClass1___init__(PyObject *self, PyObject *args, PyObject *kwargs)
{
int return_value = -1;
#if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)

#define NUM_KEYWORDS 2
static struct {
PyGC_Head _this_is_not_used;
PyObject_VAR_HEAD
PyObject *ob_item[NUM_KEYWORDS];
} _kwtuple = {
.ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
.ob_item = { &_Py_ID(pos), &_Py_ID(kw), },
};
#undef NUM_KEYWORDS
#define KWTUPLE (&_kwtuple.ob_base.ob_base)

#else // !Py_BUILD_CORE
# define KWTUPLE NULL
#endif // !Py_BUILD_CORE

static const char * const _keywords[] = {"pos", "kw", NULL};
static _PyArg_Parser _parser = {NULL, _keywords, "TestClass1", 0};
static _PyArg_Parser _parser = {
.keywords = _keywords,
.fname = "TestClass1",
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
PyObject *argsbuf[1];
PyObject * const *fastargs;
Py_ssize_t nargs = PyTuple_GET_SIZE(args);
Py_ssize_t varargssize = Py_MAX(nargs - 1, 0);
Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 1;
Py_ssize_t noptargs = Py_MIN(nargs, 1) + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 1;
PyObject *pos;
PyObject *const *__clinic_args;
PyObject *kw = Py_None;
Expand All @@ -4198,15 +4220,15 @@ TestModule.TestClass1.__init__
goto skip_optional_kwonly;
}
kw = fastargs[0];
skip_optional_kwonly:
skip_optional_kwonly:
return_value = TestModule_TestClass1___init___impl((TestClassObject *)self, pos, varargssize, __clinic_args, kw);

exit:
exit:
return return_value;
}

static int
TestModule_TestClass1___init___impl(TestClassObject *self, PyObject *pos,
Py_ssize_t varargssize,
PyObject *const *args, PyObject *kw)
/*[clinic end generated code: output=fd92077792f4c3ef input=da8e0daa18983316]*/
/*[clinic end generated code: output=b7e8fba5e3e6e531 input=da8e0daa18983316]*/
93 changes: 72 additions & 21 deletions Modules/_testclinic.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,20 @@
#include "clinic/_testclinic.c.h"


static PyObject *
pack_varargs_to_tuple(Py_ssize_t varargssize, PyObject *const *args)
{
assert(!PyErr_Occurred());
PyObject *tuple = PyTuple_New(varargssize);
if (!tuple) {
return NULL;
}
for (Py_ssize_t i = 0; i < varargssize; i++) {
PyTuple_SET_ITEM(tuple, i, Py_NewRef(args[i]));
}
return tuple;
}

/* Pack arguments to a tuple, implicitly increase all the arguments' refcount.
* NULL arguments will be replaced to Py_None. */
static PyObject *
Expand Down Expand Up @@ -962,10 +976,16 @@ posonly_vararg

static PyObject *
posonly_vararg_impl(PyObject *module, PyObject *a, PyObject *b,
PyObject *args)
/*[clinic end generated code: output=ee6713acda6b954e input=783427fe7ec2b67a]*/
Py_ssize_t varargssize, PyObject *const *args)
/*[clinic end generated code: output=744bd14cfaa7b46c input=783427fe7ec2b67a]*/
{
return pack_arguments_newref(3, a, b, args);
PyObject *vararg_tuple = pack_varargs_to_tuple(varargssize, args);
if (!vararg_tuple) {
return NULL;
}
PyObject *result = pack_arguments_newref(3, a, b, vararg_tuple);
Py_DECREF(vararg_tuple);
return result;
}


Expand All @@ -979,10 +999,17 @@ vararg_and_posonly
[clinic start generated code]*/

static PyObject *
vararg_and_posonly_impl(PyObject *module, PyObject *a, PyObject *args)
/*[clinic end generated code: output=42792f799465a14d input=defe017b19ba52e8]*/
vararg_and_posonly_impl(PyObject *module, PyObject *a,
Py_ssize_t varargssize, PyObject *const *args)
/*[clinic end generated code: output=75f9bcbfc99efb90 input=defe017b19ba52e8]*/
{
return pack_arguments_newref(2, a, args);
PyObject *vararg_tuple = pack_varargs_to_tuple(varargssize, args);
if (!vararg_tuple) {
return NULL;
}
PyObject *result = pack_arguments_newref(2, a, vararg_tuple);
Py_DECREF(vararg_tuple);
return result;
}


Expand All @@ -995,10 +1022,17 @@ vararg
[clinic start generated code]*/

static PyObject *
vararg_impl(PyObject *module, PyObject *a, PyObject *args)
/*[clinic end generated code: output=91ab7a0efc52dd5e input=02c0f772d05f591e]*/
vararg_impl(PyObject *module, PyObject *a, Py_ssize_t varargssize,
PyObject *const *args)
/*[clinic end generated code: output=36e183ea6ecb9f8f input=02c0f772d05f591e]*/
{
return pack_arguments_newref(2, a, args);
PyObject *vararg_tuple = pack_varargs_to_tuple(varargssize, args);
if (!vararg_tuple) {
return NULL;
}
PyObject *result = pack_arguments_newref(2, a, vararg_tuple);
Py_DECREF(vararg_tuple);
return result;
}


Expand All @@ -1012,12 +1046,19 @@ vararg_with_default
[clinic start generated code]*/

static PyObject *
vararg_with_default_impl(PyObject *module, PyObject *a, PyObject *args,
vararg_with_default_impl(PyObject *module, PyObject *a,
Py_ssize_t varargssize, PyObject *const *args,
int b)
/*[clinic end generated code: output=182c01035958ce92 input=68cafa6a79f89e36]*/
/*[clinic end generated code: output=f4e18bc71825f3f9 input=68cafa6a79f89e36]*/
{
PyObject *vararg_tuple = pack_varargs_to_tuple(varargssize, args);
if (!vararg_tuple) {
return NULL;
}
PyObject *obj_b = b ? Py_True : Py_False;
return pack_arguments_newref(3, a, args, obj_b);
PyObject *result = pack_arguments_newref(3, a, vararg_tuple, obj_b);
Py_DECREF(vararg_tuple);
return result;
}


Expand All @@ -1030,10 +1071,17 @@ vararg_with_only_defaults
[clinic start generated code]*/

static PyObject *
vararg_with_only_defaults_impl(PyObject *module, PyObject *args, PyObject *b)
/*[clinic end generated code: output=c06b1826d91f2f7b input=678c069bc67550e1]*/
vararg_with_only_defaults_impl(PyObject *module, Py_ssize_t varargssize,
PyObject *const *args, PyObject *b)
/*[clinic end generated code: output=049328b782106d03 input=678c069bc67550e1]*/
{
return pack_arguments_newref(2, args, b);
PyObject *vararg_tuple = pack_varargs_to_tuple(varargssize, args);
if (!vararg_tuple) {
return NULL;
}
PyObject *result = pack_arguments_newref(2, vararg_tuple, b);
Py_DECREF(vararg_tuple);
return result;
}


Expand All @@ -1053,8 +1101,9 @@ Proof-of-concept of GH-32092 OOB bug.

static PyObject *
gh_32092_oob_impl(PyObject *module, PyObject *pos1, PyObject *pos2,
PyObject *varargs, PyObject *kw1, PyObject *kw2)
/*[clinic end generated code: output=ee259c130054653f input=46d15c881608f8ff]*/
Py_ssize_t varargssize, PyObject *const *varargs,
PyObject *kw1, PyObject *kw2)
/*[clinic end generated code: output=ecb8573caf9791ac input=46d15c881608f8ff]*/
{
Py_RETURN_NONE;
}
Expand All @@ -1072,9 +1121,10 @@ Proof-of-concept of GH-32092 keyword args passing bug.
[clinic start generated code]*/

static PyObject *
gh_32092_kw_pass_impl(PyObject *module, PyObject *pos, PyObject *args,
gh_32092_kw_pass_impl(PyObject *module, PyObject *pos,
Py_ssize_t varargssize, PyObject *const *args,
PyObject *kw)
/*[clinic end generated code: output=4a2bbe4f7c8604e9 input=5c0bd5b9079a0cce]*/
/*[clinic end generated code: output=5fb8caec2618b065 input=5c0bd5b9079a0cce]*/
{
Py_RETURN_NONE;
}
Expand All @@ -1091,8 +1141,9 @@ Proof-of-concept of GH-99233 refcount error bug.
[clinic start generated code]*/

static PyObject *
gh_99233_refcount_impl(PyObject *module, PyObject *args)
/*[clinic end generated code: output=585855abfbca9a7f input=85f5fb47ac91a626]*/
gh_99233_refcount_impl(PyObject *module, Py_ssize_t varargssize,
PyObject *const *args)
/*[clinic end generated code: output=2712f6e3397e4eca input=85f5fb47ac91a626]*/
{
Py_RETURN_NONE;
}
Expand Down
Loading