LibJS: Preserve information about local variables declaration kind

This is required for upcoming change where we want to emit ThrowIfTDZ
for assignment expressions only for lexical declarations.
This commit is contained in:
Aliaksandr Kalenik 2025-05-05 21:53:19 +03:00 committed by Andreas Kling
parent 2774068ca0
commit db480b1f0c
Notes: github-actions[bot] 2025-05-06 10:07:32 +00:00
11 changed files with 83 additions and 40 deletions

View file

@ -22,6 +22,7 @@
#include <LibJS/Bytecode/Operand.h>
#include <LibJS/Bytecode/ScopedOperand.h>
#include <LibJS/Forward.h>
#include <LibJS/LocalVariable.h>
#include <LibJS/Runtime/ClassFieldDefinition.h>
#include <LibJS/Runtime/Completion.h>
#include <LibJS/Runtime/EnvironmentCoordinate.h>
@ -340,11 +341,11 @@ public:
ThrowCompletionOr<void> for_each_function_hoistable_with_annexB_extension(ThrowCompletionOrVoidCallback<FunctionDeclaration&>&& callback) const;
Vector<FlyString> const& local_variables_names() const { return m_local_variables_names; }
size_t add_local_variable(FlyString name)
auto const& local_variables_names() const { return m_local_variables_names; }
size_t add_local_variable(FlyString name, LocalVariable::DeclarationKind declaration_kind)
{
auto index = m_local_variables_names.size();
m_local_variables_names.append(move(name));
m_local_variables_names.append({ move(name), declaration_kind });
return index;
}
@ -363,7 +364,7 @@ private:
Vector<NonnullRefPtr<FunctionDeclaration const>> m_functions_hoistable_with_annexB_extension;
Vector<FlyString> m_local_variables_names;
Vector<LocalVariable> m_local_variables_names;
};
// ImportEntry Record, https://tc39.es/ecma262/#table-importentry-record-fields
@ -785,7 +786,7 @@ public:
auto const& body_ptr() const { return m_body; }
auto const& parameters() const { return m_parameters; }
i32 function_length() const { return m_function_length; }
Vector<FlyString> const& local_variables_names() const { return m_local_variables_names; }
Vector<LocalVariable> const& local_variables_names() const { return m_local_variables_names; }
bool is_strict_mode() const { return m_is_strict_mode; }
bool might_need_arguments_object() const { return m_parsing_insights.might_need_arguments_object; }
bool contains_direct_call_to_eval() const { return m_parsing_insights.contains_direct_call_to_eval; }
@ -803,7 +804,7 @@ public:
virtual ~FunctionNode();
protected:
FunctionNode(RefPtr<Identifier const> name, ByteString source_text, NonnullRefPtr<Statement const> body, NonnullRefPtr<FunctionParameters const> parameters, i32 function_length, FunctionKind kind, bool is_strict_mode, FunctionParsingInsights parsing_insights, bool is_arrow_function, Vector<FlyString> local_variables_names);
FunctionNode(RefPtr<Identifier const> name, ByteString source_text, NonnullRefPtr<Statement const> body, NonnullRefPtr<FunctionParameters const> parameters, i32 function_length, FunctionKind kind, bool is_strict_mode, FunctionParsingInsights parsing_insights, bool is_arrow_function, Vector<LocalVariable> local_variables_names);
void dump(int indent, ByteString const& class_name) const;
RefPtr<Identifier const> m_name { nullptr };
@ -818,7 +819,7 @@ private:
bool m_is_arrow_function : 1 { false };
FunctionParsingInsights m_parsing_insights;
Vector<FlyString> m_local_variables_names;
Vector<LocalVariable> m_local_variables_names;
mutable RefPtr<SharedFunctionInstanceData> m_shared_data;
};
@ -829,7 +830,7 @@ class FunctionDeclaration final
public:
static bool must_have_name() { return true; }
FunctionDeclaration(SourceRange source_range, RefPtr<Identifier const> name, ByteString source_text, NonnullRefPtr<Statement const> body, NonnullRefPtr<FunctionParameters const> parameters, i32 function_length, FunctionKind kind, bool is_strict_mode, FunctionParsingInsights insights, Vector<FlyString> local_variables_names)
FunctionDeclaration(SourceRange source_range, RefPtr<Identifier const> name, ByteString source_text, NonnullRefPtr<Statement const> body, NonnullRefPtr<FunctionParameters const> parameters, i32 function_length, FunctionKind kind, bool is_strict_mode, FunctionParsingInsights insights, Vector<LocalVariable> local_variables_names)
: Declaration(move(source_range))
, FunctionNode(move(name), move(source_text), move(body), move(parameters), function_length, kind, is_strict_mode, insights, false, move(local_variables_names))
{
@ -859,7 +860,7 @@ class FunctionExpression final
public:
static bool must_have_name() { return false; }
FunctionExpression(SourceRange source_range, RefPtr<Identifier const> name, ByteString source_text, NonnullRefPtr<Statement const> body, NonnullRefPtr<FunctionParameters const> parameters, i32 function_length, FunctionKind kind, bool is_strict_mode, FunctionParsingInsights insights, Vector<FlyString> local_variables_names, bool is_arrow_function = false)
FunctionExpression(SourceRange source_range, RefPtr<Identifier const> name, ByteString source_text, NonnullRefPtr<Statement const> body, NonnullRefPtr<FunctionParameters const> parameters, i32 function_length, FunctionKind kind, bool is_strict_mode, FunctionParsingInsights insights, Vector<LocalVariable> local_variables_names, bool is_arrow_function = false)
: Expression(move(source_range))
, FunctionNode(move(name), move(source_text), move(body), move(parameters), function_length, kind, is_strict_mode, insights, is_arrow_function, move(local_variables_names))
{