Make `Decodable` and `Decoder` infallible. by nnethercote · Pull Request #93066...
source link: https://github.com/rust-lang/rust/pull/93066
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Decoder
has two impls:
- opaque: this impl is already partly infallible, i.e. in some places it
currently panics on failure (e.g. if the input is too short, or on a
badResult
discriminant), and in some places it returns an error
(e.g. on a badOption
discriminant). The number of places where
either happens is surprisingly small, just because the binary
representation has very little redundancy and a lot of input reading
can occur even on malformed data. - json: this impl is fully fallible, but it's only used (a) for the
.rlink
file production, and there's aFIXME
comment suggesting it
should change to a binary format, and (b) in a few tests in
non-fundamental ways. Indeed #85993 is open to remove it entirely.
And the top-level places in the compiler that call into decoding just
abort on error anyway. So the fallibility is providing little value, and
getting rid of it leads to some non-trivial performance improvements.
Much of this PR is pretty boring and mechanical. Some notes about
a few interesting parts:
- The commit removes
Decoder::{Error,error}
. InternIteratorElement::intern_with
: the impl forT
now has the same
optimization for small counts that the impl forResult<T, E>
has,
because it's now much hotter.- Decodable impls for SmallVec, LinkedList, VecDeque now all use
collect
, which is nice; the one forVec
uses unsafe code, because
that gave better perf on some benchmarks.
r? @bjorn3
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK