Serenity Operating System
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}