Skip to content

Commit

Permalink
Optimize FromReflect impl
Browse files Browse the repository at this point in the history
First attempt to downcast, then call `from_reflect`
  • Loading branch information
davidpdrsn committed Dec 5, 2022
1 parent 151d900 commit a30ad56
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 6 deletions.
18 changes: 16 additions & 2 deletions crates/mirror-mirror-macros/src/derive_reflect/enum_.rs
Original file line number Diff line number Diff line change
Expand Up @@ -302,7 +302,14 @@ fn expand_from_reflect(ident: &Ident, variants: &[VariantData<'_>]) -> TokenStre
let ident_string = stringify(ident);
let ty = &field.ty;
quote! {
#ident: <#ty as FromReflect>::from_reflect(enum_.field(#ident_string)?)?.to_owned(),
#ident: {
let value = enum_.field(#ident_string)?;
if let Some(value) = value.downcast_ref::<#ty>() {
value.to_owned()
} else {
<#ty as FromReflect>::from_reflect(value)?.to_owned()
}
},
}
}
});
Expand All @@ -322,7 +329,14 @@ fn expand_from_reflect(ident: &Ident, variants: &[VariantData<'_>]) -> TokenStre
} else {
let ty = &field.ty;
quote! {
<#ty as FromReflect>::from_reflect(enum_.field_at(#idx)?)?.to_owned(),
{
let value = enum_.field_at(#idx)?;
if let Some(value) = value.downcast_ref::<#ty>() {
value.to_owned()
} else {
<#ty as FromReflect>::from_reflect(value)?.to_owned()
}
},
}
}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,14 @@ fn expand_from_reflect(
let ty = &field.ty;
let field = stringify(ident);
quote_spanned! {span=>
#ident: <#ty as FromReflect>::from_reflect(struct_.field(#field)?)?.to_owned(),
#ident: {
let value = struct_.field(#field)?;
if let Some(value) = value.downcast_ref::<#ty>() {
value.to_owned()
} else {
<#ty as FromReflect>::from_reflect(value)?.to_owned()
}
},
}
}
});
Expand Down
11 changes: 8 additions & 3 deletions crates/mirror-mirror-macros/src/derive_reflect/tuple_struct.rs
Original file line number Diff line number Diff line change
Expand Up @@ -175,9 +175,14 @@ fn expand_from_reflect(
}
} else {
quote_spanned! {span=>
#field_index: <#ty as FromReflect>::from_reflect(
tuple_struct.field(#field_index)?,
)?.to_owned(),
#field_index: {
let value = tuple_struct.field(#field_index)?;
if let Some(value) = value.downcast_ref::<#ty>() {
value.to_owned()
} else {
<#ty as FromReflect>::from_reflect(value)?.to_owned()
}
},
}
}
});
Expand Down

0 comments on commit a30ad56

Please sign in to comment.