diff --git a/src/error.hpp b/src/error.hpp index d6f217d..83a0e79 100644 --- a/src/error.hpp +++ b/src/error.hpp @@ -21,6 +21,7 @@ enum class ErrorCode { DivisionByZero, SyntaxError, RuntimeError, + Raise, }; class Value; diff --git a/src/stdlib.cpp b/src/stdlib.cpp index 1bdf184..4813289 100644 --- a/src/stdlib.cpp +++ b/src/stdlib.cpp @@ -293,6 +293,28 @@ Result stdlib_error(const StackFrame& stack) { return ERROR_OBJ(RuntimeError, val); } +Result stdlib_raise(const StackFrame& stack) { + auto stack_size = TRY(stack.size()); + + if (stack_size > 1) { + auto accumulator = TRY(stack.get(0)); + auto res = TRY(stack.set(0, accumulator)); + res = TRY(res.ret(0)); + + return res; + } + + auto params = TRY(stack.get(0)); + auto size = TRY(params.size()); + if (size != 1) return ERROR(ArgumentCountMismatch); + + auto val = TRY(params.get(0)); + + auto cont = Value(TRY(Continuation::create(val, stack))); + + return ERROR_OBJ(Raise, cont); +} + #define STDLIB_FUNCTION(name, id) \ [(uint64_t)StdlibFunctionId::id] = {#name, StdlibFunctionId::id, \ stdlib_##name} @@ -312,6 +334,7 @@ static StdlibFunctionEntry function_entries[] = { STDLIB_FUNCTION(size, Size), STDLIB_FUNCTION(map, Map), STDLIB_FUNCTION(error, Error), + STDLIB_FUNCTION(raise, Raise), [(uint64_t)StdlibFunctionId::Max] = {0, StdlibFunctionId::Max, stdlib_unknown}, }; diff --git a/src/stdlib.hpp b/src/stdlib.hpp index d7dc4a1..2248a1d 100644 --- a/src/stdlib.hpp +++ b/src/stdlib.hpp @@ -19,6 +19,7 @@ enum class StdlibFunctionId : uint64_t { Size, Map, Error, + Raise, Max, }; diff --git a/src/valeri.cpp b/src/valeri.cpp index 0dc7d54..de5ffcc 100644 --- a/src/valeri.cpp +++ b/src/valeri.cpp @@ -18,10 +18,13 @@ Result print_error(const Result& res, const String& backtrace) { auto errobj = TRY(geterrobj().copy()); if (errobj.is()) { debug_print(geterr()); - } else { + } else if (errobj.is()) { auto message = TRY(errobj.to()->message()); print_string(*message.to()); std::cout << "\n"; + } else { + std::cout << "Uncaught error: "; + debug_print(errobj); } if (TRY(backtrace.size()) > 0) {