From c53a86a3fe530d6adaa095944a59a8a0333be3c6 Mon Sep 17 00:00:00 2001 From: Ali Mohammad Pur Date: Fri, 11 Jun 2021 01:36:10 +0430 Subject: [PATCH] LibJS: Resolve the `this' value in call expression bytecode --- .../Libraries/LibJS/Bytecode/ASTCodegen.cpp | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp index 2264dc85a0..6397ca2e8c 100644 --- a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp +++ b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp @@ -616,15 +616,36 @@ void VariableDeclaration::generate_bytecode(Bytecode::Generator& generator) cons void CallExpression::generate_bytecode(Bytecode::Generator& generator) const { - m_callee->generate_bytecode(generator); auto callee_reg = generator.allocate_register(); - generator.emit(callee_reg); - - // FIXME: Load the correct 'this' value into 'this_reg'. auto this_reg = generator.allocate_register(); generator.emit(js_undefined()); generator.emit(this_reg); + if (is(this)) { + m_callee->generate_bytecode(generator); + generator.emit(callee_reg); + } else if (is(*m_callee)) { + TODO(); + } else if (is(*m_callee)) { + auto& member_expression = static_cast(*m_callee); + if (is(member_expression.object())) { + TODO(); + } else { + member_expression.object().generate_bytecode(generator); + generator.emit(this_reg); + // FIXME: Don't copy this logic here, make MemberExpression generate it. + if (!is(member_expression.property())) + TODO(); + auto identifier_table_ref = generator.intern_string(static_cast(member_expression.property()).string()); + generator.emit(identifier_table_ref); + generator.emit(callee_reg); + } + } else { + // FIXME: this = global object in sloppy mode. + m_callee->generate_bytecode(generator); + generator.emit(callee_reg); + } + Vector argument_registers; for (auto& arg : m_arguments) { arg.value->generate_bytecode(generator);