From 57386ca8398e38ad21a6b91edef13b8024fc5510 Mon Sep 17 00:00:00 2001 From: Ali Mohammad Pur Date: Sun, 13 Mar 2022 12:43:45 +0330 Subject: [PATCH] LibJS: Initialize 'var' bindings to undefined on declaration This is what CreateGlobalVarBinding does, so do the same thing in BC. --- Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp index 0e00457160..a952ded98f 100644 --- a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp +++ b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp @@ -176,6 +176,8 @@ Bytecode::CodeGenerationErrorOr ScopeNode::generate_bytecode(Bytecode::Gen if (!declared_function_names.contains(function_name) && !declared_var_names.contains(function_name)) { // i. Perform ? env.CreateGlobalVarBinding(F, false). generator.emit(index, Bytecode::Op::EnvironmentMode::Var, false); + generator.emit(js_undefined()); + generator.emit(index, Bytecode::Op::SetVariable::InitializationMode::Initialize, Bytecode::Op::EnvironmentMode::Var); // ii. Append F to declaredFunctionOrVarNames. declared_function_names.set(function_name); @@ -848,7 +850,7 @@ Bytecode::CodeGenerationErrorOr FunctionDeclaration::generate_bytecode(Byt if (m_is_hoisted) { auto index = generator.intern_identifier(name()); generator.emit(index); - generator.emit(index, Bytecode::Op::SetVariable::InitializationMode::Initialize, Bytecode::Op::EnvironmentMode::Var); + generator.emit(index, Bytecode::Op::SetVariable::InitializationMode::Set, Bytecode::Op::EnvironmentMode::Var); } return {}; } @@ -1127,10 +1129,11 @@ Bytecode::CodeGenerationErrorOr VariableDeclaration::generate_bytecode(Byt generator.emit(js_undefined()); auto initialization_mode = is_lexical_declaration() ? Bytecode::Op::SetVariable::InitializationMode::Initialize : Bytecode::Op::SetVariable::InitializationMode::Set; + auto environment_mode = is_lexical_declaration() ? Bytecode::Op::EnvironmentMode::Lexical : Bytecode::Op::EnvironmentMode::Var; TRY(declarator.target().visit( [&](NonnullRefPtr const& id) -> Bytecode::CodeGenerationErrorOr { - generator.emit(generator.intern_identifier(id->string()), initialization_mode); + generator.emit(generator.intern_identifier(id->string()), initialization_mode, environment_mode); return {}; }, [&](NonnullRefPtr const& pattern) -> Bytecode::CodeGenerationErrorOr {