Console.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /*
  2. * Copyright (c) 2020, Emanuele Torre <torreemanuele6@gmail.com>
  3. * Copyright (c) 2020-2021, Linus Groh <linusg@serenityos.org>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #include <LibJS/Console.h>
  8. #include <LibJS/Runtime/GlobalObject.h>
  9. namespace JS {
  10. Console::Console(GlobalObject& global_object)
  11. : m_global_object(global_object)
  12. {
  13. }
  14. VM& Console::vm()
  15. {
  16. return m_global_object.vm();
  17. }
  18. Value Console::debug()
  19. {
  20. #ifdef __serenity__
  21. dbgln("\033[32;1m(js debug)\033[0m {}", vm().join_arguments());
  22. #endif
  23. if (m_client)
  24. return m_client->debug();
  25. return js_undefined();
  26. }
  27. Value Console::error()
  28. {
  29. #ifdef __serenity__
  30. dbgln("\033[32;1m(js error)\033[0m {}", vm().join_arguments());
  31. #endif
  32. if (m_client)
  33. return m_client->error();
  34. return js_undefined();
  35. }
  36. Value Console::info()
  37. {
  38. #ifdef __serenity__
  39. dbgln("\033[32;1m(js info)\033[0m {}", vm().join_arguments());
  40. #endif
  41. if (m_client)
  42. return m_client->info();
  43. return js_undefined();
  44. }
  45. Value Console::log()
  46. {
  47. #ifdef __serenity__
  48. dbgln("\033[32;1m(js log)\033[0m {}", vm().join_arguments());
  49. #endif
  50. if (m_client)
  51. return m_client->log();
  52. return js_undefined();
  53. }
  54. Value Console::warn()
  55. {
  56. #ifdef __serenity__
  57. dbgln("\033[32;1m(js warn)\033[0m {}", vm().join_arguments());
  58. #endif
  59. if (m_client)
  60. return m_client->warn();
  61. return js_undefined();
  62. }
  63. Value Console::clear()
  64. {
  65. if (m_client)
  66. return m_client->clear();
  67. return js_undefined();
  68. }
  69. Value Console::trace()
  70. {
  71. if (m_client)
  72. return m_client->trace();
  73. return js_undefined();
  74. }
  75. Value Console::count()
  76. {
  77. if (m_client)
  78. return m_client->count();
  79. return js_undefined();
  80. }
  81. Value Console::count_reset()
  82. {
  83. if (m_client)
  84. return m_client->count_reset();
  85. return js_undefined();
  86. }
  87. Value Console::assert_()
  88. {
  89. if (m_client)
  90. return m_client->assert_();
  91. return js_undefined();
  92. }
  93. unsigned Console::counter_increment(String label)
  94. {
  95. auto value = m_counters.get(label);
  96. if (!value.has_value()) {
  97. m_counters.set(label, 1);
  98. return 1;
  99. }
  100. auto new_value = value.value() + 1;
  101. m_counters.set(label, new_value);
  102. return new_value;
  103. }
  104. bool Console::counter_reset(String label)
  105. {
  106. if (!m_counters.contains(label))
  107. return false;
  108. m_counters.remove(label);
  109. return true;
  110. }
  111. VM& ConsoleClient::vm()
  112. {
  113. return global_object().vm();
  114. }
  115. Vector<String> ConsoleClient::get_trace() const
  116. {
  117. Vector<String> trace;
  118. auto& execution_context_stack = m_console.global_object().vm().execution_context_stack();
  119. // NOTE: -2 to skip the console.trace() execution context
  120. for (ssize_t i = execution_context_stack.size() - 2; i >= 0; --i)
  121. trace.append(execution_context_stack[i]->function_name);
  122. return trace;
  123. }
  124. }