The use of `PyStackRef_AsPyObjectBorrow` makes it hard to track ownership of references, making analysis of escaping calls too difficult
Ninguém assumiu esta issue ainda.
- Linguagem predominante
- Python
- Estrelas
- 77.2k
- Forks
- 36k
- Métricas de merge de PRs
- Métricas de PR pendentes
Descrição
The problem with PyStackRef_AsPyObjectBorrow is that it is not clear whether the reference is owned by the stack ref or the pointer.
Borrowing references across calls is fine but in less structured code, it is error prone and very hard to analyze.
The solution is change most, ideally all, uses of PyStackRef_AsPyObjectBorrow to PyStackRef_AsPyObjectSteal so that the ownership of the reference is clear.
E.g.
inst(UNARY_NEGATIVE, (value -- res)) {
PyObject *val_o = PyStackRef_AsPyObjectBorrow(value);
PyObject *res_o = PyNumber_Negative(val_o);
PyStackRef_CLOSE(value);
ERROR_IF(res_o == NULL, error);
res = PyStackRef_FromPyObjectSteal(res_o);
}
would become:
inst(UNARY_NEGATIVE, (value -- res)) {
PyObject *val_o = PyStackRef_AsPyObjectSteal(value);
PyObject *res_o = PyNumber_Negative(val_o);
Py_DECREF(val_o);
ERROR_IF(res_o == NULL, error);
res = PyStackRef_FromPyObjectSteal(res_o);
}
This ensures that during the escaping call to PyNumber_Negative, the reference to the value a PyObject *, so will not be reclaimed by the garbage collector.
Linked PRs
- gh-122037
Guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Direção de pesquisa
Pesquise no código-fonte do CPython os usos de PyStackRef_AsPyObjectBorrow e revise os padrões de ownership de PyStackRef_AsPyObjectSteal e PyStackRef_CLOSE mostrados na issue. Determine quais usos atravessam chamadas nas quais as referências podem escapar e, em seguida, verifique se as referências relevantes continuam válidas e se o ownership é explícito; compare o trabalho com o PR vinculado gh-122037.
Escrita pelo modelo de indexação a partir do texto da issue.
Avaliação
- Stack de tecnologia
- c, python
- Domínio
- backend
- Tipo de issue
- Refatoração
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Status de atividade
- Estagnada
- Clareza
- Razoavelmente clara
- Facilidade para iniciantes
- 25/100