소스 검색

Revert "LibJS: Don't hoist functions under certain circumstances"

This reverts commit 3411d50737725b382ae526e91a8bbd60656c3323.

It was causing LeakSanitizer on CI to fail, possibly due to a circular
reference.
Linus Groh 4 년 전
부모
커밋
3faeabf1dc
4개의 변경된 파일8개의 추가작업 그리고 45개의 파일을 삭제
  1. 2 2
      Userland/Libraries/LibJS/AST.cpp
  2. 1 1
      Userland/Libraries/LibJS/AST.h
  3. 4 35
      Userland/Libraries/LibJS/Parser.cpp
  4. 1 7
      Userland/Libraries/LibJS/Parser.h

+ 2 - 2
Userland/Libraries/LibJS/AST.cpp

@@ -2377,9 +2377,9 @@ void ScopeNode::add_functions(NonnullRefPtrVector<FunctionDeclaration> functions
     m_functions.extend(move(functions));
 }
 
-void ScopeNode::add_hoisted_function(NonnullRefPtr<FunctionDeclaration> hoisted_function)
+void ScopeNode::add_hoisted_functions(NonnullRefPtrVector<FunctionDeclaration> hoisted_functions)
 {
-    m_hoisted_functions.append(hoisted_function);
+    m_hoisted_functions.extend(move(hoisted_functions));
 }
 
 }

+ 1 - 1
Userland/Libraries/LibJS/AST.h

@@ -145,7 +145,7 @@ public:
 
     void add_variables(NonnullRefPtrVector<VariableDeclaration>);
     void add_functions(NonnullRefPtrVector<FunctionDeclaration>);
-    void add_hoisted_function(NonnullRefPtr<FunctionDeclaration>);
+    void add_hoisted_functions(NonnullRefPtrVector<FunctionDeclaration>);
     NonnullRefPtrVector<VariableDeclaration> const& variables() const { return m_variables; }
     NonnullRefPtrVector<FunctionDeclaration> const& functions() const { return m_functions; }
     NonnullRefPtrVector<FunctionDeclaration> const& hoisted_functions() const { return m_hoisted_functions; }

+ 4 - 35
Userland/Libraries/LibJS/Parser.cpp

@@ -64,24 +64,7 @@ public:
             scope_node->add_variables(m_parser.m_state.let_scopes.last());
 
         scope_node->add_functions(m_parser.m_state.current_scope->function_declarations);
-
-        for (auto& hoistable_function : m_parser.m_state.current_scope->hoisted_function_declarations) {
-            if (is_hoistable(hoistable_function)) {
-                scope_node->add_hoisted_function(hoistable_function.declaration);
-            }
-        }
-    }
-
-    static bool is_hoistable(Parser::Scope::HoistableDeclaration& declaration)
-    {
-        auto& name = declaration.declaration->name();
-        // See if we find any conflicting lexical declaration on the way up
-        for (RefPtr<Parser::Scope> scope = declaration.scope; !scope.is_null(); scope = scope->parent) {
-            if (scope->lexical_declarations.contains(name)) {
-                return false;
-            }
-        }
-        return true;
+        scope_node->add_hoisted_functions(m_parser.m_state.current_scope->hoisted_function_declarations);
     }
 
     Parser& m_parser;
@@ -321,8 +304,7 @@ NonnullRefPtr<Declaration> Parser::parse_declaration()
     case TokenType::Function: {
         auto declaration = parse_function_node<FunctionDeclaration>();
         m_state.current_scope->function_declarations.append(declaration);
-        auto hoisting_target = m_state.current_scope->get_current_function_scope();
-        hoisting_target->hoisted_function_declarations.append({ declaration, *m_state.current_scope });
+        m_state.current_scope->get_current_function_scope()->hoisted_function_declarations.append(declaration);
         return declaration;
     }
     case TokenType::Let:
@@ -1778,23 +1760,10 @@ NonnullRefPtr<VariableDeclaration> Parser::parse_variable_declaration(bool for_l
         consume_or_insert_semicolon();
 
     auto declaration = create_ast_node<VariableDeclaration>({ m_state.current_token.filename(), rule_start.position(), position() }, declaration_kind, move(declarations));
-    if (declaration_kind == DeclarationKind::Var) {
+    if (declaration_kind == DeclarationKind::Var)
         m_state.var_scopes.last().append(declaration);
-    } else {
+    else
         m_state.let_scopes.last().append(declaration);
-
-        for (auto& declarator : declaration->declarations()) {
-            declarator.target().visit(
-                [&](const NonnullRefPtr<Identifier>& id) {
-                    m_state.current_scope->lexical_declarations.set(id->string());
-                },
-                [&](const NonnullRefPtr<BindingPattern>& binding) {
-                    binding->for_each_bound_name([&](const auto& name) {
-                        m_state.current_scope->lexical_declarations.set(name);
-                    });
-                });
-        }
-    }
     return declaration;
 }
 

+ 1 - 7
Userland/Libraries/LibJS/Parser.h

@@ -201,18 +201,12 @@ private:
             Function,
             Block,
         };
-        struct HoistableDeclaration {
-            NonnullRefPtr<FunctionDeclaration> declaration;
-            NonnullRefPtr<Scope> scope; // where it is actually declared
-        };
 
         Type type;
         RefPtr<Scope> parent;
 
         NonnullRefPtrVector<FunctionDeclaration> function_declarations;
-        Vector<HoistableDeclaration> hoisted_function_declarations;
-
-        HashTable<FlyString> lexical_declarations;
+        NonnullRefPtrVector<FunctionDeclaration> hoisted_function_declarations;
 
         explicit Scope(Type, RefPtr<Scope>);
         RefPtr<Scope> get_current_function_scope();