From: Kumar Aditya Date: Tue, 8 Jul 2025 07:34:50 +0000 (+0530) Subject: gh-134043: use `_PyObject_GetMethodStackRef` in pattern matching (#136356) X-Git-Tag: v3.15.0a1~1058 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=89f06a38c07f8ad72611e3bb545484d71a8a8d1b;p=thirdparty%2FPython%2Fcpython.git gh-134043: use `_PyObject_GetMethodStackRef` in pattern matching (#136356) --- diff --git a/Python/ceval.c b/Python/ceval.c index 50665defd382..291e753dec0c 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -627,12 +627,14 @@ _PyEval_MatchKeys(PyThreadState *tstate, PyObject *map, PyObject *keys) PyObject *seen = NULL; PyObject *dummy = NULL; PyObject *values = NULL; - PyObject *get = NULL; // We use the two argument form of map.get(key, default) for two reasons: // - Atomically check for a key and get its value without error handling. // - Don't cause key creation or resizing in dict subclasses like // collections.defaultdict that define __missing__ (or similar). - int meth_found = _PyObject_GetMethod(map, &_Py_ID(get), &get); + _PyCStackRef cref; + _PyThreadState_PushCStackRef(tstate, &cref); + int meth_found = _PyObject_GetMethodStackRef(tstate, map, &_Py_ID(get), &cref.ref); + PyObject *get = PyStackRef_AsPyObjectBorrow(cref.ref); if (get == NULL) { goto fail; } @@ -682,12 +684,12 @@ _PyEval_MatchKeys(PyThreadState *tstate, PyObject *map, PyObject *keys) } // Success: done: - Py_DECREF(get); + _PyThreadState_PopCStackRef(tstate, &cref); Py_DECREF(seen); Py_DECREF(dummy); return values; fail: - Py_XDECREF(get); + _PyThreadState_PopCStackRef(tstate, &cref); Py_XDECREF(seen); Py_XDECREF(dummy); Py_XDECREF(values);