From fd70c4b8852ac258107002e288fb800d78707e1c Mon Sep 17 00:00:00 2001 From: overlookmotel <557937+overlookmotel@users.noreply.github.com> Date: Wed, 18 Sep 2024 02:23:36 +0000 Subject: [PATCH] perf(transformer): arrow function transform more efficient scope search (#5842) Micro-optimization. Match scopes with a single comparison, instead of 2. --- .../src/es2015/arrow_functions.rs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/crates/oxc_transformer/src/es2015/arrow_functions.rs b/crates/oxc_transformer/src/es2015/arrow_functions.rs index 82c4d54d9..484325812 100644 --- a/crates/oxc_transformer/src/es2015/arrow_functions.rs +++ b/crates/oxc_transformer/src/es2015/arrow_functions.rs @@ -252,16 +252,20 @@ impl<'a> ArrowFunctions<'a> { // let this_var = self.this_var_stack.last_mut().unwrap(); if this_var.is_none() { - let target_scope_id = - ctx.scopes().ancestors(ctx.current_scope_id()).skip(1).find(|&scope_id| { + let target_scope_id = ctx + .scopes() + .ancestors(ctx.current_scope_id()) + .skip(1) + .find(|&scope_id| { let scope_flags = ctx.scopes().get_flags(scope_id); - scope_flags.intersects(ScopeFlags::Function | ScopeFlags::Top) - && !scope_flags.contains(ScopeFlags::Arrow) - }); + // Function but not arrow function + scope_flags & (ScopeFlags::Function | ScopeFlags::Arrow) == ScopeFlags::Function + }) + .unwrap_or(ctx.scopes().root_scope_id()); this_var.replace(BoundIdentifier::new_uid( "this", - target_scope_id.unwrap(), + target_scope_id, SymbolFlags::FunctionScopedVariable, ctx, ));