generated from tc39/template-for-proposals
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathspec.emu
86 lines (81 loc) · 5.01 KB
/
spec.emu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
<!doctype html>
<meta charset="utf8">
<link rel="stylesheet" href="./spec.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.4/styles/github.min.css">
<script src="./spec.js"></script>
<pre class="metadata">
title: Faster Promise Adoption
stage: 1
contributors: Justin Ridgewell
location: https://tc39.es/proposal-faster-promise-adoption
markEffects: true
</pre>
<emu-clause id="proposal-control-abstraction-objects">
<h1>Control Abstraction Objects <emu-xref href="#sec-control-abstraction-objects"></emu-xref></h1>
<emu-clause id="proposal-promise-objects">
<h1>Promise Objects <emu-xref href="#sec-promise-objects"></emu-xref></h1>
<emu-clause id="proposal-promise-abstract-operations">
<h1>Promise Abstract Operations <emu-xref href="#sec-promise-abstract-operations"></emu-xref></h1>
<emu-clause id="proposal-createresolvingfunctions" type="abstract operation">
<h1>
CreateResolvingFunctions (
_promise_: unknown,
): a Record with fields [[Resolve]] (a function object) and [[Reject]] (a function object)
</h1>
<dl class="header">
</dl>
<emu-alg>
1. Let _alreadyResolved_ be the Record { [[Value]]: *false* }.
1. Let _stepsResolve_ be the algorithm steps defined in <emu-xref href="#sec-promise-resolve-functions" title></emu-xref>.
1. Let _lengthResolve_ be the number of non-optional parameters of the function definition in <emu-xref href="#sec-promise-resolve-functions" title></emu-xref>.
1. Let _resolve_ be CreateBuiltinFunction(_stepsResolve_, _lengthResolve_, *""*, « [[Promise]], [[AlreadyResolved]] »).
1. Set _resolve_.[[Promise]] to _promise_.
1. Set _resolve_.[[AlreadyResolved]] to _alreadyResolved_.
1. Let _stepsReject_ be the algorithm steps defined in <emu-xref href="#sec-promise-reject-functions" title></emu-xref>.
1. Let _lengthReject_ be the number of non-optional parameters of the function definition in <emu-xref href="#sec-promise-reject-functions" title></emu-xref>.
1. Let _reject_ be CreateBuiltinFunction(_stepsReject_, _lengthReject_, *""*, « [[Promise]], [[AlreadyResolved]] »).
1. Set _reject_.[[Promise]] to _promise_.
1. Set _reject_.[[AlreadyResolved]] to _alreadyResolved_.
1. Return the Record { [[Resolve]]: _resolve_, [[Reject]]: _reject_ }.
</emu-alg>
<emu-clause id="sec-promise-resolve-functions">
<h1>Promise Resolve Functions</h1>
<p>A promise resolve function is an anonymous built-in function that has [[Promise]] and [[AlreadyResolved]] internal slots.</p>
<p>When a promise resolve function is called with argument _resolution_, the following steps are taken:</p>
<emu-alg>
1. Let _F_ be the active function object.
1. Assert: _F_ has a [[Promise]] internal slot whose value is an Object.
1. Let _promise_ be _F_.[[Promise]].
1. Let _alreadyResolved_ be _F_.[[AlreadyResolved]].
1. If _alreadyResolved_.[[Value]] is *true*, return *undefined*.
1. Set _alreadyResolved_.[[Value]] to *true*.
1. If SameValue(_resolution_, _promise_) is *true*, then
1. Let _selfResolutionError_ be a newly created *TypeError* object.
1. Perform RejectPromise(_promise_, _selfResolutionError_).
1. Return *undefined*.
1. If Type(_resolution_) is not Object, then
1. Perform FulfillPromise(_promise_, _resolution_).
1. Return *undefined*.
1. Let _then_ be Completion(Get(_resolution_, *"then"*)).
1. If _then_ is an abrupt completion, then
1. Perform RejectPromise(_promise_, _then_.[[Value]]).
1. Return *undefined*.
1. Let _thenAction_ be _then_.[[Value]].
1. If IsCallable(_thenAction_) is *false*, then
1. Perform FulfillPromise(_promise_, _resolution_).
1. Return *undefined*.
1. <del>Let _thenJobCallback_ be HostMakeJobCallback(_thenAction_).</del>
1. <del>Let _job_ be NewPromiseResolveThenableJob(_promise_, _resolution_, _thenJobCallback_).</del>
1. <del>Perform HostEnqueuePromiseJob(_job_.[[Job]], _job_.[[Realm]]).</del>
1. <ins>Let _resolvingFunctions_ be CreateResolvingFunctions(_promise_).</ins>
1. <ins>Let _thenCallResult_ be Completion(Call(_then_, _resolution_, « _resolvingFunctions_.[[Resolve]], _resolvingFunctions_.[[Reject]] »)).</ins>
1. <ins>If _thenCallResult_ is an abrupt completion, then</ins>
1. <ins>Perform ! Call(_resolvingFunctions_.[[Reject]], *undefined*, « _thenCallResult_.[[Value]] »).</ins>
1. Return *undefined*.
</emu-alg>
<p>The *"length"* property of a promise resolve function is *1*<sub>𝔽</sub>.</p>
</emu-clause>
</emu-clause>
</emu-clause>
</emu-clause>
</emu-clause>