You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Fix unsafe_stable_anymap, rename to stable_anymap (it's safe) (#2338)
* doesn't work poc
* Works
* make this work with or without feature
* start time
* Fix fixes
* Fix more build
* fix build
* reset changes in fuzzbench fuzzer
---------
Co-authored-by: Toka <tokazerkje@outlook.com>
/// Visitor object used internally for the [`crate::serdeany::SerdeAny`] registry.
@@ -148,6 +151,7 @@ pub mod serdeany_registry {
148
151
V: serde::de::SeqAccess<'de>,
149
152
{
150
153
let id:TypeRepr = visitor.next_element()?.unwrap();
154
+
151
155
let cb = unsafe{
152
156
REGISTRY
153
157
.deserializers
@@ -187,8 +191,10 @@ pub mod serdeany_registry {
187
191
)
188
192
});
189
193
190
-
#[cfg(feature = "unsafe_stable_anymap")]
191
-
assert_eq!(_entry.1,TypeId::of::<T>(),"Fatal safety error: TypeId of type {} is not equals to the deserializer's TypeId for this type! Two registered types have the same type_name!", type_repr::<T>());
194
+
// We assert that only one element with the given TypeId is in the map.
195
+
// This is only necessary for stable_anymap where we don't directly use the TypeId, but the type_name instead.
196
+
#[cfg(feature = "stable_anymap")]
197
+
assert_eq!(_entry.1,TypeId::of::<T>(),"Fatal safety error: TypeId of type {} is not equal to the deserializer's TypeId for this type! Two registered types have the same type_name!", type_repr::<T>());
192
198
}
193
199
194
200
pubfnfinalize(&mutself){
@@ -277,7 +283,7 @@ pub mod serdeany_registry {
277
283
T:crate::serdeany::SerdeAny,
278
284
{
279
285
let type_repr = type_repr::<T>();
280
-
#[cfg(not(feature = "unsafe_stable_anymap"))]
286
+
#[cfg(not(feature = "stable_anymap"))]
281
287
let type_repr = &type_repr;
282
288
283
289
self.map
@@ -293,7 +299,7 @@ pub mod serdeany_registry {
293
299
T:crate::serdeany::SerdeAny,
294
300
{
295
301
let type_repr = type_repr::<T>();
296
-
#[cfg(not(feature = "unsafe_stable_anymap"))]
302
+
#[cfg(not(feature = "stable_anymap"))]
297
303
let type_repr = &type_repr;
298
304
299
305
self.map
@@ -309,7 +315,7 @@ pub mod serdeany_registry {
309
315
T:crate::serdeany::SerdeAny,
310
316
{
311
317
let type_repr = type_repr::<T>();
312
-
#[cfg(not(feature = "unsafe_stable_anymap"))]
318
+
#[cfg(not(feature = "stable_anymap"))]
313
319
let type_repr = &type_repr;
314
320
315
321
self.map
@@ -351,7 +357,7 @@ pub mod serdeany_registry {
351
357
T:crate::serdeany::SerdeAny,
352
358
{
353
359
let type_repr = type_repr::<T>();
354
-
#[cfg(not(feature = "unsafe_stable_anymap"))]
360
+
#[cfg(not(feature = "stable_anymap"))]
355
361
let type_repr = &type_repr;
356
362
357
363
assert!(
@@ -410,7 +416,7 @@ pub mod serdeany_registry {
410
416
T:crate::serdeany::SerdeAny,
411
417
{
412
418
let type_repr = type_repr::<T>();
413
-
#[cfg(not(feature = "unsafe_stable_anymap"))]
419
+
#[cfg(not(feature = "stable_anymap"))]
414
420
let type_repr = &type_repr;
415
421
416
422
self.map.contains_key(type_repr)
@@ -458,7 +464,7 @@ pub mod serdeany_registry {
458
464
T:crate::serdeany::SerdeAny,
459
465
{
460
466
let type_repr = type_repr::<T>();
461
-
#[cfg(not(feature = "unsafe_stable_anymap"))]
467
+
#[cfg(not(feature = "stable_anymap"))]
462
468
let type_repr = &type_repr;
463
469
464
470
matchself.map.get(type_repr){
@@ -475,7 +481,7 @@ pub mod serdeany_registry {
475
481
T:crate::serdeany::SerdeAny,
476
482
{
477
483
let type_repr = type_repr::<T>();
478
-
#[cfg(not(feature = "unsafe_stable_anymap"))]
484
+
#[cfg(not(feature = "stable_anymap"))]
479
485
let type_repr = &type_repr;
480
486
481
487
matchself.map.get_mut(type_repr){
@@ -494,7 +500,7 @@ pub mod serdeany_registry {
494
500
T:crate::serdeany::SerdeAny,
495
501
{
496
502
let type_repr = type_repr::<T>();
497
-
#[cfg(not(feature = "unsafe_stable_anymap"))]
503
+
#[cfg(not(feature = "stable_anymap"))]
498
504
let type_repr = &type_repr;
499
505
500
506
matchself.map.get_mut(type_repr){
@@ -522,7 +528,7 @@ pub mod serdeany_registry {
522
528
T:crate::serdeany::SerdeAny,
523
529
{
524
530
let type_repr = type_repr::<T>();
525
-
#[cfg(not(feature = "unsafe_stable_anymap"))]
531
+
#[cfg(not(feature = "stable_anymap"))]
526
532
let type_repr = &type_repr;
527
533
528
534
#[allow(clippy::manual_map)]
@@ -548,7 +554,7 @@ pub mod serdeany_registry {
548
554
T:crate::serdeany::SerdeAny,
549
555
{
550
556
let type_repr = type_repr::<T>();
551
-
#[cfg(not(feature = "unsafe_stable_anymap"))]
557
+
#[cfg(not(feature = "stable_anymap"))]
552
558
let type_repr = &type_repr;
553
559
554
560
#[allow(clippy::manual_map)]
@@ -614,7 +620,7 @@ pub mod serdeany_registry {
614
620
T:crate::serdeany::SerdeAny,
615
621
{
616
622
let type_repr = type_repr::<T>();
617
-
#[cfg(not(feature = "unsafe_stable_anymap"))]
623
+
#[cfg(not(feature = "stable_anymap"))]
618
624
let type_repr = &type_repr;
619
625
620
626
assert!(
@@ -721,7 +727,7 @@ pub mod serdeany_registry {
721
727
T:crate::serdeany::SerdeAny,
722
728
{
723
729
let type_repr = type_repr::<T>();
724
-
#[cfg(not(feature = "unsafe_stable_anymap"))]
730
+
#[cfg(not(feature = "stable_anymap"))]
725
731
let type_repr = &type_repr;
726
732
727
733
self.map.contains_key(type_repr)
@@ -735,7 +741,7 @@ pub mod serdeany_registry {
735
741
T:crate::serdeany::SerdeAny,
736
742
{
737
743
let type_repr = type_repr::<T>();
738
-
#[cfg(not(feature = "unsafe_stable_anymap"))]
744
+
#[cfg(not(feature = "stable_anymap"))]
739
745
let type_repr = &type_repr;
740
746
741
747
matchself.map.get(type_repr){
@@ -768,9 +774,18 @@ impl Serialize for dyn crate::serdeany::SerdeAny {
768
774
{
769
775
use serde::ser::SerializeSeq;
770
776
771
-
let id = crate::anymap::unpack_type_id(self.type_id());
777
+
#[cfg(not(feature = "stable_anymap"))]
778
+
let type_id = crate::anymap::unpack_type_id(self.type_id());
779
+
#[cfg(not(feature = "stable_anymap"))]
780
+
let type_id = &type_id;
781
+
782
+
// For the stable anymap, we use the `type_name` as type id.
0 commit comments