From 416e2da7f6df81d44b991d3e3648872eff422bbd Mon Sep 17 00:00:00 2001 From: snowapril Date: Wed, 18 Aug 2021 00:35:14 +0900 Subject: [PATCH] compiler: add is_global() check at top of errors add `!symbol.is_global()` condition check before entrying global symbol errors This change will decrease hot path cost. Signed-off-by: snowapril --- src/symboltable.rs | 57 +++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 26 deletions(-) diff --git a/src/symboltable.rs b/src/symboltable.rs index 8dc120e..1bdd1a2 100644 --- a/src/symboltable.rs +++ b/src/symboltable.rs @@ -1120,32 +1120,37 @@ impl SymbolTableBuilder { // Role already set.. match role { SymbolUsage::Global => { - if symbol.is_parameter { - return Err(SymbolTableError { - error: format!("name '{}' is parameter and global", name), - location, - }); - } - if symbol.is_referenced { - return Err(SymbolTableError { - error: format!("name '{}' is used prior to global declaration", name), - location, - }); - } - if symbol.is_annotated { - return Err(SymbolTableError { - error: format!("annotated name '{}' can't be global", name), - location, - }); - } - if symbol.is_assigned { - return Err(SymbolTableError { - error: format!( - "name '{}' is assigned to before global declaration", - name - ), - location, - }); + if !symbol.is_global() { + if symbol.is_parameter { + return Err(SymbolTableError { + error: format!("name '{}' is parameter and global", name), + location, + }); + } + if symbol.is_referenced { + return Err(SymbolTableError { + error: format!( + "name '{}' is used prior to global declaration", + name + ), + location, + }); + } + if symbol.is_annotated { + return Err(SymbolTableError { + error: format!("annotated name '{}' can't be global", name), + location, + }); + } + if symbol.is_assigned { + return Err(SymbolTableError { + error: format!( + "name '{}' is assigned to before global declaration", + name + ), + location, + }); + } } } SymbolUsage::Nonlocal => {