Files
ladybird/Libraries/LibJS/Runtime/Error.h
Andreas Kling 68fa684f76 LibJS: Account runtime storage as external memory
Report outline storage retained by scripts, environments, module
namespace objects, iterator helpers, property name iterators, argument
objects, and error tracebacks. These objects keep vectors and maps that
can grow independently from their GC cell sizes.
2026-05-07 10:03:09 +02:00

77 lines
2.8 KiB
C++

/*
* Copyright (c) 2020, Andreas Kling <andreas@ladybird.org>
* Copyright (c) 2021-2022, Linus Groh <linusg@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/FlyString.h>
#include <AK/String.h>
#include <AK/Utf16String.h>
#include <LibJS/Export.h>
#include <LibJS/Runtime/Completion.h>
#include <LibJS/Runtime/ErrorData.h>
#include <LibJS/Runtime/Object.h>
namespace JS {
class JS_API Error
: public Object
, public ErrorData {
JS_OBJECT(Error, Object);
GC_DECLARE_ALLOCATOR(Error);
public:
static GC::Ref<Error> create(Realm&);
static GC::Ref<Error> create(Realm&, Utf16String message);
static GC::Ref<Error> create(Realm&, StringView message);
virtual ~Error() override = default;
[[nodiscard]] Utf16String stack_string(CompactTraceback compact = CompactTraceback::No) const;
ThrowCompletionOr<void> install_error_cause(Value options);
void set_message(Utf16String);
protected:
explicit Error(Object& prototype);
virtual void visit_edges(Visitor&) override;
private:
virtual size_t external_memory_size() const override;
virtual bool is_error_object() const final { return true; }
virtual ErrorData* error_data() final { return this; }
virtual ErrorData const* error_data() const final { return this; }
};
template<>
inline bool Object::fast_is<Error>() const { return is_error_object(); }
// NOTE: Making these inherit from Error is not required by the spec but
// our way of implementing the [[ErrorData]] internal slot, which is
// used in Object.prototype.toString().
#define DECLARE_NATIVE_ERROR(ClassName, snake_name, PrototypeName, ConstructorName) \
class JS_API ClassName final : public Error { \
JS_OBJECT(ClassName, Error); \
GC_DECLARE_ALLOCATOR(ClassName); \
\
public: \
static GC::Ref<ClassName> create(Realm&); \
static GC::Ref<ClassName> create(Realm&, Utf16String message); \
static GC::Ref<ClassName> create(Realm&, StringView message); \
\
explicit ClassName(Object& prototype); \
virtual ~ClassName() override = default; \
};
#define __JS_ENUMERATE(ClassName, snake_name, PrototypeName, ConstructorName, ArrayType) \
DECLARE_NATIVE_ERROR(ClassName, snake_name, PrototypeName, ConstructorName)
JS_ENUMERATE_NATIVE_ERRORS
#undef __JS_ENUMERATE
}