0
1

More than 3 years have passed since last update.

Python/C APIを読む その2(参照カウント)

Last updated at Posted at 2021-03-25

概要

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"
...

参考にさせていただいた本・頁

上記参照

感想

内部を見れているようで面白かった。

今後

続けていきたい。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1