From e3f5e71658b4f96e6053c23a4e78c4cf55aabcb5 Mon Sep 17 00:00:00 2001 From: sobolevn Date: Thu, 30 Mar 2023 15:52:27 +0300 Subject: [PATCH 1/4] gh-103131: Convert `sys.getsizeof` and `sys.set_asyncgen_hooks` to AC --- .../pycore_global_objects_fini_generated.h | 2 + Include/internal/pycore_global_strings.h | 2 + .../internal/pycore_runtime_init_generated.h | 2 + .../internal/pycore_unicodeobject_generated.h | 6 + ...-03-30-15-29-55.gh-issue-103131.pFNxUN.rst | 2 + Python/clinic/sysmodule.c.h | 133 +++++++++++++++++- Python/sysmodule.c | 61 ++++---- 7 files changed, 172 insertions(+), 36 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-03-30-15-29-55.gh-issue-103131.pFNxUN.rst diff --git a/Include/internal/pycore_global_objects_fini_generated.h b/Include/internal/pycore_global_objects_fini_generated.h index 14dfd9ea5823ed..39e5328d0066af 100644 --- a/Include/internal/pycore_global_objects_fini_generated.h +++ b/Include/internal/pycore_global_objects_fini_generated.h @@ -919,7 +919,9 @@ _PyStaticObjects_CheckRefcnt(PyInterpreterState *interp) { _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(fillvalue)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(filters)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(final)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(finalizer)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(find_class)); + _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(firstiter)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(fix_imports)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(flags)); _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(flush)); diff --git a/Include/internal/pycore_global_strings.h b/Include/internal/pycore_global_strings.h index 6f430bb25eb8d3..f18f3660a59b9f 100644 --- a/Include/internal/pycore_global_strings.h +++ b/Include/internal/pycore_global_strings.h @@ -405,7 +405,9 @@ struct _Py_global_strings { STRUCT_FOR_ID(fillvalue) STRUCT_FOR_ID(filters) STRUCT_FOR_ID(final) + STRUCT_FOR_ID(finalizer) STRUCT_FOR_ID(find_class) + STRUCT_FOR_ID(firstiter) STRUCT_FOR_ID(fix_imports) STRUCT_FOR_ID(flags) STRUCT_FOR_ID(flush) diff --git a/Include/internal/pycore_runtime_init_generated.h b/Include/internal/pycore_runtime_init_generated.h index 0452c4c61551de..3915ab92b6c909 100644 --- a/Include/internal/pycore_runtime_init_generated.h +++ b/Include/internal/pycore_runtime_init_generated.h @@ -911,7 +911,9 @@ extern "C" { INIT_ID(fillvalue), \ INIT_ID(filters), \ INIT_ID(final), \ + INIT_ID(finalizer), \ INIT_ID(find_class), \ + INIT_ID(firstiter), \ INIT_ID(fix_imports), \ INIT_ID(flags), \ INIT_ID(flush), \ diff --git a/Include/internal/pycore_unicodeobject_generated.h b/Include/internal/pycore_unicodeobject_generated.h index 7114a5416f2515..84992982694ac6 100644 --- a/Include/internal/pycore_unicodeobject_generated.h +++ b/Include/internal/pycore_unicodeobject_generated.h @@ -1068,9 +1068,15 @@ _PyUnicode_InitStaticStrings(PyInterpreterState *interp) { string = &_Py_ID(final); assert(_PyUnicode_CheckConsistency(string, 1)); _PyUnicode_InternInPlace(interp, &string); + string = &_Py_ID(finalizer); + assert(_PyUnicode_CheckConsistency(string, 1)); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(find_class); assert(_PyUnicode_CheckConsistency(string, 1)); _PyUnicode_InternInPlace(interp, &string); + string = &_Py_ID(firstiter); + assert(_PyUnicode_CheckConsistency(string, 1)); + _PyUnicode_InternInPlace(interp, &string); string = &_Py_ID(fix_imports); assert(_PyUnicode_CheckConsistency(string, 1)); _PyUnicode_InternInPlace(interp, &string); diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-03-30-15-29-55.gh-issue-103131.pFNxUN.rst b/Misc/NEWS.d/next/Core and Builtins/2023-03-30-15-29-55.gh-issue-103131.pFNxUN.rst new file mode 100644 index 00000000000000..670780d451a2f7 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-03-30-15-29-55.gh-issue-103131.pFNxUN.rst @@ -0,0 +1,2 @@ +Convert :func:`sys.getsizeof` and :func:`sys.set_asyncgen_hooks` +to argument clinic. diff --git a/Python/clinic/sysmodule.c.h b/Python/clinic/sysmodule.c.h index 46252dd404325b..316a175ab3af2c 100644 --- a/Python/clinic/sysmodule.c.h +++ b/Python/clinic/sysmodule.c.h @@ -548,6 +548,75 @@ sys_get_coroutine_origin_tracking_depth(PyObject *module, PyObject *Py_UNUSED(ig return return_value; } +PyDoc_STRVAR(sys_set_asyncgen_hooks__doc__, +"set_asyncgen_hooks($module, /, firstiter=,\n" +" finalizer=)\n" +"--\n" +"\n" +"Set a finalizer for async generators objects."); + +#define SYS_SET_ASYNCGEN_HOOKS_METHODDEF \ + {"set_asyncgen_hooks", _PyCFunction_CAST(sys_set_asyncgen_hooks), METH_FASTCALL|METH_KEYWORDS, sys_set_asyncgen_hooks__doc__}, + +static PyObject * +sys_set_asyncgen_hooks_impl(PyObject *module, PyObject *firstiter, + PyObject *finalizer); + +static PyObject * +sys_set_asyncgen_hooks(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + #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(firstiter), &_Py_ID(finalizer), }, + }; + #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[] = {"firstiter", "finalizer", NULL}; + static _PyArg_Parser _parser = { + .keywords = _keywords, + .fname = "set_asyncgen_hooks", + .kwtuple = KWTUPLE, + }; + #undef KWTUPLE + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + PyObject *firstiter = NULL; + PyObject *finalizer = NULL; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + firstiter = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + finalizer = args[1]; +skip_optional_pos: + return_value = sys_set_asyncgen_hooks_impl(module, firstiter, finalizer); + +exit: + return return_value; +} + PyDoc_STRVAR(sys_get_asyncgen_hooks__doc__, "get_asyncgen_hooks($module, /)\n" "--\n" @@ -821,6 +890,68 @@ sys_set_int_max_str_digits(PyObject *module, PyObject *const *args, Py_ssize_t n return return_value; } +PyDoc_STRVAR(sys_getsizeof__doc__, +"getsizeof($module, /, object, default=)\n" +"--\n" +"\n" +"Return the size of object in bytes."); + +#define SYS_GETSIZEOF_METHODDEF \ + {"getsizeof", _PyCFunction_CAST(sys_getsizeof), METH_FASTCALL|METH_KEYWORDS, sys_getsizeof__doc__}, + +static PyObject * +sys_getsizeof_impl(PyObject *module, PyObject *object, PyObject *dflt); + +static PyObject * +sys_getsizeof(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + #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(object), &_Py_ID(default), }, + }; + #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[] = {"object", "default", NULL}; + static _PyArg_Parser _parser = { + .keywords = _keywords, + .fname = "getsizeof", + .kwtuple = KWTUPLE, + }; + #undef KWTUPLE + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; + PyObject *object; + PyObject *dflt = NULL; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { + goto exit; + } + object = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + dflt = args[1]; +skip_optional_pos: + return_value = sys_getsizeof_impl(module, object, dflt); + +exit: + return return_value; +} + PyDoc_STRVAR(sys_getrefcount__doc__, "getrefcount($module, object, /)\n" "--\n" @@ -1387,4 +1518,4 @@ sys__getframemodulename(PyObject *module, PyObject *const *args, Py_ssize_t narg #ifndef SYS_GETANDROIDAPILEVEL_METHODDEF #define SYS_GETANDROIDAPILEVEL_METHODDEF #endif /* !defined(SYS_GETANDROIDAPILEVEL_METHODDEF) */ -/*[clinic end generated code: output=5c761f14326ced54 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=a5e247703f29e539 input=a9049054013a1b77]*/ diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 4afb0f1d0b5ed2..075a25e55628a2 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1291,19 +1291,20 @@ static PyStructSequence_Desc asyncgen_hooks_desc = { 2 }; -static PyObject * -sys_set_asyncgen_hooks(PyObject *self, PyObject *args, PyObject *kw) -{ - static char *keywords[] = {"firstiter", "finalizer", NULL}; - PyObject *firstiter = NULL; - PyObject *finalizer = NULL; +/*[clinic input] +sys.set_asyncgen_hooks - if (!PyArg_ParseTupleAndKeywords( - args, kw, "|OO", keywords, - &firstiter, &finalizer)) { - return NULL; - } + firstiter: object = NULL + finalizer: object = NULL +Set a finalizer for async generators objects. +[clinic start generated code]*/ + +static PyObject * +sys_set_asyncgen_hooks_impl(PyObject *module, PyObject *firstiter, + PyObject *finalizer) +/*[clinic end generated code: output=6fe3b2dd3f9a9db5 input=ef6a1e96361234be]*/ +{ if (finalizer && finalizer != Py_None) { if (!PyCallable_Check(finalizer)) { PyErr_Format(PyExc_TypeError, @@ -1337,12 +1338,6 @@ sys_set_asyncgen_hooks(PyObject *self, PyObject *args, PyObject *kw) Py_RETURN_NONE; } -PyDoc_STRVAR(set_asyncgen_hooks_doc, -"set_asyncgen_hooks(* [, firstiter] [, finalizer])\n\ -\n\ -Set a finalizer for async generators objects." -); - /*[clinic input] sys.get_asyncgen_hooks @@ -1792,20 +1787,23 @@ _PySys_GetSizeOf(PyObject *o) return (size_t)size + _PyType_PreHeaderSize(Py_TYPE(o)); } +/*[clinic input] +sys.getsizeof + + object: object + default as dflt: object = NULL + +Return the size of object in bytes. +[clinic start generated code]*/ + static PyObject * -sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds) +sys_getsizeof_impl(PyObject *module, PyObject *object, PyObject *dflt) +/*[clinic end generated code: output=3f326a2f59e30975 input=7712d53f10145836]*/ { - static char *kwlist[] = {"object", "default", 0}; size_t size; - PyObject *o, *dflt = NULL; PyThreadState *tstate = _PyThreadState_GET(); - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:getsizeof", - kwlist, &o, &dflt)) { - return NULL; - } - - size = _PySys_GetSizeOf(o); + size = _PySys_GetSizeOf(object); if (size == (size_t)-1 && _PyErr_Occurred(tstate)) { /* Has a default value been given */ @@ -1820,11 +1818,6 @@ sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds) return PyLong_FromSize_t(size); } -PyDoc_STRVAR(getsizeof_doc, -"getsizeof(object [, default]) -> int\n\ -\n\ -Return the size of object in bytes."); - /*[clinic input] sys.getrefcount -> Py_ssize_t @@ -2251,8 +2244,7 @@ static PyMethodDef sys_methods[] = { SYS_GETTOTALREFCOUNT_METHODDEF SYS_GETREFCOUNT_METHODDEF SYS_GETRECURSIONLIMIT_METHODDEF - {"getsizeof", _PyCFunction_CAST(sys_getsizeof), - METH_VARARGS | METH_KEYWORDS, getsizeof_doc}, + SYS_GETSIZEOF_METHODDEF SYS__GETFRAME_METHODDEF SYS__GETFRAMEMODULENAME_METHODDEF SYS_GETWINDOWSVERSION_METHODDEF @@ -2274,8 +2266,7 @@ static PyMethodDef sys_methods[] = { SYS__DEBUGMALLOCSTATS_METHODDEF SYS_SET_COROUTINE_ORIGIN_TRACKING_DEPTH_METHODDEF SYS_GET_COROUTINE_ORIGIN_TRACKING_DEPTH_METHODDEF - {"set_asyncgen_hooks", _PyCFunction_CAST(sys_set_asyncgen_hooks), - METH_VARARGS | METH_KEYWORDS, set_asyncgen_hooks_doc}, + SYS_SET_ASYNCGEN_HOOKS_METHODDEF SYS_GET_ASYNCGEN_HOOKS_METHODDEF SYS_GETANDROIDAPILEVEL_METHODDEF SYS_ACTIVATE_STACK_TRAMPOLINE_METHODDEF From c9a71d94264a3da114dc43a567a480fbc1d21e21 Mon Sep 17 00:00:00 2001 From: sobolevn Date: Fri, 31 Mar 2023 15:49:38 +0300 Subject: [PATCH 2/4] Fix signatures in help --- Python/clinic/sysmodule.c.h | 6 +++++- Python/sysmodule.c | 8 ++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Python/clinic/sysmodule.c.h b/Python/clinic/sysmodule.c.h index 316a175ab3af2c..62e3173a9d1c2f 100644 --- a/Python/clinic/sysmodule.c.h +++ b/Python/clinic/sysmodule.c.h @@ -553,6 +553,8 @@ PyDoc_STRVAR(sys_set_asyncgen_hooks__doc__, " finalizer=)\n" "--\n" "\n" +"set_asyncgen_hooks(* [, firstiter] [, finalizer])\n" +"\n" "Set a finalizer for async generators objects."); #define SYS_SET_ASYNCGEN_HOOKS_METHODDEF \ @@ -894,6 +896,8 @@ PyDoc_STRVAR(sys_getsizeof__doc__, "getsizeof($module, /, object, default=)\n" "--\n" "\n" +"getsizeof(object [, default]) -> int\n" +"\n" "Return the size of object in bytes."); #define SYS_GETSIZEOF_METHODDEF \ @@ -1518,4 +1522,4 @@ sys__getframemodulename(PyObject *module, PyObject *const *args, Py_ssize_t narg #ifndef SYS_GETANDROIDAPILEVEL_METHODDEF #define SYS_GETANDROIDAPILEVEL_METHODDEF #endif /* !defined(SYS_GETANDROIDAPILEVEL_METHODDEF) */ -/*[clinic end generated code: output=a5e247703f29e539 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=8bce5e0ebd57c3be input=a9049054013a1b77]*/ diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 075a25e55628a2..b36f161579a3fc 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1297,13 +1297,15 @@ sys.set_asyncgen_hooks firstiter: object = NULL finalizer: object = NULL +set_asyncgen_hooks(* [, firstiter] [, finalizer]) + Set a finalizer for async generators objects. [clinic start generated code]*/ static PyObject * sys_set_asyncgen_hooks_impl(PyObject *module, PyObject *firstiter, PyObject *finalizer) -/*[clinic end generated code: output=6fe3b2dd3f9a9db5 input=ef6a1e96361234be]*/ +/*[clinic end generated code: output=6fe3b2dd3f9a9db5 input=fa1bd81419c4f97b]*/ { if (finalizer && finalizer != Py_None) { if (!PyCallable_Check(finalizer)) { @@ -1793,12 +1795,14 @@ sys.getsizeof object: object default as dflt: object = NULL +getsizeof(object [, default]) -> int + Return the size of object in bytes. [clinic start generated code]*/ static PyObject * sys_getsizeof_impl(PyObject *module, PyObject *object, PyObject *dflt) -/*[clinic end generated code: output=3f326a2f59e30975 input=7712d53f10145836]*/ +/*[clinic end generated code: output=3f326a2f59e30975 input=d21ca2aef11d2ff4]*/ { size_t size; PyThreadState *tstate = _PyThreadState_GET(); From 2f0839fdc714273fbc6b289c791603ef860aacf6 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Mon, 28 Aug 2023 14:40:45 +0100 Subject: [PATCH 3/4] Delete 2023-03-30-15-29-55.gh-issue-103131.pFNxUN.rst --- .../2023-03-30-15-29-55.gh-issue-103131.pFNxUN.rst | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-03-30-15-29-55.gh-issue-103131.pFNxUN.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-03-30-15-29-55.gh-issue-103131.pFNxUN.rst b/Misc/NEWS.d/next/Core and Builtins/2023-03-30-15-29-55.gh-issue-103131.pFNxUN.rst deleted file mode 100644 index 670780d451a2f7..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2023-03-30-15-29-55.gh-issue-103131.pFNxUN.rst +++ /dev/null @@ -1,2 +0,0 @@ -Convert :func:`sys.getsizeof` and :func:`sys.set_asyncgen_hooks` -to argument clinic. From c0086505210648aadec10fc949df06824d4f2dd6 Mon Sep 17 00:00:00 2001 From: sobolevn Date: Wed, 20 Mar 2024 13:47:29 +0300 Subject: [PATCH 4/4] Drop `sys.getsizeof` part from the PR --- Doc/library/sys.rst | 2 +- Python/clinic/sysmodule.c.h | 75 ++----------------------------------- Python/sysmodule.c | 39 ++++++++++--------- 3 files changed, 24 insertions(+), 92 deletions(-) diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 087a3454c33272..d651cc28cf79cd 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -1666,7 +1666,7 @@ always available. ``'opcode'`` event type added; :attr:`~frame.f_trace_lines` and :attr:`~frame.f_trace_opcodes` attributes added to frames -.. function:: set_asyncgen_hooks([firstiter] [, finalizer]) +.. function:: set_asyncgen_hooks(*, firstiter=None, finalizer=None) Accepts two optional keyword arguments which are callables that accept an :term:`asynchronous generator iterator` as an argument. The *firstiter* diff --git a/Python/clinic/sysmodule.c.h b/Python/clinic/sysmodule.c.h index b3d063c55dd747..89c71ce6f84b34 100644 --- a/Python/clinic/sysmodule.c.h +++ b/Python/clinic/sysmodule.c.h @@ -580,12 +580,9 @@ sys_get_coroutine_origin_tracking_depth(PyObject *module, PyObject *Py_UNUSED(ig } PyDoc_STRVAR(sys_set_asyncgen_hooks__doc__, -"set_asyncgen_hooks($module, /, firstiter=,\n" -" finalizer=)\n" +"set_asyncgen_hooks($module, /, firstiter=None, finalizer=None)\n" "--\n" "\n" -"set_asyncgen_hooks([firstiter] [, finalizer])\n" -"\n" "Set a finalizer for async generators objects."); #define SYS_SET_ASYNCGEN_HOOKS_METHODDEF \ @@ -626,8 +623,8 @@ sys_set_asyncgen_hooks(PyObject *module, PyObject *const *args, Py_ssize_t nargs #undef KWTUPLE PyObject *argsbuf[2]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; - PyObject *firstiter = NULL; - PyObject *finalizer = NULL; + PyObject *firstiter = Py_None; + PyObject *finalizer = Py_None; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf); if (!args) { @@ -923,70 +920,6 @@ sys_set_int_max_str_digits(PyObject *module, PyObject *const *args, Py_ssize_t n return return_value; } -PyDoc_STRVAR(sys_getsizeof__doc__, -"getsizeof($module, /, object, default=)\n" -"--\n" -"\n" -"getsizeof(object [, default]) -> int\n" -"\n" -"Return the size of object in bytes."); - -#define SYS_GETSIZEOF_METHODDEF \ - {"getsizeof", _PyCFunction_CAST(sys_getsizeof), METH_FASTCALL|METH_KEYWORDS, sys_getsizeof__doc__}, - -static PyObject * -sys_getsizeof_impl(PyObject *module, PyObject *object, PyObject *dflt); - -static PyObject * -sys_getsizeof(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) -{ - PyObject *return_value = NULL; - #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(object), &_Py_ID(default), }, - }; - #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[] = {"object", "default", NULL}; - static _PyArg_Parser _parser = { - .keywords = _keywords, - .fname = "getsizeof", - .kwtuple = KWTUPLE, - }; - #undef KWTUPLE - PyObject *argsbuf[2]; - Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; - PyObject *object; - PyObject *dflt = NULL; - - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); - if (!args) { - goto exit; - } - object = args[0]; - if (!noptargs) { - goto skip_optional_pos; - } - dflt = args[1]; -skip_optional_pos: - return_value = sys_getsizeof_impl(module, object, dflt); - -exit: - return return_value; -} - PyDoc_STRVAR(sys_getrefcount__doc__, "getrefcount($module, object, /)\n" "--\n" @@ -1639,4 +1572,4 @@ sys__get_cpu_count_config(PyObject *module, PyObject *Py_UNUSED(ignored)) #ifndef SYS_GETANDROIDAPILEVEL_METHODDEF #define SYS_GETANDROIDAPILEVEL_METHODDEF #endif /* !defined(SYS_GETANDROIDAPILEVEL_METHODDEF) */ -/*[clinic end generated code: output=81568733e71fe5a0 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=2aa9dd082c0d9464 input=a9049054013a1b77]*/ diff --git a/Python/sysmodule.c b/Python/sysmodule.c index a6c4d65f56472b..2abd764309787d 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1376,10 +1376,8 @@ static PyStructSequence_Desc asyncgen_hooks_desc = { /*[clinic input] sys.set_asyncgen_hooks - firstiter: object = NULL - finalizer: object = NULL - -set_asyncgen_hooks([firstiter] [, finalizer]) + firstiter: object = None + finalizer: object = None Set a finalizer for async generators objects. [clinic start generated code]*/ @@ -1387,7 +1385,7 @@ Set a finalizer for async generators objects. static PyObject * sys_set_asyncgen_hooks_impl(PyObject *module, PyObject *firstiter, PyObject *finalizer) -/*[clinic end generated code: output=6fe3b2dd3f9a9db5 input=abe3687861bb9e94]*/ +/*[clinic end generated code: output=6fe3b2dd3f9a9db5 input=3664f349bc833d43]*/ { if (finalizer && finalizer != Py_None) { if (!PyCallable_Check(finalizer)) { @@ -1900,25 +1898,20 @@ _PySys_GetSizeOf(PyObject *o) return (size_t)size + presize; } -/*[clinic input] -sys.getsizeof - - object: object - default as dflt: object = NULL - -getsizeof(object [, default]) -> int - -Return the size of object in bytes. -[clinic start generated code]*/ - static PyObject * -sys_getsizeof_impl(PyObject *module, PyObject *object, PyObject *dflt) -/*[clinic end generated code: output=3f326a2f59e30975 input=d21ca2aef11d2ff4]*/ +sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds) { + static char *kwlist[] = {"object", "default", 0}; size_t size; + PyObject *o, *dflt = NULL; PyThreadState *tstate = _PyThreadState_GET(); - size = _PySys_GetSizeOf(object); + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:getsizeof", + kwlist, &o, &dflt)) { + return NULL; + } + + size = _PySys_GetSizeOf(o); if (size == (size_t)-1 && _PyErr_Occurred(tstate)) { /* Has a default value been given */ @@ -1933,6 +1926,11 @@ sys_getsizeof_impl(PyObject *module, PyObject *object, PyObject *dflt) return PyLong_FromSize_t(size); } +PyDoc_STRVAR(getsizeof_doc, +"getsizeof(object [, default]) -> int\n\ +\n\ +Return the size of object in bytes."); + /*[clinic input] sys.getrefcount -> Py_ssize_t @@ -2509,7 +2507,8 @@ static PyMethodDef sys_methods[] = { SYS_GETTOTALREFCOUNT_METHODDEF SYS_GETREFCOUNT_METHODDEF SYS_GETRECURSIONLIMIT_METHODDEF - SYS_GETSIZEOF_METHODDEF + {"getsizeof", _PyCFunction_CAST(sys_getsizeof), + METH_VARARGS | METH_KEYWORDS, getsizeof_doc}, SYS__GETFRAME_METHODDEF SYS__GETFRAMEMODULENAME_METHODDEF SYS_GETWINDOWSVERSION_METHODDEF