diff --git a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp index 5440030c6f..eac9f3bf0b 100644 --- a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp +++ b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp @@ -84,6 +84,12 @@ Optional BinaryExpression::generate_bytecode(Bytecode::Gener case BinaryOp::AbstractEquals: generator.emit(dst_reg, *lhs_reg, *rhs_reg); return dst_reg; + case BinaryOp::TypedInequals: + generator.emit(dst_reg, *lhs_reg, *rhs_reg); + return dst_reg; + case BinaryOp::TypedEquals: + generator.emit(dst_reg, *lhs_reg, *rhs_reg); + return dst_reg; case BinaryOp::BitwiseAnd: generator.emit(dst_reg, *lhs_reg, *rhs_reg); return dst_reg; diff --git a/Userland/Libraries/LibJS/Bytecode/Instruction.h b/Userland/Libraries/LibJS/Bytecode/Instruction.h index 84471e80e2..1f40091ff2 100644 --- a/Userland/Libraries/LibJS/Bytecode/Instruction.h +++ b/Userland/Libraries/LibJS/Bytecode/Instruction.h @@ -23,6 +23,8 @@ O(LessThanEquals) \ O(AbstractInequals) \ O(AbstractEquals) \ + O(TypedInequals) \ + O(TypedEquals) \ O(NewString) \ O(NewObject) \ O(GetVariable) \ diff --git a/Userland/Libraries/LibJS/Bytecode/Op.cpp b/Userland/Libraries/LibJS/Bytecode/Op.cpp index 73703d1027..b2fea825fd 100644 --- a/Userland/Libraries/LibJS/Bytecode/Op.cpp +++ b/Userland/Libraries/LibJS/Bytecode/Op.cpp @@ -112,6 +112,16 @@ 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 TypedInequals::execute(Bytecode::Interpreter& interpreter) const +{ + interpreter.reg(m_dst) = Value(!strict_eq(interpreter.reg(m_src1), interpreter.reg(m_src2))); +} + +void TypedEquals::execute(Bytecode::Interpreter& interpreter) const +{ + interpreter.reg(m_dst) = Value(strict_eq(interpreter.reg(m_src1), interpreter.reg(m_src2))); +} + void BitwiseAnd::execute(Bytecode::Interpreter& interpreter) const { interpreter.reg(m_dst) = bitwise_and(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2)); @@ -319,6 +329,16 @@ String AbstractEquals::to_string() const return String::formatted("AbstractEquals dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); } +String TypedInequals::to_string() const +{ + return String::formatted("TypedInequals dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); +} + +String TypedEquals::to_string() const +{ + return String::formatted("TypedEquals dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); +} + String BitwiseAnd::to_string() const { return String::formatted("BitwiseAnd dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); diff --git a/Userland/Libraries/LibJS/Bytecode/Op.h b/Userland/Libraries/LibJS/Bytecode/Op.h index 17f96d135e..3a4ad9236a 100644 --- a/Userland/Libraries/LibJS/Bytecode/Op.h +++ b/Userland/Libraries/LibJS/Bytecode/Op.h @@ -260,6 +260,44 @@ private: Register m_src2; }; +class TypedInequals final : public Instruction { +public: + TypedInequals(Register dst, Register src1, Register src2) + : Instruction(Type::TypedInequals) + , m_dst(dst) + , m_src1(src1) + , m_src2(src2) + { + } + + void execute(Bytecode::Interpreter&) const; + String to_string() const; + +private: + Register m_dst; + Register m_src1; + Register m_src2; +}; + +class TypedEquals final : public Instruction { +public: + TypedEquals(Register dst, Register src1, Register src2) + : Instruction(Type::TypedEquals) + , m_dst(dst) + , m_src1(src1) + , m_src2(src2) + { + } + + void execute(Bytecode::Interpreter&) const; + String to_string() const; + +private: + Register m_dst; + Register m_src1; + Register m_src2; +}; + class BitwiseAnd final : public Instruction { public: BitwiseAnd(Register dst, Register src1, Register src2)