diff options
author | Andreas Kling <kling@serenityos.org> | 2020-04-02 09:54:15 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-04-02 09:56:13 +0200 |
commit | 8ad890cfa69f105549d42fe43e2c016e231ddc9a (patch) | |
tree | 3cd253d2a32c1559a884fb3a5e9307e562778880 /Userland | |
parent | c683665ca959788e6ca308d9cebff285f47d4d84 (diff) | |
download | serenity-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.cpp | 17 |
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); + } } } |