@@ -16,7 +16,6 @@ use crate::serialize::state::SerializerState;
16
16
use crate :: str:: { PyStr , PyStrSubclass } ;
17
17
use crate :: typeref:: { STR_TYPE , TRUE , VALUE_STR } ;
18
18
use crate :: util:: isize_to_usize;
19
- use compact_str:: CompactString ;
20
19
use core:: ptr:: NonNull ;
21
20
use serde:: ser:: { Serialize , SerializeMap , Serializer } ;
22
21
use smallvec:: SmallVec ;
@@ -297,7 +296,7 @@ impl Serialize for DictSortedKey {
297
296
items. push ( ( key_as_str, value) ) ;
298
297
}
299
298
300
- items . sort_unstable_by ( |a , b| a . 0 . cmp ( b . 0 ) ) ;
299
+ sort_dict_items ( & mut items ) ;
301
300
302
301
let mut map = serializer. serialize_map ( None ) . unwrap ( ) ;
303
302
for ( key, val) in items. iter ( ) {
@@ -310,105 +309,105 @@ impl Serialize for DictSortedKey {
310
309
}
311
310
312
311
#[ 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 > {
314
313
// because of ObType::Enum
315
314
let uni = unsafe { PyStr :: from_ptr_unchecked ( key) . to_str ( ) } ;
316
315
if unlikely ! ( uni. is_none( ) ) {
317
316
Err ( SerializeError :: InvalidStr )
318
317
} else {
319
- Ok ( CompactString :: from ( uni. unwrap ( ) ) )
318
+ Ok ( String :: from ( uni. unwrap ( ) ) )
320
319
}
321
320
}
322
321
323
322
#[ cold]
324
323
#[ 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 > {
326
325
let uni = unsafe { PyStrSubclass :: from_ptr_unchecked ( key) . to_str ( ) } ;
327
326
if unlikely ! ( uni. is_none( ) ) {
328
327
Err ( SerializeError :: InvalidStr )
329
328
} else {
330
- Ok ( CompactString :: from ( uni. unwrap ( ) ) )
329
+ Ok ( String :: from ( uni. unwrap ( ) ) )
331
330
}
332
331
}
333
332
334
333
#[ allow( clippy:: unnecessary_wraps) ]
335
334
#[ 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 > {
337
336
let mut buf = SmallFixedBuffer :: new ( ) ;
338
337
Date :: new ( key) . write_buf ( & mut buf) ;
339
338
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) )
341
340
}
342
341
343
342
#[ inline( never) ]
344
343
fn non_str_datetime (
345
344
key : * mut pyo3_ffi:: PyObject ,
346
345
opts : crate :: opt:: Opt ,
347
- ) -> Result < CompactString , SerializeError > {
346
+ ) -> Result < String , SerializeError > {
348
347
let mut buf = SmallFixedBuffer :: new ( ) ;
349
348
let dt = DateTime :: new ( key, opts) ;
350
349
if dt. write_buf ( & mut buf, opts) . is_err ( ) {
351
350
return Err ( SerializeError :: DatetimeLibraryUnsupported ) ;
352
351
}
353
352
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) )
355
354
}
356
355
357
356
#[ cold]
358
357
#[ inline( never) ]
359
358
fn non_str_time (
360
359
key : * mut pyo3_ffi:: PyObject ,
361
360
opts : crate :: opt:: Opt ,
362
- ) -> Result < CompactString , SerializeError > {
361
+ ) -> Result < String , SerializeError > {
363
362
let mut buf = SmallFixedBuffer :: new ( ) ;
364
363
let time = Time :: new ( key, opts) ;
365
364
if time. write_buf ( & mut buf) . is_err ( ) {
366
365
return Err ( SerializeError :: TimeHasTzinfo ) ;
367
366
}
368
367
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) )
370
369
}
371
370
372
371
#[ allow( clippy:: unnecessary_wraps) ]
373
372
#[ 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 > {
375
374
let mut buf = SmallFixedBuffer :: new ( ) ;
376
375
UUID :: new ( key) . write_buf ( & mut buf) ;
377
376
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) )
379
378
}
380
379
381
380
#[ allow( clippy:: unnecessary_wraps) ]
382
381
#[ cold]
383
382
#[ 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 > {
385
384
let val = ffi ! ( PyFloat_AS_DOUBLE ( key) ) ;
386
385
if !val. is_finite ( ) {
387
- Ok ( CompactString :: const_new ( "null" ) )
386
+ Ok ( String :: from ( "null" ) )
388
387
} else {
389
- Ok ( CompactString :: from ( ryu:: Buffer :: new ( ) . format_finite ( val) ) )
388
+ Ok ( String :: from ( ryu:: Buffer :: new ( ) . format_finite ( val) ) )
390
389
}
391
390
}
392
391
393
392
#[ allow( clippy:: unnecessary_wraps) ]
394
393
#[ 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 > {
396
395
let ival = ffi ! ( PyLong_AsLongLong ( key) ) ;
397
396
if unlikely ! ( ival == -1 && !ffi!( PyErr_Occurred ( ) ) . is_null( ) ) {
398
397
ffi ! ( PyErr_Clear ( ) ) ;
399
398
let uval = ffi ! ( PyLong_AsUnsignedLongLong ( key) ) ;
400
399
if unlikely ! ( uval == u64 :: MAX && !ffi!( PyErr_Occurred ( ) ) . is_null( ) ) {
401
400
return Err ( SerializeError :: DictIntegerKey64Bit ) ;
402
401
}
403
- Ok ( CompactString :: from ( itoa:: Buffer :: new ( ) . format ( uval) ) )
402
+ Ok ( String :: from ( itoa:: Buffer :: new ( ) . format ( uval) ) )
404
403
} else {
405
- Ok ( CompactString :: from ( itoa:: Buffer :: new ( ) . format ( ival) ) )
404
+ Ok ( String :: from ( itoa:: Buffer :: new ( ) . format ( ival) ) )
406
405
}
407
406
}
408
407
409
408
#[ 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 ) ) ;
412
411
}
413
412
414
413
pub ( crate ) struct DictNonStrKey {
@@ -421,14 +420,14 @@ impl DictNonStrKey {
421
420
fn pyobject_to_string (
422
421
key : * mut pyo3_ffi:: PyObject ,
423
422
opts : crate :: opt:: Opt ,
424
- ) -> Result < CompactString , SerializeError > {
423
+ ) -> Result < String , SerializeError > {
425
424
match pyobject_to_obtype ( key, opts) {
426
- ObType :: None => Ok ( CompactString :: const_new ( "null" ) ) ,
425
+ ObType :: None => Ok ( String :: from ( "null" ) ) ,
427
426
ObType :: Bool => {
428
427
if unsafe { core:: ptr:: eq ( key, TRUE ) } {
429
- Ok ( CompactString :: const_new ( "true" ) )
428
+ Ok ( String :: from ( "true" ) )
430
429
} else {
431
- Ok ( CompactString :: const_new ( "false" ) )
430
+ Ok ( String :: from ( "false" ) )
432
431
}
433
432
}
434
433
ObType :: Int => non_str_int ( key) ,
@@ -475,7 +474,7 @@ impl Serialize for DictNonStrKey {
475
474
let len = isize_to_usize ( ffi ! ( Py_SIZE ( self . ptr) ) ) ;
476
475
assume ! ( len > 0 ) ;
477
476
478
- let mut items: SmallVec < [ ( CompactString , * mut pyo3_ffi:: PyObject ) ; 8 ] > =
477
+ let mut items: SmallVec < [ ( String , * mut pyo3_ffi:: PyObject ) ; 8 ] > =
479
478
SmallVec :: with_capacity ( len) ;
480
479
481
480
for _ in 0 ..len {
@@ -487,7 +486,7 @@ impl Serialize for DictNonStrKey {
487
486
if is_type ! ( ob_type!( key) , STR_TYPE ) {
488
487
match unsafe { PyStr :: from_ptr_unchecked ( key) . to_str ( ) } {
489
488
Some ( uni) => {
490
- items. push ( ( CompactString :: from ( uni) , value) ) ;
489
+ items. push ( ( String :: from ( uni) , value) ) ;
491
490
}
492
491
None => err ! ( SerializeError :: InvalidStr ) ,
493
492
}
@@ -499,12 +498,18 @@ impl Serialize for DictNonStrKey {
499
498
}
500
499
}
501
500
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
+
502
507
if opt_enabled ! ( opts, SORT_KEYS ) {
503
- sort_non_str_dict_items ( & mut items ) ;
508
+ sort_dict_items ( & mut items_as_str ) ;
504
509
}
505
510
506
511
let mut map = serializer. serialize_map ( None ) . unwrap ( ) ;
507
- for ( key, val) in items . iter ( ) {
512
+ for ( key, val) in items_as_str . iter ( ) {
508
513
let pyvalue = PyObjectSerializer :: new ( * val, self . state , self . default ) ;
509
514
map. serialize_key ( key) . unwrap ( ) ;
510
515
map. serialize_value ( & pyvalue) ?;
0 commit comments