@@ -1899,6 +1899,7 @@ static int handle_route_impl(
18991899 ViewApp * self ;
19001900 Py_ssize_t * size ;
19011901 PyObject * * path_params ;
1902+
19021903 if (PyAwaitable_UnpackValues (
19031904 awaitable ,
19041905 & self ,
@@ -1933,14 +1934,14 @@ static int handle_route_impl(
19331934 NULL
19341935 );
19351936 }
1937+
19361938 PyObject * * params = json_parser (
19371939 & self -> parsers ,
19381940 body ,
19391941 query_obj ,
19401942 r -> inputs ,
19411943 r -> inputs_size
19421944 );
1943-
19441945 Py_DECREF (query_obj );
19451946
19461947 if (!params ) {
@@ -1977,7 +1978,6 @@ static int handle_route_impl(
19771978 NULL
19781979 );
19791980
1980-
19811981 for (int i = 0 ; i < r -> inputs_size + * size ; i ++ )
19821982 Py_DECREF (merged [i ]);
19831983
@@ -1992,22 +1992,33 @@ static int handle_route_impl(
19921992 NULL
19931993 );
19941994
1995- for (int i = 0 ; i < r -> inputs_size ; i ++ ) {
1995+ for (int i = 0 ; i < r -> inputs_size ; i ++ )
19961996 Py_DECREF (params [i ]);
1997- }
19981997 }
19991998
2000- if (!coro ) {
1999+ if (!coro )
20012000 return -1 ;
2002- }
20032001
2004- if (PyAwaitable_AddAwait (
2005- awaitable ,
2006- coro ,
2007- handle_route_callback ,
2008- route_error
2009- ) < 0 ) {
2010- return -1 ;
2002+ if (!Py_IS_TYPE (coro , & PyCoro_Type )) {
2003+ if (handle_route_callback (awaitable , coro ) < 0 ) {
2004+ if (fire_error (
2005+ self ,
2006+ awaitable ,
2007+ 500 ,
2008+ r ,
2009+ NULL
2010+ ) < 0 )
2011+ return -1 ;
2012+ }
2013+ } else {
2014+ if (PyAwaitable_AddAwait (
2015+ awaitable ,
2016+ coro ,
2017+ handle_route_callback ,
2018+ route_error
2019+ ) < 0 ) {
2020+ return -1 ;
2021+ }
20112022 }
20122023
20132024 return 0 ;
@@ -2045,7 +2056,6 @@ static int body_inc_buf(PyObject* awaitable, PyObject* result) {
20452056 return -1 ;
20462057 }
20472058
2048-
20492059 char * buf ;
20502060 Py_ssize_t * size ;
20512061 char * query ;
@@ -2226,9 +2236,8 @@ static int handle_route_query(PyObject* awaitable, char* query) {
22262236 );
22272237 if (!parsed_item ) {
22282238 PyErr_Clear ();
2229- for (int i = 0 ; i < r -> inputs_size ; i ++ ) {
2239+ for (int i = 0 ; i < r -> inputs_size ; i ++ )
22302240 Py_XDECREF (params [i ]);
2231- }
22322241
22332242 free (params );
22342243 Py_DECREF (query_obj );
@@ -2274,18 +2283,30 @@ static int handle_route_query(PyObject* awaitable, char* query) {
22742283 free (params );
22752284 Py_DECREF (query_obj );
22762285
2277-
22782286 if (!coro )
22792287 return -1 ;
22802288
2281- if (PyAwaitable_AddAwait (
2282- awaitable ,
2283- coro ,
2284- handle_route_callback ,
2285- route_error
2286- ) < 0 ) {
2287- Py_DECREF (coro );
2288- return -1 ;
2289+ if (!Py_IS_TYPE (coro , & PyCoro_Type )) {
2290+ if (handle_route_callback (awaitable , coro ) < 0 ) {
2291+ if (fire_error (
2292+ self ,
2293+ awaitable ,
2294+ 500 ,
2295+ r ,
2296+ NULL
2297+ ) < 0 )
2298+ return -1 ;
2299+ }
2300+ } else {
2301+ if (PyAwaitable_AddAwait (
2302+ awaitable ,
2303+ coro ,
2304+ handle_route_callback ,
2305+ route_error
2306+ ) < 0 ) {
2307+ Py_DECREF (coro );
2308+ return -1 ;
2309+ }
22892310 }
22902311
22912312 Py_DECREF (coro );
@@ -2880,6 +2901,7 @@ static PyObject* app(
28802901 } else {
28812902 res_coro = PyObject_CallNoArgs (r -> callable );
28822903 }
2904+
28832905 if (!res_coro ) {
28842906 Py_DECREF (awaitable );
28852907 free (path );
@@ -2898,9 +2920,9 @@ static PyObject* app(
28982920 return awaitable ;
28992921 }
29002922
2901- if (!PyObject_IsInstance (
2923+ if (!Py_IS_TYPE (
29022924 res_coro ,
2903- ( PyObject * ) & PyCoro_Type
2925+ & PyCoro_Type
29042926 )) {
29052927 if (handle_route_callback (
29062928 awaitable ,
0 commit comments