2019-07-27 00:54:25 +03:00
|
|
|
// run-pass
|
|
|
|
|
2018-09-17 11:18:35 +02:00
|
|
|
#![allow(unused_mut)]
|
|
|
|
#![allow(unused_imports)]
|
2015-03-31 13:40:39 -07:00
|
|
|
#![feature(rustc_private)]
|
2014-06-01 14:16:11 +02:00
|
|
|
|
2020-07-04 16:20:24 +01:00
|
|
|
extern crate rustc_macros;
|
2020-06-02 22:46:42 +03:00
|
|
|
extern crate rustc_serialize;
|
2014-06-01 14:16:11 +02:00
|
|
|
|
2020-07-04 16:20:24 +01:00
|
|
|
use rustc_macros::{Decodable, Encodable};
|
2020-06-02 22:46:42 +03:00
|
|
|
use rustc_serialize::json;
|
2020-07-04 16:20:24 +01:00
|
|
|
use rustc_serialize::{Decodable, Encodable};
|
2014-06-01 14:16:11 +02:00
|
|
|
|
2020-07-04 16:20:24 +01:00
|
|
|
#[derive(Encodable, Decodable, PartialEq, Debug)]
|
2014-06-01 14:16:11 +02:00
|
|
|
struct UnitLikeStruct;
|
|
|
|
|
|
|
|
pub fn main() {
|
|
|
|
let obj = UnitLikeStruct;
|
2015-01-26 16:10:22 +01:00
|
|
|
let json_str: String = json::encode(&obj).unwrap();
|
2014-06-01 14:16:11 +02:00
|
|
|
|
2015-02-01 21:53:25 -05:00
|
|
|
let json_object = json::from_str(&json_str);
|
2014-06-01 14:16:11 +02:00
|
|
|
let mut decoder = json::Decoder::new(json_object.unwrap());
|
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 #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.
2022-01-18 13:22:50 +11:00
|
|
|
let mut decoded_obj: UnitLikeStruct = Decodable::decode(&mut decoder);
|
2014-06-01 14:16:11 +02:00
|
|
|
|
|
|
|
assert_eq!(obj, decoded_obj);
|
|
|
|
}
|