Generator.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /*
  2. * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibJS/AST.h>
  7. #include <LibJS/Bytecode/BasicBlock.h>
  8. #include <LibJS/Bytecode/Generator.h>
  9. #include <LibJS/Bytecode/Instruction.h>
  10. #include <LibJS/Bytecode/Register.h>
  11. #include <LibJS/Forward.h>
  12. namespace JS::Bytecode {
  13. Generator::Generator()
  14. : m_string_table(make<StringTable>())
  15. {
  16. }
  17. Generator::~Generator()
  18. {
  19. }
  20. Executable Generator::generate(ASTNode const& node)
  21. {
  22. Generator generator;
  23. generator.switch_to_basic_block(generator.make_block());
  24. node.generate_bytecode(generator);
  25. return { move(generator.m_root_basic_blocks), move(generator.m_string_table), generator.m_next_register };
  26. }
  27. void Generator::grow(size_t additional_size)
  28. {
  29. VERIFY(m_current_basic_block);
  30. m_current_basic_block->grow(additional_size);
  31. }
  32. void* Generator::next_slot()
  33. {
  34. VERIFY(m_current_basic_block);
  35. return m_current_basic_block->next_slot();
  36. }
  37. Register Generator::allocate_register()
  38. {
  39. VERIFY(m_next_register != NumericLimits<u32>::max());
  40. return Register { m_next_register++ };
  41. }
  42. Label Generator::nearest_continuable_scope() const
  43. {
  44. return m_continuable_scopes.last();
  45. }
  46. void Generator::begin_continuable_scope(Label continue_target)
  47. {
  48. m_continuable_scopes.append(continue_target);
  49. }
  50. void Generator::end_continuable_scope()
  51. {
  52. m_continuable_scopes.take_last();
  53. }
  54. }