ladybird/AK
Linus Groh f418115f1b LibJS: Add initial support for Promises
Almost a year after first working on this, it's finally done: an
implementation of Promises for LibJS! :^)

The core functionality is working and closely following the spec [1].
I mostly took the pseudo code and transformed it into C++ - if you read
and understand it, you will know how the spec implements Promises; and
if you read the spec first, the code will look very familiar.

Implemented functions are:

- Promise() constructor
- Promise.prototype.then()
- Promise.prototype.catch()
- Promise.prototype.finally()
- Promise.resolve()
- Promise.reject()

For the tests I added a new function to test-js's global object,
runQueuedPromiseJobs(), which calls vm.run_queued_promise_jobs().
By design, queued jobs normally only run after the script was fully
executed, making it improssible to test handlers in individual test()
calls by default [2].

Subsequent commits include integrations into LibWeb and js(1) -
pretty-printing, running queued promise jobs when necessary.

This has an unusual amount of dbgln() statements, all hidden behind the
PROMISE_DEBUG flag - I'm leaving them in for now as they've been very
useful while debugging this, things can get quite complex with so many
asynchronously executed functions.

I've not extensively explored use of these APIs for promise-based
functionality in LibWeb (fetch(), Notification.requestPermission()
etc.), but we'll get there in due time.

