Produce JS-visible string results as UTF-16 at their source, including numeric formatting, BigInt and BigFraction formatting, URI encoding, console formatting, parser errors, regular expression errors, Intl and Temporal records, LibUnicode locale boundaries, and LibWeb bindings. Handle fractional radix formatting through the UTF-16 builder view.
79 lines
3 KiB
C++
79 lines
3 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&, Utf16View 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);
|
|
void set_message(Utf16View);
|
|
|
|
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&, Utf16View 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
|
|
|
|
}
|