mirror of https://github.com/tc39/test262.git
Tests for TLA module evaluation
This commit is contained in:
parent
0213936e95
commit
32bb36f5e4
|
@ -0,0 +1,53 @@
|
||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
esid: sec-moduleevaluation
|
||||||
|
description: >
|
||||||
|
Top Level Await on a Dynamic import
|
||||||
|
info: |
|
||||||
|
InnerModuleEvaluation( module, stack, index )
|
||||||
|
|
||||||
|
...
|
||||||
|
14. If module.[[PendingAsyncDependencies]] is > 0, set module.[[AsyncEvaluating]] to true.
|
||||||
|
15. Otherwise, if module.[[Async]] is true, perform ! ExecuteAsyncModule(module).
|
||||||
|
16. Otherwise, perform ? module.ExecuteModule().
|
||||||
|
|
||||||
|
ExecuteAsyncModule ( module )
|
||||||
|
|
||||||
|
1. Assert: module.[[Status]] is "evaluating" or "evaluated".
|
||||||
|
2. Assert: module.[[Async]] is true.
|
||||||
|
3. Set module.[[AsyncEvaluating]] to true.
|
||||||
|
4. Let capability be ! NewPromiseCapability(%Promise%).
|
||||||
|
5. Let stepsFulfilled be the steps of a CallAsyncModuleFulfilled function as specified below.
|
||||||
|
...
|
||||||
|
8. Let stepsRejected be the steps of a CallAsyncModuleRejected function as specified below.
|
||||||
|
...
|
||||||
|
11. Perform ! PerformPromiseThen(capability.[[Promise]], onFulfilled, onRejected).
|
||||||
|
12. Perform ! module.ExecuteModule(capability).
|
||||||
|
13. Return.
|
||||||
|
|
||||||
|
ExecuteModule ( [ capability ] )
|
||||||
|
|
||||||
|
...
|
||||||
|
11. If module.[[Async]] is false, then
|
||||||
|
a. Assert: capability was not provided.
|
||||||
|
b. Push moduleCxt on to the execution context stack; moduleCxt is now the running execution context.
|
||||||
|
c. Let result be the result of evaluating module.[[ECMAScriptCode]].
|
||||||
|
d. Suspend moduleCxt and remove it from the execution context stack.
|
||||||
|
e. Resume the context that is now on the top of the execution context stack as the running execution context.
|
||||||
|
f. Return Completion(result).
|
||||||
|
12. Otherwise,
|
||||||
|
a. Assert: capability is a PromiseCapability Record.
|
||||||
|
b. Perform ! AsyncBlockStart(capability, module.[[ECMAScriptCode]], moduleCxt).
|
||||||
|
c. Return.
|
||||||
|
flags: [module]
|
||||||
|
features: [top-level-await, dynamic-import]
|
||||||
|
negative:
|
||||||
|
phase: runtime
|
||||||
|
type: TypeError
|
||||||
|
---*/
|
||||||
|
|
||||||
|
await import('./module-import-rejection-body_FIXTURE.js');
|
||||||
|
|
||||||
|
throw new Test262Error('this should be unreachable');
|
|
@ -0,0 +1,54 @@
|
||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
esid: sec-moduleevaluation
|
||||||
|
description: >
|
||||||
|
Top Level Await on a Dynamic import
|
||||||
|
info: |
|
||||||
|
InnerModuleEvaluation( module, stack, index )
|
||||||
|
|
||||||
|
...
|
||||||
|
14. If module.[[PendingAsyncDependencies]] is > 0, set module.[[AsyncEvaluating]] to true.
|
||||||
|
15. Otherwise, if module.[[Async]] is true, perform ! ExecuteAsyncModule(module).
|
||||||
|
16. Otherwise, perform ? module.ExecuteModule().
|
||||||
|
|
||||||
|
ExecuteAsyncModule ( module )
|
||||||
|
|
||||||
|
1. Assert: module.[[Status]] is "evaluating" or "evaluated".
|
||||||
|
2. Assert: module.[[Async]] is true.
|
||||||
|
3. Set module.[[AsyncEvaluating]] to true.
|
||||||
|
4. Let capability be ! NewPromiseCapability(%Promise%).
|
||||||
|
5. Let stepsFulfilled be the steps of a CallAsyncModuleFulfilled function as specified below.
|
||||||
|
...
|
||||||
|
8. Let stepsRejected be the steps of a CallAsyncModuleRejected function as specified below.
|
||||||
|
...
|
||||||
|
11. Perform ! PerformPromiseThen(capability.[[Promise]], onFulfilled, onRejected).
|
||||||
|
12. Perform ! module.ExecuteModule(capability).
|
||||||
|
13. Return.
|
||||||
|
|
||||||
|
ExecuteModule ( [ capability ] )
|
||||||
|
|
||||||
|
...
|
||||||
|
11. If module.[[Async]] is false, then
|
||||||
|
a. Assert: capability was not provided.
|
||||||
|
b. Push moduleCxt on to the execution context stack; moduleCxt is now the running execution context.
|
||||||
|
c. Let result be the result of evaluating module.[[ECMAScriptCode]].
|
||||||
|
d. Suspend moduleCxt and remove it from the execution context stack.
|
||||||
|
e. Resume the context that is now on the top of the execution context stack as the running execution context.
|
||||||
|
f. Return Completion(result).
|
||||||
|
12. Otherwise,
|
||||||
|
a. Assert: capability is a PromiseCapability Record.
|
||||||
|
b. Perform ! AsyncBlockStart(capability, module.[[ECMAScriptCode]], moduleCxt).
|
||||||
|
c. Return.
|
||||||
|
flags: [module, async]
|
||||||
|
features: [top-level-await, dynamic-import]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var ns = await import('./module-import-resolution_FIXTURE.js');
|
||||||
|
|
||||||
|
assert.sameValue(ns.default, 42);
|
||||||
|
assert.sameValue(ns.x, 'named');
|
||||||
|
assert.sameValue(ns.y, 39);
|
||||||
|
|
||||||
|
$DONE();
|
|
@ -0,0 +1,54 @@
|
||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
esid: sec-moduleevaluation
|
||||||
|
description: >
|
||||||
|
Dynamic imported module with async exports
|
||||||
|
info: |
|
||||||
|
InnerModuleEvaluation( module, stack, index )
|
||||||
|
|
||||||
|
...
|
||||||
|
14. If module.[[PendingAsyncDependencies]] is > 0, set module.[[AsyncEvaluating]] to true.
|
||||||
|
15. Otherwise, if module.[[Async]] is true, perform ! ExecuteAsyncModule(module).
|
||||||
|
16. Otherwise, perform ? module.ExecuteModule().
|
||||||
|
|
||||||
|
ExecuteAsyncModule ( module )
|
||||||
|
|
||||||
|
1. Assert: module.[[Status]] is "evaluating" or "evaluated".
|
||||||
|
2. Assert: module.[[Async]] is true.
|
||||||
|
3. Set module.[[AsyncEvaluating]] to true.
|
||||||
|
4. Let capability be ! NewPromiseCapability(%Promise%).
|
||||||
|
5. Let stepsFulfilled be the steps of a CallAsyncModuleFulfilled function as specified below.
|
||||||
|
...
|
||||||
|
8. Let stepsRejected be the steps of a CallAsyncModuleRejected function as specified below.
|
||||||
|
...
|
||||||
|
11. Perform ! PerformPromiseThen(capability.[[Promise]], onFulfilled, onRejected).
|
||||||
|
12. Perform ! module.ExecuteModule(capability).
|
||||||
|
13. Return.
|
||||||
|
|
||||||
|
ExecuteModule ( [ capability ] )
|
||||||
|
|
||||||
|
...
|
||||||
|
11. If module.[[Async]] is false, then
|
||||||
|
a. Assert: capability was not provided.
|
||||||
|
b. Push moduleCxt on to the execution context stack; moduleCxt is now the running execution context.
|
||||||
|
c. Let result be the result of evaluating module.[[ECMAScriptCode]].
|
||||||
|
d. Suspend moduleCxt and remove it from the execution context stack.
|
||||||
|
e. Resume the context that is now on the top of the execution context stack as the running execution context.
|
||||||
|
f. Return Completion(result).
|
||||||
|
12. Otherwise,
|
||||||
|
a. Assert: capability is a PromiseCapability Record.
|
||||||
|
b. Perform ! AsyncBlockStart(capability, module.[[ECMAScriptCode]], moduleCxt).
|
||||||
|
c. Return.
|
||||||
|
flags: [module, async]
|
||||||
|
features: [top-level-await, dynamic-import]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
import('./module-import-rejection_FIXTURE.js').then(() => {
|
||||||
|
throw new Test262Error('Should not be fulfilled');
|
||||||
|
}, (err) => {
|
||||||
|
assert(err instanceof TypeError);
|
||||||
|
assert.sameValue(err.constructor, TypeError);
|
||||||
|
assert.sameValue(err.message, 'error in the default export line');
|
||||||
|
}).then($DONE, $DONE);
|
|
@ -0,0 +1,52 @@
|
||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
esid: sec-moduleevaluation
|
||||||
|
description: >
|
||||||
|
Dynamic imported module with async exports
|
||||||
|
info: |
|
||||||
|
InnerModuleEvaluation( module, stack, index )
|
||||||
|
|
||||||
|
...
|
||||||
|
14. If module.[[PendingAsyncDependencies]] is > 0, set module.[[AsyncEvaluating]] to true.
|
||||||
|
15. Otherwise, if module.[[Async]] is true, perform ! ExecuteAsyncModule(module).
|
||||||
|
16. Otherwise, perform ? module.ExecuteModule().
|
||||||
|
|
||||||
|
ExecuteAsyncModule ( module )
|
||||||
|
|
||||||
|
1. Assert: module.[[Status]] is "evaluating" or "evaluated".
|
||||||
|
2. Assert: module.[[Async]] is true.
|
||||||
|
3. Set module.[[AsyncEvaluating]] to true.
|
||||||
|
4. Let capability be ! NewPromiseCapability(%Promise%).
|
||||||
|
5. Let stepsFulfilled be the steps of a CallAsyncModuleFulfilled function as specified below.
|
||||||
|
...
|
||||||
|
8. Let stepsRejected be the steps of a CallAsyncModuleRejected function as specified below.
|
||||||
|
...
|
||||||
|
11. Perform ! PerformPromiseThen(capability.[[Promise]], onFulfilled, onRejected).
|
||||||
|
12. Perform ! module.ExecuteModule(capability).
|
||||||
|
13. Return.
|
||||||
|
|
||||||
|
ExecuteModule ( [ capability ] )
|
||||||
|
|
||||||
|
...
|
||||||
|
11. If module.[[Async]] is false, then
|
||||||
|
a. Assert: capability was not provided.
|
||||||
|
b. Push moduleCxt on to the execution context stack; moduleCxt is now the running execution context.
|
||||||
|
c. Let result be the result of evaluating module.[[ECMAScriptCode]].
|
||||||
|
d. Suspend moduleCxt and remove it from the execution context stack.
|
||||||
|
e. Resume the context that is now on the top of the execution context stack as the running execution context.
|
||||||
|
f. Return Completion(result).
|
||||||
|
12. Otherwise,
|
||||||
|
a. Assert: capability is a PromiseCapability Record.
|
||||||
|
b. Perform ! AsyncBlockStart(capability, module.[[ECMAScriptCode]], moduleCxt).
|
||||||
|
c. Return.
|
||||||
|
flags: [module, async]
|
||||||
|
features: [top-level-await, dynamic-import]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
import('./module-import-resolution_FIXTURE.js').then(ns => {
|
||||||
|
assert.sameValue(ns.default, 42);
|
||||||
|
assert.sameValue(ns.x, 'named');
|
||||||
|
assert.sameValue(ns.y, 39);
|
||||||
|
}).then($DONE, $DONE);
|
|
@ -0,0 +1,86 @@
|
||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
esid: sec-moduleevaluation
|
||||||
|
description: >
|
||||||
|
Ticks from async module (w/ TLA) won't change loading async module
|
||||||
|
info: |
|
||||||
|
Table 3: Additional Fields of Cyclic Module Records
|
||||||
|
|
||||||
|
[[Async]]
|
||||||
|
|
||||||
|
...
|
||||||
|
Having an asynchronous dependency does not make the module asynchronous. This field must not change after the module is parsed.
|
||||||
|
|
||||||
|
Evaluate ( ) Concrete Method
|
||||||
|
|
||||||
|
...
|
||||||
|
6. Let capability be ! NewPromiseCapability(%Promise%).
|
||||||
|
7. Set module.[[TopLevelCapability]] to capability.
|
||||||
|
8. Let result be InnerModuleEvaluation(module, stack, 0).
|
||||||
|
9. If result is an abrupt completion, then
|
||||||
|
...
|
||||||
|
d. Perform ! Call(capability.[[Reject]], undefined, «result.[[Value]]»).
|
||||||
|
10. Otherwise,
|
||||||
|
...
|
||||||
|
b. If module.[[AsyncEvaluating]] is false, then
|
||||||
|
i. Perform ! Call(capability.[[Resolve]], undefined, «undefined»).
|
||||||
|
...
|
||||||
|
11. Return undefinedcapability.[[Promise]].
|
||||||
|
|
||||||
|
InnerModuleEvaluation( module, stack, index )
|
||||||
|
|
||||||
|
...
|
||||||
|
14. If module.[[PendingAsyncDependencies]] is > 0, set module.[[AsyncEvaluating]] to true.
|
||||||
|
15. Otherwise, if module.[[Async]] is true, perform ! ExecuteAsyncModule(module).
|
||||||
|
16. Otherwise, perform ? module.ExecuteModule().
|
||||||
|
|
||||||
|
ExecuteAsyncModule ( module )
|
||||||
|
|
||||||
|
1. Assert: module.[[Status]] is "evaluating" or "evaluated".
|
||||||
|
2. Assert: module.[[Async]] is true.
|
||||||
|
3. Set module.[[AsyncEvaluating]] to true.
|
||||||
|
4. Let capability be ! NewPromiseCapability(%Promise%).
|
||||||
|
5. Let stepsFulfilled be the steps of a CallAsyncModuleFulfilled function as specified below.
|
||||||
|
...
|
||||||
|
8. Let stepsRejected be the steps of a CallAsyncModuleRejected function as specified below.
|
||||||
|
...
|
||||||
|
11. Perform ! PerformPromiseThen(capability.[[Promise]], onFulfilled, onRejected).
|
||||||
|
12. Perform ! module.ExecuteModule(capability).
|
||||||
|
13. Return.
|
||||||
|
|
||||||
|
ExecuteModule ( [ capability ] )
|
||||||
|
|
||||||
|
...
|
||||||
|
11. If module.[[Async]] is false, then
|
||||||
|
a. Assert: capability was not provided.
|
||||||
|
b. Push moduleCxt on to the execution context stack; moduleCxt is now the running execution context.
|
||||||
|
c. Let result be the result of evaluating module.[[ECMAScriptCode]].
|
||||||
|
d. Suspend moduleCxt and remove it from the execution context stack.
|
||||||
|
e. Resume the context that is now on the top of the execution context stack as the running execution context.
|
||||||
|
f. Return Completion(result).
|
||||||
|
12. Otherwise,
|
||||||
|
a. Assert: capability is a PromiseCapability Record.
|
||||||
|
b. Perform ! AsyncBlockStart(capability, module.[[ECMAScriptCode]], moduleCxt).
|
||||||
|
c. Return.
|
||||||
|
flags: [module, async]
|
||||||
|
features: [top-level-await]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var x = 'synchronous evaluation';
|
||||||
|
|
||||||
|
Promise.resolve().then(() => x = 'tick in the async evaluation');
|
||||||
|
|
||||||
|
// module 'foo' won't tick here
|
||||||
|
import foo from './module-import-resolution_FIXTURE.js';
|
||||||
|
|
||||||
|
assert.sameValue(foo, 42);
|
||||||
|
assert.sameValue(x, 'synchronous evaluation');
|
||||||
|
|
||||||
|
// Enforce [[Async]] to true, and tick
|
||||||
|
await 1;
|
||||||
|
|
||||||
|
assert.sameValue(x, 'tick in the async evaluation');
|
||||||
|
|
||||||
|
$DONE();
|
|
@ -0,0 +1,76 @@
|
||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
esid: sec-moduleevaluation
|
||||||
|
description: >
|
||||||
|
Evaluate imported rejected module
|
||||||
|
info: |
|
||||||
|
Table 3: Additional Fields of Cyclic Module Records
|
||||||
|
|
||||||
|
[[Async]]
|
||||||
|
|
||||||
|
...
|
||||||
|
Having an asynchronous dependency does not make the module asynchronous. This field must not change after the module is parsed.
|
||||||
|
|
||||||
|
Evaluate ( ) Concrete Method
|
||||||
|
|
||||||
|
...
|
||||||
|
6. Let capability be ! NewPromiseCapability(%Promise%).
|
||||||
|
7. Set module.[[TopLevelCapability]] to capability.
|
||||||
|
8. Let result be InnerModuleEvaluation(module, stack, 0).
|
||||||
|
9. If result is an abrupt completion, then
|
||||||
|
...
|
||||||
|
d. Perform ! Call(capability.[[Reject]], undefined, «result.[[Value]]»).
|
||||||
|
10. Otherwise,
|
||||||
|
...
|
||||||
|
b. If module.[[AsyncEvaluating]] is false, then
|
||||||
|
i. Perform ! Call(capability.[[Resolve]], undefined, «undefined»).
|
||||||
|
...
|
||||||
|
11. Return undefinedcapability.[[Promise]].
|
||||||
|
|
||||||
|
InnerModuleEvaluation( module, stack, index )
|
||||||
|
|
||||||
|
...
|
||||||
|
14. If module.[[PendingAsyncDependencies]] is > 0, set module.[[AsyncEvaluating]] to true.
|
||||||
|
15. Otherwise, if module.[[Async]] is true, perform ! ExecuteAsyncModule(module).
|
||||||
|
16. Otherwise, perform ? module.ExecuteModule().
|
||||||
|
|
||||||
|
ExecuteAsyncModule ( module )
|
||||||
|
|
||||||
|
1. Assert: module.[[Status]] is "evaluating" or "evaluated".
|
||||||
|
2. Assert: module.[[Async]] is true.
|
||||||
|
3. Set module.[[AsyncEvaluating]] to true.
|
||||||
|
4. Let capability be ! NewPromiseCapability(%Promise%).
|
||||||
|
5. Let stepsFulfilled be the steps of a CallAsyncModuleFulfilled function as specified below.
|
||||||
|
...
|
||||||
|
8. Let stepsRejected be the steps of a CallAsyncModuleRejected function as specified below.
|
||||||
|
...
|
||||||
|
11. Perform ! PerformPromiseThen(capability.[[Promise]], onFulfilled, onRejected).
|
||||||
|
12. Perform ! module.ExecuteModule(capability).
|
||||||
|
13. Return.
|
||||||
|
|
||||||
|
ExecuteModule ( [ capability ] )
|
||||||
|
|
||||||
|
...
|
||||||
|
11. If module.[[Async]] is false, then
|
||||||
|
a. Assert: capability was not provided.
|
||||||
|
b. Push moduleCxt on to the execution context stack; moduleCxt is now the running execution context.
|
||||||
|
c. Let result be the result of evaluating module.[[ECMAScriptCode]].
|
||||||
|
d. Suspend moduleCxt and remove it from the execution context stack.
|
||||||
|
e. Resume the context that is now on the top of the execution context stack as the running execution context.
|
||||||
|
f. Return Completion(result).
|
||||||
|
12. Otherwise,
|
||||||
|
a. Assert: capability is a PromiseCapability Record.
|
||||||
|
b. Perform ! AsyncBlockStart(capability, module.[[ECMAScriptCode]], moduleCxt).
|
||||||
|
c. Return.
|
||||||
|
flags: [module]
|
||||||
|
features: [top-level-await]
|
||||||
|
negative:
|
||||||
|
phase: runtime
|
||||||
|
type: TypeError
|
||||||
|
---*/
|
||||||
|
|
||||||
|
import foo from './module-import-rejection-body_FIXTURE.js';
|
||||||
|
|
||||||
|
throw new Test262Error('this should be unreachable');
|
|
@ -0,0 +1,9 @@
|
||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
export default 42;
|
||||||
|
|
||||||
|
export const named = 'named';
|
||||||
|
|
||||||
|
var rejection = Promise.reject(new TypeError('I reject this!'));
|
||||||
|
await rejection;
|
|
@ -0,0 +1,76 @@
|
||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
esid: sec-moduleevaluation
|
||||||
|
description: >
|
||||||
|
Evaluate imported rejected module
|
||||||
|
info: |
|
||||||
|
Table 3: Additional Fields of Cyclic Module Records
|
||||||
|
|
||||||
|
[[Async]]
|
||||||
|
|
||||||
|
...
|
||||||
|
Having an asynchronous dependency does not make the module asynchronous. This field must not change after the module is parsed.
|
||||||
|
|
||||||
|
Evaluate ( ) Concrete Method
|
||||||
|
|
||||||
|
...
|
||||||
|
6. Let capability be ! NewPromiseCapability(%Promise%).
|
||||||
|
7. Set module.[[TopLevelCapability]] to capability.
|
||||||
|
8. Let result be InnerModuleEvaluation(module, stack, 0).
|
||||||
|
9. If result is an abrupt completion, then
|
||||||
|
...
|
||||||
|
d. Perform ! Call(capability.[[Reject]], undefined, «result.[[Value]]»).
|
||||||
|
10. Otherwise,
|
||||||
|
...
|
||||||
|
b. If module.[[AsyncEvaluating]] is false, then
|
||||||
|
i. Perform ! Call(capability.[[Resolve]], undefined, «undefined»).
|
||||||
|
...
|
||||||
|
11. Return undefinedcapability.[[Promise]].
|
||||||
|
|
||||||
|
InnerModuleEvaluation( module, stack, index )
|
||||||
|
|
||||||
|
...
|
||||||
|
14. If module.[[PendingAsyncDependencies]] is > 0, set module.[[AsyncEvaluating]] to true.
|
||||||
|
15. Otherwise, if module.[[Async]] is true, perform ! ExecuteAsyncModule(module).
|
||||||
|
16. Otherwise, perform ? module.ExecuteModule().
|
||||||
|
|
||||||
|
ExecuteAsyncModule ( module )
|
||||||
|
|
||||||
|
1. Assert: module.[[Status]] is "evaluating" or "evaluated".
|
||||||
|
2. Assert: module.[[Async]] is true.
|
||||||
|
3. Set module.[[AsyncEvaluating]] to true.
|
||||||
|
4. Let capability be ! NewPromiseCapability(%Promise%).
|
||||||
|
5. Let stepsFulfilled be the steps of a CallAsyncModuleFulfilled function as specified below.
|
||||||
|
...
|
||||||
|
8. Let stepsRejected be the steps of a CallAsyncModuleRejected function as specified below.
|
||||||
|
...
|
||||||
|
11. Perform ! PerformPromiseThen(capability.[[Promise]], onFulfilled, onRejected).
|
||||||
|
12. Perform ! module.ExecuteModule(capability).
|
||||||
|
13. Return.
|
||||||
|
|
||||||
|
ExecuteModule ( [ capability ] )
|
||||||
|
|
||||||
|
...
|
||||||
|
11. If module.[[Async]] is false, then
|
||||||
|
a. Assert: capability was not provided.
|
||||||
|
b. Push moduleCxt on to the execution context stack; moduleCxt is now the running execution context.
|
||||||
|
c. Let result be the result of evaluating module.[[ECMAScriptCode]].
|
||||||
|
d. Suspend moduleCxt and remove it from the execution context stack.
|
||||||
|
e. Resume the context that is now on the top of the execution context stack as the running execution context.
|
||||||
|
f. Return Completion(result).
|
||||||
|
12. Otherwise,
|
||||||
|
a. Assert: capability is a PromiseCapability Record.
|
||||||
|
b. Perform ! AsyncBlockStart(capability, module.[[ECMAScriptCode]], moduleCxt).
|
||||||
|
c. Return.
|
||||||
|
flags: [module]
|
||||||
|
features: [top-level-await]
|
||||||
|
negative:
|
||||||
|
phase: runtime
|
||||||
|
type: RangeError
|
||||||
|
---*/
|
||||||
|
|
||||||
|
import foo from './module-import-rejection-tick_FIXTURE.js';
|
||||||
|
|
||||||
|
throw new Test262Error('this should be unreachable');
|
|
@ -0,0 +1,12 @@
|
||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
export default 42;
|
||||||
|
|
||||||
|
await Promise.resolve().then(() => {
|
||||||
|
// This rejection will tick first unwrapping all the promises first
|
||||||
|
return Promise.reject(new RangeError());
|
||||||
|
});
|
||||||
|
|
||||||
|
var rejection = Promise.reject(new TypeError());
|
||||||
|
await rejection;
|
|
@ -0,0 +1,76 @@
|
||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
esid: sec-moduleevaluation
|
||||||
|
description: >
|
||||||
|
Evaluate imported rejected module
|
||||||
|
info: |
|
||||||
|
Table 3: Additional Fields of Cyclic Module Records
|
||||||
|
|
||||||
|
[[Async]]
|
||||||
|
|
||||||
|
...
|
||||||
|
Having an asynchronous dependency does not make the module asynchronous. This field must not change after the module is parsed.
|
||||||
|
|
||||||
|
Evaluate ( ) Concrete Method
|
||||||
|
|
||||||
|
...
|
||||||
|
6. Let capability be ! NewPromiseCapability(%Promise%).
|
||||||
|
7. Set module.[[TopLevelCapability]] to capability.
|
||||||
|
8. Let result be InnerModuleEvaluation(module, stack, 0).
|
||||||
|
9. If result is an abrupt completion, then
|
||||||
|
...
|
||||||
|
d. Perform ! Call(capability.[[Reject]], undefined, «result.[[Value]]»).
|
||||||
|
10. Otherwise,
|
||||||
|
...
|
||||||
|
b. If module.[[AsyncEvaluating]] is false, then
|
||||||
|
i. Perform ! Call(capability.[[Resolve]], undefined, «undefined»).
|
||||||
|
...
|
||||||
|
11. Return undefinedcapability.[[Promise]].
|
||||||
|
|
||||||
|
InnerModuleEvaluation( module, stack, index )
|
||||||
|
|
||||||
|
...
|
||||||
|
14. If module.[[PendingAsyncDependencies]] is > 0, set module.[[AsyncEvaluating]] to true.
|
||||||
|
15. Otherwise, if module.[[Async]] is true, perform ! ExecuteAsyncModule(module).
|
||||||
|
16. Otherwise, perform ? module.ExecuteModule().
|
||||||
|
|
||||||
|
ExecuteAsyncModule ( module )
|
||||||
|
|
||||||
|
1. Assert: module.[[Status]] is "evaluating" or "evaluated".
|
||||||
|
2. Assert: module.[[Async]] is true.
|
||||||
|
3. Set module.[[AsyncEvaluating]] to true.
|
||||||
|
4. Let capability be ! NewPromiseCapability(%Promise%).
|
||||||
|
5. Let stepsFulfilled be the steps of a CallAsyncModuleFulfilled function as specified below.
|
||||||
|
...
|
||||||
|
8. Let stepsRejected be the steps of a CallAsyncModuleRejected function as specified below.
|
||||||
|
...
|
||||||
|
11. Perform ! PerformPromiseThen(capability.[[Promise]], onFulfilled, onRejected).
|
||||||
|
12. Perform ! module.ExecuteModule(capability).
|
||||||
|
13. Return.
|
||||||
|
|
||||||
|
ExecuteModule ( [ capability ] )
|
||||||
|
|
||||||
|
...
|
||||||
|
11. If module.[[Async]] is false, then
|
||||||
|
a. Assert: capability was not provided.
|
||||||
|
b. Push moduleCxt on to the execution context stack; moduleCxt is now the running execution context.
|
||||||
|
c. Let result be the result of evaluating module.[[ECMAScriptCode]].
|
||||||
|
d. Suspend moduleCxt and remove it from the execution context stack.
|
||||||
|
e. Resume the context that is now on the top of the execution context stack as the running execution context.
|
||||||
|
f. Return Completion(result).
|
||||||
|
12. Otherwise,
|
||||||
|
a. Assert: capability is a PromiseCapability Record.
|
||||||
|
b. Perform ! AsyncBlockStart(capability, module.[[ECMAScriptCode]], moduleCxt).
|
||||||
|
c. Return.
|
||||||
|
flags: [module]
|
||||||
|
features: [top-level-await]
|
||||||
|
negative:
|
||||||
|
phase: runtime
|
||||||
|
type: TypeError
|
||||||
|
---*/
|
||||||
|
|
||||||
|
import { resolved } from './module-import-rejection_FIXTURE.js';
|
||||||
|
|
||||||
|
throw new Test262Error('this should be unreachable');
|
|
@ -0,0 +1,11 @@
|
||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
export const resolved = await 42;
|
||||||
|
|
||||||
|
// Can't use Test262Error in this file because it's not referenced here
|
||||||
|
export default await Promise.reject(new TypeError('error in the default export line'));
|
||||||
|
|
||||||
|
// Use RangeError to differentiate from initial error
|
||||||
|
export const x = await Promise.reject(new RangeError('named x rejection'));
|
||||||
|
export const y = await Promise.reject(new RangeError('named y rejection'));
|
|
@ -0,0 +1,81 @@
|
||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
esid: sec-moduleevaluation
|
||||||
|
description: >
|
||||||
|
Evaluate imported module with async exports
|
||||||
|
info: |
|
||||||
|
Table 3: Additional Fields of Cyclic Module Records
|
||||||
|
|
||||||
|
[[Async]]
|
||||||
|
|
||||||
|
...
|
||||||
|
Having an asynchronous dependency does not make the module asynchronous. This field must not change after the module is parsed.
|
||||||
|
|
||||||
|
Evaluate ( ) Concrete Method
|
||||||
|
|
||||||
|
...
|
||||||
|
6. Let capability be ! NewPromiseCapability(%Promise%).
|
||||||
|
7. Set module.[[TopLevelCapability]] to capability.
|
||||||
|
8. Let result be InnerModuleEvaluation(module, stack, 0).
|
||||||
|
9. If result is an abrupt completion, then
|
||||||
|
...
|
||||||
|
d. Perform ! Call(capability.[[Reject]], undefined, «result.[[Value]]»).
|
||||||
|
10. Otherwise,
|
||||||
|
...
|
||||||
|
b. If module.[[AsyncEvaluating]] is false, then
|
||||||
|
i. Perform ! Call(capability.[[Resolve]], undefined, «undefined»).
|
||||||
|
...
|
||||||
|
11. Return undefinedcapability.[[Promise]].
|
||||||
|
|
||||||
|
InnerModuleEvaluation( module, stack, index )
|
||||||
|
|
||||||
|
...
|
||||||
|
14. If module.[[PendingAsyncDependencies]] is > 0, set module.[[AsyncEvaluating]] to true.
|
||||||
|
15. Otherwise, if module.[[Async]] is true, perform ! ExecuteAsyncModule(module).
|
||||||
|
16. Otherwise, perform ? module.ExecuteModule().
|
||||||
|
|
||||||
|
ExecuteAsyncModule ( module )
|
||||||
|
|
||||||
|
1. Assert: module.[[Status]] is "evaluating" or "evaluated".
|
||||||
|
2. Assert: module.[[Async]] is true.
|
||||||
|
3. Set module.[[AsyncEvaluating]] to true.
|
||||||
|
4. Let capability be ! NewPromiseCapability(%Promise%).
|
||||||
|
5. Let stepsFulfilled be the steps of a CallAsyncModuleFulfilled function as specified below.
|
||||||
|
...
|
||||||
|
8. Let stepsRejected be the steps of a CallAsyncModuleRejected function as specified below.
|
||||||
|
...
|
||||||
|
11. Perform ! PerformPromiseThen(capability.[[Promise]], onFulfilled, onRejected).
|
||||||
|
12. Perform ! module.ExecuteModule(capability).
|
||||||
|
13. Return.
|
||||||
|
|
||||||
|
ExecuteModule ( [ capability ] )
|
||||||
|
|
||||||
|
...
|
||||||
|
11. If module.[[Async]] is false, then
|
||||||
|
a. Assert: capability was not provided.
|
||||||
|
b. Push moduleCxt on to the execution context stack; moduleCxt is now the running execution context.
|
||||||
|
c. Let result be the result of evaluating module.[[ECMAScriptCode]].
|
||||||
|
d. Suspend moduleCxt and remove it from the execution context stack.
|
||||||
|
e. Resume the context that is now on the top of the execution context stack as the running execution context.
|
||||||
|
f. Return Completion(result).
|
||||||
|
12. Otherwise,
|
||||||
|
a. Assert: capability is a PromiseCapability Record.
|
||||||
|
b. Perform ! AsyncBlockStart(capability, module.[[ECMAScriptCode]], moduleCxt).
|
||||||
|
c. Return.
|
||||||
|
flags: [module, async]
|
||||||
|
features: [top-level-await]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
import foo from './module-import-resolution_FIXTURE.js';
|
||||||
|
|
||||||
|
assert.sameValue(foo, 42);
|
||||||
|
|
||||||
|
import { x, y } from './module-import-resolution_FIXTURE.js';
|
||||||
|
|
||||||
|
assert.sameValue(x, 'named');
|
||||||
|
assert.sameValue(y, 39);
|
||||||
|
|
||||||
|
// $DONE is set at the end to reflect the async operations from the imported module
|
||||||
|
$DONE();
|
|
@ -0,0 +1,14 @@
|
||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
await 1;
|
||||||
|
await 2;
|
||||||
|
export default await Promise.resolve(42);
|
||||||
|
|
||||||
|
export const y = await 39;
|
||||||
|
export const x = await 'named';
|
||||||
|
|
||||||
|
// Bonus: this rejection is not unwrapped
|
||||||
|
if (false) {
|
||||||
|
await Promise.reject(42);
|
||||||
|
}
|
|
@ -0,0 +1,95 @@
|
||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
esid: sec-moduleevaluation
|
||||||
|
description: >
|
||||||
|
Evaluate imported module with unwrapped imported promises
|
||||||
|
info: |
|
||||||
|
Table 3: Additional Fields of Cyclic Module Records
|
||||||
|
|
||||||
|
[[Async]]
|
||||||
|
|
||||||
|
...
|
||||||
|
Having an asynchronous dependency does not make the module asynchronous. This field must not change after the module is parsed.
|
||||||
|
|
||||||
|
Evaluate ( ) Concrete Method
|
||||||
|
|
||||||
|
...
|
||||||
|
6. Let capability be ! NewPromiseCapability(%Promise%).
|
||||||
|
7. Set module.[[TopLevelCapability]] to capability.
|
||||||
|
8. Let result be InnerModuleEvaluation(module, stack, 0).
|
||||||
|
9. If result is an abrupt completion, then
|
||||||
|
...
|
||||||
|
d. Perform ! Call(capability.[[Reject]], undefined, «result.[[Value]]»).
|
||||||
|
10. Otherwise,
|
||||||
|
...
|
||||||
|
b. If module.[[AsyncEvaluating]] is false, then
|
||||||
|
i. Perform ! Call(capability.[[Resolve]], undefined, «undefined»).
|
||||||
|
...
|
||||||
|
11. Return undefinedcapability.[[Promise]].
|
||||||
|
|
||||||
|
InnerModuleEvaluation( module, stack, index )
|
||||||
|
|
||||||
|
...
|
||||||
|
14. If module.[[PendingAsyncDependencies]] is > 0, set module.[[AsyncEvaluating]] to true.
|
||||||
|
15. Otherwise, if module.[[Async]] is true, perform ! ExecuteAsyncModule(module).
|
||||||
|
16. Otherwise, perform ? module.ExecuteModule().
|
||||||
|
|
||||||
|
ExecuteAsyncModule ( module )
|
||||||
|
|
||||||
|
1. Assert: module.[[Status]] is "evaluating" or "evaluated".
|
||||||
|
2. Assert: module.[[Async]] is true.
|
||||||
|
3. Set module.[[AsyncEvaluating]] to true.
|
||||||
|
4. Let capability be ! NewPromiseCapability(%Promise%).
|
||||||
|
5. Let stepsFulfilled be the steps of a CallAsyncModuleFulfilled function as specified below.
|
||||||
|
...
|
||||||
|
8. Let stepsRejected be the steps of a CallAsyncModuleRejected function as specified below.
|
||||||
|
...
|
||||||
|
11. Perform ! PerformPromiseThen(capability.[[Promise]], onFulfilled, onRejected).
|
||||||
|
12. Perform ! module.ExecuteModule(capability).
|
||||||
|
13. Return.
|
||||||
|
|
||||||
|
ExecuteModule ( [ capability ] )
|
||||||
|
|
||||||
|
...
|
||||||
|
11. If module.[[Async]] is false, then
|
||||||
|
a. Assert: capability was not provided.
|
||||||
|
b. Push moduleCxt on to the execution context stack; moduleCxt is now the running execution context.
|
||||||
|
c. Let result be the result of evaluating module.[[ECMAScriptCode]].
|
||||||
|
d. Suspend moduleCxt and remove it from the execution context stack.
|
||||||
|
e. Resume the context that is now on the top of the execution context stack as the running execution context.
|
||||||
|
f. Return Completion(result).
|
||||||
|
12. Otherwise,
|
||||||
|
a. Assert: capability is a PromiseCapability Record.
|
||||||
|
b. Perform ! AsyncBlockStart(capability, module.[[ECMAScriptCode]], moduleCxt).
|
||||||
|
c. Return.
|
||||||
|
flags: [module, async]
|
||||||
|
features: [top-level-await]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
import mod from './module-import-unwrapped_FIXTURE.js';
|
||||||
|
import { x, y } from './module-import-unwrapped_FIXTURE.js';
|
||||||
|
|
||||||
|
assert(mod instanceof Promise, 'mod is an instance of Promise');
|
||||||
|
assert(x instanceof Promise, 'x is an instance of Promise');
|
||||||
|
assert(y instanceof Promise, 'y is an instance of Promise');
|
||||||
|
|
||||||
|
assert.sameValue(Object.getPrototypeOf(mod), Promise.prototype, 'Proto of mod');
|
||||||
|
assert.sameValue(Object.getPrototypeOf(x), Promise.prototype, 'Proto of x');
|
||||||
|
assert.sameValue(Object.getPrototypeOf(y), Promise.prototype, 'Proto of y');
|
||||||
|
|
||||||
|
assert.sameValue(await mod, 'default');
|
||||||
|
assert.sameValue(await y, 'unwrapped resolution');
|
||||||
|
|
||||||
|
var err;
|
||||||
|
try {
|
||||||
|
await x;
|
||||||
|
} catch (e) {
|
||||||
|
err = e;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.sameValue(err, 'unwrapped rejection');
|
||||||
|
|
||||||
|
// $DONE is set at the end to reflect the async operations from the imported module
|
||||||
|
$DONE();
|
|
@ -0,0 +1,9 @@
|
||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
await 1;
|
||||||
|
|
||||||
|
export default Promise.resolve('default');
|
||||||
|
|
||||||
|
export const x = Promise.reject('unwrapped rejection');
|
||||||
|
export const y = Promise.resolve('unwrapped resolution');
|
|
@ -0,0 +1,88 @@
|
||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
esid: sec-moduleevaluation
|
||||||
|
description: >
|
||||||
|
Ticks from async module (w/ TLA) self importing
|
||||||
|
info: |
|
||||||
|
Table 3: Additional Fields of Cyclic Module Records
|
||||||
|
|
||||||
|
[[Async]]
|
||||||
|
|
||||||
|
...
|
||||||
|
Having an asynchronous dependency does not make the module asynchronous. This field must not change after the module is parsed.
|
||||||
|
|
||||||
|
Evaluate ( ) Concrete Method
|
||||||
|
|
||||||
|
...
|
||||||
|
6. Let capability be ! NewPromiseCapability(%Promise%).
|
||||||
|
7. Set module.[[TopLevelCapability]] to capability.
|
||||||
|
8. Let result be InnerModuleEvaluation(module, stack, 0).
|
||||||
|
9. If result is an abrupt completion, then
|
||||||
|
...
|
||||||
|
d. Perform ! Call(capability.[[Reject]], undefined, «result.[[Value]]»).
|
||||||
|
10. Otherwise,
|
||||||
|
...
|
||||||
|
b. If module.[[AsyncEvaluating]] is false, then
|
||||||
|
i. Perform ! Call(capability.[[Resolve]], undefined, «undefined»).
|
||||||
|
...
|
||||||
|
11. Return undefinedcapability.[[Promise]].
|
||||||
|
|
||||||
|
InnerModuleEvaluation( module, stack, index )
|
||||||
|
|
||||||
|
...
|
||||||
|
14. If module.[[PendingAsyncDependencies]] is > 0, set module.[[AsyncEvaluating]] to true.
|
||||||
|
15. Otherwise, if module.[[Async]] is true, perform ! ExecuteAsyncModule(module).
|
||||||
|
16. Otherwise, perform ? module.ExecuteModule().
|
||||||
|
|
||||||
|
ExecuteAsyncModule ( module )
|
||||||
|
|
||||||
|
1. Assert: module.[[Status]] is "evaluating" or "evaluated".
|
||||||
|
2. Assert: module.[[Async]] is true.
|
||||||
|
3. Set module.[[AsyncEvaluating]] to true.
|
||||||
|
4. Let capability be ! NewPromiseCapability(%Promise%).
|
||||||
|
5. Let stepsFulfilled be the steps of a CallAsyncModuleFulfilled function as specified below.
|
||||||
|
...
|
||||||
|
8. Let stepsRejected be the steps of a CallAsyncModuleRejected function as specified below.
|
||||||
|
...
|
||||||
|
11. Perform ! PerformPromiseThen(capability.[[Promise]], onFulfilled, onRejected).
|
||||||
|
12. Perform ! module.ExecuteModule(capability).
|
||||||
|
13. Return.
|
||||||
|
|
||||||
|
ExecuteModule ( [ capability ] )
|
||||||
|
|
||||||
|
...
|
||||||
|
11. If module.[[Async]] is false, then
|
||||||
|
a. Assert: capability was not provided.
|
||||||
|
b. Push moduleCxt on to the execution context stack; moduleCxt is now the running execution context.
|
||||||
|
c. Let result be the result of evaluating module.[[ECMAScriptCode]].
|
||||||
|
d. Suspend moduleCxt and remove it from the execution context stack.
|
||||||
|
e. Resume the context that is now on the top of the execution context stack as the running execution context.
|
||||||
|
f. Return Completion(result).
|
||||||
|
12. Otherwise,
|
||||||
|
a. Assert: capability is a PromiseCapability Record.
|
||||||
|
b. Perform ! AsyncBlockStart(capability, module.[[ECMAScriptCode]], moduleCxt).
|
||||||
|
c. Return.
|
||||||
|
flags: [module, async]
|
||||||
|
features: [top-level-await]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var x = 'synchronous evaluation';
|
||||||
|
|
||||||
|
Promise.resolve().then(() => x = 'tick in the async evaluation');
|
||||||
|
|
||||||
|
import self from './module-self-import-async-resolution-ticks.js';
|
||||||
|
|
||||||
|
assert.sameValue(x, 'synchronous evaluation');
|
||||||
|
|
||||||
|
assert.throws(ReferenceError, function() {
|
||||||
|
self;
|
||||||
|
}, 'self is not initialized yet');
|
||||||
|
|
||||||
|
export default await Promise.resolve(42);
|
||||||
|
|
||||||
|
assert.sameValue(x, 'tick in the async evaluation');
|
||||||
|
assert.sameValue(self, 42), 'self is initialized after export';
|
||||||
|
|
||||||
|
$DONE();
|
|
@ -0,0 +1,81 @@
|
||||||
|
// Copyright (C) 2019 Leo Balter. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
esid: sec-moduleevaluation
|
||||||
|
description: >
|
||||||
|
Ticks from sync module (no TLA) loading async module
|
||||||
|
info: |
|
||||||
|
Table 3: Additional Fields of Cyclic Module Records
|
||||||
|
|
||||||
|
[[Async]]
|
||||||
|
|
||||||
|
...
|
||||||
|
Having an asynchronous dependency does not make the module asynchronous. This field must not change after the module is parsed.
|
||||||
|
|
||||||
|
Evaluate ( ) Concrete Method
|
||||||
|
|
||||||
|
...
|
||||||
|
6. Let capability be ! NewPromiseCapability(%Promise%).
|
||||||
|
7. Set module.[[TopLevelCapability]] to capability.
|
||||||
|
8. Let result be InnerModuleEvaluation(module, stack, 0).
|
||||||
|
9. If result is an abrupt completion, then
|
||||||
|
...
|
||||||
|
d. Perform ! Call(capability.[[Reject]], undefined, «result.[[Value]]»).
|
||||||
|
10. Otherwise,
|
||||||
|
...
|
||||||
|
b. If module.[[AsyncEvaluating]] is false, then
|
||||||
|
i. Perform ! Call(capability.[[Resolve]], undefined, «undefined»).
|
||||||
|
...
|
||||||
|
11. Return undefinedcapability.[[Promise]].
|
||||||
|
|
||||||
|
InnerModuleEvaluation( module, stack, index )
|
||||||
|
|
||||||
|
...
|
||||||
|
14. If module.[[PendingAsyncDependencies]] is > 0, set module.[[AsyncEvaluating]] to true.
|
||||||
|
15. Otherwise, if module.[[Async]] is true, perform ! ExecuteAsyncModule(module).
|
||||||
|
16. Otherwise, perform ? module.ExecuteModule().
|
||||||
|
|
||||||
|
ExecuteAsyncModule ( module )
|
||||||
|
|
||||||
|
1. Assert: module.[[Status]] is "evaluating" or "evaluated".
|
||||||
|
2. Assert: module.[[Async]] is true.
|
||||||
|
3. Set module.[[AsyncEvaluating]] to true.
|
||||||
|
4. Let capability be ! NewPromiseCapability(%Promise%).
|
||||||
|
5. Let stepsFulfilled be the steps of a CallAsyncModuleFulfilled function as specified below.
|
||||||
|
...
|
||||||
|
8. Let stepsRejected be the steps of a CallAsyncModuleRejected function as specified below.
|
||||||
|
...
|
||||||
|
11. Perform ! PerformPromiseThen(capability.[[Promise]], onFulfilled, onRejected).
|
||||||
|
12. Perform ! module.ExecuteModule(capability).
|
||||||
|
13. Return.
|
||||||
|
|
||||||
|
ExecuteModule ( [ capability ] )
|
||||||
|
|
||||||
|
...
|
||||||
|
11. If module.[[Async]] is false, then
|
||||||
|
a. Assert: capability was not provided.
|
||||||
|
b. Push moduleCxt on to the execution context stack; moduleCxt is now the running execution context.
|
||||||
|
c. Let result be the result of evaluating module.[[ECMAScriptCode]].
|
||||||
|
d. Suspend moduleCxt and remove it from the execution context stack.
|
||||||
|
e. Resume the context that is now on the top of the execution context stack as the running execution context.
|
||||||
|
f. Return Completion(result).
|
||||||
|
12. Otherwise,
|
||||||
|
a. Assert: capability is a PromiseCapability Record.
|
||||||
|
b. Perform ! AsyncBlockStart(capability, module.[[ECMAScriptCode]], moduleCxt).
|
||||||
|
c. Return.
|
||||||
|
flags: [module, async]
|
||||||
|
features: [top-level-await]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var x = 'synchronous evaluation';
|
||||||
|
|
||||||
|
Promise.resolve().then(() => x = 'tick in the async evaluation');
|
||||||
|
|
||||||
|
import foo from './module-import-resolution_FIXTURE.js';
|
||||||
|
assert.sameValue(foo, 42);
|
||||||
|
assert.sameValue(x, 'synchronous evaluation');
|
||||||
|
|
||||||
|
Promise.resolve().then(() => {
|
||||||
|
assert.sameValue(x, 'tick in the async evaluation');
|
||||||
|
}).then($DONE, $DONE);
|
Loading…
Reference in New Issue