[1]: https://tc39.es/ecma262/#sec-promise-objects
[2]: https://tc39.es/ecma262/#sec-jobs-and-job-queues
2021-04-02 10:47:40 +02:00
..
Tests AK: Add IsSigned conterpart to IsUnsigned. 2021-03-28 11:45:51 +02:00
AllOf.h AK: Publish all_of() 2021-02-17 15:22:21 +01:00
AnyOf.h AK: Publish AK::any_of by default 2021-02-07 11:35:08 +01:00
Array.h AK: Fix integer_sequence_generate_array 2021-03-21 09:35:23 +01:00
Assertions.h Everywhere: Remove unused RELEASE_ASSERT macro 2021-02-23 21:11:53 +01:00
Atomic.h AK: Add a full memory barrier function based on atomic operations 2021-03-05 11:29:34 +01:00
Badge.h Badge: Access to underlying type 2021-01-15 09:44:21 +01:00
Base64.cpp Everywhere: Remove unnecessary clang-format offs 2021-03-04 11:01:48 +01:00
Base64.h Everywhere: Remove unnecessary headers 3/4 2021-02-08 18:03:57 +01:00
BinaryHeap.h AK: Store BinaryHeap key-value pairs together for efficient swaps 2021-03-13 23:50:07 +01:00
BinarySearch.h Everywhere: Remove unnecessary headers 3/4 2021-02-08 18:03:57 +01:00
BitCast.h AK: Implement bit_cast 2021-03-23 08:22:15 +01:00
Bitmap.h AK: Simplify Bitmap and implement in terms of BitmapView 2021-03-04 11:25:45 +01:00
BitmapView.h AK: Add BitmapView class (like StringView but for bitmaps) 2021-03-04 11:25:45 +01:00
BitStream.h LibCompress+AK: Dont short-circuit error handling propagation 2021-03-16 14:56:50 +01:00
Buffered.h AK: Cleanup missing includes and #ifdef evaluation 2020-11-22 11:35:53 +01:00
ByteBuffer.cpp AK: Alter ByteBuffer to utilise memcmp. 2021-02-21 16:34:51 +01:00
ByteBuffer.h AK: Make ByteBuffer::slice(0, size()) a freebie 2021-03-15 18:01:11 +01:00
Checked.h AK: Add decrement operator to Checked 2021-03-13 10:17:28 +01:00
CheckedFormatString.h AK: Rename {DBGLN_NO => ENABLE}_COMPILETIME_FORMAT_CHECK 2021-02-24 13:07:57 +01:00
CircularDeque.h Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
CircularDuplexStream.h Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
CircularQueue.h Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
CMakeLists.txt Meta: Build AK and LibRegex tests in Lagom and for Serenity 2021-02-28 18:19:37 +01:00
Complex.h AK: Add complex number library 2021-03-27 10:20:55 +01:00
Concepts.h AK: Add Signed/Unsigned concepts. 2021-03-28 11:45:51 +02:00
Debug.h.in LibJS: Add initial support for Promises 2021-04-02 10:47:40 +02:00
Demangle.h Revert "AK: Don't demangle in serenity :(" 2020-05-20 16:24:26 +02:00
DistinctNumeric.h Everywhere: Remove a bunch of redundant 'AK::' namespace prefixes 2021-02-26 16:59:56 +01:00
DoublyLinkedList.h Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
Endian.h AK: Simplify constructors and conversions from nullptr_t 2021-01-12 09:11:45 +01:00
EnumBits.h AK: Add AK_ENUM_BITWISE_OPERATORS(..) to enable type-safe enum bitwise operations 2021-03-08 18:47:40 +01:00
FileStream.h Everywhere: Remove unnecessary headers 4/4 2021-02-08 18:03:57 +01:00
Find.h AK: Find a value in any container offering iterators 2021-01-11 19:45:05 +01:00
FlyString.cpp Everywhere: Remove a bunch of redundant 'AK::' namespace prefixes 2021-02-26 16:59:56 +01:00
FlyString.h AK: Simplify constructors and conversions from nullptr_t 2021-01-12 09:11:45 +01:00
Format.cpp Everywhere: Remove klog(), dbg() and purge all LogStream usage :^) 2021-03-12 17:29:37 +01:00
Format.h Everywhere: Remove klog(), dbg() and purge all LogStream usage :^) 2021-03-12 17:29:37 +01:00
Forward.h AK: Add OutputBitStream class 2021-03-13 20:07:25 +01:00
Function.h Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
GenericLexer.cpp Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
GenericLexer.h AK: Add GenericLexer::retreat() 2020-10-29 11:52:31 +01:00
HashFunctions.h Everywhere: Fix weird includes 2021-02-08 18:03:57 +01:00
HashMap.h Everywhere: Remove unnecessary headers 4/4 2021-02-08 18:03:57 +01:00
HashTable.h Everywhere: Remove klog(), dbg() and purge all LogStream usage :^) 2021-03-12 17:29:37 +01:00
Hex.cpp AK: Use StringBuilder::appendff() instead of appendf() 2021-02-09 19:18:13 +01:00
Hex.h Everywhere: Remove unnecessary headers 3/4 2021-02-08 18:03:57 +01:00
IDAllocator.h Everywhere: Remove klog(), dbg() and purge all LogStream usage :^) 2021-03-12 17:29:37 +01:00
InlineLinkedList.h Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
IntrusiveList.h AK: Add basic const iteration to IntrusiveList 2021-03-11 14:21:49 +01:00
IPv4Address.h Everywhere: Remove klog(), dbg() and purge all LogStream usage :^) 2021-03-12 17:29:37 +01:00
IterationDecision.h Meta: Add license header to source files 2020-01-18 09:45:54 +01:00
Iterator.h AK: Make single pivot quick_sort guarantee a max stack depth of log(n) 2021-02-01 09:52:36 +01:00
JsonArray.h AK: Allow assigning a value to a specific index in a JsonArray 2021-03-26 22:58:31 +01:00
JsonArraySerializer.h Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
JsonObject.h AK: JsonObject::value_or() fallback value should be a const reference 2021-03-08 11:50:36 +01:00
JsonObjectSerializer.h Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
JsonParser.cpp Everywhere: Remove a bunch of redundant 'AK::' namespace prefixes 2021-02-26 16:59:56 +01:00
JsonParser.h AK: Remove empty destructor from JsonParser. 2020-09-08 14:01:21 +02:00
JsonPath.cpp Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
JsonPath.h Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
JsonValue.cpp Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
JsonValue.h AK: Add 64 bit methods to JsonValue 2021-03-17 23:22:42 +01:00
kmalloc.h AK: Always include <new> from compiler before our operators new 2020-11-05 09:59:30 +01:00
kstdio.h Everywhere: Remove klog(), dbg() and purge all LogStream usage :^) 2021-03-12 17:29:37 +01:00
LexicalPath.cpp AK: Add LexicalPath::relative_path 2021-02-20 15:53:37 +01:00
LexicalPath.h AK: Add LexicalPath::relative_path 2021-02-20 15:53:37 +01:00
MACAddress.h Everywhere: Remove a bunch of redundant 'AK::' namespace prefixes 2021-02-26 16:59:56 +01:00
MappedFile.cpp Everywhere: Remove klog(), dbg() and purge all LogStream usage :^) 2021-03-12 17:29:37 +01:00
MappedFile.h LibC+Everywhere: Remove open_with_path_length() in favor of open() 2021-01-12 23:34:01 +01:00
MemMem.h Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
Memory.h AK+LibC: Always use REP MOVSB/STOSB for memcpy()/memset() 2020-07-27 15:54:39 +02:00
MemoryStream.h Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
NeverDestroyed.h NeverDestroyed: Add tests 2020-11-22 10:54:33 +01:00
Noncopyable.h Meta: Force semi-colon after MAKE_AK_NONXXXABLE() 2020-08-27 10:12:04 +02:00
NonnullOwnPtr.h Everywhere: Remove klog(), dbg() and purge all LogStream usage :^) 2021-03-12 17:29:37 +01:00
NonnullOwnPtrVector.h AK: Make Nonnull*PtrVector use size_t for indexes 2021-02-20 18:34:32 +01:00
NonnullPtrVector.h AK: Make Nonnull*PtrVector use size_t for indexes 2021-02-20 18:34:32 +01:00
NonnullRefPtr.h Kernel::CPU: Move headers into common directory 2021-03-21 09:35:23 +01:00
NonnullRefPtrVector.h AK: Make Nonnull*PtrVector use size_t for indexes 2021-02-20 18:34:32 +01:00
NumberFormat.h AK: Add longer human readable size to string helper function 2021-03-25 10:59:11 +01:00
NumericLimits.h AK: Add NumericLimits specialization for char. 2020-09-29 16:14:58 +02:00
Optional.h Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
OSError.h Everywhere: Remove klog(), dbg() and purge all LogStream usage :^) 2021-03-12 17:29:37 +01:00
OwnPtr.h Everywhere: Remove klog(), dbg() and purge all LogStream usage :^) 2021-03-12 17:29:37 +01:00
Platform.h Everywhere: Remove klog(), dbg() and purge all LogStream usage :^) 2021-03-12 17:29:37 +01:00
PrintfImplementation.h AK+LibC: Make %p specifier Architecture Independent 2021-03-21 09:35:23 +01:00
Ptr32.h AK: Add a Ptr32 type to handle fixed sized pointers 2021-03-21 09:35:23 +01:00
Queue.h Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
QuickSort.h AK: Make single pivot quick_sort guarantee a max stack depth of log(n) 2021-02-01 09:52:36 +01:00
Random.h Everywhere: Switch from (void) to [[maybe_unused]] (#4473) 2020-12-21 00:09:48 +01:00
RefCounted.h Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
RefPtr.h Kernel::CPU: Move headers into common directory 2021-03-21 09:35:23 +01:00
Result.h AK: Fix bogus return type of Result::release_error() (#6054) 2021-04-01 21:03:57 +02:00
ScopedValueRollback.h Meta: Add license header to source files 2020-01-18 09:45:54 +01:00
ScopeGuard.h Meta+AK: Make clang-format-10 clean 2020-09-25 21:18:17 +02:00
ScopeLogger.h LibCpp: Add the beginning of a C++ parser 2021-01-27 21:10:57 +01:00
SIMD.h AK: Add header for SIMD vectorized types 2020-12-08 09:39:43 +01:00
Singleton.h Kernel::CPU: Move headers into common directory 2021-03-21 09:35:23 +01:00
SinglyLinkedList.h Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
SinglyLinkedListWithCount.h Everywhere: Remove unnecessary headers 4/4 2021-02-08 18:03:57 +01:00
SourceGenerator.h Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
Span.h Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
StackInfo.cpp AK: Fix OOO mistake in StackInfo.cpp 2021-03-03 11:09:44 +01:00
StackInfo.h LibJS+AK: Move cross-platform stack bounds code from JS::Heap to AK::StackInfo 2020-11-08 16:51:54 +01:00
StdLibExtras.h AK: Add IsSigned conterpart to IsUnsigned. 2021-03-28 11:45:51 +02:00
Stream.h Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
String.cpp Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
String.h Everywhere: Remove a bunch of redundant 'AK::' namespace prefixes 2021-02-26 16:59:56 +01:00
StringBuilder.cpp Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
StringBuilder.h AK+Kernel+Userland: Enable some more compiletime format string checks 2021-02-23 13:59:33 +01:00
StringImpl.cpp Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
StringImpl.h Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
StringUtils.cpp Everywhere: Remove a bunch of redundant 'AK::' namespace prefixes 2021-02-26 16:59:56 +01:00
StringUtils.h AK: Add String{,Utils}::to_snakecase() 2021-02-21 19:47:47 +01:00
StringView.cpp Everywhere: Remove a bunch of redundant 'AK::' namespace prefixes 2021-02-26 16:59:56 +01:00
StringView.h AK: Don't compare past '\0' in StringView::operator==(const char*) 2021-02-24 22:13:04 +01:00
TemporaryChange.h Meta: Add license header to source files 2020-01-18 09:45:54 +01:00
TestSuite.h AK+LibM: Rename EXPECT_CLOSE to EXPECT_APPROXIMATE 2021-03-03 20:19:24 +01:00
Time.cpp AK: Fix some overflows/underflows that weren't properly handled 2021-03-13 10:17:28 +01:00
Time.h AK: Fix some overflows/underflows that weren't properly handled 2021-03-13 10:17:28 +01:00
Traits.h AK: Find a value in any container offering iterators 2021-01-11 19:45:05 +01:00
Trie.h AK: Replace some SFINAE with requires clauses, clean up existing ones 2020-12-30 13:28:49 +01:00
TypeCasts.h Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
TypedTransfer.h Everywhere: Remove pessimizing and redundant move() 2021-03-17 16:30:15 +01:00
TypeList.h AK: Add missing 'template' keywords in TypeList 2020-12-31 16:16:07 +01:00
Types.h AK: Implement terabytes, petabytes, exabytes 2021-03-17 23:22:42 +01:00
URL.cpp AK: Add optional fragment parameter to create_with_file_protocol() 2021-03-07 11:00:36 +01:00
URL.h Everywhere: Remove klog(), dbg() and purge all LogStream usage :^) 2021-03-12 17:29:37 +01:00
URLParser.cpp AK: Add optional parameter for excluding chars to urlencode() 2021-01-31 19:05:55 +01:00
URLParser.h AK: Add optional parameter for excluding chars to urlencode() 2021-01-31 19:05:55 +01:00
Userspace.h AK: Simplify constructors and conversions from nullptr_t 2021-01-12 09:11:45 +01:00
Utf8View.cpp AK: Add starts_with to Utf8View 2021-03-25 10:59:34 +01:00
Utf8View.h AK: Add starts_with to Utf8View 2021-03-25 10:59:34 +01:00
Utf32View.h Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
UUID.cpp Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
UUID.h AK: Simplify constructors and conversions from nullptr_t 2021-01-12 09:11:45 +01:00
Vector.h Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
Weakable.h Kernel::CPU: Move headers into common directory 2021-03-21 09:35:23 +01:00
WeakPtr.h Everywhere: Remove klog(), dbg() and purge all LogStream usage :^) 2021-03-12 17:29:37 +01:00