@@ -735,7 +735,7 @@ impl fmt::Debug for Dynamic {
735
735
use std:: collections:: HashSet ;
736
736
737
737
// Avoid infinite recursion for shared values in a reference loop.
738
- fn debug_fmt_print (
738
+ fn checked_debug_fmt (
739
739
f : & mut fmt:: Formatter < ' _ > ,
740
740
value : & Dynamic ,
741
741
dict : & mut HashSet < * const Dynamic > ,
@@ -744,7 +744,7 @@ impl fmt::Debug for Dynamic {
744
744
Union :: Shared ( ref cell, ..) => match crate :: func:: locked_read ( cell) {
745
745
Some ( v) => {
746
746
if dict. insert ( value) {
747
- debug_fmt_print ( f, & v, dict) ?;
747
+ checked_debug_fmt ( f, & v, dict) ?;
748
748
f. write_str ( " (shared)" )
749
749
} else {
750
750
f. write_str ( "<shared>" )
@@ -761,7 +761,7 @@ impl fmt::Debug for Dynamic {
761
761
if i > 0 {
762
762
f. write_str ( ", " ) ?;
763
763
}
764
- debug_fmt_print ( f, v, dict) ?;
764
+ checked_debug_fmt ( f, v, dict) ?;
765
765
}
766
766
f. write_str ( "]" )
767
767
}
@@ -776,7 +776,7 @@ impl fmt::Debug for Dynamic {
776
776
}
777
777
fmt:: Debug :: fmt ( k, f) ?;
778
778
f. write_str ( ": " ) ?;
779
- debug_fmt_print ( f, v, dict) ?;
779
+ checked_debug_fmt ( f, v, dict) ?;
780
780
}
781
781
f. write_str ( "}" )
782
782
}
@@ -792,15 +792,15 @@ impl fmt::Debug for Dynamic {
792
792
fmt:: Debug :: fmt ( fnptr. fn_name ( ) , f) ?;
793
793
for curry in & fnptr. curry {
794
794
f. write_str ( ", " ) ?;
795
- debug_fmt_print ( f, curry, dict) ?;
795
+ checked_debug_fmt ( f, curry, dict) ?;
796
796
}
797
797
f. write_str ( ")" )
798
798
}
799
799
_ => fmt:: Debug :: fmt ( value, f) ,
800
800
}
801
801
}
802
802
803
- debug_fmt_print ( f, self , & mut <_ >:: default ( ) )
803
+ checked_debug_fmt ( f, self , & mut <_ >:: default ( ) )
804
804
}
805
805
}
806
806
}
@@ -1265,6 +1265,10 @@ impl Dynamic {
1265
1265
false
1266
1266
}
1267
1267
1268
+ #[ cfg( not( feature = "no_closure" ) ) ]
1269
+ Union :: Shared ( ref cell, ..) if cfg ! ( feature = "unchecked" ) => {
1270
+ crate :: func:: locked_read ( cell) . map_or ( false , |v| v. is_hashable ( ) )
1271
+ }
1268
1272
#[ cfg( not( feature = "no_closure" ) ) ]
1269
1273
Union :: Shared ( ..) => {
1270
1274
#[ cfg( feature = "no_std" ) ]
@@ -1278,10 +1282,18 @@ impl Dynamic {
1278
1282
dict : & mut HashSet < * const Dynamic > ,
1279
1283
) -> bool {
1280
1284
match value. 0 {
1281
- Union :: Shared ( ref cell, ..) => match crate :: func:: locked_read ( cell) {
1282
- Some ( v) => dict. insert ( value) && checked_is_hashable ( & v, dict) ,
1283
- _ => false ,
1284
- } ,
1285
+ Union :: Shared ( ref cell, ..) => crate :: func:: locked_read ( cell)
1286
+ . map_or ( false , |v| {
1287
+ dict. insert ( value) && checked_is_hashable ( & v, dict)
1288
+ } ) ,
1289
+ #[ cfg( not( feature = "no_index" ) ) ]
1290
+ Union :: Array ( ref a, ..) => a. iter ( ) . all ( |v| checked_is_hashable ( v, dict) ) ,
1291
+ #[ cfg( not( feature = "no_object" ) ) ]
1292
+ Union :: Map ( ref m, ..) => m. values ( ) . all ( |v| checked_is_hashable ( v, dict) ) ,
1293
+ Union :: FnPtr ( ref f, ..) => {
1294
+ f. environ . is_none ( )
1295
+ && f. curry ( ) . iter ( ) . all ( |v| checked_is_hashable ( v, dict) )
1296
+ }
1285
1297
_ => value. is_hashable ( ) ,
1286
1298
}
1287
1299
}
0 commit comments