Remove Incref/Decref of Specific Immortal Objects
还没有人认领这个 Issue。
- 主要语言
- Python
- 星标
- 77.2k
- 派生
- 36k
- PR 合并指标
- PR 指标待抓取
描述
Feature or enhancement
Proposal:
In various places we incref or decref an object that we already know is a specific immortal object, like None. For example, see gh-117393. These operations are unnecessary and the (small) cost can be avoided.
We could simply drop the increfs and decrefs, but there is value in communicating that we would have done the op if the object weren't known to be immortal. (Furthermore, there's the very, very remote chance that some known-immortal object might be made mortal again some day, for some currently unknown reason. It would be quite hard at the point to know that we should add back in the incref or decref we had removed.)
Here are the options I see:
- leave the existing code alone
- replace the existing code with comments
- replace the existing code with a noop macro (in the internal API)
We probably wouldn't make all the changes we could find all at once, but could at the least point to this issue for the decision on what should be done. If we do add a macro then we'd do it relative to this issue.
Personally, I'd go with the macro. It would communicate the intent to readers just as well as the existing code does or as a comment would. I imagine it would look something like the following:
#ifdef Py_DEBUG
# define Py_INCREF_IMMORTAL(OBJ) \
assert(_Py_IsImmortal(OBJ)
# define Py_DECREF_IMMORTAL(OBJ) \
assert(_Py_IsImmortal(OBJ)
#else
# define Py_INCREF_IMMORTAL(OBJ)
# define Py_DECREF_IMMORTAL(OBJ)
#endif
For None we could be even more explicit:
#define Py_INCREF_NONE() \
Py_INCREF_IMMORTAL(Py_None)
#define Py_DECREF_NONE() \
Py_DECREF_IMMORTAL(Py_None)
// or
#define Py_INCREF_NONE(OBJ) \
do { \
assert(OBJ == Py_None) \
Py_INCREF_IMMORTAL(OBJ) \
} while (0)
#define Py_DECREF_NONE(OBJ) \
do { \
assert(OBJ == Py_None) \
Py_DECREF_IMMORTAL(OBJ) \
} while (0)
CC @eduardo-elizondo
Has this already been discussed elsewhere?
No response given
Links to previous discussion of this feature:
No response
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
先从提案和其中引用的 gh-117393 讨论开始,然后定位针对已知 immortal objects 的现有 incref/decref 操作。比较所述的三个选项,包括提议的 Py_DEBUG 行为,并确定采用哪种 API 选择和范围才算完成;issue 中没有指定文件或测试。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- c
- 领域
- backend
- Issue 类型
- 功能
- 难度
- 5/5
- 预计耗时
- 一周以上
- 活跃度
- 停滞
- 描述清晰度
- 需要澄清
- 新手友好度
- 25/100