Closed juntyr closed 5 months ago
Thanks @juntyr for raising the issue. I'm inclined to propose a more basic solution (#39) that doesn't introduce any breaking changes.
@ma2bd Thanks for the quick reply! #39 would also likely solve the issue (and is much more applicable and general so thumbs up for that in any case) though I wonder if there is any data structure that works better with a zero-based field …
This reminds me of the std::mem::uninitialized
implementation which just sets each byte to 0x01
to protects against non-zero-like types, so setting a globally-applicable value seems to be an acceptable solution.
Thus, I think that #39 is a better idea, perhaps with an extra doc comment or helped method to explain that all default integer values can be set to 1 to allow non-zero values to be successfully traced.
Summary
NonZero*
is a fundamentally useful datatype in Rust, whichserde
models as a newtype around the inner numerical type. That makes tracing any datatype that contains anyNonZero*
difficult, as the tracer by default always passes zero numeric values, whichNonZero*
rejects. While giving example data can solve this issue, it is impractical for deeply nestedNonZero*
s.This PR fixes this by checking if the traced integer-looking-value is one of the
NonZero*
types. While the test is ... not pretty ..., it should be optimised out during monomorphisation.Test Plan
I'm happy to add a few tests for cases you suggest :)