diff options
author | iximeow <me@iximeow.net> | 2021-07-04 15:59:25 -0700 |
---|---|---|
committer | iximeow <me@iximeow.net> | 2021-07-04 15:59:25 -0700 |
commit | 15311c6ce76205d0f0ec17358a242c057f84efba (patch) | |
tree | 3d9c75a79506e513f980cbccb8c901fc4c1527d9 | |
parent | e7cb91d727bd9fbb332d09d8ac254b0bd6c46e88 (diff) |
actually enforce DecodeError impl'ing std::error::Error in std builds
the previous test and code only tested one concrete archtecture, and it
turns out never required `std::error::Error` on `DecodeError`.
-rw-r--r-- | src/lib.rs | 17 | ||||
-rw-r--r-- | tests/lib.rs | 11 |
2 files changed, 24 insertions, 4 deletions
@@ -30,7 +30,7 @@ pub use reader::{Reader, ReadError, U8Reader, U16le, U16be, U32le, U32be, U64le, /// it is permissible for an implementor of `DecodeError` to have items that return `false` for /// all these functions; decoders are permitted to error in way that `yaxpeax-arch` does not know /// about. -pub trait DecodeError: PartialEq { +pub trait DecodeError: PartialEq + Display + Debug + Send + Sync + 'static { /// did the decoder fail because it reached the end of input? fn data_exhausted(&self) -> bool; /// did the decoder error because the instruction's opcode is invalid? @@ -157,9 +157,18 @@ impl<T> AddressBounds for T where T: Address + Debug + Hash + PartialEq + Eq + S impl<T> AddressBounds for T where T: Address + Debug + Hash + PartialEq + Eq {} #[cfg(feature = "std")] -trait DecodeErrorBounds: DecodeError + std::error::Error + Debug + Display {} +/// this is not a particularly interesting trait. it just exists to add a `std::error::Error` +/// bound onto `DecodeError` for `std` builds. +pub trait DecodeErrorBounds: std::error::Error + DecodeError {} +#[cfg(feature = "std")] +impl<T: std::error::Error + DecodeError> DecodeErrorBounds for T {} +#[cfg(not(feature = "std"))] +/// this is not a particularly interesting trait. it just exists to add a `std::error::Error` +/// bound onto `DecodeError` for `std` builds. +pub trait DecodeErrorBounds: DecodeError {} #[cfg(not(feature = "std"))] -trait DecodeErrorBounds: DecodeError + Debug + Display {} +impl<T: DecodeError> DecodeErrorBounds for T {} + /// a collection of associated type parameters that constitute the definitions for an instruction /// set. `Arch` provides an `Instruction` and its associated `Operand`s, which is guaranteed to be @@ -180,7 +189,7 @@ pub trait Arch { type Word: Debug + Display + PartialEq + Eq; type Address: AddressBounds; type Instruction: Instruction + LengthedInstruction<Unit=AddressDiff<Self::Address>> + Debug + Default + Sized; - type DecodeError: DecodeError + Debug + Display; + type DecodeError: DecodeErrorBounds + Debug + Display; type Decoder: Decoder<Self> + Default; type Operand; } diff --git a/tests/lib.rs b/tests/lib.rs index 8e097de..9add6e3 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -10,6 +10,17 @@ fn test_u16() { } #[test] +fn generic_error_can_bail() { + use yaxpeax_arch::{Arch, Decoder, Reader}; + + #[allow(dead_code)] + fn decode<A: Arch, U: Into<impl Reader<A::Address, A::Word>>>(data: U, decoder: &A::Decoder) -> anyhow::Result<()> { + let mut reader = data.into(); + decoder.decode(&mut reader)?; + Ok(()) + } +} +#[test] fn error_can_bail() { use yaxpeax_arch::{Arch, AddressDiff, Decoder, Reader, LengthedInstruction, Instruction, StandardDecodeError, U8Reader}; struct TestIsa {} |