Serenity Operating System
at master 67 lines 2.6 kB view raw
1/* 2 * Copyright (c) 2020, Andreas Kling <kling@serenityos.org> 3 * Copyright (c) 2021-2022, Linus Groh <linusg@serenityos.org> 4 * 5 * SPDX-License-Identifier: BSD-2-Clause 6 */ 7 8#pragma once 9 10#include <AK/DeprecatedFlyString.h> 11#include <AK/String.h> 12#include <LibJS/Runtime/Completion.h> 13#include <LibJS/Runtime/Object.h> 14#include <LibJS/SourceRange.h> 15 16namespace JS { 17 18struct TracebackFrame { 19 DeprecatedFlyString function_name; 20 SourceRange source_range; 21}; 22 23class Error : public Object { 24 JS_OBJECT(Error, Object); 25 26public: 27 static NonnullGCPtr<Error> create(Realm&); 28 static NonnullGCPtr<Error> create(Realm&, String message); 29 static ThrowCompletionOr<NonnullGCPtr<Error>> create(Realm&, StringView message); 30 31 virtual ~Error() override = default; 32 33 [[nodiscard]] ThrowCompletionOr<String> stack_string(VM&) const; 34 35 ThrowCompletionOr<void> install_error_cause(Value options); 36 37 Vector<TracebackFrame, 32> const& traceback() const { return m_traceback; } 38 39protected: 40 explicit Error(Object& prototype); 41 42private: 43 void populate_stack(); 44 Vector<TracebackFrame, 32> m_traceback; 45}; 46 47// NOTE: Making these inherit from Error is not required by the spec but 48// our way of implementing the [[ErrorData]] internal slot, which is 49// used in Object.prototype.toString(). 50#define DECLARE_NATIVE_ERROR(ClassName, snake_name, PrototypeName, ConstructorName) \ 51 class ClassName final : public Error { \ 52 JS_OBJECT(ClassName, Error); \ 53 \ 54 public: \ 55 static NonnullGCPtr<ClassName> create(Realm&); \ 56 static NonnullGCPtr<ClassName> create(Realm&, String message); \ 57 static ThrowCompletionOr<NonnullGCPtr<ClassName>> create(Realm&, StringView message); \ 58 \ 59 explicit ClassName(Object& prototype); \ 60 virtual ~ClassName() override = default; \ 61 }; 62 63#define __JS_ENUMERATE(ClassName, snake_name, PrototypeName, ConstructorName, ArrayType) \ 64 DECLARE_NATIVE_ERROR(ClassName, snake_name, PrototypeName, ConstructorName) 65JS_ENUMERATE_NATIVE_ERRORS 66#undef __JS_ENUMERATE 67}