report which field a struct validation error occured in

This commit is contained in:
Pat Hickey
2020-01-29 13:18:57 -08:00
parent 814dd19488
commit e2079c085d
2 changed files with 39 additions and 2 deletions

View File

@@ -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 member_valids = s.member_layout().into_iter().map(|ml| {
let type_ = names.type_ref(&ml.member.tref); let type_ = names.type_ref(&ml.member.tref);
let offset = ml.offset as u32; 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! { quote! {
@@ -235,7 +250,22 @@ fn define_ptr_struct(names: &Names, name: &witx::Id, s: &witx::StructDatatype) -
}, },
}; };
let offset = ml.offset as u32; 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| { let member_reads = s.member_layout().into_iter().map(|ml| {

View File

@@ -11,4 +11,11 @@ pub enum GuestError {
PtrNotAligned(Region, u32), PtrNotAligned(Region, u32),
#[error("Pointer already borrowed: {0:?}")] #[error("Pointer already borrowed: {0:?}")]
PtrBorrowed(Region), PtrBorrowed(Region),
#[error("In {typename}.{field}:")]
InField {
typename: String,
field: String,
#[source]
err: Box<GuestError>,
},
} }