@@ -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