mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 01:02:45 +00:00 
			
		
		
		
	LibJS: Use macros to generate the common unary/binary bytecode ops
This commit is contained in:
		
							parent
							
								
									3067ee9c4c
								
							
						
					
					
						commit
						ebb40e7d7b
					
				
					 2 changed files with 108 additions and 753 deletions
				
			
		|  | @ -58,141 +58,59 @@ void LoadRegister::execute(Bytecode::Interpreter& interpreter) const | ||||||
|     interpreter.reg(m_dst) = interpreter.reg(m_src); |     interpreter.reg(m_dst) = interpreter.reg(m_src); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Add::execute(Bytecode::Interpreter& interpreter) const | static Value abstract_inequals(GlobalObject& global_object, Value src1, Value src2) | ||||||
| { | { | ||||||
|     interpreter.reg(m_dst) = add(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2)); |     return Value(!abstract_eq(global_object, src1, src2)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Sub::execute(Bytecode::Interpreter& interpreter) const | static Value abstract_equals(GlobalObject& global_object, Value src1, Value src2) | ||||||
| { | { | ||||||
|     interpreter.reg(m_dst) = sub(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2)); |     return Value(abstract_eq(global_object, src1, src2)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Mul::execute(Bytecode::Interpreter& interpreter) const | static Value typed_inequals(GlobalObject&, Value src1, Value src2) | ||||||
| { | { | ||||||
|     interpreter.reg(m_dst) = mul(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2)); |     return Value(!strict_eq(src1, src2)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Div::execute(Bytecode::Interpreter& interpreter) const | static Value typed_equals(GlobalObject&, Value src1, Value src2) | ||||||
| { | { | ||||||
|     interpreter.reg(m_dst) = div(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2)); |     return Value(strict_eq(src1, src2)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Mod::execute(Bytecode::Interpreter& interpreter) const | #define JS_DEFINE_COMMON_BINARY_OP(OpTitleCase, op_snake_case)                                                                 \ | ||||||
|  |     void OpTitleCase::execute(Bytecode::Interpreter& interpreter) const                                                        \ | ||||||
|  |     {                                                                                                                          \ | ||||||
|  |         interpreter.reg(m_dst) = op_snake_case(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2)); \ | ||||||
|  |     }                                                                                                                          \ | ||||||
|  |     String OpTitleCase::to_string() const                                                                                      \ | ||||||
|  |     {                                                                                                                          \ | ||||||
|  |         return String::formatted(#OpTitleCase " dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2);                             \ | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | JS_ENUMERATE_COMMON_BINARY_OPS(JS_DEFINE_COMMON_BINARY_OP) | ||||||
|  | 
 | ||||||
|  | static Value not_(GlobalObject&, Value value) | ||||||
| { | { | ||||||
|     interpreter.reg(m_dst) = mod(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2)); |     return Value(!value.to_boolean()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Exp::execute(Bytecode::Interpreter& interpreter) const | static Value typeof_(GlobalObject& global_object, Value value) | ||||||
| { | { | ||||||
|     interpreter.reg(m_dst) = exp(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2)); |     return js_string(global_object.vm(), value.typeof()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void GreaterThan::execute(Bytecode::Interpreter& interpreter) const | #define JS_DEFINE_COMMON_UNARY_OP(OpTitleCase, op_snake_case)                                        \ | ||||||
| { |     void OpTitleCase::execute(Bytecode::Interpreter& interpreter) const                              \ | ||||||
|     interpreter.reg(m_dst) = greater_than(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2)); |     {                                                                                                \ | ||||||
| } |         interpreter.reg(m_dst) = op_snake_case(interpreter.global_object(), interpreter.reg(m_src)); \ | ||||||
|  |     }                                                                                                \ | ||||||
|  |     String OpTitleCase::to_string() const                                                            \ | ||||||
|  |     {                                                                                                \ | ||||||
|  |         return String::formatted(#OpTitleCase " dst:{}, src:{}", m_dst, m_src);                      \ | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
| void GreaterThanEquals::execute(Bytecode::Interpreter& interpreter) const | JS_ENUMERATE_COMMON_UNARY_OPS(JS_DEFINE_COMMON_UNARY_OP) | ||||||
| { |  | ||||||
|     interpreter.reg(m_dst) = greater_than_equals(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void LessThan::execute(Bytecode::Interpreter& interpreter) const |  | ||||||
| { |  | ||||||
|     interpreter.reg(m_dst) = less_than(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void LessThanEquals::execute(Bytecode::Interpreter& interpreter) const |  | ||||||
| { |  | ||||||
|     interpreter.reg(m_dst) = less_than_equals(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 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 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)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void BitwiseOr::execute(Bytecode::Interpreter& interpreter) const |  | ||||||
| { |  | ||||||
|     interpreter.reg(m_dst) = bitwise_or(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void BitwiseXor::execute(Bytecode::Interpreter& interpreter) const |  | ||||||
| { |  | ||||||
|     interpreter.reg(m_dst) = bitwise_xor(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void LeftShift::execute(Bytecode::Interpreter& interpreter) const |  | ||||||
| { |  | ||||||
|     interpreter.reg(m_dst) = left_shift(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void RightShift::execute(Bytecode::Interpreter& interpreter) const |  | ||||||
| { |  | ||||||
|     interpreter.reg(m_dst) = right_shift(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void UnsignedRightShift::execute(Bytecode::Interpreter& interpreter) const |  | ||||||
| { |  | ||||||
|     interpreter.reg(m_dst) = unsigned_right_shift(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void In::execute(Bytecode::Interpreter& interpreter) const |  | ||||||
| { |  | ||||||
|     interpreter.reg(m_dst) = in(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void InstanceOf::execute(Bytecode::Interpreter& interpreter) const |  | ||||||
| { |  | ||||||
|     interpreter.reg(m_dst) = instance_of(interpreter.global_object(), interpreter.reg(m_src1), interpreter.reg(m_src2)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void BitwiseNot::execute(Bytecode::Interpreter& interpreter) const |  | ||||||
| { |  | ||||||
|     interpreter.reg(m_dst) = bitwise_not(interpreter.global_object(), interpreter.reg(m_src)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void Not::execute(Bytecode::Interpreter& interpreter) const |  | ||||||
| { |  | ||||||
|     interpreter.reg(m_dst) = Value(!interpreter.reg(m_src).to_boolean()); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void UnaryPlus::execute(Bytecode::Interpreter& interpreter) const |  | ||||||
| { |  | ||||||
|     interpreter.reg(m_dst) = Value(unary_plus(interpreter.global_object(), interpreter.reg(m_src))); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void UnaryMinus::execute(Bytecode::Interpreter& interpreter) const |  | ||||||
| { |  | ||||||
|     interpreter.reg(m_dst) = Value(unary_minus(interpreter.global_object(), interpreter.reg(m_src))); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void Typeof::execute(Bytecode::Interpreter& interpreter) const |  | ||||||
| { |  | ||||||
|     auto& vm = interpreter.global_object().vm(); |  | ||||||
|     interpreter.reg(m_dst) = Value(js_string(vm, interpreter.reg(m_src).typeof())); |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| void NewString::execute(Bytecode::Interpreter& interpreter) const | void NewString::execute(Bytecode::Interpreter& interpreter) const | ||||||
| { | { | ||||||
|  | @ -305,141 +223,6 @@ String LoadRegister::to_string() const | ||||||
|     return String::formatted("LoadRegister dst:{}, src:{}", m_dst, m_src); |     return String::formatted("LoadRegister dst:{}, src:{}", m_dst, m_src); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| String Add::to_string() const |  | ||||||
| { |  | ||||||
|     return String::formatted("Add dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| String Sub::to_string() const |  | ||||||
| { |  | ||||||
|     return String::formatted("Sub dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| String Mul::to_string() const |  | ||||||
| { |  | ||||||
|     return String::formatted("Mul dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| String Div::to_string() const |  | ||||||
| { |  | ||||||
|     return String::formatted("Div dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| String Mod::to_string() const |  | ||||||
| { |  | ||||||
|     return String::formatted("Mod dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| String Exp::to_string() const |  | ||||||
| { |  | ||||||
|     return String::formatted("Exp dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| String GreaterThan::to_string() const |  | ||||||
| { |  | ||||||
|     return String::formatted("GreaterThan dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| String GreaterThanEquals::to_string() const |  | ||||||
| { |  | ||||||
|     return String::formatted("GreaterThanEquals dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| String LessThan::to_string() const |  | ||||||
| { |  | ||||||
|     return String::formatted("LessThan dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| String LessThanEquals::to_string() const |  | ||||||
| { |  | ||||||
|     return String::formatted("LessThanEquals dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 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 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); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| String BitwiseOr::to_string() const |  | ||||||
| { |  | ||||||
|     return String::formatted("BitwiseOr dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| String BitwiseXor::to_string() const |  | ||||||
| { |  | ||||||
|     return String::formatted("BitwiseXor dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| String LeftShift::to_string() const |  | ||||||
| { |  | ||||||
|     return String::formatted("LeftShift dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| String RightShift::to_string() const |  | ||||||
| { |  | ||||||
|     return String::formatted("RightShift dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| String UnsignedRightShift::to_string() const |  | ||||||
| { |  | ||||||
|     return String::formatted("UnsignedRightShift dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| String In::to_string() const |  | ||||||
| { |  | ||||||
|     return String::formatted("In dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| String InstanceOf::to_string() const |  | ||||||
| { |  | ||||||
|     return String::formatted("In dst:{}, src1:{}, src2:{}", m_dst, m_src1, m_src2); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| String BitwiseNot::to_string() const |  | ||||||
| { |  | ||||||
|     return String::formatted("BitwiseNot dst:{}, src:{}", m_dst, m_src); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| String Not::to_string() const |  | ||||||
| { |  | ||||||
|     return String::formatted("Not dst:{}, src:{}", m_dst, m_src); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| String UnaryPlus::to_string() const |  | ||||||
| { |  | ||||||
|     return String::formatted("UnaryPlus dst:{}, src:{}", m_dst, m_src); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| String UnaryMinus::to_string() const |  | ||||||
| { |  | ||||||
|     return String::formatted("UnaryMinus dst:{}, src:{}", m_dst, m_src); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| String Typeof::to_string() const |  | ||||||
| { |  | ||||||
|     return String::formatted("Typeof dst:{}, src:{}", m_dst, m_src); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| String NewString::to_string() const | String NewString::to_string() const | ||||||
| { | { | ||||||
|     return String::formatted("NewString dst:{}, string:\"{}\"", m_dst, m_string); |     return String::formatted("NewString dst:{}, string:\"{}\"", m_dst, m_string); | ||||||
|  |  | ||||||
|  | @ -50,508 +50,80 @@ private: | ||||||
|     Register m_src; |     Register m_src; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| class Add final : public Instruction { | #define JS_ENUMERATE_COMMON_BINARY_OPS(O)     \ | ||||||
| public: |     O(Add, add)                               \ | ||||||
|     Add(Register dst, Register src1, Register src2) |     O(Sub, sub)                               \ | ||||||
|         : Instruction(Type::Add) |     O(Mul, mul)                               \ | ||||||
|         , m_dst(dst) |     O(Div, div)                               \ | ||||||
|         , m_src1(src1) |     O(Exp, exp)                               \ | ||||||
|         , m_src2(src2) |     O(Mod, mod)                               \ | ||||||
|     { |     O(In, in)                                 \ | ||||||
|     } |     O(InstanceOf, instance_of)                \ | ||||||
| 
 |     O(GreaterThan, greater_than)              \ | ||||||
|     void execute(Bytecode::Interpreter&) const; |     O(GreaterThanEquals, greater_than_equals) \ | ||||||
|     String to_string() const; |     O(LessThan, less_than)                    \ | ||||||
| 
 |     O(LessThanEquals, less_than_equals)       \ | ||||||
| private: |     O(AbstractInequals, abstract_inequals)    \ | ||||||
|     Register m_dst; |     O(AbstractEquals, abstract_equals)        \ | ||||||
|     Register m_src1; |     O(TypedInequals, typed_inequals)          \ | ||||||
|     Register m_src2; |     O(TypedEquals, typed_equals)              \ | ||||||
| }; |     O(BitwiseAnd, bitwise_and)                \ | ||||||
| 
 |     O(BitwiseOr, bitwise_or)                  \ | ||||||
| class Sub final : public Instruction { |     O(BitwiseXor, bitwise_xor)                \ | ||||||
| public: |     O(LeftShift, left_shift)                  \ | ||||||
|     Sub(Register dst, Register src1, Register src2) |     O(RightShift, right_shift)                \ | ||||||
|         : Instruction(Type::Sub) |     O(UnsignedRightShift, unsigned_right_shift) | ||||||
|         , m_dst(dst) | 
 | ||||||
|         , m_src1(src1) | #define JS_DECLARE_COMMON_BINARY_OP(OpTitleCase, op_snake_case) \ | ||||||
|         , m_src2(src2) |     class OpTitleCase final : public Instruction {              \ | ||||||
|     { |     public:                                                     \ | ||||||
|     } |         OpTitleCase(Register dst, Register src1, Register src2) \ | ||||||
| 
 |             : Instruction(Type::OpTitleCase)                    \ | ||||||
|     void execute(Bytecode::Interpreter&) const; |             , m_dst(dst)                                        \ | ||||||
|     String to_string() const; |             , m_src1(src1)                                      \ | ||||||
| 
 |             , m_src2(src2)                                      \ | ||||||
| private: |         {                                                       \ | ||||||
|     Register m_dst; |         }                                                       \ | ||||||
|     Register m_src1; |                                                                 \ | ||||||
|     Register m_src2; |         void execute(Bytecode::Interpreter&) const;             \ | ||||||
| }; |         String to_string() const;                               \ | ||||||
| 
 |                                                                 \ | ||||||
| class Mul final : public Instruction { |     private:                                                    \ | ||||||
| public: |         Register m_dst;                                         \ | ||||||
|     Mul(Register dst, Register src1, Register src2) |         Register m_src1;                                        \ | ||||||
|         : Instruction(Type::Mul) |         Register m_src2;                                        \ | ||||||
|         , m_dst(dst) |     }; | ||||||
|         , m_src1(src1) | 
 | ||||||
|         , m_src2(src2) | JS_ENUMERATE_COMMON_BINARY_OPS(JS_DECLARE_COMMON_BINARY_OP) | ||||||
|     { | #undef JS_DECLARE_COMMON_BINARY_OP | ||||||
|     } | 
 | ||||||
| 
 | #define JS_ENUMERATE_COMMON_UNARY_OPS(O) \ | ||||||
|     void execute(Bytecode::Interpreter&) const; |     O(BitwiseNot, bitwise_not)           \ | ||||||
|     String to_string() const; |     O(Not, not_)                         \ | ||||||
| 
 |     O(UnaryPlus, unary_plus)             \ | ||||||
| private: |     O(UnaryMinus, unary_minus)           \ | ||||||
|     Register m_dst; |     O(Typeof, typeof_) | ||||||
|     Register m_src1; | 
 | ||||||
|     Register m_src2; | #define JS_DECLARE_COMMON_UNARY_OP(OpTitleCase, op_snake_case) \ | ||||||
| }; |     class OpTitleCase final : public Instruction {             \ | ||||||
| 
 |     public:                                                    \ | ||||||
| class Div final : public Instruction { |         OpTitleCase(Register dst, Register src)                \ | ||||||
| public: |             : Instruction(Type::OpTitleCase)                   \ | ||||||
|     Div(Register dst, Register src1, Register src2) |             , m_dst(dst)                                       \ | ||||||
|         : Instruction(Type::Div) |             , m_src(src)                                       \ | ||||||
|         , m_dst(dst) |         {                                                      \ | ||||||
|         , m_src1(src1) |         }                                                      \ | ||||||
|         , m_src2(src2) |                                                                \ | ||||||
|     { |         void execute(Bytecode::Interpreter&) const;            \ | ||||||
|     } |         String to_string() const;                              \ | ||||||
| 
 |                                                                \ | ||||||
|     void execute(Bytecode::Interpreter&) const; |     private:                                                   \ | ||||||
|     String to_string() const; |         Register m_dst;                                        \ | ||||||
| 
 |         Register m_src;                                        \ | ||||||
| private: |     }; | ||||||
|     Register m_dst; | 
 | ||||||
|     Register m_src1; | JS_ENUMERATE_COMMON_UNARY_OPS(JS_DECLARE_COMMON_UNARY_OP) | ||||||
|     Register m_src2; | #undef JS_DECLARE_COMMON_UNARY_OP | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| class Mod final : public Instruction { |  | ||||||
| public: |  | ||||||
|     Mod(Register dst, Register src1, Register src2) |  | ||||||
|         : Instruction(Type::Mod) |  | ||||||
|         , 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 Exp final : public Instruction { |  | ||||||
| public: |  | ||||||
|     Exp(Register dst, Register src1, Register src2) |  | ||||||
|         : Instruction(Type::Exp) |  | ||||||
|         , 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 GreaterThan final : public Instruction { |  | ||||||
| public: |  | ||||||
|     GreaterThan(Register dst, Register src1, Register src2) |  | ||||||
|         : Instruction(Type::GreaterThan) |  | ||||||
|         , 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 GreaterThanEquals final : public Instruction { |  | ||||||
| public: |  | ||||||
|     GreaterThanEquals(Register dst, Register src1, Register src2) |  | ||||||
|         : Instruction(Type::GreaterThanEquals) |  | ||||||
|         , 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 LessThan final : public Instruction { |  | ||||||
| public: |  | ||||||
|     LessThan(Register dst, Register src1, Register src2) |  | ||||||
|         : Instruction(Type::LessThan) |  | ||||||
|         , 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 LessThanEquals final : public Instruction { |  | ||||||
| public: |  | ||||||
|     LessThanEquals(Register dst, Register src1, Register src2) |  | ||||||
|         : Instruction(Type::LessThanEquals) |  | ||||||
|         , 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 AbstractInequals final : public Instruction { |  | ||||||
| public: |  | ||||||
|     AbstractInequals(Register dst, Register src1, Register src2) |  | ||||||
|         : Instruction(Type::AbstractInequals) |  | ||||||
|         , 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 AbstractEquals final : public Instruction { |  | ||||||
| public: |  | ||||||
|     AbstractEquals(Register dst, Register src1, Register src2) |  | ||||||
|         : Instruction(Type::AbstractEquals) |  | ||||||
|         , 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 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) |  | ||||||
|         : Instruction(Type::BitwiseAnd) |  | ||||||
|         , 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 BitwiseOr final : public Instruction { |  | ||||||
| public: |  | ||||||
|     BitwiseOr(Register dst, Register src1, Register src2) |  | ||||||
|         : Instruction(Type::BitwiseOr) |  | ||||||
|         , 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 BitwiseXor final : public Instruction { |  | ||||||
| public: |  | ||||||
|     BitwiseXor(Register dst, Register src1, Register src2) |  | ||||||
|         : Instruction(Type::BitwiseXor) |  | ||||||
|         , 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 LeftShift final : public Instruction { |  | ||||||
| public: |  | ||||||
|     LeftShift(Register dst, Register src1, Register src2) |  | ||||||
|         : Instruction(Type::LeftShift) |  | ||||||
|         , 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 RightShift final : public Instruction { |  | ||||||
| public: |  | ||||||
|     RightShift(Register dst, Register src1, Register src2) |  | ||||||
|         : Instruction(Type::RightShift) |  | ||||||
|         , 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 UnsignedRightShift final : public Instruction { |  | ||||||
| public: |  | ||||||
|     UnsignedRightShift(Register dst, Register src1, Register src2) |  | ||||||
|         : Instruction(Type::UnsignedRightShift) |  | ||||||
|         , 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 In final : public Instruction { |  | ||||||
| public: |  | ||||||
|     In(Register dst, Register src1, Register src2) |  | ||||||
|         : Instruction(Type::In) |  | ||||||
|         , 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 InstanceOf final : public Instruction { |  | ||||||
| public: |  | ||||||
|     InstanceOf(Register dst, Register src1, Register src2) |  | ||||||
|         : Instruction(Type::InstanceOf) |  | ||||||
|         , 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 BitwiseNot final : public Instruction { |  | ||||||
| public: |  | ||||||
|     BitwiseNot(Register dst, Register src) |  | ||||||
|         : Instruction(Type::BitwiseNot) |  | ||||||
|         , m_dst(dst) |  | ||||||
|         , m_src(src) |  | ||||||
|     { |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     void execute(Bytecode::Interpreter&) const; |  | ||||||
|     String to_string() const; |  | ||||||
| 
 |  | ||||||
| private: |  | ||||||
|     Register m_dst; |  | ||||||
|     Register m_src; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| class Not final : public Instruction { |  | ||||||
| public: |  | ||||||
|     Not(Register dst, Register src) |  | ||||||
|         : Instruction(Type::Not) |  | ||||||
|         , m_dst(dst) |  | ||||||
|         , m_src(src) |  | ||||||
|     { |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     void execute(Bytecode::Interpreter&) const; |  | ||||||
|     String to_string() const; |  | ||||||
| 
 |  | ||||||
| private: |  | ||||||
|     Register m_dst; |  | ||||||
|     Register m_src; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| class UnaryPlus final : public Instruction { |  | ||||||
| public: |  | ||||||
|     UnaryPlus(Register dst, Register src) |  | ||||||
|         : Instruction(Type::UnaryPlus) |  | ||||||
|         , m_dst(dst) |  | ||||||
|         , m_src(src) |  | ||||||
|     { |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     void execute(Bytecode::Interpreter&) const; |  | ||||||
|     String to_string() const; |  | ||||||
| 
 |  | ||||||
| private: |  | ||||||
|     Register m_dst; |  | ||||||
|     Register m_src; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| class UnaryMinus final : public Instruction { |  | ||||||
| public: |  | ||||||
|     UnaryMinus(Register dst, Register src) |  | ||||||
|         : Instruction(Type::UnaryMinus) |  | ||||||
|         , m_dst(dst) |  | ||||||
|         , m_src(src) |  | ||||||
|     { |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     void execute(Bytecode::Interpreter&) const; |  | ||||||
|     String to_string() const; |  | ||||||
| 
 |  | ||||||
| private: |  | ||||||
|     Register m_dst; |  | ||||||
|     Register m_src; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| class Typeof final : public Instruction { |  | ||||||
| public: |  | ||||||
|     Typeof(Register dst, Register src) |  | ||||||
|         : Instruction(Type::Typeof) |  | ||||||
|         , m_dst(dst) |  | ||||||
|         , m_src(src) |  | ||||||
|     { |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     void execute(Bytecode::Interpreter&) const; |  | ||||||
|     String to_string() const; |  | ||||||
| 
 |  | ||||||
| private: |  | ||||||
|     Register m_dst; |  | ||||||
|     Register m_src; |  | ||||||
| }; |  | ||||||
| 
 | 
 | ||||||
| class NewString final : public Instruction { | class NewString final : public Instruction { | ||||||
| public: | public: | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling