Skip to content

Commit bc3d90e

Browse files
committed
Use the new PyAwaitable_AddExpr function inside of PyAwaitable_AsyncWith.
This should simplify its implementation and helps eliminate any duplicate code. Signed-off-by: AraHaan <[email protected]>
1 parent 34dcee2 commit bc3d90e

File tree

1 file changed

+33
-44
lines changed

1 file changed

+33
-44
lines changed

src/_pyawaitable/with.c

Lines changed: 33 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -40,44 +40,43 @@ async_with_inner(PyObject *aw, PyObject *res)
4040
if (tb == NULL)
4141
tb = Py_NewRef(Py_None);
4242

43-
PyObject *coro = PyObject_Vectorcall(
44-
exit,
45-
(PyObject *[]) { tp, val, tb },
46-
3,
47-
NULL
48-
);
49-
Py_DECREF(tp);
50-
Py_DECREF(val);
51-
Py_DECREF(tb);
52-
if (coro == NULL) {
43+
if (
44+
PyAwaitable_AddExpr(
45+
aw,
46+
PyObject_Vectorcall(
47+
exit,
48+
(PyObject *[]) { tp, val, tb },
49+
3,
50+
NULL),
51+
NULL,
52+
NULL) < 0
53+
) {
54+
Py_DECREF(tp);
55+
Py_DECREF(val);
56+
Py_DECREF(tb);
5357
return -1;
5458
}
5559

56-
if (PyAwaitable_AddAwait(aw, coro, NULL, NULL) < 0) {
57-
Py_DECREF(coro);
58-
return -1;
59-
}
60-
61-
Py_DECREF(coro);
60+
Py_DECREF(tp);
61+
Py_DECREF(val);
62+
Py_DECREF(tb);
6263
return 0;
6364
}
6465
else {
6566
// OK
66-
PyObject *coro = PyObject_Vectorcall(
67-
exit,
68-
(PyObject *[]) { Py_None, Py_None, Py_None },
69-
3,
70-
NULL
71-
);
72-
if (coro == NULL) {
67+
if (
68+
PyAwaitable_AddExpr(
69+
aw,
70+
PyObject_Vectorcall(
71+
exit,
72+
(PyObject *[]) { Py_None, Py_None, Py_None },
73+
3,
74+
NULL),
75+
NULL,
76+
NULL) < 0
77+
) {
7378
return -1;
7479
}
75-
76-
if (PyAwaitable_AddAwait(aw, coro, NULL, NULL) < 0) {
77-
Py_DECREF(coro);
78-
return -1;
79-
}
80-
Py_DECREF(coro);
8180
return 0;
8281
}
8382
}
@@ -134,35 +133,25 @@ PyAwaitable_AsyncWith(
134133

135134
Py_DECREF(exit);
136135

137-
PyObject *coro = PyObject_CallNoArgs(with);
138-
Py_DECREF(with);
139-
140-
if (coro == NULL) {
141-
Py_DECREF(inner_aw);
142-
return -1;
143-
}
144-
145136
// Note: Errors in __aenter__ are not sent to __aexit__
146137
if (
147-
PyAwaitable_AddAwait(
138+
PyAwaitable_AddExpr(
148139
inner_aw,
149-
coro,
140+
PyObject_CallNoArgs(with),
150141
async_with_inner,
151142
NULL
152143
) < 0
153144
) {
154145
Py_DECREF(inner_aw);
155-
Py_DECREF(coro);
146+
Py_DECREF(with);
156147
return -1;
157148
}
158149

159-
Py_DECREF(coro);
150+
Py_DECREF(with);
160151

161-
if (PyAwaitable_AddAwait(aw, inner_aw, NULL, err) < 0) {
162-
Py_DECREF(inner_aw);
152+
if (PyAwaitable_AddExpr(aw, inner_aw, NULL, err) < 0) {
163153
return -1;
164154
}
165155

166-
Py_DECREF(inner_aw);
167156
return 0;
168157
}

0 commit comments

Comments
 (0)