Op.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  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 NewString final : public Instruction {
  77. public:
  78. NewString(Register dst, String string)
  79. : m_dst(dst)
  80. , m_string(move(string))
  81. {
  82. }
  83. virtual ~NewString() override { }
  84. virtual void execute(Bytecode::Interpreter&) const override;
  85. virtual String to_string() const override;
  86. private:
  87. Register m_dst;
  88. String m_string;
  89. };
  90. class SetVariable final : public Instruction {
  91. public:
  92. SetVariable(FlyString identifier, Register src)
  93. : m_identifier(move(identifier))
  94. , m_src(src)
  95. {
  96. }
  97. virtual ~SetVariable() override { }
  98. virtual void execute(Bytecode::Interpreter&) const override;
  99. virtual String to_string() const override;
  100. private:
  101. FlyString m_identifier;
  102. Register m_src;
  103. };
  104. class GetVariable final : public Instruction {
  105. public:
  106. GetVariable(Register dst, FlyString identifier)
  107. : m_dst(dst)
  108. , m_identifier(move(identifier))
  109. {
  110. }
  111. virtual ~GetVariable() override { }
  112. virtual void execute(Bytecode::Interpreter&) const override;
  113. virtual String to_string() const override;
  114. private:
  115. Register m_dst;
  116. FlyString m_identifier;
  117. };
  118. class Jump final : public Instruction {
  119. public:
  120. explicit Jump(Label target)
  121. : m_target(target)
  122. {
  123. }
  124. virtual ~Jump() override { }
  125. virtual void execute(Bytecode::Interpreter&) const override;
  126. virtual String to_string() const override;
  127. private:
  128. Label m_target;
  129. };
  130. class JumpIfFalse final : public Instruction {
  131. public:
  132. explicit JumpIfFalse(Register result, Optional<Label> target = {})
  133. : m_result(result)
  134. , m_target(move(target))
  135. {
  136. }
  137. void set_target(Optional<Label> target) { m_target = move(target); }
  138. virtual ~JumpIfFalse() override { }
  139. virtual void execute(Bytecode::Interpreter&) const override;
  140. virtual String to_string() const override;
  141. private:
  142. Register m_result;
  143. Optional<Label> m_target;
  144. };
  145. }