Skip to content

Commit dab9e77

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 <seandhunt_7@yahoo.com>
1 parent 34dcee2 commit dab9e77

File tree

1 file changed

+27
-49
lines changed

1 file changed

+27
-49
lines changed

src/_pyawaitable/with.c

Lines changed: 27 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ async_with_inner(PyObject *aw, PyObject *res)
2323
Py_DECREF(res);
2424
Py_DECREF(aw);
2525

26+
PyObject *args[3];
2627
if (callback_result < 0) {
2728
PyObject *tp, *val, *tb;
2829
PyErr_Fetch(&tp, &val, &tb);
@@ -40,46 +41,33 @@ async_with_inner(PyObject *aw, PyObject *res)
4041
if (tb == NULL)
4142
tb = Py_NewRef(Py_None);
4243

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) {
53-
return -1;
54-
}
55-
56-
if (PyAwaitable_AddAwait(aw, coro, NULL, NULL) < 0) {
57-
Py_DECREF(coro);
58-
return -1;
59-
}
60-
61-
Py_DECREF(coro);
62-
return 0;
44+
args[0] = tp;
45+
args[1] = val;
46+
args[2] = tb;
6347
}
6448
else {
6549
// OK
66-
PyObject *coro = PyObject_Vectorcall(
50+
args[0] = Py_NewRef(Py_None);
51+
args[1] = Py_NewRef(Py_None);
52+
args[2] = Py_NewRef(Py_None);
53+
}
54+
55+
int result = PyAwaitable_AddExpr(
56+
aw,
57+
PyObject_Vectorcall(
6758
exit,
68-
(PyObject *[]) { Py_None, Py_None, Py_None },
59+
args,
6960
3,
70-
NULL
71-
);
72-
if (coro == NULL) {
73-
return -1;
74-
}
75-
76-
if (PyAwaitable_AddAwait(aw, coro, NULL, NULL) < 0) {
77-
Py_DECREF(coro);
78-
return -1;
79-
}
80-
Py_DECREF(coro);
81-
return 0;
61+
NULL),
62+
NULL,
63+
NULL);
64+
Py_DECREF(args[0]);
65+
Py_DECREF(args[1]);
66+
Py_DECREF(args[2]);
67+
if (result < 0) {
68+
return -1;
8269
}
70+
return 0;
8371
}
8472

8573
_PyAwaitable_API(int)
@@ -134,35 +122,25 @@ PyAwaitable_AsyncWith(
134122

135123
Py_DECREF(exit);
136124

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-
145125
// Note: Errors in __aenter__ are not sent to __aexit__
146126
if (
147-
PyAwaitable_AddAwait(
127+
PyAwaitable_AddExpr(
148128
inner_aw,
149-
coro,
129+
PyObject_CallNoArgs(with),
150130
async_with_inner,
151131
NULL
152132
) < 0
153133
) {
154134
Py_DECREF(inner_aw);
155-
Py_DECREF(coro);
135+
Py_DECREF(with);
156136
return -1;
157137
}
158138

159-
Py_DECREF(coro);
139+
Py_DECREF(with);
160140

161-
if (PyAwaitable_AddAwait(aw, inner_aw, NULL, err) < 0) {
162-
Py_DECREF(inner_aw);
141+
if (PyAwaitable_AddExpr(aw, inner_aw, NULL, err) < 0) {
163142
return -1;
164143
}
165144

166-
Py_DECREF(inner_aw);
167145
return 0;
168146
}

0 commit comments

Comments
 (0)