†__build_class__が実行される様を見ていきます。}前はcall_functionの先は概要だけ説明しましたが今回はこの先についてガチに見ていきます。†call_functionはバイトコード実行と同じceval.cに書かれています。Pythonで書かれた関数。x;}__build_class__の実装はCで書かれているので今回はifの部分が実行されます。Cで実装された関数を実行する_PyCFunction_FastCallKeywordsについて見る前に、そろそろPyObjectについて見ていくことにしましょう。†PyObjectはその名の通りPythonオブジェクトのC表現です。PyObject;_PyObject_HEAD_EXTRAはデバッグオプション付きでビルドされたときのデバッグ情報用メンバなので今回は無視します。参照カウントとTypeObjectへの参照を持っているようです。ob_base;つまり、PyCFunctionObjectの先頭部分はPyObjectということになります。Cに不慣れな方は「え?これ構造体の中に構造体埋め込まれてるけどfunc->ob_base.ob_refcntみたいにアクセスすんの?」と思われるかもしれませんが、そこはポインタマジック、ポインタ経由でアクセスするとぶっちゃけ以下のように定義されているのと同じようにアクセスできます。PyCFunctionObject;全てのオブジェクト表現が共通のヘッダを持っているため、操作をする際には共通要素に依存した処理が書けることになります。ちなみに、PyCFunction_Checkの実装は以下の通りです。&PyCFunction_Type)Py_TYPEはob_typeメンバを取り出すマクロです。†さて次にPyTypeObjectです。PyTypeObject;長い、ってところですがメンバについて詳しいことは次回以降に見ていきます。次にPyCFunction_Typeの定義を見てみましょう。Objects/methodobject.cです。*/};今回の本筋ではありませんが説明しないわけにもいかないので、PyCFunction_Typeはob_typeとしてPyType_Typeを参照します。「PyCFunctionはType型」ということになります。Type型は「型の型」、メタな型です。PyCFunction型が定義されました。大体わかってきましたがPyTypeObjectはPyObjectの型を表すオブジェクトです。別の言語風に言うとクラスオブジェクトといったところでしょうか。一応、オブジェクトが生成されるときにPyTypeObjectが設定される様子を確認しておきましょう。op;}PyObject_INITはまたInclude/objimpl.hに戻ります。)というわけでPyObjectとPyTypeObjectが関連付けられました。長くなりましたがPyObjectについて確認できたのでオブジェクトの型がPyCFunction_Typeの時に実行される_PyCFunction_FastCallKeywordsに進みます。result;}今回はnkwargsは0なのでそのまま_PyCFunction_FastCallDictへ。長いので実行される部分以外は省略。result;}というわけで、Python関数に対応するC言語の関数が実行されることになります。今回は関数実行をスタートにPyObjectについて見ていきました。本当はPyTypeObjectについてもう少し触れようと思ったのですがC実装の関数の場合はTypeObectは識別子ぐらいにしか使われていないので省略しました。心配しなくても(?)後からがっつり見ていくことになります。これでようやく__build_class__に対するbuiltin___build_class__が実行される段階まで来ました。