소스 검색

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 년 전
부모
커밋
8ad890cfa6
1개의 변경된 파일16개의 추가작업 그리고 1개의 파일을 삭제
  1. 16 1
      Userland/js.cpp

+ 16 - 1
Userland/js.cpp

@@ -34,6 +34,7 @@
 #include <LibJS/Parser.h>
 #include <LibJS/Parser.h>
 #include <LibJS/Runtime/Array.h>
 #include <LibJS/Runtime/Array.h>
 #include <LibJS/Runtime/Date.h>
 #include <LibJS/Runtime/Date.h>
+#include <LibJS/Runtime/Error.h>
 #include <LibJS/Runtime/Function.h>
 #include <LibJS/Runtime/Function.h>
 #include <LibJS/Runtime/GlobalObject.h>
 #include <LibJS/Runtime/GlobalObject.h>
 #include <LibJS/Runtime/Object.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());
     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)
 void print_value(JS::Value value, HashTable<JS::Object*>& seen_objects)
 {
 {
     if (value.is_object()) {
     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);
             return print_function(object, seen_objects);
         if (object.is_date())
         if (object.is_date())
             return print_date(object, seen_objects);
             return print_date(object, seen_objects);
+        if (object.is_error())
+            return print_error(object, seen_objects);
         return print_object(object, seen_objects);
         return print_object(object, seen_objects);
     }
     }
 
 
@@ -268,7 +277,13 @@ void repl(JS::Interpreter& interpreter)
             program->dump(0);
             program->dump(0);
 
 
         auto result = interpreter.run(*program);
         auto result = interpreter.run(*program);
-        print(result);
+        if (interpreter.exception()) {
+            printf("Exception caught: ");
+            print(interpreter.exception()->value());
+            interpreter.clear_exception();
+        } else {
+            print(result);
+        }
     }
     }
 }
 }