Builtins.h 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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. O(MathAbs, math_abs, Math, abs, 1)
  13. enum class Builtin {
  14. #define DEFINE_BUILTIN_ENUM(name, ...) name,
  15. JS_ENUMERATE_BUILTINS(DEFINE_BUILTIN_ENUM)
  16. #undef DEFINE_BUILTIN_ENUM
  17. __Count,
  18. };
  19. static StringView builtin_name(Builtin value)
  20. {
  21. switch (value) {
  22. #define DEFINE_BUILTIN_CASE(name, snake_case_name, base, property, ...) \
  23. case Builtin::name: \
  24. return #base "." #property##sv;
  25. JS_ENUMERATE_BUILTINS(DEFINE_BUILTIN_CASE)
  26. #undef DEFINE_BUILTIN_CASE
  27. case Builtin::__Count:
  28. VERIFY_NOT_REACHED();
  29. }
  30. VERIFY_NOT_REACHED();
  31. }
  32. inline size_t builtin_argument_count(Builtin value)
  33. {
  34. switch (value) {
  35. #define DEFINE_BUILTIN_CASE(name, snake_case_name, base, property, arg_count, ...) \
  36. case Builtin::name: \
  37. return arg_count;
  38. JS_ENUMERATE_BUILTINS(DEFINE_BUILTIN_CASE)
  39. #undef DEFINE_BUILTIN_CASE
  40. case Builtin::__Count:
  41. VERIFY_NOT_REACHED();
  42. }
  43. VERIFY_NOT_REACHED();
  44. }
  45. Optional<Builtin> get_builtin(MemberExpression const& expression);
  46. }
  47. namespace AK {
  48. template<>
  49. struct Formatter<JS::Bytecode::Builtin> : Formatter<StringView> {
  50. ErrorOr<void> format(FormatBuilder& builder, JS::Bytecode::Builtin value)
  51. {
  52. return Formatter<StringView>::format(builder, builtin_name(value));
  53. }
  54. };
  55. }