| 
									
										
										
										
											2021-08-21 13:41:32 -04:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2022-01-31 13:07:22 -05:00
										 |  |  |  * Copyright (c) 2021, Tim Flynn <trflynn89@serenityos.org> | 
					
						
							| 
									
										
										
										
											2021-08-21 13:41:32 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-16 18:26:49 -06:00
										 |  |  | #include <AK/StringView.h>
 | 
					
						
							| 
									
										
										
										
											2021-08-21 13:41:32 -04:00
										 |  |  | #include <LibJS/Runtime/NativeFunction.h>
 | 
					
						
							| 
									
										
										
										
											2022-10-02 10:59:22 +01:00
										 |  |  | #include <LibJS/Runtime/PromiseCapability.h>
 | 
					
						
							| 
									
										
										
										
											2021-08-21 13:41:32 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace JS { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct RemainingElements final : public Cell { | 
					
						
							| 
									
										
										
										
											2022-08-28 22:11:20 +02:00
										 |  |  |     JS_CELL(RemainingElements, Cell); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-28 23:51:28 +02:00
										 |  |  |     u64 value { 0 }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2021-08-21 13:41:32 -04:00
										 |  |  |     RemainingElements() = default; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     explicit RemainingElements(u64 initial_value) | 
					
						
							|  |  |  |         : value(initial_value) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-11 22:16:30 +02:00
										 |  |  | class PromiseValueList final : public Cell { | 
					
						
							| 
									
										
										
										
											2022-08-28 22:11:20 +02:00
										 |  |  |     JS_CELL(PromiseValueList, Cell); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-11 22:16:30 +02:00
										 |  |  | public: | 
					
						
							|  |  |  |     Vector<Value>& values() { return m_values; } | 
					
						
							|  |  |  |     Vector<Value> const& values() const { return m_values; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2022-08-28 23:51:28 +02:00
										 |  |  |     PromiseValueList() = default; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-04 16:22:47 +01:00
										 |  |  |     virtual void visit_edges(Visitor&) override; | 
					
						
							| 
									
										
										
										
											2021-08-21 13:41:32 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-11 22:16:30 +02:00
										 |  |  |     Vector<Value> m_values; | 
					
						
							| 
									
										
										
										
											2021-08-21 13:41:32 -04:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-21 15:23:12 -04:00
										 |  |  | class PromiseResolvingElementFunction : public NativeFunction { | 
					
						
							| 
									
										
										
										
											2021-08-21 13:41:32 -04:00
										 |  |  |     JS_OBJECT(PromiseResolvingFunction, NativeFunction); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2022-08-16 00:20:49 +01:00
										 |  |  |     virtual void initialize(Realm&) override; | 
					
						
							| 
									
										
										
										
											2021-08-21 15:23:12 -04:00
										 |  |  |     virtual ~PromiseResolvingElementFunction() override = default; | 
					
						
							| 
									
										
										
										
											2021-08-21 13:41:32 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-20 21:16:30 +01:00
										 |  |  |     virtual ThrowCompletionOr<Value> call() override; | 
					
						
							| 
									
										
										
										
											2021-08-21 13:41:32 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-21 15:23:12 -04:00
										 |  |  | protected: | 
					
						
							| 
									
										
										
										
											2022-10-02 12:11:30 +01:00
										 |  |  |     explicit PromiseResolvingElementFunction(size_t, PromiseValueList&, NonnullGCPtr<PromiseCapability>, RemainingElements&, Object& prototype); | 
					
						
							| 
									
										
										
										
											2021-08-21 15:23:12 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-04 22:04:22 +01:00
										 |  |  |     virtual ThrowCompletionOr<Value> resolve_element() = 0; | 
					
						
							| 
									
										
										
										
											2021-08-21 13:41:32 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     size_t m_index { 0 }; | 
					
						
							|  |  |  |     PromiseValueList& m_values; | 
					
						
							| 
									
										
										
										
											2022-10-02 12:11:30 +01:00
										 |  |  |     NonnullGCPtr<PromiseCapability> m_capability; | 
					
						
							| 
									
										
										
										
											2021-08-21 13:41:32 -04:00
										 |  |  |     RemainingElements& m_remaining_elements; | 
					
						
							| 
									
										
										
										
											2021-08-21 15:23:12 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |     virtual void visit_edges(Visitor&) override; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-21 13:41:32 -04:00
										 |  |  |     bool m_already_called { false }; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-21 15:23:12 -04:00
										 |  |  | // 27.2.4.1.3 Promise.all Resolve Element Functions, https://tc39.es/ecma262/#sec-promise.all-resolve-element-functions
 | 
					
						
							|  |  |  | class PromiseAllResolveElementFunction final : public PromiseResolvingElementFunction { | 
					
						
							|  |  |  |     JS_OBJECT(PromiseResolvingFunction, NativeFunction); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2022-10-02 12:11:30 +01:00
										 |  |  |     static PromiseAllResolveElementFunction* create(Realm&, size_t, PromiseValueList&, NonnullGCPtr<PromiseCapability>, RemainingElements&); | 
					
						
							| 
									
										
										
										
											2021-08-21 15:23:12 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     virtual ~PromiseAllResolveElementFunction() override = default; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2022-10-02 12:11:30 +01:00
										 |  |  |     explicit PromiseAllResolveElementFunction(size_t, PromiseValueList&, NonnullGCPtr<PromiseCapability>, RemainingElements&, Object& prototype); | 
					
						
							| 
									
										
										
										
											2022-08-28 23:51:28 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-04 22:04:22 +01:00
										 |  |  |     virtual ThrowCompletionOr<Value> resolve_element() override; | 
					
						
							| 
									
										
										
										
											2021-08-21 15:23:12 -04:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-21 17:00:48 -04:00
										 |  |  | // 27.2.4.2.2 Promise.allSettled Resolve Element Functions, https://tc39.es/ecma262/#sec-promise.allsettled-resolve-element-functions
 | 
					
						
							|  |  |  | class PromiseAllSettledResolveElementFunction final : public PromiseResolvingElementFunction { | 
					
						
							|  |  |  |     JS_OBJECT(PromiseResolvingFunction, NativeFunction); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2022-10-02 12:11:30 +01:00
										 |  |  |     static PromiseAllSettledResolveElementFunction* create(Realm&, size_t, PromiseValueList&, NonnullGCPtr<PromiseCapability>, RemainingElements&); | 
					
						
							| 
									
										
										
										
											2021-08-21 17:00:48 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     virtual ~PromiseAllSettledResolveElementFunction() override = default; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2022-10-02 12:11:30 +01:00
										 |  |  |     explicit PromiseAllSettledResolveElementFunction(size_t, PromiseValueList&, NonnullGCPtr<PromiseCapability>, RemainingElements&, Object& prototype); | 
					
						
							| 
									
										
										
										
											2022-08-28 23:51:28 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-04 22:04:22 +01:00
										 |  |  |     virtual ThrowCompletionOr<Value> resolve_element() override; | 
					
						
							| 
									
										
										
										
											2021-08-21 17:00:48 -04:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // 27.2.4.2.3 Promise.allSettled Reject Element Functions, https://tc39.es/ecma262/#sec-promise.allsettled-reject-element-functions
 | 
					
						
							|  |  |  | class PromiseAllSettledRejectElementFunction final : public PromiseResolvingElementFunction { | 
					
						
							| 
									
										
										
										
											2021-09-11 22:26:53 +02:00
										 |  |  |     JS_OBJECT(PromiseResolvingFunction, PromiseResolvingElementFunction); | 
					
						
							| 
									
										
										
										
											2021-08-21 17:00:48 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2022-10-02 12:11:30 +01:00
										 |  |  |     static PromiseAllSettledRejectElementFunction* create(Realm&, size_t, PromiseValueList&, NonnullGCPtr<PromiseCapability>, RemainingElements&); | 
					
						
							| 
									
										
										
										
											2021-08-21 17:00:48 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     virtual ~PromiseAllSettledRejectElementFunction() override = default; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2022-10-02 12:11:30 +01:00
										 |  |  |     explicit PromiseAllSettledRejectElementFunction(size_t, PromiseValueList&, NonnullGCPtr<PromiseCapability>, RemainingElements&, Object& prototype); | 
					
						
							| 
									
										
										
										
											2022-08-28 23:51:28 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-04 22:04:22 +01:00
										 |  |  |     virtual ThrowCompletionOr<Value> resolve_element() override; | 
					
						
							| 
									
										
										
										
											2021-08-21 17:00:48 -04:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-21 16:43:38 -04:00
										 |  |  | // 27.2.4.3.2 Promise.any Reject Element Functions, https://tc39.es/ecma262/#sec-promise.any-reject-element-functions
 | 
					
						
							|  |  |  | class PromiseAnyRejectElementFunction final : public PromiseResolvingElementFunction { | 
					
						
							| 
									
										
										
										
											2021-09-11 22:26:53 +02:00
										 |  |  |     JS_OBJECT(PromiseResolvingFunction, PromiseResolvingElementFunction); | 
					
						
							| 
									
										
										
										
											2021-08-21 16:43:38 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2022-10-02 12:11:30 +01:00
										 |  |  |     static PromiseAnyRejectElementFunction* create(Realm&, size_t, PromiseValueList&, NonnullGCPtr<PromiseCapability>, RemainingElements&); | 
					
						
							| 
									
										
										
										
											2021-08-21 16:43:38 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     virtual ~PromiseAnyRejectElementFunction() override = default; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2022-10-02 12:11:30 +01:00
										 |  |  |     explicit PromiseAnyRejectElementFunction(size_t, PromiseValueList&, NonnullGCPtr<PromiseCapability>, RemainingElements&, Object& prototype); | 
					
						
							| 
									
										
										
										
											2022-08-28 23:51:28 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-04 22:04:22 +01:00
										 |  |  |     virtual ThrowCompletionOr<Value> resolve_element() override; | 
					
						
							| 
									
										
										
										
											2021-08-21 16:43:38 -04:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-21 13:41:32 -04:00
										 |  |  | } |