次のコードスニペットを見たときに、Python用のC拡張機能の作成について学習しようとしているため、ファイルmethodobject.cを読んでいました。
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);
理解すればするほど理解できません。methへのポインターを返していると思います。これは、self(ローカルで宣言されたポインター)とarg(PyCFunctionCallに外部から渡されたポインター)を受け取る関数です。ただし、methとselfがスタックに割り当てられているように見えるため、PyCFunctionCallが終了すると解放され、渡される変数に問題が発生します。
ここで何が欠けていますか?