10

Make `Decodable` and `Decoder` infallible. by nnethercote · Pull Request #93066...

 2 years ago
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.
neoserver,ios ssh client

Copy link

Contributor

nnethercote commented 11 days ago

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
    bad Result discriminant), and in some places it returns an error
    (e.g. on a bad Option 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 a FIXME 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 for T now has the same
    optimization for small counts that the impl for Result<T, E> has,
    because it's now much hotter.
  • Decodable impls for SmallVec, LinkedList, VecDeque now all use
    collect, which is nice; the one for Vec uses unsafe code, because
    that gave better perf on some benchmarks.

r? @bjorn3


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK