1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-03-02 16:26:19 +00:00

fix(core): use SwipeFlow::add_page to save stack memory

[no changelog]
This commit is contained in:
Roman Zeyde 2025-02-27 16:55:38 +02:00 committed by Roman Zeyde
parent 323107e6a8
commit 674342b594
2 changed files with 40 additions and 27 deletions

View File

@ -133,6 +133,18 @@ impl SwipeFlow {
state: &'static dyn FlowController, state: &'static dyn FlowController,
page: impl FlowComponentDynTrait + 'static, page: impl FlowComponentDynTrait + 'static,
) -> Result<Self, error::Error> { ) -> Result<Self, error::Error> {
self.add_page(state, page)?;
Ok(self)
}
/// Add a page to the flow.
///
/// Pages must be inserted in the order of the flow state index.
pub fn add_page(
&mut self,
state: &'static dyn FlowController,
page: impl FlowComponentDynTrait + 'static,
) -> Result<&mut Self, error::Error> {
debug_assert!(self.store.len() == state.index()); debug_assert!(self.store.len() == state.index());
let alloc = GcBox::new(page)?; let alloc = GcBox::new(page)?;
let page = gc::coerce!(FlowComponentDynTrait, alloc); let page = gc::coerce!(FlowComponentDynTrait, alloc);

View File

@ -274,12 +274,13 @@ pub fn new_confirm_output(
.into_layout()? .into_layout()?
.one_button_request(ButtonRequest::from_num(br_code, br_name)); .one_button_request(ButtonRequest::from_num(br_code, br_name));
SwipeFlow::new(&ConfirmOutputWithAmount::Address)? let mut flow = SwipeFlow::new(&ConfirmOutputWithAmount::Address)?;
.with_page(&ConfirmOutputWithAmount::Address, main_content)? flow.add_page(&ConfirmOutputWithAmount::Address, main_content)?
.with_page(&ConfirmOutputWithAmount::Amount, confirm_amount)? .add_page(&ConfirmOutputWithAmount::Amount, confirm_amount)?
.with_page(&ConfirmOutputWithAmount::Menu, content_main_menu)? .add_page(&ConfirmOutputWithAmount::Menu, content_main_menu)?
.with_page(&ConfirmOutputWithAmount::AccountInfo, account_content)? .add_page(&ConfirmOutputWithAmount::AccountInfo, account_content)?
.with_page(&ConfirmOutputWithAmount::CancelTap, get_cancel_page())? .add_page(&ConfirmOutputWithAmount::CancelTap, get_cancel_page())?;
flow
} else if let Some(summary_items_params) = summary_items_params { } else if let Some(summary_items_params) = summary_items_params {
// Summary // Summary
let content_summary = summary_items_params let content_summary = summary_items_params
@ -344,45 +345,45 @@ pub fn new_confirm_output(
.with_swipe(Direction::Right, SwipeSettings::immediate()) .with_swipe(Direction::Right, SwipeSettings::immediate())
.map(super::util::map_to_choice); .map(super::util::map_to_choice);
let mut flow = SwipeFlow::new(&ConfirmOutputWithSummary::Main)? let mut flow = SwipeFlow::new(&ConfirmOutputWithSummary::Main)?;
.with_page(&ConfirmOutputWithSummary::Main, main_content)? flow.add_page(&ConfirmOutputWithSummary::Main, main_content)?
.with_page(&ConfirmOutputWithSummary::MainMenu, content_main_menu)? .add_page(&ConfirmOutputWithSummary::MainMenu, content_main_menu)?
.with_page(&ConfirmOutputWithSummary::MainMenuCancel, get_cancel_page())?; .add_page(&ConfirmOutputWithSummary::MainMenuCancel, get_cancel_page())?;
if let Some(confirm_address) = confirm_address { if let Some(confirm_address) = confirm_address {
let address_content = confirm_address.into_layout()?; let address_content = confirm_address.into_layout()?;
flow = flow.with_page(&ConfirmOutputWithSummary::AddressInfo, address_content)?; flow.add_page(&ConfirmOutputWithSummary::AddressInfo, address_content)?;
} else { } else {
// dummy page - this will never be shown since there is no menu item pointing to // dummy page - this will never be shown since there is no menu item pointing to
// it, but the page has to exist in the flow // it, but the page has to exist in the flow
flow = flow.with_page( flow.add_page(
&ConfirmOutputWithSummary::AddressInfo, &ConfirmOutputWithSummary::AddressInfo,
Frame::left_aligned(TString::empty(), VerticalMenu::empty()) Frame::left_aligned(TString::empty(), VerticalMenu::empty())
.map(|_| Some(FlowMsg::Cancelled)), .map(|_| Some(FlowMsg::Cancelled)),
)?; )?;
} }
flow = flow flow.add_page(&ConfirmOutputWithSummary::Summary, content_summary)?
.with_page(&ConfirmOutputWithSummary::Summary, content_summary)? .add_page(&ConfirmOutputWithSummary::SummaryMenu, content_summary_menu)?
.with_page(&ConfirmOutputWithSummary::SummaryMenu, content_summary_menu)? .add_page(
.with_page(
&ConfirmOutputWithSummary::SummaryMenuCancel, &ConfirmOutputWithSummary::SummaryMenuCancel,
get_cancel_page(), get_cancel_page(),
)? )?
.with_page(&ConfirmOutputWithSummary::FeeInfo, content_fee)? .add_page(&ConfirmOutputWithSummary::FeeInfo, content_fee)?
.with_page(&ConfirmOutputWithSummary::Hold, content_hold)? .add_page(&ConfirmOutputWithSummary::Hold, content_hold)?
.with_page(&ConfirmOutputWithSummary::HoldMenu, content_hold_menu)? .add_page(&ConfirmOutputWithSummary::HoldMenu, content_hold_menu)?
.with_page(&ConfirmOutputWithSummary::HoldMenuCancel, get_cancel_page())? .add_page(&ConfirmOutputWithSummary::HoldMenuCancel, get_cancel_page())?
.with_page(&ConfirmOutputWithSummary::AccountInfo, account_content)?; .add_page(&ConfirmOutputWithSummary::AccountInfo, account_content)?;
if let Some(confirm_extra) = confirm_extra { if let Some(confirm_extra) = confirm_extra {
let extra_content = confirm_extra.into_layout()?; let extra_content = confirm_extra.into_layout()?;
flow = flow.with_page(&ConfirmOutputWithSummary::ExtraInfo, extra_content)? flow.add_page(&ConfirmOutputWithSummary::ExtraInfo, extra_content)?;
} }
flow flow
} else { } else {
SwipeFlow::new(&ConfirmOutput::Address)? let mut flow = SwipeFlow::new(&ConfirmOutput::Address)?;
.with_page(&ConfirmOutput::Address, main_content)? flow.add_page(&ConfirmOutput::Address, main_content)?
.with_page(&ConfirmOutput::Menu, content_main_menu)? .add_page(&ConfirmOutput::Menu, content_main_menu)?
.with_page(&ConfirmOutput::AccountInfo, account_content)? .add_page(&ConfirmOutput::AccountInfo, account_content)?
.with_page(&ConfirmOutput::CancelTap, get_cancel_page())? .add_page(&ConfirmOutput::CancelTap, get_cancel_page())?;
flow
}; };
Ok(res) Ok(res)