diff --git a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp index 2264dc85a0b..6397ca2e8c6 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);