From 0cc9d47e1bed54bb21a39aec2f44a3a26ef5acf6 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 6 Jun 2021 13:36:34 +0200 Subject: [PATCH] LibJS: Add AbstractEquals bytecode instruction for == comparison :^) --- .../Libraries/LibJS/Bytecode/ASTCodegen.cpp | 3 +++ Userland/Libraries/LibJS/Bytecode/Op.cpp | 10 ++++++++++ Userland/Libraries/LibJS/Bytecode/Op.h | 19 +++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp index 6bb367186b..9edbea0528 100644 --- a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp +++ b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp @@ -55,6 +55,9 @@ Optional BinaryExpression::generate_bytecode(Bytecode::Gener case BinaryOp::AbstractInequals: generator.emit(dst_reg, *lhs_reg, *rhs_reg); return dst_reg; + case BinaryOp::AbstractEquals: + generator.emit(dst_reg, *lhs_reg, *rhs_reg); + return dst_reg; default: TODO(); } diff --git a/Userland/Libraries/LibJS/Bytecode/Op.cpp b/Userland/Libraries/LibJS/Bytecode/Op.cpp index 0297533b11..f1430d5ae7 100644 --- a/Userland/Libraries/LibJS/Bytecode/Op.cpp +++ b/Userland/Libraries/LibJS/Bytecode/Op.cpp @@ -38,6 +38,11 @@ void AbstractInequals::execute(Bytecode::Interpreter& interpreter) const interpreter.reg(m_dst) = Value(!abstract_eq(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2))); } +void AbstractEquals::execute(Bytecode::Interpreter& interpreter) const +{ + interpreter.reg(m_dst) = Value(abstract_eq(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2))); +} + void NewString::execute(Bytecode::Interpreter& interpreter) const { interpreter.reg(m_dst) = js_string(interpreter.vm(), m_string); @@ -164,6 +169,11 @@ String AbstractInequals::to_string() const return String::formatted("AbstractInequals dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); } +String AbstractEquals::to_string() const +{ + return String::formatted("AbstractEquals dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); +} + String NewString::to_string() const { return String::formatted("NewString dst:{}, string:\"{}\"", m_dst, m_string); diff --git a/Userland/Libraries/LibJS/Bytecode/Op.h b/Userland/Libraries/LibJS/Bytecode/Op.h index 9769a6b5a6..1ee72e41a4 100644 --- a/Userland/Libraries/LibJS/Bytecode/Op.h +++ b/Userland/Libraries/LibJS/Bytecode/Op.h @@ -108,6 +108,25 @@ private: Register m_src2; }; +class AbstractEquals final : public Instruction { +public: + AbstractEquals(Register dst, Register src1, Register src2) + : m_dst(dst) + , m_src1(src1) + , m_src2(src2) + { + } + + virtual ~AbstractEquals() override { } + virtual void execute(Bytecode::Interpreter&) const override; + virtual String to_string() const override; + +private: + Register m_dst; + Register m_src1; + Register m_src2; +}; + class NewString final : public Instruction { public: NewString(Register dst, String string)