Op.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. /*
  2. * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/FlyString.h>
  8. #include <LibJS/Bytecode/Instruction.h>
  9. #include <LibJS/Bytecode/Label.h>
  10. #include <LibJS/Bytecode/Register.h>
  11. #include <LibJS/Heap/Cell.h>
  12. #include <LibJS/Runtime/Value.h>
  13. namespace JS::Bytecode::Op {
  14. class Load final : public Instruction {
  15. public:
  16. Load(Register dst, Value value)
  17. : m_dst(dst)
  18. , m_value(value)
  19. {
  20. }
  21. virtual ~Load() override { }
  22. virtual void execute(Bytecode::Interpreter&) const override;
  23. virtual String to_string() const override;
  24. private:
  25. Register m_dst;
  26. Value m_value;
  27. };
  28. class Add final : public Instruction {
  29. public:
  30. Add(Register dst, Register src1, Register src2)
  31. : m_dst(dst)
  32. , m_src1(src1)
  33. , m_src2(src2)
  34. {
  35. }
  36. virtual ~Add() override { }
  37. virtual void execute(Bytecode::Interpreter&) const override;
  38. virtual String to_string() const override;
  39. private:
  40. Register m_dst;
  41. Register m_src1;
  42. Register m_src2;
  43. };
  44. class Sub final : public Instruction {
  45. public:
  46. Sub(Register dst, Register src1, Register src2)
  47. : m_dst(dst)
  48. , m_src1(src1)
  49. , m_src2(src2)
  50. {
  51. }
  52. virtual ~Sub() override { }
  53. virtual void execute(Bytecode::Interpreter&) const override;
  54. virtual String to_string() const override;
  55. private:
  56. Register m_dst;
  57. Register m_src1;
  58. Register m_src2;
  59. };
  60. class LessThan final : public Instruction {
  61. public:
  62. LessThan(Register dst, Register src1, Register src2)
  63. : m_dst(dst)
  64. , m_src1(src1)
  65. , m_src2(src2)
  66. {
  67. }
  68. virtual ~LessThan() override { }
  69. virtual void execute(Bytecode::Interpreter&) const override;
  70. virtual String to_string() const override;
  71. private:
  72. Register m_dst;
  73. Register m_src1;
  74. Register m_src2;
  75. };
  76. class AbstractInequals final : public Instruction {
  77. public:
  78. AbstractInequals(Register dst, Register src1, Register src2)
  79. : m_dst(dst)
  80. , m_src1(src1)
  81. , m_src2(src2)
  82. {
  83. }
  84. virtual ~AbstractInequals() override { }
  85. virtual void execute(Bytecode::Interpreter&) const override;
  86. virtual String to_string() const override;
  87. private:
  88. Register m_dst;
  89. Register m_src1;
  90. Register m_src2;
  91. };
  92. class NewString final : public Instruction {
  93. public:
  94. NewString(Register dst, String string)
  95. : m_dst(dst)
  96. , m_string(move(string))
  97. {
  98. }
  99. virtual ~NewString() override { }
  100. virtual void execute(Bytecode::Interpreter&) const override;
  101. virtual String to_string() const override;
  102. private:
  103. Register m_dst;
  104. String m_string;
  105. };
  106. class NewObject final : public Instruction {
  107. public:
  108. explicit NewObject(Register dst)
  109. : m_dst(dst)
  110. {
  111. }
  112. virtual ~NewObject() override { }
  113. virtual void execute(Bytecode::Interpreter&) const override;
  114. virtual String to_string() const override;
  115. private:
  116. Register m_dst;
  117. };
  118. class SetVariable final : public Instruction {
  119. public:
  120. SetVariable(FlyString identifier, Register src)
  121. : m_identifier(move(identifier))
  122. , m_src(src)
  123. {
  124. }
  125. virtual ~SetVariable() override { }
  126. virtual void execute(Bytecode::Interpreter&) const override;
  127. virtual String to_string() const override;
  128. private:
  129. FlyString m_identifier;
  130. Register m_src;
  131. };
  132. class GetVariable final : public Instruction {
  133. public:
  134. GetVariable(Register dst, FlyString identifier)
  135. : m_dst(dst)
  136. , m_identifier(move(identifier))
  137. {
  138. }
  139. virtual ~GetVariable() override { }
  140. virtual void execute(Bytecode::Interpreter&) const override;
  141. virtual String to_string() const override;
  142. private:
  143. Register m_dst;
  144. FlyString m_identifier;
  145. };
  146. class Jump final : public Instruction {
  147. public:
  148. explicit Jump(Label target)
  149. : m_target(target)
  150. {
  151. }
  152. virtual ~Jump() override { }
  153. virtual void execute(Bytecode::Interpreter&) const override;
  154. virtual String to_string() const override;
  155. private:
  156. Label m_target;
  157. };
  158. class JumpIfFalse final : public Instruction {
  159. public:
  160. explicit JumpIfFalse(Register result, Optional<Label> target = {})
  161. : m_result(result)
  162. , m_target(move(target))
  163. {
  164. }
  165. void set_target(Optional<Label> target) { m_target = move(target); }
  166. virtual ~JumpIfFalse() override { }
  167. virtual void execute(Bytecode::Interpreter&) const override;
  168. virtual String to_string() const override;
  169. private:
  170. Register m_result;
  171. Optional<Label> m_target;
  172. };
  173. class JumpIfTrue final : public Instruction {
  174. public:
  175. explicit JumpIfTrue(Register result, Optional<Label> target = {})
  176. : m_result(result)
  177. , m_target(move(target))
  178. {
  179. }
  180. void set_target(Optional<Label> target) { m_target = move(target); }
  181. virtual ~JumpIfTrue() override { }
  182. virtual void execute(Bytecode::Interpreter&) const override;
  183. virtual String to_string() const override;
  184. private:
  185. Register m_result;
  186. Optional<Label> m_target;
  187. };
  188. }