1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-24 09:47:34 +00:00
serenity/Userland/Libraries/LibJS
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
..
Heap LibJS: Fix m_allocations_since_last_gc initialization value 2021-03-28 20:40:22 +02:00
Runtime LibJS: Add initial support for Promises 2021-04-02 10:47:40 +02:00
Tests LibJS: Add initial support for Promises 2021-04-02 10:47:40 +02:00
AST.cpp Only apply auto-naming of function expressions based on syntax 2021-03-22 12:44:07 +01:00
AST.h Only apply auto-naming of function expressions based on syntax 2021-03-22 12:44:07 +01:00
CMakeLists.txt LibJS: Add initial support for Promises 2021-04-02 10:47:40 +02:00
Console.cpp LibJS: Put console dbgln() logging behind #ifdef __serenity__ 2021-03-02 08:36:34 +01:00
Console.h LibJS: Print console.{debug,error,info,log,warn} to system debug log 2021-02-21 21:32:16 +01:00
Forward.h LibJS: Add initial support for Promises 2021-04-02 10:47:40 +02:00
Interpreter.cpp LibJS: Add initial support for Promises 2021-04-02 10:47:40 +02:00
Interpreter.h LibJS: Always inline some tiny Interpreter getters 2021-03-21 21:39:39 +01:00
Lexer.cpp LibJS: Keep track of file names, lines and columns inside the AST 2021-03-01 11:14:36 +01:00
Lexer.h LibJS: Keep track of file names, lines and columns inside the AST 2021-03-01 11:14:36 +01:00
MarkupGenerator.cpp Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
MarkupGenerator.h Libraries: Move to Userland/Libraries/ 2021-01-12 12:17:46 +01:00
Parser.cpp Only apply auto-naming of function expressions based on syntax 2021-03-22 12:44:07 +01:00
Parser.h LibJS: Keep track of file names, lines and columns inside the AST 2021-03-01 11:14:36 +01:00
SourceRange.h LibJS: Keep track of file names, lines and columns inside the AST 2021-03-01 11:14:36 +01:00
SyntaxHighlighter.cpp LibSyntax: Make rehighlight() take Gfx::Palette as by const-reference 2021-02-11 23:52:39 +01:00
SyntaxHighlighter.h LibSyntax: Make rehighlight() take Gfx::Palette as by const-reference 2021-02-11 23:52:39 +01:00
Token.cpp Everywhere: Rename ASSERT => VERIFY 2021-02-23 20:56:54 +01:00
Token.h LibJS: Keep track of file names, lines and columns inside the AST 2021-03-01 11:14:36 +01:00