在5.5节中,第二个实验中,我使用的是Python2.7.13,由于书中没有提供源代码,我尝试修改了几次,结果和书中些差别:
static void
dict_dealloc(register PyDictObject *mp)
{
register PyDictEntry *ep;
Py_ssize_t fill = mp->ma_fill;
PyObject_GC_UnTrack(mp);
Py_TRASHCAN_SAFE_BEGIN(mp)
for (ep = mp->ma_table; fill > 0; ep++) {
// 调整dict中对象的引用计数
if (ep->me_key) {
--fill;
Py_DECREF(ep->me_key);
Py_XDECREF(ep->me_value);
}
}
// 释放从系统堆中申请的内存空间
if (mp->ma_table != mp->ma_smalltable)
PyMem_DEL(mp->ma_table);
// 将被销毁的PyDictObject对象放入缓冲池
if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type)
// 缓冲池没满,且mp类型是dict
free_list[numfree++] = mp;
else
// 调用mp对应type的free进行销毁
Py_TYPE(mp)->tp_free((PyObject *)mp);
/****************Test Func*******************/
printf("dealloc dict : size %d numfree is : %d\n", mp->ma_used,numfree);
/****************Test Func*******************/
Py_TRASHCAN_SAFE_END(mp)
}
第三个实验具体结果有些不同,但是应该是对的:
static int
dict_print(register PyDictObject *mp, register FILE *fp, register int flags)
{
register Py_ssize_t i;
register Py_ssize_t any;
int status;
status = Py_ReprEnter((PyObject*)mp);
if (status != 0) {
if (status < 0)
return status;
Py_BEGIN_ALLOW_THREADS
fprintf(fp, "{...}");
Py_END_ALLOW_THREADS
return 0;
}
Py_BEGIN_ALLOW_THREADS
fprintf(fp, "{");
Py_END_ALLOW_THREADS
any = 0;
for (i = 0; i <= mp->ma_mask; i++) {
PyDictEntry *ep = mp->ma_table + i;
PyObject *pvalue = ep->me_value;
if (pvalue != NULL) {
/* Prevent PyObject_Repr from deleting value during
key format */
Py_INCREF(pvalue);
if (any++ > 0) {
Py_BEGIN_ALLOW_THREADS
fprintf(fp, ", ");
Py_END_ALLOW_THREADS
}
if (PyObject_Print((PyObject *)ep->me_key, fp, 0)!=0) {
Py_DECREF(pvalue);
Py_ReprLeave((PyObject*)mp);
return -1;
}
Py_BEGIN_ALLOW_THREADS
fprintf(fp, ": ");
Py_END_ALLOW_THREADS
if (PyObject_Print(pvalue, fp, 0) != 0) {
Py_DECREF(pvalue);
Py_ReprLeave((PyObject*)mp);
return -1;
}
Py_DECREF(pvalue);
}
}
Py_BEGIN_ALLOW_THREADS
fprintf(fp, "}");
Py_END_ALLOW_THREADS
Py_ReprLeave((PyObject*)mp);
/****************Test Func*******************/
printf("numfree is : %d\n", numfree);
/****************Test Func*******************/
return 0;
}
这里的d4不知道出现了什么bug,之后再想复现没办法复现: