Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make Decodable and Decoder infallible. #93066

Merged
merged 3 commits into from
Jan 23, 2022

Commits on Jan 21, 2022

  1. Rename Decoder::read_nil and read_unit.

    Because `()` is called "unit" and it makes it match
    `Encoder::emit_unit`.
    nnethercote committed Jan 21, 2022
    Configuration menu
    Copy the full SHA
    88600a6 View commit details
    Browse the repository at this point in the history
  2. Make Decodable and Decoder infallible.

    `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 rust-lang#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 commit 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.
    nnethercote committed Jan 21, 2022
    Configuration menu
    Copy the full SHA
    416399d View commit details
    Browse the repository at this point in the history
  3. Address review comments.

    nnethercote committed Jan 21, 2022
    Configuration menu
    Copy the full SHA
    37fbd91 View commit details
    Browse the repository at this point in the history