@@ -6,6 +6,7 @@ pub(crate) use _asyncio::module_def;
66
77#[ pymodule]
88pub ( crate ) mod _asyncio {
9+ use crate :: common:: wtf8:: { Wtf8Buf , wtf8_concat} ;
910 use crate :: {
1011 common:: lock:: PyRwLock ,
1112 vm:: {
@@ -859,7 +860,7 @@ pub(crate) mod _asyncio {
859860 }
860861 }
861862
862- fn get_future_repr_info ( future : & PyObject , vm : & VirtualMachine ) -> PyResult < String > {
863+ fn get_future_repr_info ( future : & PyObject , vm : & VirtualMachine ) -> PyResult < Wtf8Buf > {
863864 // Try to use asyncio.base_futures._future_repr_info
864865 // Import from sys.modules if available, otherwise try regular import
865866 let sys_modules = vm. sys_module . get_attr ( "modules" , vm) ?;
@@ -892,29 +893,34 @@ pub(crate) mod _asyncio {
892893 Err ( _) => return get_future_repr_info_fallback ( future, vm) ,
893894 } ;
894895
895- let parts: Vec < String > = list
896- . borrow_vec ( )
897- . iter ( )
898- . filter_map ( |x : & PyObjectRef | x. str ( vm) . ok ( ) . map ( |s| s. as_str ( ) . to_string ( ) ) )
899- . collect ( ) ;
900- Ok ( parts. join ( " " ) )
896+ let mut result = Wtf8Buf :: new ( ) ;
897+ let parts = list. borrow_vec ( ) ;
898+ for ( i, x) in parts. iter ( ) . enumerate ( ) {
899+ if i > 0 {
900+ result. push_str ( " " ) ;
901+ }
902+ if let Ok ( s) = x. str ( vm) {
903+ result. push_wtf8 ( s. as_wtf8 ( ) ) ;
904+ }
905+ }
906+ Ok ( result)
901907 }
902908
903- fn get_future_repr_info_fallback ( future : & PyObject , vm : & VirtualMachine ) -> PyResult < String > {
909+ fn get_future_repr_info_fallback ( future : & PyObject , vm : & VirtualMachine ) -> PyResult < Wtf8Buf > {
904910 // Fallback: build repr from properties directly
905911 if let Ok ( Some ( state) ) =
906912 vm. get_attribute_opt ( future. to_owned ( ) , vm. ctx . intern_str ( "_state" ) )
907913 {
908- let state_str = state
914+ let s = state
909915 . str ( vm)
910- . map ( |s| s. as_str ( ) . to_lowercase ( ) )
911- . unwrap_or_else ( |_| "unknown" . to_string ( ) ) ;
912- return Ok ( state_str ) ;
916+ . map ( |s| s. as_wtf8 ( ) . to_lowercase ( ) )
917+ . unwrap_or_else ( |_| Wtf8Buf :: from ( "unknown" ) ) ;
918+ return Ok ( s ) ;
913919 }
914- Ok ( "state=unknown" . to_string ( ) )
920+ Ok ( Wtf8Buf :: from ( "state=unknown" ) )
915921 }
916922
917- fn get_task_repr_info ( task : & PyObject , vm : & VirtualMachine ) -> PyResult < String > {
923+ fn get_task_repr_info ( task : & PyObject , vm : & VirtualMachine ) -> PyResult < Wtf8Buf > {
918924 // vm.import returns the top-level module, get base_tasks submodule
919925 match vm
920926 . import ( "asyncio.base_tasks" , 0 )
@@ -927,12 +933,15 @@ pub(crate) mod _asyncio {
927933 let list: PyListRef = info. downcast ( ) . map_err ( |_| {
928934 vm. new_type_error ( "_task_repr_info should return a list" )
929935 } ) ?;
930- let parts: Vec < String > = list
931- . borrow_vec ( )
932- . iter ( )
933- . map ( |x : & PyObjectRef | x. str ( vm) . map ( |s| s. as_str ( ) . to_string ( ) ) )
934- . collect :: < PyResult < Vec < _ > > > ( ) ?;
935- Ok ( parts. join ( " " ) )
936+ let mut result = Wtf8Buf :: new ( ) ;
937+ let parts = list. borrow_vec ( ) ;
938+ for ( i, x) in parts. iter ( ) . enumerate ( ) {
939+ if i > 0 {
940+ result. push_str ( " " ) ;
941+ }
942+ result. push_wtf8 ( x. str ( vm) ?. as_wtf8 ( ) ) ;
943+ }
944+ Ok ( result)
936945 }
937946 _ => get_future_repr_info ( task, vm) ,
938947 }
@@ -1928,40 +1937,28 @@ pub(crate) mod _asyncio {
19281937 }
19291938
19301939 impl Representable for PyTask {
1931- fn repr_str ( zelf : & Py < Self > , vm : & VirtualMachine ) -> PyResult < String > {
1940+ fn repr_wtf8 ( zelf : & Py < Self > , vm : & VirtualMachine ) -> PyResult < Wtf8Buf > {
19321941 let class_name = zelf. class ( ) . name ( ) . to_string ( ) ;
19331942
19341943 if let Some ( _guard) = ReprGuard :: enter ( vm, zelf. as_object ( ) ) {
19351944 // Try to use _task_repr_info if available
19361945 if let Ok ( info) = get_task_repr_info ( zelf. as_object ( ) , vm)
1937- && info != "state=unknown"
1946+ && info. as_bytes ( ) != b "state=unknown"
19381947 {
1939- return Ok ( format ! ( "<{} {}> " , class_name, info) ) ;
1948+ return Ok ( wtf8_concat ! ( "<" , class_name, " " , info, ">" ) ) ;
19401949 }
19411950
19421951 // Fallback: build repr from task properties directly
19431952 let state = zelf. base . fut_state . load ( ) . as_str ( ) . to_lowercase ( ) ;
1944- let name = zelf
1945- . task_name
1946- . read ( )
1947- . as_ref ( )
1948- . and_then ( |n| n. str ( vm) . ok ( ) )
1949- . map ( |s| s. as_str ( ) . to_string ( ) )
1950- . unwrap_or_else ( || "?" . to_string ( ) ) ;
1951- let coro_repr = zelf
1952- . task_coro
1953- . read ( )
1954- . as_ref ( )
1955- . and_then ( |c| c. repr ( vm) . ok ( ) )
1956- . map ( |s| s. as_str ( ) . to_string ( ) )
1957- . unwrap_or_else ( || "?" . to_string ( ) ) ;
1958-
1959- Ok ( format ! (
1960- "<{} {} name='{}' coro={}>" ,
1961- class_name, state, name, coro_repr
1953+ let name = zelf. task_name . read ( ) . as_ref ( ) . and_then ( |n| n. str ( vm) . ok ( ) ) ;
1954+ let coro_repr = zelf. task_coro . read ( ) . as_ref ( ) . and_then ( |c| c. repr ( vm) . ok ( ) ) ;
1955+ let name = name. as_ref ( ) . map_or ( "?" . as_ref ( ) , |s| s. as_wtf8 ( ) ) ;
1956+ let coro_repr = coro_repr. as_ref ( ) . map_or ( "?" . as_ref ( ) , |s| s. as_wtf8 ( ) ) ;
1957+ Ok ( wtf8_concat ! (
1958+ "<" , class_name, " " , state, " name='" , name, "' coro=" , coro_repr, ">"
19621959 ) )
19631960 } else {
1964- Ok ( format ! ( "<{} ...>" , class_name ) )
1961+ Ok ( Wtf8Buf :: from ( format ! ( "<{class_name } ...>" ) ) )
19651962 }
19661963 }
19671964 }
@@ -2151,10 +2148,8 @@ pub(crate) mod _asyncio {
21512148 // Check if task awaits on itself
21522149 let task_obj: PyObjectRef = task. clone ( ) . into ( ) ;
21532150 if result. is ( & task_obj) {
2154- let msg = format ! (
2155- "Task cannot await on itself: {}" ,
2156- task_obj. repr( vm) ?. as_str( )
2157- ) ;
2151+ let task_repr = task_obj. repr ( vm) ?;
2152+ let msg = format ! ( "Task cannot await on itself: {}" , task_repr. as_wtf8( ) ) ;
21582153 task. base . fut_state . store ( FutureState :: Finished ) ;
21592154 * task. base . fut_exception . write ( ) = Some ( vm. new_runtime_error ( msg) . into ( ) ) ;
21602155 PyTask :: schedule_callbacks ( task, vm) ?;
@@ -2254,7 +2249,8 @@ pub(crate) mod _asyncio {
22542249 vm. call_method ( & loop_obj, "call_soon" , ( step_wrapper, ) ) ?;
22552250 }
22562251 } else {
2257- let msg = format ! ( "Task got bad yield: {}" , result. repr( vm) ?. as_str( ) ) ;
2252+ let result_repr = result. repr ( vm) ?;
2253+ let msg = format ! ( "Task got bad yield: {}" , result_repr. as_wtf8( ) ) ;
22582254 task. base . fut_state . store ( FutureState :: Finished ) ;
22592255 * task. base . fut_exception . write ( ) = Some ( vm. new_runtime_error ( msg) . into ( ) ) ;
22602256 PyTask :: schedule_callbacks ( task, vm) ?;
0 commit comments