2016-02-19 3 views
7

ソースコードでは、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は次のオブジェクトではありません。

答えて

4

ファイルの先頭にコメントで説明したこの行動:

free_listが利用可能PyIntObjectsの重リンクリストである、彼らのob_typeメンバーの乱用を経て をリンク。

ます。また、ヘッダコメントに応じPyIntObject Sを割り当てfill_free_list機能、に見てみることができます:メインラインは​​

+0

THXです

static PyIntObject * fill_free_list(void) { PyIntObject *p, *q; /* Python's object allocator isn't appropriate for large blocks. */ p = (PyIntObject *) PyMem_MALLOC(sizeof(PyIntBlock)); if (p == NULL) return (PyIntObject *) PyErr_NoMemory(); ((PyIntBlock *)p)->next = block_list; block_list = (PyIntBlock *)p; /* Link the int objects together, from rear to front, then return the address of the last int object in the block. */ p = &((PyIntBlock *)p)->objects[0]; q = p + N_INTOBJECTS; while (--q > p) Py_TYPE(q) = (struct _typeobject *)(q-1); Py_TYPE(q) = NULL; return p + N_INTOBJECTS - 1; } 

、ハハ、読むことをより慎重に必要コード、もう一度ありがとう。 – weidwonder

+0

いつでも歓迎です! – soon

関連する問題