Builtins.h 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /*
  2. * Copyright (c) 2023, Simon Wanner <simon@skyrising.xyz>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Format.h>
  8. #include <LibJS/Forward.h>
  9. namespace JS::Bytecode {
  10. // TitleCaseName, snake_case_name, base, property, argument_count
  11. #define JS_ENUMERATE_BUILTINS(O)
  12. enum class Builtin {
  13. #define DEFINE_BUILTIN_ENUM(name, ...) name,
  14. JS_ENUMERATE_BUILTINS(DEFINE_BUILTIN_ENUM)
  15. #undef DEFINE_BUILTIN_ENUM
  16. __Count,
  17. };
  18. static StringView builtin_name(Builtin value)
  19. {
  20. switch (value) {
  21. #define DEFINE_BUILTIN_CASE(name, snake_case_name, base, property, ...) \
  22. case Builtin::name: \
  23. return #base "." #property##sv;
  24. JS_ENUMERATE_BUILTINS(DEFINE_BUILTIN_CASE)
  25. #undef DEFINE_BUILTIN_CASE
  26. case Builtin::__Count:
  27. VERIFY_NOT_REACHED();
  28. }
  29. VERIFY_NOT_REACHED();
  30. }
  31. inline size_t builtin_argument_count(Builtin value)
  32. {
  33. switch (value) {
  34. #define DEFINE_BUILTIN_CASE(name, snake_case_name, base, property, arg_count, ...) \
  35. case Builtin::name: \
  36. return arg_count;
  37. JS_ENUMERATE_BUILTINS(DEFINE_BUILTIN_CASE)
  38. #undef DEFINE_BUILTIN_CASE
  39. case Builtin::__Count:
  40. VERIFY_NOT_REACHED();
  41. }
  42. VERIFY_NOT_REACHED();
  43. }
  44. Optional<Builtin> get_builtin(MemberExpression const& expression);
  45. }
  46. namespace AK {
  47. template<>
  48. struct Formatter<JS::Bytecode::Builtin> : Formatter<StringView> {
  49. ErrorOr<void> format(FormatBuilder& builder, JS::Bytecode::Builtin value)
  50. {
  51. return Formatter<StringView>::format(builder, builtin_name(value));
  52. }
  53. };
  54. }