@@ -16,7 +16,6 @@ use crate::serialize::state::SerializerState;
1616use crate :: str:: { PyStr , PyStrSubclass } ;
1717use crate :: typeref:: { STR_TYPE , TRUE , VALUE_STR } ;
1818use crate :: util:: isize_to_usize;
19- use compact_str:: CompactString ;
2019use core:: ptr:: NonNull ;
2120use serde:: ser:: { Serialize , SerializeMap , Serializer } ;
2221use smallvec:: SmallVec ;
@@ -297,7 +296,7 @@ impl Serialize for DictSortedKey {
297296 items. push ( ( key_as_str, value) ) ;
298297 }
299298
300- items . sort_unstable_by ( |a , b| a . 0 . cmp ( b . 0 ) ) ;
299+ sort_dict_items ( & mut items ) ;
301300
302301 let mut map = serializer. serialize_map ( None ) . unwrap ( ) ;
303302 for ( key, val) in items. iter ( ) {
@@ -310,105 +309,105 @@ impl Serialize for DictSortedKey {
310309}
311310
312311#[ inline( never) ]
313- fn non_str_str ( key : * mut pyo3_ffi:: PyObject ) -> Result < CompactString , SerializeError > {
312+ fn non_str_str ( key : * mut pyo3_ffi:: PyObject ) -> Result < String , SerializeError > {
314313 // because of ObType::Enum
315314 let uni = unsafe { PyStr :: from_ptr_unchecked ( key) . to_str ( ) } ;
316315 if unlikely ! ( uni. is_none( ) ) {
317316 Err ( SerializeError :: InvalidStr )
318317 } else {
319- Ok ( CompactString :: from ( uni. unwrap ( ) ) )
318+ Ok ( String :: from ( uni. unwrap ( ) ) )
320319 }
321320}
322321
323322#[ cold]
324323#[ inline( never) ]
325- fn non_str_str_subclass ( key : * mut pyo3_ffi:: PyObject ) -> Result < CompactString , SerializeError > {
324+ fn non_str_str_subclass ( key : * mut pyo3_ffi:: PyObject ) -> Result < String , SerializeError > {
326325 let uni = unsafe { PyStrSubclass :: from_ptr_unchecked ( key) . to_str ( ) } ;
327326 if unlikely ! ( uni. is_none( ) ) {
328327 Err ( SerializeError :: InvalidStr )
329328 } else {
330- Ok ( CompactString :: from ( uni. unwrap ( ) ) )
329+ Ok ( String :: from ( uni. unwrap ( ) ) )
331330 }
332331}
333332
334333#[ allow( clippy:: unnecessary_wraps) ]
335334#[ inline( never) ]
336- fn non_str_date ( key : * mut pyo3_ffi:: PyObject ) -> Result < CompactString , SerializeError > {
335+ fn non_str_date ( key : * mut pyo3_ffi:: PyObject ) -> Result < String , SerializeError > {
337336 let mut buf = SmallFixedBuffer :: new ( ) ;
338337 Date :: new ( key) . write_buf ( & mut buf) ;
339338 let key_as_str = str_from_slice ! ( buf. as_ptr( ) , buf. len( ) ) ;
340- Ok ( CompactString :: from ( key_as_str) )
339+ Ok ( String :: from ( key_as_str) )
341340}
342341
343342#[ inline( never) ]
344343fn non_str_datetime (
345344 key : * mut pyo3_ffi:: PyObject ,
346345 opts : crate :: opt:: Opt ,
347- ) -> Result < CompactString , SerializeError > {
346+ ) -> Result < String , SerializeError > {
348347 let mut buf = SmallFixedBuffer :: new ( ) ;
349348 let dt = DateTime :: new ( key, opts) ;
350349 if dt. write_buf ( & mut buf, opts) . is_err ( ) {
351350 return Err ( SerializeError :: DatetimeLibraryUnsupported ) ;
352351 }
353352 let key_as_str = str_from_slice ! ( buf. as_ptr( ) , buf. len( ) ) ;
354- Ok ( CompactString :: from ( key_as_str) )
353+ Ok ( String :: from ( key_as_str) )
355354}
356355
357356#[ cold]
358357#[ inline( never) ]
359358fn non_str_time (
360359 key : * mut pyo3_ffi:: PyObject ,
361360 opts : crate :: opt:: Opt ,
362- ) -> Result < CompactString , SerializeError > {
361+ ) -> Result < String , SerializeError > {
363362 let mut buf = SmallFixedBuffer :: new ( ) ;
364363 let time = Time :: new ( key, opts) ;
365364 if time. write_buf ( & mut buf) . is_err ( ) {
366365 return Err ( SerializeError :: TimeHasTzinfo ) ;
367366 }
368367 let key_as_str = str_from_slice ! ( buf. as_ptr( ) , buf. len( ) ) ;
369- Ok ( CompactString :: from ( key_as_str) )
368+ Ok ( String :: from ( key_as_str) )
370369}
371370
372371#[ allow( clippy:: unnecessary_wraps) ]
373372#[ inline( never) ]
374- fn non_str_uuid ( key : * mut pyo3_ffi:: PyObject ) -> Result < CompactString , SerializeError > {
373+ fn non_str_uuid ( key : * mut pyo3_ffi:: PyObject ) -> Result < String , SerializeError > {
375374 let mut buf = SmallFixedBuffer :: new ( ) ;
376375 UUID :: new ( key) . write_buf ( & mut buf) ;
377376 let key_as_str = str_from_slice ! ( buf. as_ptr( ) , buf. len( ) ) ;
378- Ok ( CompactString :: from ( key_as_str) )
377+ Ok ( String :: from ( key_as_str) )
379378}
380379
381380#[ allow( clippy:: unnecessary_wraps) ]
382381#[ cold]
383382#[ inline( never) ]
384- fn non_str_float ( key : * mut pyo3_ffi:: PyObject ) -> Result < CompactString , SerializeError > {
383+ fn non_str_float ( key : * mut pyo3_ffi:: PyObject ) -> Result < String , SerializeError > {
385384 let val = ffi ! ( PyFloat_AS_DOUBLE ( key) ) ;
386385 if !val. is_finite ( ) {
387- Ok ( CompactString :: const_new ( "null" ) )
386+ Ok ( String :: from ( "null" ) )
388387 } else {
389- Ok ( CompactString :: from ( ryu:: Buffer :: new ( ) . format_finite ( val) ) )
388+ Ok ( String :: from ( ryu:: Buffer :: new ( ) . format_finite ( val) ) )
390389 }
391390}
392391
393392#[ allow( clippy:: unnecessary_wraps) ]
394393#[ inline( never) ]
395- fn non_str_int ( key : * mut pyo3_ffi:: PyObject ) -> Result < CompactString , SerializeError > {
394+ fn non_str_int ( key : * mut pyo3_ffi:: PyObject ) -> Result < String , SerializeError > {
396395 let ival = ffi ! ( PyLong_AsLongLong ( key) ) ;
397396 if unlikely ! ( ival == -1 && !ffi!( PyErr_Occurred ( ) ) . is_null( ) ) {
398397 ffi ! ( PyErr_Clear ( ) ) ;
399398 let uval = ffi ! ( PyLong_AsUnsignedLongLong ( key) ) ;
400399 if unlikely ! ( uval == u64 :: MAX && !ffi!( PyErr_Occurred ( ) ) . is_null( ) ) {
401400 return Err ( SerializeError :: DictIntegerKey64Bit ) ;
402401 }
403- Ok ( CompactString :: from ( itoa:: Buffer :: new ( ) . format ( uval) ) )
402+ Ok ( String :: from ( itoa:: Buffer :: new ( ) . format ( uval) ) )
404403 } else {
405- Ok ( CompactString :: from ( itoa:: Buffer :: new ( ) . format ( ival) ) )
404+ Ok ( String :: from ( itoa:: Buffer :: new ( ) . format ( ival) ) )
406405 }
407406}
408407
409408#[ inline( never) ]
410- fn sort_non_str_dict_items ( items : & mut SmallVec < [ ( CompactString , * mut pyo3_ffi:: PyObject ) ; 8 ] > ) {
411- items. sort_unstable_by ( |a, b| a. 0 . cmp ( & b. 0 ) ) ;
409+ fn sort_dict_items ( items : & mut SmallVec < [ ( & str , * mut pyo3_ffi:: PyObject ) ; 8 ] > ) {
410+ items. sort_unstable_by ( |a, b| a. 0 . cmp ( b. 0 ) ) ;
412411}
413412
414413pub ( crate ) struct DictNonStrKey {
@@ -421,14 +420,14 @@ impl DictNonStrKey {
421420 fn pyobject_to_string (
422421 key : * mut pyo3_ffi:: PyObject ,
423422 opts : crate :: opt:: Opt ,
424- ) -> Result < CompactString , SerializeError > {
423+ ) -> Result < String , SerializeError > {
425424 match pyobject_to_obtype ( key, opts) {
426- ObType :: None => Ok ( CompactString :: const_new ( "null" ) ) ,
425+ ObType :: None => Ok ( String :: from ( "null" ) ) ,
427426 ObType :: Bool => {
428427 if unsafe { core:: ptr:: eq ( key, TRUE ) } {
429- Ok ( CompactString :: const_new ( "true" ) )
428+ Ok ( String :: from ( "true" ) )
430429 } else {
431- Ok ( CompactString :: const_new ( "false" ) )
430+ Ok ( String :: from ( "false" ) )
432431 }
433432 }
434433 ObType :: Int => non_str_int ( key) ,
@@ -475,7 +474,7 @@ impl Serialize for DictNonStrKey {
475474 let len = isize_to_usize ( ffi ! ( Py_SIZE ( self . ptr) ) ) ;
476475 assume ! ( len > 0 ) ;
477476
478- let mut items: SmallVec < [ ( CompactString , * mut pyo3_ffi:: PyObject ) ; 8 ] > =
477+ let mut items: SmallVec < [ ( String , * mut pyo3_ffi:: PyObject ) ; 8 ] > =
479478 SmallVec :: with_capacity ( len) ;
480479
481480 for _ in 0 ..len {
@@ -487,7 +486,7 @@ impl Serialize for DictNonStrKey {
487486 if is_type ! ( ob_type!( key) , STR_TYPE ) {
488487 match unsafe { PyStr :: from_ptr_unchecked ( key) . to_str ( ) } {
489488 Some ( uni) => {
490- items. push ( ( CompactString :: from ( uni) , value) ) ;
489+ items. push ( ( String :: from ( uni) , value) ) ;
491490 }
492491 None => err ! ( SerializeError :: InvalidStr ) ,
493492 }
@@ -499,12 +498,18 @@ impl Serialize for DictNonStrKey {
499498 }
500499 }
501500
501+ let mut items_as_str: SmallVec < [ ( & str , * mut pyo3_ffi:: PyObject ) ; 8 ] > =
502+ SmallVec :: with_capacity ( len) ;
503+ items
504+ . iter ( )
505+ . for_each ( |( key, val) | items_as_str. push ( ( ( * key) . as_str ( ) , * val) ) ) ;
506+
502507 if opt_enabled ! ( opts, SORT_KEYS ) {
503- sort_non_str_dict_items ( & mut items ) ;
508+ sort_dict_items ( & mut items_as_str ) ;
504509 }
505510
506511 let mut map = serializer. serialize_map ( None ) . unwrap ( ) ;
507- for ( key, val) in items . iter ( ) {
512+ for ( key, val) in items_as_str . iter ( ) {
508513 let pyvalue = PyObjectSerializer :: new ( * val, self . state , self . default ) ;
509514 map. serialize_key ( key) . unwrap ( ) ;
510515 map. serialize_value ( & pyvalue) ?;
0 commit comments