mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 11:12:45 +00:00 
			
		
		
		
	 88814acbd3
			
		
	
	
		88814acbd3
		
	
	
	
	
		
			
			This includes an Error::create overload to create an Error from a UTF-8 StringView. If creating a String from that view fails, the factory will return an OOM InternalError instead. VM::throw_completion can also make use of this overload via its perfect forwarding.
		
			
				
	
	
		
			67 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
 | |
|  * Copyright (c) 2021-2022, Linus Groh <linusg@serenityos.org>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <AK/DeprecatedFlyString.h>
 | |
| #include <AK/String.h>
 | |
| #include <LibJS/Runtime/Completion.h>
 | |
| #include <LibJS/Runtime/Object.h>
 | |
| #include <LibJS/SourceRange.h>
 | |
| 
 | |
| namespace JS {
 | |
| 
 | |
| struct TracebackFrame {
 | |
|     DeprecatedFlyString function_name;
 | |
|     SourceRange source_range;
 | |
| };
 | |
| 
 | |
| class Error : public Object {
 | |
|     JS_OBJECT(Error, Object);
 | |
| 
 | |
| public:
 | |
|     static NonnullGCPtr<Error> create(Realm&);
 | |
|     static NonnullGCPtr<Error> create(Realm&, String message);
 | |
|     static ThrowCompletionOr<NonnullGCPtr<Error>> create(Realm&, StringView message);
 | |
| 
 | |
|     virtual ~Error() override = default;
 | |
| 
 | |
|     [[nodiscard]] ThrowCompletionOr<String> stack_string(VM&) const;
 | |
| 
 | |
|     ThrowCompletionOr<void> install_error_cause(Value options);
 | |
| 
 | |
|     Vector<TracebackFrame, 32> const& traceback() const { return m_traceback; }
 | |
| 
 | |
| protected:
 | |
|     explicit Error(Object& prototype);
 | |
| 
 | |
| private:
 | |
|     void populate_stack();
 | |
|     Vector<TracebackFrame, 32> m_traceback;
 | |
| };
 | |
| 
 | |
| // 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 ClassName final : public Error {                                                    \
 | |
|         JS_OBJECT(ClassName, Error);                                                          \
 | |
|                                                                                               \
 | |
|     public:                                                                                   \
 | |
|         static NonnullGCPtr<ClassName> create(Realm&);                                        \
 | |
|         static NonnullGCPtr<ClassName> create(Realm&, String message);                        \
 | |
|         static ThrowCompletionOr<NonnullGCPtr<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
 | |
| }
 |