LibJS: Call shrink_to_fit() on various Vectors created during parse
Vectors that stick around in the AST were wasting a fair bit of memory due to the growth padding we keep by default. This patch goes after some of these vectors with the shrink_to_fit() stick to reduce waste. Since the AST can stay around for a long time, it is worth making an effort to shrink it down when we have a chance.
This commit is contained in:
parent
2e98c17347
commit
9721da2e6a
Notes:
sideshowbarker
2024-07-17 08:37:36 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/9721da2e6a Pull-request: https://github.com/SerenityOS/serenity/pull/16215 Reviewed-by: https://github.com/ADKaster Reviewed-by: https://github.com/trflynn89
2 changed files with 18 additions and 0 deletions
|
@ -280,6 +280,14 @@ public:
|
||||||
m_children.append(move(child));
|
m_children.append(move(child));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void shrink_to_fit()
|
||||||
|
{
|
||||||
|
m_children.shrink_to_fit();
|
||||||
|
m_lexical_declarations.shrink_to_fit();
|
||||||
|
m_var_declarations.shrink_to_fit();
|
||||||
|
m_functions_hoistable_with_annexB_extension.shrink_to_fit();
|
||||||
|
}
|
||||||
|
|
||||||
NonnullRefPtrVector<Statement> const& children() const { return m_children; }
|
NonnullRefPtrVector<Statement> const& children() const { return m_children; }
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override;
|
virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override;
|
||||||
|
|
|
@ -1807,6 +1807,7 @@ NonnullRefPtr<ObjectExpression> Parser::parse_object_expression()
|
||||||
m_state.invalid_property_range_in_object_expression.set(object_expression_offset, invalid_object_literal_property_range->start);
|
m_state.invalid_property_range_in_object_expression.set(object_expression_offset, invalid_object_literal_property_range->start);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
properties.shrink_to_fit();
|
||||||
return create_ast_node<ObjectExpression>(
|
return create_ast_node<ObjectExpression>(
|
||||||
{ m_source_code, rule_start.position(), position() },
|
{ m_source_code, rule_start.position(), position() },
|
||||||
move(properties));
|
move(properties));
|
||||||
|
@ -1835,6 +1836,8 @@ NonnullRefPtr<ArrayExpression> Parser::parse_array_expression()
|
||||||
}
|
}
|
||||||
|
|
||||||
consume(TokenType::BracketClose);
|
consume(TokenType::BracketClose);
|
||||||
|
|
||||||
|
elements.shrink_to_fit();
|
||||||
return create_ast_node<ArrayExpression>({ m_source_code, rule_start.position(), position() }, move(elements));
|
return create_ast_node<ArrayExpression>({ m_source_code, rule_start.position(), position() }, move(elements));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2022,6 +2025,7 @@ NonnullRefPtr<Expression> Parser::parse_expression(int min_precedence, Associati
|
||||||
consume();
|
consume();
|
||||||
expressions.append(parse_expression(2));
|
expressions.append(parse_expression(2));
|
||||||
}
|
}
|
||||||
|
expressions.shrink_to_fit();
|
||||||
expression = create_ast_node<SequenceExpression>({ m_source_code, rule_start.position(), position() }, move(expressions));
|
expression = create_ast_node<SequenceExpression>({ m_source_code, rule_start.position(), position() }, move(expressions));
|
||||||
}
|
}
|
||||||
return expression;
|
return expression;
|
||||||
|
@ -2461,6 +2465,8 @@ void Parser::parse_statement_list(ScopeNode& output_node, AllowLabelledFunction
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
output_node.shrink_to_fit();
|
||||||
}
|
}
|
||||||
|
|
||||||
// FunctionBody, https://tc39.es/ecma262/#prod-FunctionBody
|
// FunctionBody, https://tc39.es/ecma262/#prod-FunctionBody
|
||||||
|
@ -2729,6 +2735,8 @@ Vector<FunctionParameter> Parser::parse_formal_parameters(int& function_length,
|
||||||
// Otherwise, we need a closing parenthesis (which is consumed elsewhere). If we get neither, it's an error.
|
// Otherwise, we need a closing parenthesis (which is consumed elsewhere). If we get neither, it's an error.
|
||||||
if (!match(TokenType::Eof) && !match(TokenType::ParenClose))
|
if (!match(TokenType::Eof) && !match(TokenType::ParenClose))
|
||||||
expected(Token::name(TokenType::ParenClose));
|
expected(Token::name(TokenType::ParenClose));
|
||||||
|
|
||||||
|
parameters.shrink_to_fit();
|
||||||
return parameters;
|
return parameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3033,6 +3041,8 @@ NonnullRefPtr<VariableDeclaration> Parser::parse_variable_declaration(bool for_l
|
||||||
if (!for_loop_variable_declaration)
|
if (!for_loop_variable_declaration)
|
||||||
consume_or_insert_semicolon();
|
consume_or_insert_semicolon();
|
||||||
|
|
||||||
|
declarations.shrink_to_fit();
|
||||||
|
|
||||||
auto declaration = create_ast_node<VariableDeclaration>({ m_source_code, rule_start.position(), position() }, declaration_kind, move(declarations));
|
auto declaration = create_ast_node<VariableDeclaration>({ m_source_code, rule_start.position(), position() }, declaration_kind, move(declarations));
|
||||||
return declaration;
|
return declaration;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue