Use newer PyCode API and other fixes (#4916)

* Use PyCode API

* style: pre-commit fixes

* Free locals

* Fix PY_VERSION_HEX check

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
cyyever 2023-11-06 06:08:32 +08:00 committed by GitHub
parent 31b0a5d94f
commit f2606930bf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -2751,10 +2751,15 @@ get_type_override(const void *this_ptr, const type_info *this_type, const char *
if ((std::string) str(f_code->co_name) == name && f_code->co_argcount > 0) { if ((std::string) str(f_code->co_name) == name && f_code->co_argcount > 0) {
PyObject *locals = PyEval_GetLocals(); PyObject *locals = PyEval_GetLocals();
if (locals != nullptr) { if (locals != nullptr) {
# if PY_VERSION_HEX >= 0x030b0000
PyObject *co_varnames = PyCode_GetVarnames(f_code);
# else
PyObject *co_varnames = PyObject_GetAttrString((PyObject *) f_code, "co_varnames"); PyObject *co_varnames = PyObject_GetAttrString((PyObject *) f_code, "co_varnames");
# endif
PyObject *self_arg = PyTuple_GET_ITEM(co_varnames, 0); PyObject *self_arg = PyTuple_GET_ITEM(co_varnames, 0);
Py_DECREF(co_varnames); Py_DECREF(co_varnames);
PyObject *self_caller = dict_getitem(locals, self_arg); PyObject *self_caller = dict_getitem(locals, self_arg);
Py_DECREF(locals);
if (self_caller == self.ptr()) { if (self_caller == self.ptr()) {
Py_DECREF(f_code); Py_DECREF(f_code);
Py_DECREF(frame); Py_DECREF(frame);