目前学习到第三章PyListObject的内容,在最后一小节Hack PyListObject操作的时候,作者并没有给源代码,这里是我的修改。
static int
list_print(PyListObject *op, FILE *fp, int flags)
{
int rc;
Py_ssize_t i;
PyObject *item;
rc = Py_ReprEnter((PyObject*)op);
if (rc != 0) {
if (rc < 0)
return rc;
Py_BEGIN_ALLOW_THREADS
fprintf(fp, "[...]");
Py_END_ALLOW_THREADS
return 0;
}
Py_BEGIN_ALLOW_THREADS
fprintf(fp, "[");
Py_END_ALLOW_THREADS
for (i = 0; i < Py_SIZE(op); i++) {
item = op->ob_item[i];
Py_INCREF(item);
if (i > 0) {
Py_BEGIN_ALLOW_THREADS
fprintf(fp, ", ");
Py_END_ALLOW_THREADS
}
if (PyObject_Print(item, fp, 0) != 0) {
Py_DECREF(item);
Py_ReprLeave((PyObject *)op);
return -1;
}
Py_DECREF(item);
}
Py_BEGIN_ALLOW_THREADS
fprintf(fp, "]");
Py_END_ALLOW_THREADS
Py_ReprLeave((PyObject *)op);
// -------------------------------
printf("\nallocated=%d, ob_size=%d\n", op->allocated, op->ob_size);
printf("num_free_lists=%d\n", numfree);
// -------------------------------
return 0;
}
修改的代码在// -------------------------------
之间,放在这个函数的其他地方也可以,但是注意不要放在
Py_BEGIN_ALLOW_THREADS
fprintf(fp, "]");
Py_END_ALLOW_THREADS
之间,这块代码之间开启了一个线程,由于我在第一次改代码的时候就已经试过错了,所以不会再犯了,详情请看我的另一篇文章《Python源码剖析》笔记 int_print()
PS.最后查看PyListObject对象缓冲池的使用,也可以在命令行中查看,有一些不同,但效果是一样的。
如图:
或者:
本人是C语言小白,没怎么接触过C语言,现在在研究Python源码,如果有什么错误,欢迎各位大佬指正,感谢!
5.迷宫 下图给出了一个迷宫的平面图其中标记为1 的为障碍标记为0 的为可 以通行...
3月11日消息 外媒 Windows Latest 报道,如果你一直在等待 Windows 10 21H1 的 I...
cocoapods-hmap-prebuilt 是什么? cocoapods-hmap-prebuilt 是美团平台迭代组自...
将以下代码放到一个单独的页面checkcode.asp %Option ExplicitResponse.buffer=t...
1、前言 在上一期中 [开源]基于姿态估计的运动计数APP开发二 中我们已经完成了仰...
作为开放源码定义的管理者,Open Source Initiative(OSI)20多年来一直将许可证指...
戳蓝字“ CSDN云计算 ”关注我们哦 作者 |?江子抑 转自 |?编程拯救世界 ? 主要思...
从php5.1.0开始,php.ini里加了date.timezone这个选项,并且默认情况下是关闭的...
油猴脚本(Tampermonkey)是一个非常流行的浏览器扩展,它可以运行由广大社区编...
compilation debug=true 意味着可以插入一些debugger的中断,这样在开发是就可以...