summaryrefslogtreecommitdiffstats
path: root/Objects/clinic/longobject.c.h
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2019-03-14 08:32:22 (GMT)
committerGitHub <noreply@github.com>2019-03-14 08:32:22 (GMT)
commit3191391515824fa7f3c573d807f1034c6a28fab3 (patch)
treeff8213b07b206de4df88dc352ee957ce68f0f2de /Objects/clinic/longobject.c.h
parent2c0d3f454705bb5ccf5f6189f3cf77bbae4f056b (diff)
downloadcpython-3191391515824fa7f3c573d807f1034c6a28fab3.zip
cpython-3191391515824fa7f3c573d807f1034c6a28fab3.tar.gz
cpython-3191391515824fa7f3c573d807f1034c6a28fab3.tar.bz2
bpo-36127: Argument Clinic: inline parsing code for keyword parameters. (GH-12058)
Diffstat (limited to 'Objects/clinic/longobject.c.h')
-rw-r--r--Objects/clinic/longobject.c.h89
1 files changed, 79 insertions, 10 deletions
diff --git a/Objects/clinic/longobject.c.h b/Objects/clinic/longobject.c.h
index 6770023..453edba 100644
--- a/Objects/clinic/longobject.c.h
+++ b/Objects/clinic/longobject.c.h
@@ -10,14 +10,29 @@ long_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
{
PyObject *return_value = NULL;
static const char * const _keywords[] = {"", "base", NULL};
- static _PyArg_Parser _parser = {"|OO:int", _keywords, 0};
+ static _PyArg_Parser _parser = {NULL, _keywords, "int", 0};
+ PyObject *argsbuf[2];
+ PyObject * const *fastargs;
+ Py_ssize_t nargs = PyTuple_GET_SIZE(args);
+ Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0;
PyObject *x = NULL;
PyObject *obase = NULL;
- if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser,
- &x, &obase)) {
+ fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 2, 0, argsbuf);
+ if (!fastargs) {
goto exit;
}
+ if (nargs < 1) {
+ goto skip_optional_posonly;
+ }
+ noptargs--;
+ x = fastargs[0];
+skip_optional_posonly:
+ if (!noptargs) {
+ goto skip_optional_pos;
+ }
+ obase = fastargs[1];
+skip_optional_pos:
return_value = long_new_impl(type, x, obase);
exit:
@@ -183,15 +198,50 @@ int_to_bytes(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *
{
PyObject *return_value = NULL;
static const char * const _keywords[] = {"length", "byteorder", "signed", NULL};
- static _PyArg_Parser _parser = {"nU|$p:to_bytes", _keywords, 0};
+ static _PyArg_Parser _parser = {NULL, _keywords, "to_bytes", 0};
+ PyObject *argsbuf[3];
+ Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
Py_ssize_t length;
PyObject *byteorder;
int is_signed = 0;
- if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
- &length, &byteorder, &is_signed)) {
+ args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
+ if (!args) {
+ goto exit;
+ }
+ if (PyFloat_Check(args[0])) {
+ PyErr_SetString(PyExc_TypeError,
+ "integer argument expected, got float" );
+ goto exit;
+ }
+ {
+ Py_ssize_t ival = -1;
+ PyObject *iobj = PyNumber_Index(args[0]);
+ if (iobj != NULL) {
+ ival = PyLong_AsSsize_t(iobj);
+ Py_DECREF(iobj);
+ }
+ if (ival == -1 && PyErr_Occurred()) {
+ goto exit;
+ }
+ length = ival;
+ }
+ if (!PyUnicode_Check(args[1])) {
+ _PyArg_BadArgument("to_bytes", 2, "str", args[1]);
goto exit;
}
+ if (PyUnicode_READY(args[1]) == -1) {
+ goto exit;
+ }
+ byteorder = args[1];
+ if (!noptargs) {
+ goto skip_optional_kwonly;
+ }
+ is_signed = PyObject_IsTrue(args[2]);
+ if (is_signed < 0) {
+ goto exit;
+ }
+skip_optional_kwonly:
return_value = int_to_bytes_impl(self, length, byteorder, is_signed);
exit:
@@ -230,18 +280,37 @@ int_from_bytes(PyTypeObject *type, PyObject *const *args, Py_ssize_t nargs, PyOb
{
PyObject *return_value = NULL;
static const char * const _keywords[] = {"bytes", "byteorder", "signed", NULL};
- static _PyArg_Parser _parser = {"OU|$p:from_bytes", _keywords, 0};
+ static _PyArg_Parser _parser = {NULL, _keywords, "from_bytes", 0};
+ PyObject *argsbuf[3];
+ Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
PyObject *bytes_obj;
PyObject *byteorder;
int is_signed = 0;
- if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
- &bytes_obj, &byteorder, &is_signed)) {
+ args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
+ if (!args) {
+ goto exit;
+ }
+ bytes_obj = args[0];
+ if (!PyUnicode_Check(args[1])) {
+ _PyArg_BadArgument("from_bytes", 2, "str", args[1]);
+ goto exit;
+ }
+ if (PyUnicode_READY(args[1]) == -1) {
+ goto exit;
+ }
+ byteorder = args[1];
+ if (!noptargs) {
+ goto skip_optional_kwonly;
+ }
+ is_signed = PyObject_IsTrue(args[2]);
+ if (is_signed < 0) {
goto exit;
}
+skip_optional_kwonly:
return_value = int_from_bytes_impl(type, bytes_obj, byteorder, is_signed);
exit:
return return_value;
}
-/*[clinic end generated code: output=3b91cda9d83abaa2 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=709503897c55bca1 input=a9049054013a1b77]*/