Jelajahi Sumber

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.
Andreas Kling 5 tahun lalu
induk
melakukan
8ad890cfa6
1 mengubah file dengan 16 tambahan dan 1 penghapusan
  1. 16 1
      Userland/js.cpp

+ 16 - 1
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);
+        }
     }
 }