diff options
Diffstat (limited to 'Libraries/LibJS')
-rw-r--r-- | Libraries/LibJS/Console.cpp | 68 | ||||
-rw-r--r-- | Libraries/LibJS/Console.h | 32 | ||||
-rw-r--r-- | Libraries/LibJS/Runtime/ConsoleObject.cpp | 44 | ||||
-rw-r--r-- | Libraries/LibJS/Runtime/ConsoleObject.h | 1 |
4 files changed, 116 insertions, 29 deletions
diff --git a/Libraries/LibJS/Console.cpp b/Libraries/LibJS/Console.cpp index 1a62a453eb..986268d0b6 100644 --- a/Libraries/LibJS/Console.cpp +++ b/Libraries/LibJS/Console.cpp @@ -1,5 +1,6 @@ /* * Copyright (c) 2020, Emanuele Torre <torreemanuele6@gmail.com> + * Copyright (c) 2020, Linus Groh <mail@linusgroh.de> * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -25,8 +26,9 @@ */ #include <AK/String.h> +#include <AK/StringBuilder.h> #include <LibJS/Console.h> -#include <stdio.h> +#include <LibJS/Interpreter.h> namespace JS { @@ -35,17 +37,75 @@ Console::Console(Interpreter& interpreter) { } +void Console::add_message(ConsoleMessageKind kind, String text) +{ + ConsoleMessage message = { kind, text }; + m_messages.append(message); + + if (on_new_message) + on_new_message(message); +} + +void Console::debug(String text) +{ + add_message(ConsoleMessageKind::Debug, text); +} + +void Console::error(String text) +{ + add_message(ConsoleMessageKind::Error, text); +} + +void Console::info(String text) +{ + add_message(ConsoleMessageKind::Info, text); +} + +void Console::log(String text) +{ + add_message(ConsoleMessageKind::Log, text); +} + +void Console::warn(String text) +{ + add_message(ConsoleMessageKind::Warn, text); +} + +void Console::clear() +{ + m_messages.clear(); + add_message(ConsoleMessageKind::Clear, {}); +} + +void Console::trace(String title) +{ + StringBuilder message_text; + message_text.append(title); + + auto call_stack = m_interpreter.call_stack(); + // -2 to skip the console.trace() call frame + for (ssize_t i = call_stack.size() - 2; i >= 0; --i) { + auto function_name = call_stack[i].function_name; + message_text.append("\n\t"); + if (String(function_name).is_empty()) + function_name = "<anonymous>"; + message_text.append(function_name); + } + + add_message(ConsoleMessageKind::Trace, message_text.build()); +} + unsigned Console::count(String label) { auto counter_value = m_counters.get(label); if (!counter_value.has_value()) { - printf("%s: 1\n", label.characters()); + add_message(ConsoleMessageKind::Count, String::format("%s: 1", label.characters())); m_counters.set(label, 1); return 1; } auto new_counter_value = counter_value.value() + 1; - printf("%s: %d\n", label.characters(), new_counter_value); + add_message(ConsoleMessageKind::Count, String::format("%s: %u", label.characters(), new_counter_value)); m_counters.set(label, new_counter_value); return new_counter_value; } @@ -56,7 +116,7 @@ bool Console::count_reset(String label) return false; m_counters.remove(label); - printf("%s: 0\n", label.characters()); + add_message(ConsoleMessageKind::Count, String::format("%s: 0", label.characters())); return true; } diff --git a/Libraries/LibJS/Console.h b/Libraries/LibJS/Console.h index 3d4ef371d5..1ae6120b37 100644 --- a/Libraries/LibJS/Console.h +++ b/Libraries/LibJS/Console.h @@ -26,12 +26,29 @@ #pragma once +#include <AK/Function.h> #include <AK/HashMap.h> #include <AK/Noncopyable.h> #include <LibJS/Forward.h> namespace JS { +enum class ConsoleMessageKind { + Clear, + Count, + Debug, + Error, + Info, + Log, + Trace, + Warn, +}; + +struct ConsoleMessage { + ConsoleMessageKind kind; + String text; +}; + class Console { AK_MAKE_NONCOPYABLE(Console); AK_MAKE_NONMOVABLE(Console); @@ -43,12 +60,27 @@ public: HashMap<String, unsigned>& counters() { return m_counters; } + void debug(String text); + void error(String text); + void info(String text); + void log(String text); + void warn(String text); + + void clear(); + + void trace(String title); + unsigned count(String label = "default"); bool count_reset(String label = "default"); + void add_message(ConsoleMessageKind, String text); + + AK::Function<void(ConsoleMessage&)> on_new_message; + private: Interpreter& m_interpreter; + Vector<ConsoleMessage> m_messages; HashMap<String, unsigned> m_counters; }; diff --git a/Libraries/LibJS/Runtime/ConsoleObject.cpp b/Libraries/LibJS/Runtime/ConsoleObject.cpp index c4d2be4fa3..b6a5eb81ad 100644 --- a/Libraries/LibJS/Runtime/ConsoleObject.cpp +++ b/Libraries/LibJS/Runtime/ConsoleObject.cpp @@ -28,22 +28,23 @@ #include <AK/FlyString.h> #include <AK/Function.h> +#include <AK/StringBuilder.h> #include <LibJS/Console.h> #include <LibJS/Interpreter.h> #include <LibJS/Runtime/ConsoleObject.h> #include <LibJS/Runtime/GlobalObject.h> -#include <stdio.h> namespace JS { -static void print_args(Interpreter& interpreter) +static String join_args(Interpreter& interpreter) { + StringBuilder joined_arguments; for (size_t i = 0; i < interpreter.argument_count(); ++i) { - printf("%s", interpreter.argument(i).to_string().characters()); + joined_arguments.append(interpreter.argument(i).to_string().characters()); if (i != interpreter.argument_count() - 1) - putchar(' '); + joined_arguments.append(' '); } - putchar('\n'); + return joined_arguments.build(); } ConsoleObject::ConsoleObject() @@ -57,6 +58,7 @@ ConsoleObject::ConsoleObject() put_native_function("trace", trace); put_native_function("count", count); put_native_function("countReset", count_reset); + put_native_function("clear", clear); } ConsoleObject::~ConsoleObject() @@ -65,51 +67,37 @@ ConsoleObject::~ConsoleObject() Value ConsoleObject::log(Interpreter& interpreter) { - print_args(interpreter); + interpreter.console().log(join_args(interpreter)); return js_undefined(); } Value ConsoleObject::debug(Interpreter& interpreter) { - printf("\033[36;1m"); - print_args(interpreter); - printf("\033[0m"); + interpreter.console().debug(join_args(interpreter)); return js_undefined(); } Value ConsoleObject::info(Interpreter& interpreter) { - print_args(interpreter); + interpreter.console().info(join_args(interpreter)); return js_undefined(); } Value ConsoleObject::warn(Interpreter& interpreter) { - printf("\033[33;1m"); - print_args(interpreter); - printf("\033[0m"); + interpreter.console().warn(join_args(interpreter)); return js_undefined(); } Value ConsoleObject::error(Interpreter& interpreter) { - printf("\033[31;1m"); - print_args(interpreter); - printf("\033[0m"); + interpreter.console().error(join_args(interpreter)); return js_undefined(); } Value ConsoleObject::trace(Interpreter& interpreter) { - print_args(interpreter); - auto call_stack = interpreter.call_stack(); - // -2 to skip the console.trace() call frame - for (ssize_t i = call_stack.size() - 2; i >= 0; --i) { - auto function_name = call_stack[i].function_name; - if (String(function_name).is_empty()) - function_name = "<anonymous>"; - printf("%s\n", function_name.characters()); - } + interpreter.console().trace(join_args(interpreter)); return js_undefined(); } @@ -131,4 +119,10 @@ Value ConsoleObject::count_reset(Interpreter& interpreter) return js_undefined(); } +Value ConsoleObject::clear(Interpreter& interpreter) +{ + interpreter.console().clear(); + return js_undefined(); +} + } diff --git a/Libraries/LibJS/Runtime/ConsoleObject.h b/Libraries/LibJS/Runtime/ConsoleObject.h index eff99da621..eb5fedf84e 100644 --- a/Libraries/LibJS/Runtime/ConsoleObject.h +++ b/Libraries/LibJS/Runtime/ConsoleObject.h @@ -46,6 +46,7 @@ private: static Value trace(Interpreter&); static Value count(Interpreter&); static Value count_reset(Interpreter&); + static Value clear(Interpreter&); }; } |