mirror of
https://github.com/python/cpython.git
synced 2025-11-01 06:01:29 +00:00
gh-134043: use _PyObject_GetMethodStackRef in pattern matching (#136356)
This commit is contained in:
parent
5b78c85fb4
commit
89f06a38c0
1 changed files with 6 additions and 4 deletions
|
|
@ -627,12 +627,14 @@ _PyEval_MatchKeys(PyThreadState *tstate, PyObject *map, PyObject *keys)
|
||||||
PyObject *seen = NULL;
|
PyObject *seen = NULL;
|
||||||
PyObject *dummy = NULL;
|
PyObject *dummy = NULL;
|
||||||
PyObject *values = NULL;
|
PyObject *values = NULL;
|
||||||
PyObject *get = NULL;
|
|
||||||
// We use the two argument form of map.get(key, default) for two reasons:
|
// 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.
|
// - Atomically check for a key and get its value without error handling.
|
||||||
// - Don't cause key creation or resizing in dict subclasses like
|
// - Don't cause key creation or resizing in dict subclasses like
|
||||||
// collections.defaultdict that define __missing__ (or similar).
|
// 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) {
|
if (get == NULL) {
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
@ -682,12 +684,12 @@ _PyEval_MatchKeys(PyThreadState *tstate, PyObject *map, PyObject *keys)
|
||||||
}
|
}
|
||||||
// Success:
|
// Success:
|
||||||
done:
|
done:
|
||||||
Py_DECREF(get);
|
_PyThreadState_PopCStackRef(tstate, &cref);
|
||||||
Py_DECREF(seen);
|
Py_DECREF(seen);
|
||||||
Py_DECREF(dummy);
|
Py_DECREF(dummy);
|
||||||
return values;
|
return values;
|
||||||
fail:
|
fail:
|
||||||
Py_XDECREF(get);
|
_PyThreadState_PopCStackRef(tstate, &cref);
|
||||||
Py_XDECREF(seen);
|
Py_XDECREF(seen);
|
||||||
Py_XDECREF(dummy);
|
Py_XDECREF(dummy);
|
||||||
Py_XDECREF(values);
|
Py_XDECREF(values);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue