From 5641ae71b86349621071065dd416c5e9919d0fc3 Mon Sep 17 00:00:00 2001 From: Fabian Boehm Date: Tue, 27 Feb 2024 18:58:32 +0100 Subject: [PATCH] ast: Box a large enum variant IfStatement is 680 bytes, much larger than the other variants (SwitchStatement is next at 232). An enum is as large as its largest variant, so this saves a bunch, especially since DecoratedStatement is much more likely than IfStatement. This will speed up the no-execute benchmark by 1.07x. --- src/ast.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/ast.rs b/src/ast.rs index a782ece6c..ff2f8cc7e 100644 --- a/src/ast.rs +++ b/src/ast.rs @@ -2001,7 +2001,8 @@ pub enum StatementVariant { None, NotStatement(NotStatement), BlockStatement(BlockStatement), - IfStatement(IfStatement), + // IfStatement is much larger than the rest, so we box it. + IfStatement(Box), SwitchStatement(SwitchStatement), DecoratedStatement(DecoratedStatement), } @@ -2081,7 +2082,7 @@ fn embedded_node(&self) -> &dyn NodeMut { StatementVariant::None => panic!("cannot visit null statement"), StatementVariant::NotStatement(node) => node, StatementVariant::BlockStatement(node) => node, - StatementVariant::IfStatement(node) => node, + StatementVariant::IfStatement(node) => &**node, StatementVariant::SwitchStatement(node) => node, StatementVariant::DecoratedStatement(node) => node, } @@ -3612,7 +3613,7 @@ fn new_decorated_statement(slf: &mut Populator<'_>) -> Box { } ParseKeyword::kw_if => { let embedded = self.allocate_visit::(); - Box::new(StatementVariant::IfStatement(*embedded)) + Box::new(StatementVariant::IfStatement(embedded)) } ParseKeyword::kw_switch => { let embedded = self.allocate_visit::();