mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 06:27:45 +00:00
LibJS/Bytecode: Check for lexical bindings only in current scope
BlockDeclarationInstantiation takes as input the new lexical environment that was created and checks if there is a binding for the current name only in this new scope. This allows shadowing lexical variables and prevents us crashing due to an already initialized lexical variable in this case: ```js let x = 1; { let x = 1; } ```
This commit is contained in:
parent
c55a4c7f30
commit
3a48c7fdaf
2 changed files with 11 additions and 2 deletions
|
@ -138,7 +138,7 @@ public:
|
|||
{
|
||||
m_variable_scopes.last_matching([&](auto& x) { return x.mode == BindingMode::Global || x.mode == mode; })->known_bindings.set(identifier);
|
||||
}
|
||||
bool has_binding(IdentifierTableIndex identifier, Optional<BindingMode> const& specific_binding_mode = {})
|
||||
bool has_binding(IdentifierTableIndex identifier, Optional<BindingMode> const& specific_binding_mode = {}) const
|
||||
{
|
||||
for (auto index = m_variable_scopes.size(); index > 0; --index) {
|
||||
auto& scope = m_variable_scopes[index - 1];
|
||||
|
@ -151,6 +151,13 @@ public:
|
|||
}
|
||||
return false;
|
||||
}
|
||||
bool has_binding_in_current_scope(IdentifierTableIndex identifier) const
|
||||
{
|
||||
if (m_variable_scopes.is_empty())
|
||||
return false;
|
||||
|
||||
return m_variable_scopes.last().known_bindings.contains(identifier);
|
||||
}
|
||||
|
||||
void begin_variable_scope(BindingMode mode = BindingMode::Lexical, SurroundingScopeKind kind = SurroundingScopeKind::Block);
|
||||
void end_variable_scope();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue