diff options
Diffstat (limited to 'js/src/tests/test262/language/module-code/top-level-await/module-self-import-async-resolution-ticks.js')
-rw-r--r-- | js/src/tests/test262/language/module-code/top-level-await/module-self-import-async-resolution-ticks.js | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/js/src/tests/test262/language/module-code/top-level-await/module-self-import-async-resolution-ticks.js b/js/src/tests/test262/language/module-code/top-level-await/module-self-import-async-resolution-ticks.js new file mode 100644 index 0000000000..78dc4fff05 --- /dev/null +++ b/js/src/tests/test262/language/module-code/top-level-await/module-self-import-async-resolution-ticks.js @@ -0,0 +1,89 @@ +// |reftest| module async +// 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(); |