Printer.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /*
  2. * Copyright (c) 2021, Ali Mohammad Pur <mpfard@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <LibWasm/Types.h>
  8. namespace Wasm {
  9. class Reference;
  10. class Value;
  11. ByteString instruction_name(OpCode const& opcode);
  12. Optional<OpCode> instruction_from_name(StringView name);
  13. struct Printer {
  14. explicit Printer(Stream& stream, size_t initial_indent = 0)
  15. : m_stream(stream)
  16. , m_indent(initial_indent)
  17. {
  18. }
  19. void print(Wasm::BlockType const&);
  20. void print(Wasm::CodeSection const&);
  21. void print(Wasm::CodeSection::Code const&);
  22. void print(Wasm::CodeSection::Func const&);
  23. void print(Wasm::CustomSection const&);
  24. void print(Wasm::DataCountSection const&);
  25. void print(Wasm::DataSection const&);
  26. void print(Wasm::DataSection::Data const&);
  27. void print(Wasm::ElementSection const&);
  28. void print(Wasm::ElementSection::Element const&);
  29. void print(Wasm::ExportSection const&);
  30. void print(Wasm::ExportSection::Export const&);
  31. void print(Wasm::Expression const&);
  32. void print(Wasm::FunctionSection const&);
  33. void print(Wasm::FunctionType const&);
  34. void print(Wasm::GlobalSection const&);
  35. void print(Wasm::GlobalSection::Global const&);
  36. void print(Wasm::GlobalType const&);
  37. void print(Wasm::ImportSection const&);
  38. void print(Wasm::ImportSection::Import const&);
  39. void print(Wasm::Instruction const&);
  40. void print(Wasm::Limits const&);
  41. void print(Wasm::Locals const&);
  42. void print(Wasm::MemorySection const&);
  43. void print(Wasm::MemorySection::Memory const&);
  44. void print(Wasm::MemoryType const&);
  45. void print(Wasm::Module const&);
  46. void print(Wasm::Module::Function const&);
  47. void print(Wasm::Reference const&);
  48. void print(Wasm::StartSection const&);
  49. void print(Wasm::StartSection::StartFunction const&);
  50. void print(Wasm::TableSection const&);
  51. void print(Wasm::TableSection::Table const&);
  52. void print(Wasm::TableType const&);
  53. void print(Wasm::TypeSection const&);
  54. void print(Wasm::ValueType const&);
  55. void print(Wasm::Value const&);
  56. private:
  57. void print_indent();
  58. template<typename... Args>
  59. void print(CheckedFormatString<Args...> fmt, Args&&... args)
  60. {
  61. StringBuilder builder;
  62. builder.appendff(fmt.view(), forward<Args>(args)...);
  63. m_stream.write_until_depleted(builder.string_view().bytes()).release_value_but_fixme_should_propagate_errors();
  64. }
  65. Stream& m_stream;
  66. size_t m_indent { 0 };
  67. };
  68. }