ソースコードでは、intオブジェクトの作成方法PyInt_FromLong
は、pythonは、free_listの最初の要素の位置に新しいPyIntObjectを作成します。ここ はコードです:Pythonソースコードはどのようにして "free_list =(PyIntObject *)Py_TYPE(v);"ポインタfree_listを次のオブジェクトに移動しますか?
PyObject *
PyInt_FromLong(long ival)
{
register PyIntObject *v;
#if NSMALLNEGINTS + NSMALLPOSINTS > 0
if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) {
v = small_ints[ival + NSMALLNEGINTS];
Py_INCREF(v);
return (PyObject *) v;
}
#endif
if (free_list == NULL) {
if ((free_list = fill_free_list()) == NULL)
return NULL;
}
/* Inline PyObject_New */
v = free_list;
free_list = (PyIntObject *)Py_TYPE(v);
PyObject_INIT(v, &PyInt_Type);
v->ob_ival = ival;
return (PyObject *) v;
}
とPy_TYPEは次のとおりです。
#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type)
free_list = (PyIntObject *)Py_TYPE(v);
しくみを教えてください。
リスト内の次のオブジェクトを指し示すfree_listに移動します。
Py_TYPE(v)
がPyInt_Type
を返すとしたら、(PyIntObject *)PyInt_Type
は次のオブジェクトではありません。
THXです
、ハハ、読むことをより慎重に必要コード、もう一度ありがとう。 – weidwonder
いつでも歓迎です! – soon