Op.h 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  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 AbstractEquals final : public Instruction {
  93. public:
  94. AbstractEquals(Register dst, Register src1, Register src2)
  95. : m_dst(dst)
  96. , m_src1(src1)
  97. , m_src2(src2)
  98. {
  99. }
  100. virtual ~AbstractEquals() override { }
  101. virtual void execute(Bytecode::Interpreter&) const override;
  102. virtual String to_string() const override;
  103. private:
  104. Register m_dst;
  105. Register m_src1;
  106. Register m_src2;
  107. };
  108. class NewString final : public Instruction {
  109. public:
  110. NewString(Register dst, String string)
  111. : m_dst(dst)
  112. , m_string(move(string))
  113. {
  114. }
  115. virtual ~NewString() override { }
  116. virtual void execute(Bytecode::Interpreter&) const override;
  117. virtual String to_string() const override;
  118. private:
  119. Register m_dst;
  120. String m_string;
  121. };
  122. class NewObject final : public Instruction {
  123. public:
  124. explicit NewObject(Register dst)
  125. : m_dst(dst)
  126. {
  127. }
  128. virtual ~NewObject() override { }
  129. virtual void execute(Bytecode::Interpreter&) const override;
  130. virtual String to_string() const override;
  131. private:
  132. Register m_dst;
  133. };
  134. class SetVariable final : public Instruction {
  135. public:
  136. SetVariable(FlyString identifier, Register src)
  137. : m_identifier(move(identifier))
  138. , m_src(src)
  139. {
  140. }
  141. virtual ~SetVariable() override { }
  142. virtual void execute(Bytecode::Interpreter&) const override;
  143. virtual String to_string() const override;
  144. private:
  145. FlyString m_identifier;
  146. Register m_src;
  147. };
  148. class GetVariable final : public Instruction {
  149. public:
  150. GetVariable(Register dst, FlyString identifier)
  151. : m_dst(dst)
  152. , m_identifier(move(identifier))
  153. {
  154. }
  155. virtual ~GetVariable() override { }
  156. virtual void execute(Bytecode::Interpreter&) const override;
  157. virtual String to_string() const override;
  158. private:
  159. Register m_dst;
  160. FlyString m_identifier;
  161. };
  162. class GetById final : public Instruction {
  163. public:
  164. GetById(Register dst, Register base, FlyString property)
  165. : m_dst(dst)
  166. , m_base(base)
  167. , m_property(move(property))
  168. {
  169. }
  170. virtual ~GetById() override { }
  171. virtual void execute(Bytecode::Interpreter&) const override;
  172. virtual String to_string() const override;
  173. private:
  174. Register m_dst;
  175. Register m_base;
  176. FlyString m_property;
  177. };
  178. class PutById final : public Instruction {
  179. public:
  180. PutById(Register base, FlyString property, Register src)
  181. : m_base(base)
  182. , m_property(move(property))
  183. , m_src(src)
  184. {
  185. }
  186. virtual ~PutById() override { }
  187. virtual void execute(Bytecode::Interpreter&) const override;
  188. virtual String to_string() const override;
  189. private:
  190. Register m_base;
  191. FlyString m_property;
  192. Register m_src;
  193. };
  194. class Jump final : public Instruction {
  195. public:
  196. explicit Jump(Optional<Label> target = {})
  197. : m_target(move(target))
  198. {
  199. }
  200. void set_target(Optional<Label> target) { m_target = move(target); }
  201. virtual ~Jump() override { }
  202. virtual void execute(Bytecode::Interpreter&) const override;
  203. virtual String to_string() const override;
  204. private:
  205. Optional<Label> m_target;
  206. };
  207. class JumpIfFalse final : public Instruction {
  208. public:
  209. explicit JumpIfFalse(Register result, Optional<Label> target = {})
  210. : m_result(result)
  211. , m_target(move(target))
  212. {
  213. }
  214. void set_target(Optional<Label> target) { m_target = move(target); }
  215. virtual ~JumpIfFalse() override { }
  216. virtual void execute(Bytecode::Interpreter&) const override;
  217. virtual String to_string() const override;
  218. private:
  219. Register m_result;
  220. Optional<Label> m_target;
  221. };
  222. class JumpIfTrue final : public Instruction {
  223. public:
  224. explicit JumpIfTrue(Register result, Optional<Label> target = {})
  225. : m_result(result)
  226. , m_target(move(target))
  227. {
  228. }
  229. void set_target(Optional<Label> target) { m_target = move(target); }
  230. virtual ~JumpIfTrue() override { }
  231. virtual void execute(Bytecode::Interpreter&) const override;
  232. virtual String to_string() const override;
  233. private:
  234. Register m_result;
  235. Optional<Label> m_target;
  236. };
  237. class Call final : public Instruction {
  238. public:
  239. Call(Register dst, Register callee, Register this_value, Vector<Register> arguments)
  240. : m_dst(dst)
  241. , m_callee(callee)
  242. , m_this_value(this_value)
  243. , m_arguments(move(arguments))
  244. {
  245. }
  246. virtual ~Call() override { }
  247. virtual void execute(Bytecode::Interpreter&) const override;
  248. virtual String to_string() const override;
  249. private:
  250. Register m_dst;
  251. Register m_callee;
  252. Register m_this_value;
  253. Vector<Register> m_arguments;
  254. };
  255. class EnterScope final : public Instruction {
  256. public:
  257. explicit EnterScope(ScopeNode const& scope_node)
  258. : m_scope_node(scope_node)
  259. {
  260. }
  261. virtual ~EnterScope() override { }
  262. virtual void execute(Bytecode::Interpreter&) const override;
  263. virtual String to_string() const override;
  264. private:
  265. ScopeNode const& m_scope_node;
  266. };
  267. class Return final : public Instruction {
  268. public:
  269. explicit Return(Optional<Register> argument)
  270. : m_argument(move(argument))
  271. {
  272. }
  273. virtual ~Return() override { }
  274. virtual void execute(Bytecode::Interpreter&) const override;
  275. virtual String to_string() const override;
  276. private:
  277. Optional<Register> m_argument;
  278. };
  279. }