summaryrefslogtreecommitdiff
path: root/Libraries/LibJS
diff options
context:
space:
mode:
Diffstat (limited to 'Libraries/LibJS')
-rw-r--r--Libraries/LibJS/Console.cpp68
-rw-r--r--Libraries/LibJS/Console.h32
-rw-r--r--Libraries/LibJS/Runtime/ConsoleObject.cpp44
-rw-r--r--Libraries/LibJS/Runtime/ConsoleObject.h1
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&);
};
}