概要
Pythonの構造を理解する助けとして、C APIのドキュメントを読み砕いていく。
内容
環境
Python 3.7 (CPython)に話を固定するため、
以下のコミットに話を限定したいが、必ずしもそうはならない。
tree (コミット; ブランチ)
(↑ githubのリンク)
内容
Py_INCREF(o)
<概説>
オブジェクトo
に対する参照カウントを一つ増やす。(出典)
<定義>
定義 (cpython/Include/object.h)
static inline void _Py_INCREF(PyObject *op)
{
#ifdef Py_REF_DEBUG
_Py_RefTotal++;
#endif
op->ob_refcnt++;
}
#define Py_INCREF(op) _Py_INCREF(_PyObject_CAST(op))
(定義出典)
<使用例>
使用例 (cpython/Objects/classobject.c)
Py_INCREF(func);
im->im_func = func;
(使用例出典)
Py_DECREF(o)
<概説>
オブジェクトo
に対する参照カウントを一つ減らす。参照カウントがゼロになったら、オブジェクトの型のメモリ解放関数 (NULL
であってはならない) が呼ばれる。(出典)
<定義>
定義 (cpython/Include/object.h)
static inline void _Py_DECREF(
PyObject *op)
{
if (--op->ob_refcnt != 0) {
}
else {
_Py_Dealloc(op);
}
}
(中略)
# define Py_DECREF(op) _Py_DECREF(_PyObject_CAST(op))
(定義出典)
※大筋を変えない程度に改変した。
<使用例>
使用例 (cpython/Objects/classobject.c)
Py_DECREF(im->im_func);
(使用例出典)
蛇足
Python.h
...
#include "object.h"
...
参考にさせていただいた本・頁
上記参照
感想
内部を見れているようで面白かった。
今後
続けていきたい。