Я читал через файл methodobject.c, потому что я пытаюсь узнать о создании расширений C для Python, когда я увидел следующий фрагмент кода:Похоже, что C-код в Python C-API возвращает переменную ptr в стек. Что мне не хватает?
PyObject *
PyCFunction_Call(PyObject *func, PyObject *arg, PyObject *kw)
{
PyCFunctionObject* f = (PyCFunctionObject*)func;
PyCFunction meth = PyCFunction_GET_FUNCTION(func);
PyObject *self = PyCFunction_GET_SELF(func);
Py_ssize_t size;
switch (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST)) {
case METH_VARARGS:
if (kw == NULL || PyDict_Size(kw) == 0)
return (*meth)(self, arg);
break;
Чем больше я смотрю на
return (*meth)(self, arg);
Чем больше я понимаю, я не понимаю. I think возвращает указатель на meth, который является функцией, которая принимает self (локально объявленный указатель) и arg (указатель, проходящий внешне в PyCFunctionCall). Тем не менее, поскольку мне кажется, что в стекх выделяются меты, то после выключения PyCFunctionCall они будут освобождены, что вызовет проблемы для любых переменных, к которым они передаются.
Что мне здесь не хватает?
Argh !!! Спасибо. Я чувствую себя идиотом, но, по крайней мере, теперь я просвещен. – user1245262
Вот почему мы здесь. И как отмечает @ams, не чувствуйте себя слишком плохо; синтаксис указателя функции может ввести в заблуждение. – JoeFish