From e2079c085dbb2df503c429bddb590545bb8db3bc Mon Sep 17 00:00:00 2001 From: Pat Hickey Date: Wed, 29 Jan 2020 13:18:57 -0800 Subject: [PATCH] report which field a struct validation error occured in --- crates/generate/src/types.rs | 34 ++++++++++++++++++++++++++++++++-- crates/memory/src/error.rs | 7 +++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/crates/generate/src/types.rs b/crates/generate/src/types.rs index 21dcaaa4bb..096015ae21 100644 --- a/crates/generate/src/types.rs +++ b/crates/generate/src/types.rs @@ -164,7 +164,22 @@ fn define_copy_struct(names: &Names, name: &witx::Id, s: &witx::StructDatatype) let member_valids = s.member_layout().into_iter().map(|ml| { let type_ = names.type_ref(&ml.member.tref); let offset = ml.offset as u32; - quote!( #type_::validate(&ptr.cast(#offset)?)?; ) + let fieldname = names.struct_member(&ml.member.name); + quote! { + #type_::validate( + &ptr.cast(#offset).map_err(|e| + ::memory::GuestError::InField{ + typename: stringify!(#ident).to_owned(), + field: stringify!(#fieldname).to_owned(), + err: Box::new(e), + })? + ).map_err(|e| + ::memory::GuestError::InField { + typename: stringify!(#ident).to_owned(), + field: stringify!(#fieldname).to_owned(), + err: Box::new(e), + })?; + } }); quote! { @@ -235,7 +250,22 @@ fn define_ptr_struct(names: &Names, name: &witx::Id, s: &witx::StructDatatype) - }, }; let offset = ml.offset as u32; - quote!( #type_::validate(&ptr.cast(#offset)?)?; ) + let fieldname = names.struct_member(&ml.member.name); + quote! { + #type_::validate( + &ptr.cast(#offset).map_err(|e| + ::memory::GuestError::InField{ + typename: stringify!(#ident).to_owned(), + field: stringify!(#fieldname).to_owned(), + err: Box::new(e), + })? + ).map_err(|e| + ::memory::GuestError::InField { + typename: stringify!(#ident).to_owned(), + field: stringify!(#fieldname).to_owned(), + err: Box::new(e), + })?; + } }); let member_reads = s.member_layout().into_iter().map(|ml| { diff --git a/crates/memory/src/error.rs b/crates/memory/src/error.rs index b1ed3b49b0..afbed26416 100644 --- a/crates/memory/src/error.rs +++ b/crates/memory/src/error.rs @@ -11,4 +11,11 @@ pub enum GuestError { PtrNotAligned(Region, u32), #[error("Pointer already borrowed: {0:?}")] PtrBorrowed(Region), + #[error("In {typename}.{field}:")] + InField { + typename: String, + field: String, + #[source] + err: Box, + }, }