summaryrefslogtreecommitdiff
path: root/Userland
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2020-04-02 09:54:15 +0200
committerAndreas Kling <kling@serenityos.org>2020-04-02 09:56:13 +0200
commit8ad890cfa69f105549d42fe43e2c016e231ddc9a (patch)
tree3cd253d2a32c1559a884fb3a5e9307e562778880 /Userland
parentc683665ca959788e6ca308d9cebff285f47d4d84 (diff)
downloadserenity-8ad890cfa69f105549d42fe43e2c016e231ddc9a.zip
js: Handle exceptions thrown during REPL execution
We now print thrown exceptions and clear the interpreter state so it can continue running instead of refusing to do anything after an exception has been thrown. Fixes #1572.
Diffstat (limited to 'Userland')
-rw-r--r--Userland/js.cpp17
1 files changed, 16 insertions, 1 deletions
diff --git a/Userland/js.cpp b/Userland/js.cpp
index bfe9309a15..86467cd9d8 100644
--- a/Userland/js.cpp
+++ b/Userland/js.cpp
@@ -34,6 +34,7 @@
#include <LibJS/Parser.h>
#include <LibJS/Runtime/Array.h>
#include <LibJS/Runtime/Date.h>
+#include <LibJS/Runtime/Error.h>
#include <LibJS/Runtime/Function.h>
#include <LibJS/Runtime/GlobalObject.h>
#include <LibJS/Runtime/Object.h>
@@ -132,6 +133,12 @@ static void print_date(const JS::Object& date, HashTable<JS::Object*>&)
printf("\033[34;1mDate %s\033[0m", static_cast<const JS::Date&>(date).string().characters());
}
+static void print_error(const JS::Object& object, HashTable<JS::Object*>&)
+{
+ auto& error = static_cast<const JS::Error&>(object);
+ printf("\033[34;1m[%s]\033[0m: %s", error.name().characters(), error.message().characters());
+}
+
void print_value(JS::Value value, HashTable<JS::Object*>& seen_objects)
{
if (value.is_object()) {
@@ -153,6 +160,8 @@ void print_value(JS::Value value, HashTable<JS::Object*>& seen_objects)
return print_function(object, seen_objects);
if (object.is_date())
return print_date(object, seen_objects);
+ if (object.is_error())
+ return print_error(object, seen_objects);
return print_object(object, seen_objects);
}
@@ -268,7 +277,13 @@ void repl(JS::Interpreter& interpreter)
program->dump(0);
auto result = interpreter.run(*program);
- print(result);
+ if (interpreter.exception()) {
+ printf("Exception caught: ");
+ print(interpreter.exception()->value());
+ interpreter.clear_exception();
+ } else {
+ print(result);
+ }
}
}