Skip to content

Commit 2ecdbb1

Browse files
committed
Fix mypyc failing to compile on CPython 3.10.0a6
_PyObject_HasAttrId() has been removed in python/cpython#22629
1 parent a503132 commit 2ecdbb1

File tree

2 files changed

+17
-3
lines changed

2 files changed

+17
-3
lines changed

mypyc/lib-rt/dict_ops.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,10 +112,16 @@ int CPyDict_Update(PyObject *dict, PyObject *stuff) {
112112
}
113113

114114
int CPyDict_UpdateFromAny(PyObject *dict, PyObject *stuff) {
115+
PyObject *tmp;
116+
115117
if (PyDict_CheckExact(dict)) {
116118
// Argh this sucks
117119
_Py_IDENTIFIER(keys);
118-
if (PyDict_Check(stuff) || _PyObject_HasAttrId(stuff, &PyId_keys)) {
120+
int hasAttr = PyDict_Check(stuff) || _PyObject_LookupAttrId(stuff, &PyId_keys, &tmp);
121+
if (tmp) {
122+
Py_DECREF(tmp);
123+
}
124+
if (hasAttr) {
119125
return PyDict_Update(dict, stuff);
120126
} else {
121127
return PyDict_MergeFromSeq2(dict, stuff, 1);
@@ -126,6 +132,8 @@ int CPyDict_UpdateFromAny(PyObject *dict, PyObject *stuff) {
126132
}
127133

128134
PyObject *CPyDict_FromAny(PyObject *obj) {
135+
PyObject *tmp;
136+
129137
if (PyDict_Check(obj)) {
130138
return PyDict_Copy(obj);
131139
} else {
@@ -135,11 +143,14 @@ PyObject *CPyDict_FromAny(PyObject *obj) {
135143
return NULL;
136144
}
137145
_Py_IDENTIFIER(keys);
138-
if (_PyObject_HasAttrId(obj, &PyId_keys)) {
146+
if (_PyObject_LookupAttrId(obj, &PyId_keys, &tmp)) {
139147
res = PyDict_Update(dict, obj);
140148
} else {
141149
res = PyDict_MergeFromSeq2(dict, obj, 1);
142150
}
151+
if (tmp) {
152+
Py_DECREF(tmp);
153+
}
143154
if (res < 0) {
144155
Py_DECREF(dict);
145156
return NULL;

mypyc/test-data/run-misc.test

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -940,7 +940,10 @@ import sys
940940

941941
# We lie about the version we are running in tests if it is 3.5, so
942942
# that hits a crash case.
943-
if sys.version_info[:2] == (3, 9):
943+
if sys.version_info[:2] == (3, 10):
944+
def version() -> int:
945+
return 10
946+
elif sys.version_info[:2] == (3, 9):
944947
def version() -> int:
945948
return 9
946949
elif sys.version_info[:2] == (3, 8):

0 commit comments

Comments
 (0)