Changeset 273225 in webkit


Ignore:
Timestamp:
Feb 21, 2021 4:41:30 PM (17 months ago)
Author:
keith_miller@apple.com
Message:

Implement the Top-level await proposal
https://bugs.webkit.org/show_bug.cgi?id=202484

Reviewed by Yusuke Suzuki.

JSTests:

  • test262/config.yaml:

Source/JavaScriptCore:

This patch adds support for the TLA proposal. The bulk of this patch is adding a couple of main parts.

1) converting the AbstractModuleRecord to contain many of same internal fields as JSGenerator so much of the async codegen can be shared.

2) having the link phase of the module loader record whether a module subgraph is async.
3) teaching the module loader that evaluating a module may require more than one vm entry and forwarding the awaited value as well as the resume mode to the VM.

One thing particularly interesting about this patch is that moduleEvaluation now *sometimes* (when a strongly connected subgraph is async) will return a promise. This happened to already be awaited when called from loadAndEvaluateModule (unnecessarily before) but now also needs to be handled by requestImportModule.

No new tests because every test I came up with was subsumed by tests already in test262.

  • API/JSAPIGlobalObject.h:
  • API/JSAPIGlobalObject.mm:

(JSC::JSAPIGlobalObject::moduleLoaderEvaluate):

(globalPrivate.newRegistryEntry):
(link):
(async requestImportModule):
(moduleEvaluation): Deleted.
(requestImportModule): Deleted.

  • bytecode/BytecodeGeneratorification.cpp:

(JSC::BytecodeGeneratorification::run):
(JSC::performGeneratorification):

  • bytecode/BytecodeIntrinsicRegistry.cpp:

(JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry):

  • bytecode/BytecodeIntrinsicRegistry.h:
  • bytecode/BytecodeList.rb:
  • bytecode/BytecodeUseDef.cpp:

(JSC::computeUsesForBytecodeIndexImpl):

  • bytecode/UnlinkedModuleProgramCodeBlock.h:
  • bytecompiler/BytecodeGenerator.cpp:

(JSC::BytecodeGenerator::generate):
(JSC::BytecodeGenerator::BytecodeGenerator):
(JSC::BytecodeGenerator::emitWillLeaveCallFrameDebugHook):
(JSC::BytecodeGenerator::emitGenericEnumeration):
(JSC::BytecodeGenerator::emitYieldPoint):
(JSC::BytecodeGenerator::emitYield):
(JSC::BytecodeGenerator::emitDelegateYield):
(JSC::BytecodeGenerator::emitGeneratorStateChange):

  • bytecompiler/BytecodeGenerator.h:

(JSC::BytecodeGenerator::generatorStateRegister):
(JSC::BytecodeGenerator::generatorValueRegister):
(JSC::BytecodeGenerator::generatorResumeModeRegister):
(JSC::BytecodeGenerator::generatorFrameRegister):

  • bytecompiler/NodesCodegen.cpp:

(JSC::abstractModuleRecordInternalFieldIndex):
(JSC::BytecodeIntrinsicNode::emit_intrinsic_getAbstractModuleRecordInternalField):
(JSC::FunctionNode::emitBytecode):

  • interpreter/Interpreter.cpp:

(JSC::Interpreter::executeModuleProgram):

  • interpreter/Interpreter.h:
  • parser/ASTBuilder.h:

(JSC::ASTBuilder::createAwait):
(JSC::ASTBuilder::usesAwait):

  • parser/Nodes.cpp:

(JSC::ModuleProgramNode::ModuleProgramNode):

  • parser/Nodes.h:
  • parser/Parser.cpp:

(JSC::JSToken::dump const):
(JSC::Parser<LexerType>::parseForStatement):
(JSC::Parser<LexerType>::parseAwaitExpression):
(JSC::Parser<LexerType>::parsePrimaryExpression):
(JSC::Parser<LexerType>::parseUnaryExpression):

  • parser/ParserModes.h:
  • parser/ParserTokens.h:
  • runtime/AbstractModuleRecord.cpp:

(JSC::AbstractModuleRecord::finishCreation):
(JSC::AbstractModuleRecord::link):
(JSC::AbstractModuleRecord::evaluate):

  • runtime/AbstractModuleRecord.h:

(JSC::AbstractModuleRecord::initialValues):
(JSC::AbstractModuleRecord::internalField):
(JSC::AbstractModuleRecord::internalField const):

  • runtime/JSAsyncGenerator.h:
  • runtime/JSGenerator.h:
  • runtime/JSGlobalObject.h:
  • runtime/JSModuleLoader.cpp:

(JSC::JSModuleLoader::evaluate):
(JSC::JSModuleLoader::evaluateNonVirtual):
(JSC::JSC_DEFINE_HOST_FUNCTION):

  • runtime/JSModuleLoader.h:
  • runtime/JSModuleRecord.cpp:

(JSC::JSModuleRecord::link):
(JSC::JSModuleRecord::evaluate):

  • runtime/JSModuleRecord.h:
  • runtime/ModuleProgramExecutable.h:
  • runtime/OptionsList.h:
  • runtime/SymbolTable.cpp:

(JSC::SymbolTable::dump const):

  • runtime/SymbolTable.h:
  • wasm/js/WebAssemblyModuleRecord.cpp:

(JSC::WebAssemblyModuleRecord::link):
(JSC::WebAssemblyModuleRecord::linkImpl):

  • wasm/js/WebAssemblyModuleRecord.h:

Source/WebCore:

  • bindings/js/JSDOMGlobalObject.cpp:

(WebCore::JSDOMGlobalObject::moduleLoaderEvaluate):

  • bindings/js/JSDOMGlobalObject.h:
  • bindings/js/ScriptController.cpp:

(WebCore::ScriptController::evaluateModule):

  • bindings/js/ScriptController.h:
  • bindings/js/ScriptModuleLoader.cpp:

(WebCore::ScriptModuleLoader::evaluate):

  • bindings/js/ScriptModuleLoader.h:
  • workers/WorkerOrWorkletScriptController.cpp:

(WebCore::WorkerOrWorkletScriptController::evaluateModule):

  • workers/WorkerOrWorkletScriptController.h:
Location:
trunk
Files:
48 edited

Legend:

Unmodified
Added
Removed
  • trunk/JSTests/ChangeLog

    r273218 r273225  
     12021-02-21  Keith Miller  <keith_miller@apple.com>
     2
     3        Implement the Top-level await proposal
     4        https://bugs.webkit.org/show_bug.cgi?id=202484
     5
     6        Reviewed by Yusuke Suzuki.
     7
     8        * test262/config.yaml:
     9
    1102021-02-21  Yusuke Suzuki  <ysuzuki@apple.com>
    211
  • trunk/JSTests/test262/config.yaml

    r273218 r273225  
    1515  TypedArray.prototype.at: useAtMethod
    1616  String.prototype.at: useAtMethod
     17  top-level-await: useTopLevelAwait
    1718skip:
    1819  features:
     
    2728    # FIXME: https://bugs.webkit.org/show_bug.cgi?id=222142
    2829    - regexp-match-indices
    29 
    30     - top-level-await
    3130  paths:
    3231  files:
  • trunk/Source/JavaScriptCore/API/JSAPIGlobalObject.h

    r264617 r273225  
    6666    static JSInternalPromise* moduleLoaderFetch(JSGlobalObject*, JSModuleLoader*, JSValue, JSValue, JSValue);
    6767    static JSObject* moduleLoaderCreateImportMetaProperties(JSGlobalObject*, JSModuleLoader*, JSValue, JSModuleRecord*, JSValue);
    68     static JSValue moduleLoaderEvaluate(JSGlobalObject*, JSModuleLoader*, JSValue, JSValue, JSValue);
     68    static JSValue moduleLoaderEvaluate(JSGlobalObject*, JSModuleLoader*, JSValue, JSValue, JSValue, JSValue, JSValue);
    6969
    7070    JSValue loadAndEvaluateJSScriptModule(const JSLockHolder&, JSScript *);
  • trunk/Source/JavaScriptCore/API/JSAPIGlobalObject.mm

    r271766 r273225  
    240240}
    241241
    242 JSValue JSAPIGlobalObject::moduleLoaderEvaluate(JSGlobalObject* globalObject, JSModuleLoader* moduleLoader, JSValue key, JSValue moduleRecordValue, JSValue scriptFetcher)
     242JSValue JSAPIGlobalObject::moduleLoaderEvaluate(JSGlobalObject* globalObject, JSModuleLoader* moduleLoader, JSValue key, JSValue moduleRecordValue, JSValue scriptFetcher, JSValue sentValue, JSValue resumeMode)
    243243{
    244244    VM& vm = globalObject->vm();
     
    259259
    260260    scope.release();
    261     JSValue result = moduleLoader->evaluateNonVirtual(globalObject, key, moduleRecordValue, scriptFetcher);
     261    // FIXME: We should update the delegate callbacks for async modules. https://bugs.webkit.org/show_bug.cgi?id=222253
     262    JSValue result = moduleLoader->evaluateNonVirtual(globalObject, key, moduleRecordValue, scriptFetcher, sentValue, resumeMode);
    262263
    263264    if ([moduleLoaderDelegate respondsToSelector:@selector(didEvaluateModule:)])
  • trunk/Source/JavaScriptCore/ChangeLog

    r273222 r273225  
     12021-02-21  Keith Miller  <keith_miller@apple.com>
     2
     3        Implement the Top-level await proposal
     4        https://bugs.webkit.org/show_bug.cgi?id=202484
     5
     6        Reviewed by Yusuke Suzuki.
     7
     8        This patch adds support for the TLA proposal. The bulk of this patch is adding a couple of main parts.
     9
     10         1) converting the AbstractModuleRecord to contain many of same internal fields as JSGenerator so much of the async codegen can be shared.
     11        2) having the link phase of the module loader record whether a module subgraph is async.
     12        3) teaching the module loader that evaluating a module may require more than one vm entry and forwarding the awaited value as well as the resume mode to the VM.
     13
     14         One thing particularly interesting about this patch is that moduleEvaluation now *sometimes* (when a strongly connected subgraph is async) will return a promise. This happened to already be awaited when called from loadAndEvaluateModule (unnecessarily before) but now also needs to be handled by requestImportModule.
     15
     16         No new tests because every test I came up with was subsumed by tests already in test262.
     17
     18        * API/JSAPIGlobalObject.h:
     19        * API/JSAPIGlobalObject.mm:
     20        (JSC::JSAPIGlobalObject::moduleLoaderEvaluate):
     21        * JavaScriptCore.xcodeproj/project.pbxproj:
     22        * builtins/ModuleLoader.js:
     23        (globalPrivate.newRegistryEntry):
     24        (link):
     25        (async requestImportModule):
     26        (moduleEvaluation): Deleted.
     27        (requestImportModule): Deleted.
     28        * bytecode/BytecodeGeneratorification.cpp:
     29        (JSC::BytecodeGeneratorification::run):
     30        (JSC::performGeneratorification):
     31        * bytecode/BytecodeIntrinsicRegistry.cpp:
     32        (JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry):
     33        * bytecode/BytecodeIntrinsicRegistry.h:
     34        * bytecode/BytecodeList.rb:
     35        * bytecode/BytecodeUseDef.cpp:
     36        (JSC::computeUsesForBytecodeIndexImpl):
     37        * bytecode/UnlinkedModuleProgramCodeBlock.h:
     38        * bytecompiler/BytecodeGenerator.cpp:
     39        (JSC::BytecodeGenerator::generate):
     40        (JSC::BytecodeGenerator::BytecodeGenerator):
     41        (JSC::BytecodeGenerator::emitWillLeaveCallFrameDebugHook):
     42        (JSC::BytecodeGenerator::emitGenericEnumeration):
     43        (JSC::BytecodeGenerator::emitYieldPoint):
     44        (JSC::BytecodeGenerator::emitYield):
     45        (JSC::BytecodeGenerator::emitDelegateYield):
     46        (JSC::BytecodeGenerator::emitGeneratorStateChange):
     47        * bytecompiler/BytecodeGenerator.h:
     48        (JSC::BytecodeGenerator::generatorStateRegister):
     49        (JSC::BytecodeGenerator::generatorValueRegister):
     50        (JSC::BytecodeGenerator::generatorResumeModeRegister):
     51        (JSC::BytecodeGenerator::generatorFrameRegister):
     52        * bytecompiler/NodesCodegen.cpp:
     53        (JSC::abstractModuleRecordInternalFieldIndex):
     54        (JSC::BytecodeIntrinsicNode::emit_intrinsic_getAbstractModuleRecordInternalField):
     55        (JSC::FunctionNode::emitBytecode):
     56        * interpreter/Interpreter.cpp:
     57        (JSC::Interpreter::executeModuleProgram):
     58        * interpreter/Interpreter.h:
     59        * parser/ASTBuilder.h:
     60        (JSC::ASTBuilder::createAwait):
     61        (JSC::ASTBuilder::usesAwait):
     62        * parser/Nodes.cpp:
     63        (JSC::ModuleProgramNode::ModuleProgramNode):
     64        * parser/Nodes.h:
     65        * parser/Parser.cpp:
     66        (JSC::JSToken::dump const):
     67        (JSC::Parser<LexerType>::parseForStatement):
     68        (JSC::Parser<LexerType>::parseAwaitExpression):
     69        (JSC::Parser<LexerType>::parsePrimaryExpression):
     70        (JSC::Parser<LexerType>::parseUnaryExpression):
     71        * parser/ParserModes.h:
     72        * parser/ParserTokens.h:
     73        * runtime/AbstractModuleRecord.cpp:
     74        (JSC::AbstractModuleRecord::finishCreation):
     75        (JSC::AbstractModuleRecord::link):
     76        (JSC::AbstractModuleRecord::evaluate):
     77        * runtime/AbstractModuleRecord.h:
     78        (JSC::AbstractModuleRecord::initialValues):
     79        (JSC::AbstractModuleRecord::internalField):
     80        (JSC::AbstractModuleRecord::internalField const):
     81        * runtime/JSAsyncGenerator.h:
     82        * runtime/JSGenerator.h:
     83        * runtime/JSGlobalObject.h:
     84        * runtime/JSModuleLoader.cpp:
     85        (JSC::JSModuleLoader::evaluate):
     86        (JSC::JSModuleLoader::evaluateNonVirtual):
     87        (JSC::JSC_DEFINE_HOST_FUNCTION):
     88        * runtime/JSModuleLoader.h:
     89        * runtime/JSModuleRecord.cpp:
     90        (JSC::JSModuleRecord::link):
     91        (JSC::JSModuleRecord::evaluate):
     92        * runtime/JSModuleRecord.h:
     93        * runtime/ModuleProgramExecutable.h:
     94        * runtime/OptionsList.h:
     95        * runtime/SymbolTable.cpp:
     96        (JSC::SymbolTable::dump const):
     97        * runtime/SymbolTable.h:
     98        * wasm/js/WebAssemblyModuleRecord.cpp:
     99        (JSC::WebAssemblyModuleRecord::link):
     100        (JSC::WebAssemblyModuleRecord::linkImpl):
     101        * wasm/js/WebAssemblyModuleRecord.h:
     102
    11032021-02-21  Yusuke Suzuki  <ysuzuki@apple.com>
    2104
  • trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj

    r273138 r273225  
    18471847                E34E657520668EAA00FB81AC /* ParseHash.h in Headers */ = {isa = PBXBuildFile; fileRef = E34E657320668E8D00FB81AC /* ParseHash.h */; settings = {ATTRIBUTES = (Private, ); }; };
    18481848                E34EDBF71DB5FFC900DC87A5 /* FrameTracers.h in Headers */ = {isa = PBXBuildFile; fileRef = E34EDBF61DB5FFC100DC87A5 /* FrameTracers.h */; settings = {ATTRIBUTES = (Private, ); }; };
    1849                 E34F930E2322D882002B8DB4 /* JSGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = E34F930C2322D881002B8DB4 /* JSGenerator.h */; };
     1849                E34F930E2322D882002B8DB4 /* JSGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = E34F930C2322D881002B8DB4 /* JSGenerator.h */; settings = {ATTRIBUTES = (Private, ); }; };
    18501850                E350708A1DC49BBF0089BCD6 /* DOMJITSignature.h in Headers */ = {isa = PBXBuildFile; fileRef = E35070891DC49BB60089BCD6 /* DOMJITSignature.h */; settings = {ATTRIBUTES = (Private, ); }; };
    18511851                E353C11D24AA4CB7003FBDF3 /* IntlDisplayNames.h in Headers */ = {isa = PBXBuildFile; fileRef = E353C11724AA4CB6003FBDF3 /* IntlDisplayNames.h */; };
     
    90989098                                AD4937C41DDBE6140077C807 /* AbstractModuleRecord.h in Headers */,
    90999099                                0F55F0F514D1063C00AC7649 /* AbstractPC.h in Headers */,
     9100                                FE912B4F2531193300FABDDF /* AbstractSlotVisitor.h in Headers */,
     9101                                FE912B5125311AD100FABDDF /* AbstractSlotVisitorInlines.h in Headers */,
    91009102                                534E034E1E4D4B1600213F64 /* AccessCase.h in Headers */,
    91019103                                E3BFD0BC1DAF808E0065DEA2 /* AccessCaseSnippetParams.h in Headers */,
     
    93229324                                E35E89FD25C50F870071EE1E /* BigInt64Array.h in Headers */,
    93239325                                86976E5F1FA3E8BC00E7C4E1 /* BigIntConstructor.h in Headers */,
    9324                                 FE041553252EC0730091EB5D /* SlotVisitorMacros.h in Headers */,
    93259326                                866739D213BFDE710023D87C /* BigInteger.h in Headers */,
    93269327                                861816771FB7924200ECC4EC /* BigIntObject.h in Headers */,
     
    96049605                                0FD8A32617D51F5700CA2C40 /* DFGOSREntrypointCreationPhase.h in Headers */,
    96059606                                0FC0976A1468A6F700CF2442 /* DFGOSRExit.h in Headers */,
    9606                                 FE912B4F2531193300FABDDF /* AbstractSlotVisitor.h in Headers */,
    96079607                                0F235BEC17178E7300690C7F /* DFGOSRExitBase.h in Headers */,
    96089608                                0FFB921C16D02F110055A5DB /* DFGOSRExitCompilationInfo.h in Headers */,
     
    98919891                                A513E5CB185F9624007E95AD /* InjectedScriptManager.h in Headers */,
    98929892                                A5840E21187B7B8600843B10 /* InjectedScriptModule.h in Headers */,
    9893                                 FE287D02252FB2E800D723F9 /* VerifierSlotVisitor.h in Headers */,
    98949893                                A513E5C7185F9446007E95AD /* InjectedScriptSource.h in Headers */,
    98959894                                9959E9321BD18279001AA413 /* inline-and-minify-stylesheets-and-scripts.py in Headers */,
     
    1003110030                                840480131021A1D9008E7F01 /* JSAPIValueWrapper.h in Headers */,
    1003210031                                C2CF39C216E15A8100DD69BE /* JSAPIWrapperObject.h in Headers */,
    10033                                 FE336B5325DB497D0098F034 /* MarkingConstraintExecutorPair.h in Headers */,
    1003410032                                BC18C4170E16F5CD00B34460 /* JSArray.h in Headers */,
    1003510033                                0F2B66E317B6B5AB00A7AE3F /* JSArrayBuffer.h in Headers */,
     
    1006810066                                BC18C41E0E16F5CD00B34460 /* JSContextRef.h in Headers */,
    1006910067                                A5EA70EE19F5B5C40098F5EC /* JSContextRefInspectorSupport.h in Headers */,
    10070                                 6BCCEC0425D1FA27000F391D /* VerifierSlotVisitorInlines.h in Headers */,
    1007110068                                A5D2E665195E174000A518E7 /* JSContextRefInternal.h in Headers */,
    1007210069                                148CD1D8108CF902008163C6 /* JSContextRefPrivate.h in Headers */,
     
    1020010197                                A7CA3AE817DA41AE006538AF /* JSWeakMap.h in Headers */,
    1020110198                                A7482E93116A7CAD003B0712 /* JSWeakObjectMapRefInternal.h in Headers */,
    10202                                 FE912B5125311AD100FABDDF /* AbstractSlotVisitorInlines.h in Headers */,
    1020310199                                A7482B9311671147003B0712 /* JSWeakObjectMapRefPrivate.h in Headers */,
    1020410200                                539BFBB022AD3CDC0023F4C0 /* JSWeakObjectRef.h in Headers */,
     
    1027810274                                0F7DF1351E2970DC0095951B /* MarkedSpaceInlines.h in Headers */,
    1027910275                                0F660E381E0517BB0031462C /* MarkingConstraint.h in Headers */,
     10276                                FE336B5325DB497D0098F034 /* MarkingConstraintExecutorPair.h in Headers */,
    1028010277                                0F660E3A1E0517C10031462C /* MarkingConstraintSet.h in Headers */,
    1028110278                                0F9DAA091FD1C3CF0079C5B2 /* MarkingConstraintSolver.h in Headers */,
     
    1047410471                                14BA78F113AAB88F005B7C2C /* SlotVisitor.h in Headers */,
    1047510472                                C2160FE715F7E95E00942DFC /* SlotVisitorInlines.h in Headers */,
     10473                                FE041553252EC0730091EB5D /* SlotVisitorMacros.h in Headers */,
    1047610474                                A709F2F017A0AC0400512E98 /* SlowPathCall.h in Headers */,
    1047710475                                0F5B4A331C84F0D600F1B17E /* SlowPathReturnType.h in Headers */,
     
    1059210590                                0F6C73511AC9F99F00BE1682 /* VariableWriteFireDetail.h in Headers */,
    1059310591                                0FE0502D1AA9095600D33B33 /* VarOffset.h in Headers */,
     10592                                FE287D02252FB2E800D723F9 /* VerifierSlotVisitor.h in Headers */,
     10593                                6BCCEC0425D1FA27000F391D /* VerifierSlotVisitorInlines.h in Headers */,
    1059410594                                0F426A491460CBB700131F8F /* VirtualRegister.h in Headers */,
    1059510595                                0F4D8C741FC7A97A001D32AC /* VisitCounter.h in Headers */,
  • trunk/Source/JavaScriptCore/builtins/ModuleLoader.js

    r270283 r273225  
    101101        evaluated: false,
    102102        then: @undefined,
     103        isAsync: false,
     104        completionPromise: @undefined,
    103105    };
    104106}
     
    287289        // we can call moduleDeclarationInstantiation with the correct order
    288290        // without constructing the dependency graph by calling dependencyGraph.
     291        var hasAsyncDependency = false;
    289292        var dependencies = entry.dependencies;
    290         for (var i = 0, length = dependencies.length; i < length; ++i)
    291             this.link(dependencies[i], fetcher);
    292 
    293         this.moduleDeclarationInstantiation(entry.module, fetcher);
     293        for (var i = 0, length = dependencies.length; i < length; ++i) {
     294            var dependency = dependencies[i];
     295            this.link(dependency, fetcher);
     296            hasAsyncDependency ||= dependency.isAsync;
     297        }
     298
     299        entry.isAsync = this.moduleDeclarationInstantiation(entry.module, fetcher) || hasAsyncDependency;
    294300    } catch (error) {
    295301        entry.linkSucceeded = false;
     
    304310{
    305311    // http://www.ecma-international.org/ecma-262/6.0/#sec-moduleevaluation
    306 
    307312    "use strict";
    308313
     
    313318    // The contents of the [[RequestedModules]] is cloned into entry.dependencies.
    314319    var dependencies = entry.dependencies;
    315     for (var i = 0, length = dependencies.length; i < length; ++i)
    316         this.moduleEvaluation(dependencies[i], fetcher);
    317 
    318     this.evaluate(entry.key, entry.module, fetcher);
     320
     321    if (!entry.isAsync) {
     322        // Since linking sets isAsync for any strongly connected component with an async module we should only get here if all our dependencies are also sync.
     323        for (var i = 0, length = dependencies.length; i < length; ++i) {
     324            var dependency = dependencies[i];
     325            @assert(!dependency.isAsync);
     326            this.moduleEvaluation(dependency, fetcher);
     327        }
     328
     329        this.evaluate(entry.key, entry.module, fetcher);
     330    } else {
     331        return (async function asyncModuleEvaluation(entry, dependencies) {
     332            for (var i = 0, length = dependencies.length; i < length; ++i)
     333                await this.moduleEvaluation(dependencies[i], fetcher);
     334
     335            var resumeMode = 0;
     336            while (true) {
     337                var awaitedValue = this.evaluate(entry.key, entry.module, fetcher, awaitedValue, resumeMode);
     338                if (@getAbstractModuleRecordInternalField(entry.module, @abstractModuleRecordFieldState) == @GeneratorStateExecuting)
     339                    return;
     340
     341                try {
     342                    awaitedValue = await awaitedValue;
     343                    resumeMode = 0;
     344                } catch (e) {
     345                    awaitedValue = e;
     346                    resumeMode = 2;
     347                }
     348            }
     349        }).@call(this, entry, dependencies);
     350    }
    319351}
    320352
     
    365397}
    366398
    367 function requestImportModule(key, parameters, fetcher)
    368 {
    369     "use strict";
    370 
    371     var constructor = @InternalPromise;
    372     var promise = @createPromise(constructor, /* isInternalPromise */ true);
    373     @resolveWithoutPromise(this.requestSatisfy(this.ensureRegistered(key), parameters, fetcher, new @Set),
    374         (entry) => {
    375             try {
    376                 this.linkAndEvaluateModule(entry.key, fetcher);
    377                 @fulfillPromiseWithFirstResolvingFunctionCallCheck(promise, this.getModuleNamespaceObject(entry.module));
    378             } catch (error) {
    379                 @rejectPromiseWithFirstResolvingFunctionCallCheck(promise, error);
    380             }
    381         },
    382         (reason) => {
    383             @rejectPromiseWithFirstResolvingFunctionCallCheck(promise, reason);
    384         });
    385     return promise;
     399async function requestImportModule(key, parameters, fetcher)
     400{
     401    "use strict";
     402
     403    var entry = await this.requestSatisfy(this.ensureRegistered(key), parameters, fetcher, new @Set);
     404    await this.linkAndEvaluateModule(entry.key, fetcher);
     405    return this.getModuleNamespaceObject(entry.module);
    386406}
    387407
  • trunk/Source/JavaScriptCore/bytecode/BytecodeGeneratorification.cpp

    r264049 r273225  
    218218        auto nextToEnterPoint = enterPoint().next();
    219219        unsigned switchTableIndex = m_codeBlock->numberOfSwitchJumpTables();
    220         VirtualRegister state = virtualRegisterForArgumentIncludingThis(static_cast<int32_t>(JSGenerator::GeneratorArgument::State));
     220        VirtualRegister state = virtualRegisterForArgumentIncludingThis(static_cast<int32_t>(JSGenerator::Argument::State));
    221221        auto& jumpTable = m_codeBlock->addSwitchJumpTable();
    222222        jumpTable.min = 0;
     
    233233
    234234    for (const YieldData& data : m_yields) {
    235         VirtualRegister scope = virtualRegisterForArgumentIncludingThis(static_cast<int32_t>(JSGenerator::GeneratorArgument::Frame));
     235        VirtualRegister scope = virtualRegisterForArgumentIncludingThis(static_cast<int32_t>(JSGenerator::Argument::Frame));
    236236
    237237        auto instruction = m_instructions.at(data.point);
     
    294294void performGeneratorification(BytecodeGenerator& bytecodeGenerator, UnlinkedCodeBlockGenerator* codeBlock, InstructionStreamWriter& instructions, SymbolTable* generatorFrameSymbolTable, int generatorFrameSymbolTableIndex)
    295295{
    296     if (UNLIKELY(Options::dumpBytecodesBeforeGeneratorification()))
     296    if (UNLIKELY(Options::dumpBytecodesBeforeGeneratorification())) {
     297        dataLogLn("Bytecodes before generatorification");
    297298        CodeBlockBytecodeDumper<UnlinkedCodeBlockGenerator>::dumpBlock(codeBlock, instructions, WTF::dataFile());
     299    }
    298300
    299301    BytecodeGeneratorification pass(bytecodeGenerator, codeBlock, instructions, generatorFrameSymbolTable, generatorFrameSymbolTableIndex);
    300302    pass.run();
     303
     304    if (UNLIKELY(Options::dumpBytecodesBeforeGeneratorification())) {
     305        dataLogLn("Bytecodes after generatorification");
     306        CodeBlockBytecodeDumper<UnlinkedCodeBlockGenerator>::dumpBlock(codeBlock, instructions, WTF::dataFile());
     307    }
    301308}
    302309
  • trunk/Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.cpp

    r266323 r273225  
    2828#include "BytecodeIntrinsicRegistry.h"
    2929
     30#include "AbstractModuleRecord.h"
    3031#include "BuiltinNames.h"
    3132#include "BytecodeGenerator.h"
     
    8788    m_generatorFieldThis.set(m_vm, jsNumber(static_cast<unsigned>(JSGenerator::Field::This)));
    8889    m_generatorFieldFrame.set(m_vm, jsNumber(static_cast<unsigned>(JSGenerator::Field::Frame)));
    89     m_GeneratorResumeModeNormal.set(m_vm, jsNumber(static_cast<int32_t>(JSGenerator::GeneratorResumeMode::NormalMode)));
    90     m_GeneratorResumeModeThrow.set(m_vm, jsNumber(static_cast<int32_t>(JSGenerator::GeneratorResumeMode::ThrowMode)));
    91     m_GeneratorResumeModeReturn.set(m_vm, jsNumber(static_cast<int32_t>(JSGenerator::GeneratorResumeMode::ReturnMode)));
    92     m_GeneratorStateCompleted.set(m_vm, jsNumber(static_cast<int32_t>(JSGenerator::GeneratorState::Completed)));
    93     m_GeneratorStateExecuting.set(m_vm, jsNumber(static_cast<int32_t>(JSGenerator::GeneratorState::Executing)));
     90    m_GeneratorResumeModeNormal.set(m_vm, jsNumber(static_cast<int32_t>(JSGenerator::ResumeMode::NormalMode)));
     91    m_GeneratorResumeModeThrow.set(m_vm, jsNumber(static_cast<int32_t>(JSGenerator::ResumeMode::ThrowMode)));
     92    m_GeneratorResumeModeReturn.set(m_vm, jsNumber(static_cast<int32_t>(JSGenerator::ResumeMode::ReturnMode)));
     93    m_GeneratorStateCompleted.set(m_vm, jsNumber(static_cast<int32_t>(JSGenerator::State::Completed)));
     94    m_GeneratorStateExecuting.set(m_vm, jsNumber(static_cast<int32_t>(JSGenerator::State::Executing)));
    9495    m_arrayIteratorFieldIteratedObject.set(m_vm, jsNumber(static_cast<int32_t>(JSArrayIterator::Field::IteratedObject)));
    9596    m_arrayIteratorFieldIndex.set(m_vm, jsNumber(static_cast<int32_t>(JSArrayIterator::Field::Index)));
     
    113114    m_AsyncGeneratorSuspendReasonNone.set(m_vm, jsNumber(static_cast<int32_t>(JSAsyncGenerator::AsyncGeneratorSuspendReason::None)));
    114115    m_useIntlDateTimeFormatDayPeriod.set(m_vm, jsBoolean(Options::useIntlDateTimeFormatDayPeriod()));
     116    m_abstractModuleRecordFieldState.set(m_vm, jsNumber(static_cast<int32_t>(AbstractModuleRecord::Field::State)));
    115117}
    116118
  • trunk/Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.h

    r271343 r273225  
    4848    macro(getGeneratorInternalField) \
    4949    macro(getAsyncGeneratorInternalField) \
     50    macro(getAbstractModuleRecordInternalField) \
    5051    macro(getArrayIteratorInternalField) \
    5152    macro(getStringIteratorInternalField) \
     
    153154    macro(AsyncGeneratorSuspendReasonNone) \
    154155    macro(useIntlDateTimeFormatDayPeriod) \
     156    macro(abstractModuleRecordFieldState) \
    155157
    156158#define JSC_COMMON_BYTECODE_INTRINSIC_CONSTANTS_CUSTOM_EACH_NAME(macro) \
  • trunk/Source/JavaScriptCore/bytecode/BytecodeList.rb

    r272823 r273225  
    12981298op :yield,
    12991299    args: {
    1300         generator: VirtualRegister,
    13011300        yieldPoint: unsigned,
    13021301        argument: VirtualRegister,
  • trunk/Source/JavaScriptCore/bytecode/BytecodeUseDef.cpp

    r272580 r273225  
    292292    USES(OpPutInternalField, base, value)
    293293
    294     USES(OpYield, generator, argument)
     294    USES(OpYield, argument)
    295295
    296296    case op_iterator_open: {
  • trunk/Source/JavaScriptCore/bytecode/UnlinkedModuleProgramCodeBlock.h

    r252390 r273225  
    8383    }
    8484
     85    bool isAsync() const { return codeFeatures() & AwaitFeature; }
     86
    8587private:
    8688    friend CachedModuleCodeBlock;
  • trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp

    r273135 r273225  
    3232#include "BytecodeGenerator.h"
    3333
     34#include "AbstractModuleRecord.h"
    3435#include "BuiltinExecutables.h"
    3536#include "BuiltinNames.h"
     
    280281   
    281282
    282     if (isGeneratorOrAsyncFunctionBodyParseMode(m_codeBlock->parseMode()))
     283    if (m_isAsync)
    283284        performGeneratorification(*this, m_codeBlock.get(), m_writer, m_generatorFrameSymbolTable.get(), m_generatorFrameSymbolTableIndex);
    284285
     
    386387
    387388    if (isGeneratorOrAsyncFunctionBodyParseMode(parseMode)) {
     389        m_isAsync = true;
    388390        // Generator and AsyncFunction never provides "arguments". "arguments" reference will be resolved in an upper generator function scope.
    389391        needsArguments = false;
     
    435437
    436438    if (isGeneratorOrAsyncFunctionBodyParseMode(parseMode))
    437         m_generatorRegister = &m_parameters[1];
     439        m_generatorRegister = &m_parameters[static_cast<unsigned>(JSGenerator::Argument::Generator)];
    438440
    439441    allocateAndEmitScope();
     
    952954    };
    953955
     956    if (moduleProgramNode->usesAwait()) {
     957        m_isAsync = true;
     958        initializeNextParameter(); // |this|
     959        for (unsigned i = 0; i < JSGenerator::Argument::NumberOfArguments; ++i)
     960            initializeNextParameter();
     961        m_generatorRegister = &m_parameters[static_cast<unsigned>(AbstractModuleRecord::Argument::Generator)];
     962    }
     963
    954964    emitEnter();
    955965
     
    960970    m_calleeRegister.setIndex(CallFrameSlot::callee);
    961971
    962     m_codeBlock->setNumParameters(1); // Allocate space for "this"
     972    m_codeBlock->setNumParameters(static_cast<unsigned>(AbstractModuleRecord::Argument::NumberOfArguments) + 1); // Allocate space for "this" + async module arguments.
    963973
    964974    // Now declare all variables.
     
    984994    // We keep the symbol table in the constant pool.
    985995    RegisterID* constantSymbolTable = nullptr;
    986     if (shouldEmitTypeProfilerHooks())
     996    if (shouldEmitTypeProfilerHooks() || moduleProgramNode->usesAwait())
    987997        constantSymbolTable = addConstantValue(moduleEnvironmentSymbolTable);
    988998    else
    989999        constantSymbolTable = addConstantValue(moduleEnvironmentSymbolTable->cloneScopePart(m_vm));
     1000
     1001    if (moduleProgramNode->usesAwait()) {
     1002        m_generatorFrameSymbolTable.set(m_vm, moduleEnvironmentSymbolTable);
     1003        m_generatorFrameSymbolTableIndex = constantSymbolTable->index();
     1004        emitPutInternalField(generatorRegister(), static_cast<unsigned>(AbstractModuleRecord::Field::Frame), generatorFrameRegister());
     1005    }
    9901006
    9911007    pushTDZVariables(lexicalVariables, TDZCheckOptimization::Optimize, TDZRequirement::UnderTDZ);
     
    37303746void BytecodeGenerator::emitWillLeaveCallFrameDebugHook()
    37313747{
    3732     RELEASE_ASSERT(m_scopeNode->isFunctionNode());
    37333748    emitDebugHook(WillLeaveCallFrame, m_scopeNode->lastLine(), m_scopeNode->startOffset(), m_scopeNode->lineStartOffset());
    37343749}
     
    41814196    bool isForAwait = forLoopNode ? forLoopNode->isForAwait() : false;
    41824197    auto shouldEmitAwait = isForAwait ? EmitAwait::Yes : EmitAwait::No;
    4183     ASSERT(!isForAwait || isAsyncFunctionParseMode(parseMode()));
     4198    ASSERT(!isForAwait || (isAsyncFunctionParseMode(parseMode()) || isModuleParseMode(parseMode())));
    41844199
    41854200    RefPtr<RegisterID> subject = newTemporary();
     
    47414756        OpNop::emit<OpcodeSize::Narrow>(this);
    47424757#endif
    4743     OpYield::emit(this, generatorFrameRegister(), yieldPointIndex, argument);
     4758    OpYield::emit(this, yieldPointIndex, argument);
    47444759
    47454760    // Restore the try contexts, which start offset is updated to the merge point.
     
    47544769    Ref<Label> normalLabel = newLabel();
    47554770    RefPtr<RegisterID> condition = newTemporary();
    4756     emitEqualityOp<OpStricteq>(condition.get(), generatorResumeModeRegister(), emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator::GeneratorResumeMode::NormalMode))));
     4771    emitEqualityOp<OpStricteq>(condition.get(), generatorResumeModeRegister(), emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator::ResumeMode::NormalMode))));
    47574772    emitJumpIfTrue(condition.get(), normalLabel.get());
    47584773
    47594774    Ref<Label> throwLabel = newLabel();
    4760     emitEqualityOp<OpStricteq>(condition.get(), generatorResumeModeRegister(), emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator::GeneratorResumeMode::ThrowMode))));
     4775    emitEqualityOp<OpStricteq>(condition.get(), generatorResumeModeRegister(), emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator::ResumeMode::ThrowMode))));
    47614776    emitJumpIfTrue(condition.get(), throwLabel.get());
    47624777    // Return.
     
    49424957                {
    49434958                    RefPtr<RegisterID> condition = newTemporary();
    4944                     emitEqualityOp<OpStricteq>(condition.get(), generatorResumeModeRegister(), emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator::GeneratorResumeMode::NormalMode))));
     4959                    emitEqualityOp<OpStricteq>(condition.get(), generatorResumeModeRegister(), emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator::ResumeMode::NormalMode))));
    49454960                    emitJumpIfTrue(condition.get(), normalLabel.get());
    49464961
    4947                     emitEqualityOp<OpStricteq>(condition.get(), generatorResumeModeRegister(), emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator::GeneratorResumeMode::ReturnMode))));
     4962                    emitEqualityOp<OpStricteq>(condition.get(), generatorResumeModeRegister(), emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator::ResumeMode::ReturnMode))));
    49484963                    emitJumpIfTrue(condition.get(), returnLabel.get());
    49494964
     
    50495064void BytecodeGenerator::emitGeneratorStateChange(int32_t state)
    50505065{
     5066    // FIXME: It seems like this will create a lot of constants if there are many yield points. Maybe we should op_inc the old state. https://bugs.webkit.org/show_bug.cgi?id=222254
    50515067    RegisterID* completedState = emitLoad(nullptr, jsNumber(state));
    50525068    static_assert(static_cast<unsigned>(JSGenerator::Field::State) == static_cast<unsigned>(JSAsyncGenerator::Field::State));
    5053     emitPutInternalField(generatorRegister(), static_cast<unsigned>(JSGenerator::Field::State), completedState);
     5069    emitPutInternalField(generatorRegister(), isModuleParseMode(parseMode()) ? static_cast<unsigned>(AbstractModuleRecord::Field::State) : static_cast<unsigned>(JSGenerator::Field::State), completedState);
    50545070}
    50555071
  • trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h

    r273135 r273225  
    10591059        RegisterID* emitYield(RegisterID* argument, JSAsyncGenerator::AsyncGeneratorSuspendReason = JSAsyncGenerator::AsyncGeneratorSuspendReason::Yield);
    10601060        RegisterID* emitDelegateYield(RegisterID* argument, ThrowableExpressionData*);
    1061         RegisterID* generatorStateRegister() { return &m_parameters[static_cast<int32_t>(JSGenerator::GeneratorArgument::State)]; }
    1062         RegisterID* generatorValueRegister() { return &m_parameters[static_cast<int32_t>(JSGenerator::GeneratorArgument::Value)]; }
    1063         RegisterID* generatorResumeModeRegister() { return &m_parameters[static_cast<int32_t>(JSGenerator::GeneratorArgument::ResumeMode)]; }
    1064         RegisterID* generatorFrameRegister() { return &m_parameters[static_cast<int32_t>(JSGenerator::GeneratorArgument::Frame)]; }
     1061        RegisterID* generatorStateRegister() { return &m_parameters[static_cast<int32_t>(JSGenerator::Argument::State)]; }
     1062        RegisterID* generatorValueRegister() { return &m_parameters[static_cast<int32_t>(JSGenerator::Argument::Value)]; }
     1063        RegisterID* generatorResumeModeRegister() { return &m_parameters[static_cast<int32_t>(JSGenerator::Argument::ResumeMode)]; }
     1064        RegisterID* generatorFrameRegister() { return &m_parameters[static_cast<int32_t>(JSGenerator::Argument::Frame)]; }
    10651065
    10661066        CodeType codeType() const { return m_codeType; }
     
    13281328        Vector<TryContext> m_tryContextStack;
    13291329        unsigned m_yieldPoints { 0 };
     1330        bool m_isAsync { false };
    13301331
    13311332        Strong<SymbolTable> m_generatorFrameSymbolTable;
  • trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp

    r273135 r273225  
    2929#include "NodeConstructors.h"
    3030
     31#include "AbstractModuleRecord.h"
    3132#include "BuiltinNames.h"
    3233#include "BytecodeGenerator.h"
     
    13901391}
    13911392
     1393static AbstractModuleRecord::Field abstractModuleRecordInternalFieldIndex(BytecodeIntrinsicNode* node)
     1394{
     1395    ASSERT(node->entry().type() == BytecodeIntrinsicRegistry::Type::Emitter);
     1396    if (node->entry().emitter() == &BytecodeIntrinsicNode::emit_intrinsic_abstractModuleRecordFieldState)
     1397        return AbstractModuleRecord::Field::State;
     1398    RELEASE_ASSERT_NOT_REACHED();
     1399    return AbstractModuleRecord::Field::State;
     1400}
     1401
    13921402static JSArrayIterator::Field arrayIteratorInternalFieldIndex(BytecodeIntrinsicNode* node)
    13931403{
     
    14701480    unsigned index = static_cast<unsigned>(asyncGeneratorInternalFieldIndex(static_cast<BytecodeIntrinsicNode*>(node->m_expr)));
    14711481    ASSERT(index < JSAsyncGenerator::numberOfInternalFields);
     1482    ASSERT(!node->m_next);
     1483
     1484    return generator.emitGetInternalField(generator.finalDestination(dst), base.get(), index);
     1485}
     1486
     1487RegisterID* BytecodeIntrinsicNode::emit_intrinsic_getAbstractModuleRecordInternalField(BytecodeGenerator& generator, RegisterID* dst)
     1488{
     1489    ArgumentListNode* node = m_args->m_listNode;
     1490    RefPtr<RegisterID> base = generator.emitNode(node);
     1491    node = node->m_next;
     1492    RELEASE_ASSERT(node->m_expr->isBytecodeIntrinsicNode());
     1493    unsigned index = static_cast<unsigned>(abstractModuleRecordInternalFieldIndex(static_cast<BytecodeIntrinsicNode*>(node->m_expr)));
     1494    ASSERT(index < AbstractModuleRecord::numberOfInternalFields);
    14721495    ASSERT(!node->m_next);
    14731496
     
    49414964        generator.move(args.argumentRegister(argumentCount++), generator.promiseRegister());
    49424965        generator.emitLoad(args.argumentRegister(argumentCount++), jsUndefined());
    4943         generator.emitLoad(args.argumentRegister(argumentCount++), jsNumber(static_cast<int32_t>(JSGenerator::GeneratorResumeMode::NormalMode)));
     4966        generator.emitLoad(args.argumentRegister(argumentCount++), jsNumber(static_cast<int32_t>(JSGenerator::ResumeMode::NormalMode)));
    49444967        // JSTextPosition(int _line, int _offset, int _lineStartOffset)
    49454968        JSTextPosition divot(firstLine(), startOffset(), lineStartOffset());
     
    49584981        {
    49594982            RefPtr<RegisterID> condition = generator.newTemporary();
    4960             generator.emitEqualityOp<OpStricteq>(condition.get(), generator.generatorResumeModeRegister(), generator.emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator::GeneratorResumeMode::NormalMode))));
     4983            generator.emitEqualityOp<OpStricteq>(condition.get(), generator.generatorResumeModeRegister(), generator.emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator::ResumeMode::NormalMode))));
    49614984            generator.emitJumpIfTrue(condition.get(), generatorBodyLabel.get());
    49624985
    49634986            Ref<Label> throwLabel = generator.newLabel();
    4964             generator.emitEqualityOp<OpStricteq>(condition.get(), generator.generatorResumeModeRegister(), generator.emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator::GeneratorResumeMode::ThrowMode))));
     4987            generator.emitEqualityOp<OpStricteq>(condition.get(), generator.generatorResumeModeRegister(), generator.emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator::ResumeMode::ThrowMode))));
    49654988            generator.emitJumpIfTrue(condition.get(), throwLabel.get());
    49664989
  • trunk/Source/JavaScriptCore/interpreter/Interpreter.cpp

    r272580 r273225  
    3131#include "Interpreter.h"
    3232
     33#include "AbstractModuleRecord.h"
    3334#include "BatchedTransitionOptimizer.h"
    3435#include "Bytecodes.h"
     
    5051#include "JSLexicalEnvironment.h"
    5152#include "JSModuleEnvironment.h"
     53#include "JSModuleRecord.h"
    5254#include "JSString.h"
    5355#include "LLIntThunks.h"
     
    12021204}
    12031205
    1204 JSValue Interpreter::executeModuleProgram(ModuleProgramExecutable* executable, JSGlobalObject* lexicalGlobalObject, JSModuleEnvironment* scope)
     1206JSValue Interpreter::executeModuleProgram(JSModuleRecord* record, ModuleProgramExecutable* executable, JSGlobalObject* lexicalGlobalObject, JSModuleEnvironment* scope, JSValue sentValue, JSValue resumeMode)
    12051207{
    12061208    VM& vm = scope->vm();
     
    12321234        scope->flattenDictionaryObject(vm);
    12331235
     1236    const unsigned numberOfArguments = static_cast<unsigned>(AbstractModuleRecord::Argument::NumberOfArguments);
    12341237    JSCallee* callee = JSCallee::create(vm, globalObject, scope);
    12351238    ModuleProgramCodeBlock* codeBlock;
     
    12411244            return checkedReturn(compileError);
    12421245        codeBlock = jsCast<ModuleProgramCodeBlock*>(tempCodeBlock);
    1243         ASSERT(codeBlock->numParameters() == 1); // 1 parameter for 'this'.
     1246        ASSERT(codeBlock->numParameters() == numberOfArguments + 1);
    12441247    }
    12451248
     
    12491252        DisallowGC disallowGC; // Ensure no GC happens. GC can replace CodeBlock in Executable.
    12501253        jitCode = executable->generatedJITCode();
     1254
     1255        JSValue args[numberOfArguments] = {
     1256            record,
     1257            record->internalField(JSModuleRecord::Field::State).get(),
     1258            sentValue,
     1259            resumeMode,
     1260            scope,
     1261        };
    12511262        // The |this| of the module is always `undefined`.
    12521263        // http://www.ecma-international.org/ecma-262/6.0/#sec-module-environment-records-hasthisbinding
    12531264        // http://www.ecma-international.org/ecma-262/6.0/#sec-module-environment-records-getthisbinding
    1254         protoCallFrame.init(codeBlock, globalObject, callee, jsUndefined(), 1);
    1255     }
     1265        protoCallFrame.init(codeBlock, globalObject, callee, jsUndefined(), numberOfArguments + 1, args);
     1266    }
     1267
     1268    record->internalField(JSModuleRecord::Field::State).set(vm, record, jsNumber(static_cast<int>(JSModuleRecord::State::Executing)));
    12561269
    12571270    // Execute the code:
  • trunk/Source/JavaScriptCore/interpreter/Interpreter.h

    r260744 r273225  
    106106
    107107        JSValue executeProgram(const SourceCode&, JSGlobalObject*, JSObject* thisObj);
    108         JSValue executeModuleProgram(ModuleProgramExecutable*, JSGlobalObject*, JSModuleEnvironment*);
     108        JSValue executeModuleProgram(JSModuleRecord*, ModuleProgramExecutable*, JSGlobalObject*, JSModuleEnvironment*, JSValue sentValue, JSValue resumeMode);
    109109        JSValue executeCall(JSGlobalObject*, JSObject* function, const CallData&, JSValue thisValue, const ArgList&);
    110110        JSObject* executeConstruct(JSGlobalObject*, JSObject* function, const CallData&, const ArgList&, JSValue newTarget);
  • trunk/Source/JavaScriptCore/parser/ASTBuilder.h

    r271265 r273225  
    401401    {
    402402        ASSERT(argument);
     403        usesAwait();
    403404        AwaitExprNode* node = new (m_parserArena) AwaitExprNode(location, argument);
    404405        setExceptionLocation(node, start, divot, end);
     
    11001101    }
    11011102    void usesNewTarget() { m_scope.m_features |= NewTargetFeature; }
     1103    void usesAwait() { m_scope.m_features |= AwaitFeature; }
    11021104    ExpressionNode* createIntegerLikeNumber(const JSTokenLocation& location, double d)
    11031105    {
  • trunk/Source/JavaScriptCore/parser/Nodes.cpp

    r272580 r273225  
    178178    , m_startColumn(startColumn)
    179179    , m_endColumn(endColumn)
     180    , m_usesAwait(features & AwaitFeature)
    180181    , m_moduleScopeData(*WTFMove(moduleScopeData))
    181182{
  • trunk/Source/JavaScriptCore/parser/Nodes.h

    r272883 r273225  
    19911991        unsigned startColumn() const { return m_startColumn; }
    19921992        unsigned endColumn() const { return m_endColumn; }
     1993        bool usesAwait() const { return m_usesAwait; }
    19931994
    19941995        static constexpr bool scopeIsFunction = false;
     
    20032004        unsigned m_startColumn;
    20042005        unsigned m_endColumn;
     2006        bool m_usesAwait;
    20052007        Ref<ModuleScopeData> m_moduleScopeData;
    20062008    };
  • trunk/Source/JavaScriptCore/parser/Parser.cpp

    r273107 r273225  
    208208Parser<LexerType>::~Parser()
    209209{
     210}
     211
     212void JSToken::dump(PrintStream& out) const
     213{
     214    out.print(*m_data.cooked);
    210215}
    211216
     
    13531358
    13541359    if (match(AWAIT)) {
    1355         semanticFailIfFalse(currentScope()->isAsyncFunction(), "for-await-of can only be used in an async function or async generator");
     1360        semanticFailIfFalse(currentScope()->isAsyncFunction() || (isModuleParseMode(sourceParseMode()) && Options::useTopLevelAwait()), "for-await-of can only be used in an async function or async generator");
    13561361        isAwaitFor = true;
    13571362        next();
     
    41454150{
    41464151    ASSERT(match(AWAIT));
    4147     ASSERT(currentScope()->isAsyncFunction());
     4152    ASSERT(currentScope()->isAsyncFunction() || isModuleParseMode(sourceParseMode()));
     4153    ASSERT(isAsyncFunctionParseMode(sourceParseMode()) || isModuleParseMode(sourceParseMode()));
    41484154    ASSERT(m_parserState.functionParsePhase != FunctionParsePhase::Parameters);
    41494155    JSTokenLocation location(tokenLocation());
     
    48154821        if (m_parserState.functionParsePhase == FunctionParsePhase::Parameters)
    48164822            semanticFailIfFalse(m_parserState.allowAwait, "Cannot use 'await' within a parameter default expression");
    4817         else if (currentFunctionScope()->isAsyncFunctionBoundary())
     4823        else if (currentFunctionScope()->isAsyncFunctionBoundary() || (isModuleParseMode(sourceParseMode()) && Options::useTopLevelAwait()))
    48184824            return parseAwaitExpression(context);
    48194825
     
    53395345    unsigned lastOperator = 0;
    53405346
    5341     if (UNLIKELY(match(AWAIT) && currentFunctionScope()->isAsyncFunctionBoundary()))
     5347    if (UNLIKELY(match(AWAIT) && (currentFunctionScope()->isAsyncFunctionBoundary() || (isModuleParseMode(sourceParseMode())) && Options::useTopLevelAwait())))
    53425348        return parseAwaitExpression(context);
    53435349
  • trunk/Source/JavaScriptCore/parser/ParserModes.h

    r272580 r273225  
    323323const CodeFeatures NoEvalCacheFeature =            1 << 11;
    324324const CodeFeatures NonSimpleParameterListFeature = 1 << 12;
    325 
    326 const CodeFeatures AllFeatures = EvalFeature | ArgumentsFeature | WithFeature | ThisFeature | StrictModeFeature | ShadowsArgumentsFeature | ArrowFunctionFeature | ArrowFunctionContextFeature | SuperCallFeature | SuperPropertyFeature | NewTargetFeature | NoEvalCacheFeature | NonSimpleParameterListFeature;
     325const CodeFeatures AwaitFeature =                  1 << 13;
     326
     327const CodeFeatures AllFeatures = EvalFeature | ArgumentsFeature | WithFeature | ThisFeature | StrictModeFeature | ShadowsArgumentsFeature | ArrowFunctionFeature | ArrowFunctionContextFeature | SuperCallFeature | SuperPropertyFeature | NewTargetFeature | NoEvalCacheFeature | NonSimpleParameterListFeature | AwaitFeature;
    327328
    328329typedef uint8_t InnerArrowFunctionCodeFeatures;
  • trunk/Source/JavaScriptCore/parser/ParserTokens.h

    r271509 r273225  
    284284    JSTextPosition m_startPosition;
    285285    JSTextPosition m_endPosition;
     286
     287    void dump(PrintStream&) const;
    286288};
    287289
  • trunk/Source/JavaScriptCore/runtime/AbstractModuleRecord.cpp

    r273138 r273225  
    2929#include "Error.h"
    3030#include "JSCInlines.h"
     31#include "JSInternalFieldObjectImplInlines.h"
    3132#include "JSMap.h"
    3233#include "JSModuleEnvironment.h"
     
    5354    Base::finishCreation(vm);
    5455    ASSERT(inherits(vm, info()));
     56
     57    auto values = initialValues();
     58    ASSERT(values.size() == numberOfInternalFields);
     59    for (unsigned index = 0; index < values.size(); ++index)
     60        Base::internalField(index).set(vm, this, values[index]);
    5561
    5662    auto scope = DECLARE_THROW_SCOPE(vm);
     
    809815}
    810816
    811 void AbstractModuleRecord::link(JSGlobalObject* globalObject, JSValue scriptFetcher)
     817Synchronousness AbstractModuleRecord::link(JSGlobalObject* globalObject, JSValue scriptFetcher)
    812818{
    813819    VM& vm = globalObject->vm();
     
    819825#endif
    820826    RELEASE_ASSERT_NOT_REACHED();
    821 }
    822 
    823 JS_EXPORT_PRIVATE JSValue AbstractModuleRecord::evaluate(JSGlobalObject* globalObject)
     827    return Synchronousness::Sync;
     828}
     829
     830JS_EXPORT_PRIVATE JSValue AbstractModuleRecord::evaluate(JSGlobalObject* globalObject, JSValue sentValue, JSValue resumeMode)
    824831{
    825832    VM& vm = globalObject->vm();
    826833    if (auto* jsModuleRecord = jsDynamicCast<JSModuleRecord*>(vm, this))
    827         return jsModuleRecord->evaluate(globalObject);
     834        return jsModuleRecord->evaluate(globalObject, sentValue, resumeMode);
    828835#if ENABLE(WEBASSEMBLY)
    829836    if (auto* wasmModuleRecord = jsDynamicCast<WebAssemblyModuleRecord*>(vm, this))
  • trunk/Source/JavaScriptCore/runtime/AbstractModuleRecord.h

    r273138 r273225  
    2727
    2828#include "Identifier.h"
    29 #include "JSDestructibleObject.h"
     29#include "JSGenerator.h"
     30#include "JSInternalFieldObjectImpl.h"
    3031#include <wtf/ListHashSet.h>
    3132
     
    3839// Based on the Source Text Module Record
    3940// http://www.ecma-international.org/ecma-262/6.0/#sec-source-text-module-records
    40 class AbstractModuleRecord : public JSNonFinalObject {
     41class AbstractModuleRecord : public JSInternalFieldObjectImpl<4> {
    4142    friend class LLIntOffsetsExtractor;
    4243public:
    43     using Base = JSNonFinalObject;
     44    using Base = JSInternalFieldObjectImpl<4>;
    4445
    4546    static constexpr bool needsDestruction = true;
     
    4950    {
    5051        RELEASE_ASSERT_NOT_REACHED();
     52    }
     53
     54    using Argument = JSGenerator::Argument;
     55    using State = JSGenerator::State;
     56    using ResumeMode = JSGenerator::ResumeMode;
     57
     58    enum class Field : uint32_t {
     59        State,
     60        Next,
     61        This,
     62        Frame,
     63    };
     64
     65    static_assert(numberOfInternalFields == 4);
     66    static std::array<JSValue, numberOfInternalFields> initialValues()
     67    {
     68        return { {
     69            jsNumber(static_cast<int32_t>(State::Init)),
     70            jsUndefined(),
     71            jsUndefined(),
     72            jsUndefined(),
     73        } };
    5174    }
    5275
     
    130153    }
    131154
    132     void link(JSGlobalObject*, JSValue scriptFetcher);
    133     JS_EXPORT_PRIVATE JSValue evaluate(JSGlobalObject*);
     155    Synchronousness link(JSGlobalObject*, JSValue scriptFetcher);
     156    JS_EXPORT_PRIVATE JSValue evaluate(JSGlobalObject*, JSValue sentValue, JSValue resumeMode);
     157    WriteBarrier<Unknown>& internalField(Field field) { return Base::internalField(static_cast<uint32_t>(field)); }
     158    WriteBarrier<Unknown> internalField(Field field) const { return Base::internalField(static_cast<uint32_t>(field)); }
    134159
    135160protected:
  • trunk/Source/JavaScriptCore/runtime/JSAsyncGenerator.h

    r273138 r273225  
    5555        AwaitingReturn = -5,
    5656    };
    57     static_assert(static_cast<int32_t>(AsyncGeneratorState::Completed) == static_cast<int32_t>(JSGenerator::GeneratorState::Completed));
    58     static_assert(static_cast<int32_t>(AsyncGeneratorState::Executing) == static_cast<int32_t>(JSGenerator::GeneratorState::Executing));
     57    static_assert(static_cast<int32_t>(AsyncGeneratorState::Completed) == static_cast<int32_t>(JSGenerator::State::Completed));
     58    static_assert(static_cast<int32_t>(AsyncGeneratorState::Executing) == static_cast<int32_t>(JSGenerator::State::Executing));
    5959
    6060    enum class AsyncGeneratorSuspendReason : int32_t {
  • trunk/Source/JavaScriptCore/runtime/JSGenerator.h

    r273138 r273225  
    4747    }
    4848
    49     enum class GeneratorResumeMode : int32_t {
     49    enum class ResumeMode : int32_t {
    5050        NormalMode = 0,
    5151        ReturnMode = 1,
     
    5353    };
    5454
    55     enum class GeneratorState : int32_t {
     55    enum class State : int32_t {
    5656        Completed = -1,
    5757        Executing = -2,
     
    6060
    6161    // [this], @generator, @generatorState, @generatorValue, @generatorResumeMode, @generatorFrame.
    62     enum class GeneratorArgument : int32_t {
     62    enum class Argument : int32_t {
    6363        ThisValue = 0,
    6464        Generator = 1,
     
    6767        ResumeMode = 4,
    6868        Frame = 5,
     69        NumberOfArguments = Frame,
    6970    };
    7071
     
    8384        return { {
    8485            jsNull(),
    85             jsNumber(static_cast<int32_t>(GeneratorState::Init)),
     86            jsNumber(static_cast<int32_t>(State::Init)),
    8687            jsUndefined(),
    8788            jsUndefined(),
     
    102103};
    103104
     105OVERLOAD_RELATIONAL_OPERATORS_FOR_ENUM_CLASS_WITH_INTEGRALS(JSGenerator::Argument);
     106
    104107} // namespace JSC
  • trunk/Source/JavaScriptCore/runtime/JSGlobalObject.h

    r273138 r273225  
    231231    ModuleLoaderCreateImportMetaPropertiesPtr moduleLoaderCreateImportMetaProperties;
    232232
    233     typedef JSValue (*ModuleLoaderEvaluatePtr)(JSGlobalObject*, JSModuleLoader*, JSValue, JSValue, JSValue);
     233    typedef JSValue (*ModuleLoaderEvaluatePtr)(JSGlobalObject*, JSModuleLoader*, JSValue key, JSValue moduleRecordValue, JSValue scriptFetcher, JSValue awaitedValue, JSValue resumeMode);
    234234    ModuleLoaderEvaluatePtr moduleLoaderEvaluate;
    235235
  • trunk/Source/JavaScriptCore/runtime/JSModuleLoader.cpp

    r271766 r273225  
    308308}
    309309
    310 JSValue JSModuleLoader::evaluate(JSGlobalObject* globalObject, JSValue key, JSValue moduleRecordValue, JSValue scriptFetcher)
     310JSValue JSModuleLoader::evaluate(JSGlobalObject* globalObject, JSValue key, JSValue moduleRecordValue, JSValue scriptFetcher, JSValue sentValue, JSValue resumeMode)
    311311{
    312312    dataLogLnIf(Options::dumpModuleLoadingState(), "Loader [evaluate] ", printableModuleKey(globalObject, key));
    313313
    314314    if (globalObject->globalObjectMethodTable()->moduleLoaderEvaluate)
    315         return globalObject->globalObjectMethodTable()->moduleLoaderEvaluate(globalObject, this, key, moduleRecordValue, scriptFetcher);
    316 
    317     return evaluateNonVirtual(globalObject, key, moduleRecordValue, scriptFetcher);
    318 }
    319 
    320 JSValue JSModuleLoader::evaluateNonVirtual(JSGlobalObject* globalObject, JSValue, JSValue moduleRecordValue, JSValue)
     315        return globalObject->globalObjectMethodTable()->moduleLoaderEvaluate(globalObject, this, key, moduleRecordValue, scriptFetcher, sentValue, resumeMode);
     316
     317    return evaluateNonVirtual(globalObject, key, moduleRecordValue, scriptFetcher, sentValue, resumeMode);
     318}
     319
     320JSValue JSModuleLoader::evaluateNonVirtual(JSGlobalObject* globalObject, JSValue, JSValue moduleRecordValue, JSValue, JSValue sentValue, JSValue resumeMode)
    321321{
    322322    if (auto* moduleRecord = jsDynamicCast<AbstractModuleRecord*>(globalObject->vm(), moduleRecordValue))
    323         return moduleRecord->evaluate(globalObject);
     323        return moduleRecord->evaluate(globalObject, sentValue, resumeMode);
    324324    return jsUndefined();
    325325}
     
    365365        RELEASE_AND_RETURN(scope, JSValue::encode(JSWebAssembly::instantiate(globalObject, promise, moduleKey, jsSourceCode)));
    366366#endif
     367
     368    dataLogLnIf(Options::dumpModuleLoadingState(), "loader [parsing] ", moduleKey);
    367369
    368370    ParserError error;
     
    410412    dataLogLnIf(Options::dumpModuleLoadingState(), "Loader [link] ", moduleRecord->moduleKey());
    411413
    412     moduleRecord->link(globalObject, callFrame->argument(1));
     414    auto sync = moduleRecord->link(globalObject, callFrame->argument(1));
    413415    RETURN_IF_EXCEPTION(scope, encodedJSValue());
    414416
    415     return JSValue::encode(jsUndefined());
     417    return JSValue::encode(jsBoolean(sync == Synchronousness::Async));
    416418}
    417419
     
    482484    if (!loader)
    483485        return JSValue::encode(jsUndefined());
    484     return JSValue::encode(loader->evaluate(globalObject, callFrame->argument(0), callFrame->argument(1), callFrame->argument(2)));
     486    return JSValue::encode(loader->evaluate(globalObject, callFrame->argument(0), callFrame->argument(1), callFrame->argument(2), callFrame->argument(3), callFrame->argument(4)));
    485487}
    486488
  • trunk/Source/JavaScriptCore/runtime/JSModuleLoader.h

    r260415 r273225  
    8585
    8686    // Additional platform dependent hooked APIs.
    87     JSValue evaluate(JSGlobalObject*, JSValue key, JSValue moduleRecord, JSValue scriptFetcher);
    88     JSValue evaluateNonVirtual(JSGlobalObject*, JSValue key, JSValue moduleRecord, JSValue scriptFetcher);
     87    JSValue evaluate(JSGlobalObject*, JSValue key, JSValue moduleRecord, JSValue scriptFetcher, JSValue sentValue, JSValue resumeMode);
     88    JSValue evaluateNonVirtual(JSGlobalObject*, JSValue key, JSValue moduleRecord, JSValue scriptFetcher, JSValue sentValue, JSValue resumeMode);
    8989
    9090    // Utility functions.
  • trunk/Source/JavaScriptCore/runtime/JSModuleRecord.cpp

    r273138 r273225  
    8282DEFINE_VISIT_CHILDREN(JSModuleRecord);
    8383
    84 void JSModuleRecord::link(JSGlobalObject* globalObject, JSValue scriptFetcher)
     84Synchronousness JSModuleRecord::link(JSGlobalObject* globalObject, JSValue scriptFetcher)
    8585{
    8686    VM& vm = globalObject->vm();
     
    9191    if (!executable) {
    9292        throwSyntaxError(globalObject, scope);
    93         return;
     93        return Synchronousness::Sync;
    9494    }
    9595    instantiateDeclarations(globalObject, executable, scriptFetcher);
    96     RETURN_IF_EXCEPTION(scope, void());
     96    RETURN_IF_EXCEPTION(scope, Synchronousness::Sync);
    9797    m_moduleProgramExecutable.set(vm, this, executable);
     98
     99    return executable->unlinkedModuleProgramCodeBlock()->isAsync() ? Synchronousness::Async : Synchronousness::Sync;
    98100}
    99101
     
    239241}
    240242
    241 JSValue JSModuleRecord::evaluate(JSGlobalObject* globalObject)
     243JSValue JSModuleRecord::evaluate(JSGlobalObject* globalObject, JSValue sentValue, JSValue resumeMode)
    242244{
    243245    if (!m_moduleProgramExecutable)
     
    245247    VM& vm = globalObject->vm();
    246248    ModuleProgramExecutable* executable = m_moduleProgramExecutable.get();
    247     m_moduleProgramExecutable.clear();
    248     return vm.interpreter->executeModuleProgram(executable, globalObject, moduleEnvironment());
     249    JSValue resultOrAwaitedValue = vm.interpreter->executeModuleProgram(this, executable, globalObject, moduleEnvironment(), sentValue, resumeMode);
     250    if (JSValue state = internalField(Field::State).get(); !state.isNumber() || state.asNumber() == static_cast<unsigned>(State::Executing))
     251        m_moduleProgramExecutable.clear();
     252    return resultOrAwaitedValue;
    249253}
    250254
  • trunk/Source/JavaScriptCore/runtime/JSModuleRecord.h

    r273138 r273225  
    5555    static JSModuleRecord* create(JSGlobalObject*, VM&, Structure*, const Identifier&, const SourceCode&, const VariableEnvironment&, const VariableEnvironment&);
    5656
    57     void link(JSGlobalObject*, JSValue scriptFetcher);
    58     JS_EXPORT_PRIVATE JSValue evaluate(JSGlobalObject*);
     57    Synchronousness link(JSGlobalObject*, JSValue scriptFetcher);
     58    JS_EXPORT_PRIVATE JSValue evaluate(JSGlobalObject*, JSValue sentValue, JSValue resumeMode);
    5959
    6060    const SourceCode& sourceCode() const { return m_sourceCode; }
  • trunk/Source/JavaScriptCore/runtime/ModuleProgramExecutable.h

    r273138 r273225  
    6767
    6868    UnlinkedModuleProgramCodeBlock* unlinkedModuleProgramCodeBlock() { return m_unlinkedModuleProgramCodeBlock.get(); }
     69    bool isAsync() const { return features() & AwaitFeature; }
    6970
    7071    SymbolTable* moduleEnvironmentSymbolTable() { return m_moduleEnvironmentSymbolTable.get(); }
  • trunk/Source/JavaScriptCore/runtime/OptionsList.h

    r273138 r273225  
    484484    v(Bool, wasmLLIntTiersUpToBBQ, true, Normal, nullptr) \
    485485    v(Size, webAssemblyBBQAirModeThreshold, isIOS() ? (10 * MB) : 0, Normal, "If 0, we always use BBQ Air. If Wasm module code size hits this threshold, we compile Wasm module with B3 BBQ mode.") \
    486     v(Bool, useWebAssemblyStreaming, true, Normal, "Allow to run WebAssembly's Streaming API") \
    487486    v(Bool, useEagerWebAssemblyModuleHashing, false, Normal, "Unnamed WebAssembly modules are identified in backtraces through their hash, if available.") \
    488     v(Bool, useWebAssemblyReferences, true, Normal, "Allow types from the wasm references spec.") \
    489     v(Bool, useWebAssemblyMultiValues, true, Normal, "Allow types from the wasm mulit-values spec.") \
    490     v(Bool, useWebAssemblyThreading, true, Normal, "Allow instructions from the wasm threading spec.") \
    491     v(Bool, useWeakRefs, true, Normal, "Expose the WeakRef constructor.") \
    492     v(Bool, useIntlDateTimeFormatDayPeriod, true, Normal, "Expose the Intl.DateTimeFormat dayPeriod feature.") \
    493     v(Bool, useIntlDateTimeFormatRangeToParts, true, Normal, "Expose the Intl.DateTimeFormat#formatRangeToParts feature.") \
    494     v(Bool, useAtMethod, false, Normal, "Expose the at() method on Array, %TypedArray%, and String.") \
    495     v(Bool, useSharedArrayBuffer, false, Normal, nullptr) \
    496487    v(Bool, useArrayAllocationProfiling, true, Normal, "If true, we will use our normal array allocation profiling. If false, the allocation profile will always claim to be undecided.") \
    497488    v(Bool, forcePolyProto, false, Normal, "If true, create_this will always create an object with a poly proto structure.") \
     
    514505    v(Bool, exposeProfilersOnGlobalObject, false, Normal, "If true, we will expose functions to enable/disable both the sampling profiler and the super sampler") \
    515506    v(Bool, allowUnsupportedTiers, false, Normal, "If true, we will not disable DFG or FTL when an experimental feature is enabled.") \
    516     v(Bool, usePrivateClassFields, true, Normal, "If true, the parser will understand private data fields inside classes.") \
    517     v(Bool, usePrivateMethods, true, Normal, "If true, the parser will understand private methods inside classes.") \
    518507    v(Bool, returnEarlyFromInfiniteLoopsForFuzzing, false, Normal, nullptr) \
    519508    v(Size, earlyReturnFromInfiniteLoopsLimit, 1300000000, Normal, "When returnEarlyFromInfiniteLoopsForFuzzing is true, this determines the number of executions a loop can run for before just returning. This is helpful for the fuzzer so it doesn't get stuck in infinite loops.") \
     
    523512    v(Bool, exposeCustomSettersOnGlobalObjectForTesting, false, Normal, nullptr) \
    524513    v(Bool, useJITCage, canUseJITCage(), Normal, nullptr) \
     514    \
     515    /* Feature Flags */\
     516    \
    525517    v(Bool, usePublicStaticClassFields, true, Normal, "If true, the parser will understand public static data fields inside classes.") \
    526518    v(Bool, usePrivateStaticClassFields, true, Normal, "If true, the parser will understand private static data fields inside classes.") \
     519    v(Bool, usePrivateClassFields, true, Normal, "If true, the parser will understand private data fields inside classes.") \
     520    v(Bool, usePrivateMethods, true, Normal, "If true, the parser will understand private methods inside classes.") \
     521    v(Bool, useWebAssemblyStreaming, true, Normal, "Allow to run WebAssembly's Streaming API") \
     522    v(Bool, useWebAssemblyReferences, true, Normal, "Allow types from the wasm references spec.") \
     523    v(Bool, useWebAssemblyMultiValues, true, Normal, "Allow types from the wasm mulit-values spec.") \
     524    v(Bool, useWebAssemblyThreading, true, Normal, "Allow instructions from the wasm threading spec.") \
     525    v(Bool, useWeakRefs, true, Normal, "Expose the WeakRef constructor.") \
     526    v(Bool, useIntlDateTimeFormatDayPeriod, true, Normal, "Expose the Intl.DateTimeFormat dayPeriod feature.") \
     527    v(Bool, useIntlDateTimeFormatRangeToParts, true, Normal, "Expose the Intl.DateTimeFormat#formatRangeToParts feature.") \
     528    v(Bool, useAtMethod, false, Normal, "Expose the at() method on Array, %TypedArray%, and String.") \
     529    v(Bool, useSharedArrayBuffer, false, Normal, nullptr) \
     530    v(Bool, useTopLevelAwait, true, Normal, "allow the await keyword at the top level of a module.") \
     531
    527532
    528533enum OptionEquivalence {
  • trunk/Source/JavaScriptCore/runtime/SymbolTable.cpp

    r273138 r273225  
    3434#include "TypeProfiler.h"
    3535
     36#include <wtf/CommaPrinter.h>
     37
    3638namespace JSC {
    3739
     
    284286}
    285287
     288void SymbolTable::dump(PrintStream& out) const
     289{
     290    ConcurrentJSLocker locker(m_lock);
     291    Base::dump(out);
     292
     293    CommaPrinter comma;
     294    out.print(" <");
     295    for (auto& iter : m_map)
     296        out.print(comma, *iter.key, ": ", iter.value.varOffset());
     297    out.println(">");
     298}
     299
    286300} // namespace JSC
    287301
  • trunk/Source/JavaScriptCore/runtime/SymbolTable.h

    r273138 r273225  
    739739
    740740    void finalizeUnconditionally(VM&);
     741    void dump(PrintStream&) const;
    741742
    742743private:
  • trunk/Source/JavaScriptCore/wasm/js/WebAssemblyModuleRecord.cpp

    r273138 r273225  
    9898}
    9999
    100 void WebAssemblyModuleRecord::link(JSGlobalObject* globalObject, JSValue, JSObject* importObject, Wasm::CreationMode creationMode)
     100Synchronousness WebAssemblyModuleRecord::link(JSGlobalObject* globalObject, JSValue, JSObject* importObject, Wasm::CreationMode creationMode)
     101{
     102    linkImpl(globalObject, importObject, creationMode);
     103    return Synchronousness::Sync;
     104}
     105
     106void WebAssemblyModuleRecord::linkImpl(JSGlobalObject* globalObject, JSObject* importObject, Wasm::CreationMode creationMode)
    101107{
    102108    VM& vm = globalObject->vm();
  • trunk/Source/JavaScriptCore/wasm/js/WebAssemblyModuleRecord.h

    r273138 r273225  
    6060
    6161    void prepareLink(VM&, JSWebAssemblyInstance*);
    62     void link(JSGlobalObject*, JSValue scriptFetcher, JSObject* importObject, Wasm::CreationMode);
     62    Synchronousness link(JSGlobalObject*, JSValue scriptFetcher, JSObject* importObject, Wasm::CreationMode);
    6363    JS_EXPORT_PRIVATE JSValue evaluate(JSGlobalObject*);
    6464
     
    6666
    6767private:
     68    void linkImpl(JSGlobalObject*, JSObject* importObject, Wasm::CreationMode);
    6869    WebAssemblyModuleRecord(VM&, Structure*, const Identifier&);
    6970
  • trunk/Source/WebCore/ChangeLog

    r273224 r273225  
     12021-02-21  Keith Miller  <keith_miller@apple.com>
     2
     3        Implement the Top-level await proposal
     4        https://bugs.webkit.org/show_bug.cgi?id=202484
     5
     6        Reviewed by Yusuke Suzuki.
     7
     8        * bindings/js/JSDOMGlobalObject.cpp:
     9        (WebCore::JSDOMGlobalObject::moduleLoaderEvaluate):
     10        * bindings/js/JSDOMGlobalObject.h:
     11        * bindings/js/ScriptController.cpp:
     12        (WebCore::ScriptController::evaluateModule):
     13        * bindings/js/ScriptController.h:
     14        * bindings/js/ScriptModuleLoader.cpp:
     15        (WebCore::ScriptModuleLoader::evaluate):
     16        * bindings/js/ScriptModuleLoader.h:
     17        * workers/WorkerOrWorkletScriptController.cpp:
     18        (WebCore::WorkerOrWorkletScriptController::evaluateModule):
     19        * workers/WorkerOrWorkletScriptController.h:
     20
    1212021-02-20  Yusuke Suzuki  <ysuzuki@apple.com>
    222
  • trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp

    r273203 r273225  
    471471}
    472472
    473 JSC::JSValue JSDOMGlobalObject::moduleLoaderEvaluate(JSC::JSGlobalObject* globalObject, JSC::JSModuleLoader* moduleLoader, JSC::JSValue moduleKey, JSC::JSValue moduleRecord, JSC::JSValue scriptFetcher)
     473JSC::JSValue JSDOMGlobalObject::moduleLoaderEvaluate(JSC::JSGlobalObject* globalObject, JSC::JSModuleLoader* moduleLoader, JSC::JSValue moduleKey, JSC::JSValue moduleRecord, JSC::JSValue scriptFetcher, JSC::JSValue awaitedValue, JSC::JSValue resumeMode)
    474474{
    475475    JSDOMGlobalObject* thisObject = JSC::jsCast<JSDOMGlobalObject*>(globalObject);
    476476    if (auto* loader = scriptModuleLoader(thisObject))
    477         return loader->evaluate(globalObject, moduleLoader, moduleKey, moduleRecord, scriptFetcher);
     477        return loader->evaluate(globalObject, moduleLoader, moduleKey, moduleRecord, scriptFetcher, awaitedValue, resumeMode);
    478478    return JSC::jsUndefined();
    479479}
  • trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.h

    r273203 r273225  
    108108    static JSC::Identifier moduleLoaderResolve(JSC::JSGlobalObject*, JSC::JSModuleLoader*, JSC::JSValue, JSC::JSValue, JSC::JSValue);
    109109    static JSC::JSInternalPromise* moduleLoaderFetch(JSC::JSGlobalObject*, JSC::JSModuleLoader*, JSC::JSValue, JSC::JSValue, JSC::JSValue);
    110     static JSC::JSValue moduleLoaderEvaluate(JSC::JSGlobalObject*, JSC::JSModuleLoader*, JSC::JSValue, JSC::JSValue, JSC::JSValue);
     110    static JSC::JSValue moduleLoaderEvaluate(JSC::JSGlobalObject*, JSC::JSModuleLoader*, JSC::JSValue, JSC::JSValue, JSC::JSValue, JSC::JSValue, JSC::JSValue);
    111111    static JSC::JSInternalPromise* moduleLoaderImportModule(JSC::JSGlobalObject*, JSC::JSModuleLoader*, JSC::JSString*, JSC::JSValue, const JSC::SourceOrigin&);
    112112    static JSC::JSObject* moduleLoaderCreateImportMetaProperties(JSC::JSGlobalObject*, JSC::JSModuleLoader*, JSC::JSValue, JSC::JSModuleRecord*, JSC::JSValue);
  • trunk/Source/WebCore/bindings/js/ScriptController.cpp

    r272618 r273225  
    228228}
    229229
    230 JSC::JSValue ScriptController::evaluateModule(const URL& sourceURL, JSModuleRecord& moduleRecord, DOMWrapperWorld& world)
     230JSC::JSValue ScriptController::evaluateModule(const URL& sourceURL, JSModuleRecord& moduleRecord, DOMWrapperWorld& world, JSC::JSValue awaitedValue, JSC::JSValue resumeMode)
    231231{
    232232    JSLockHolder lock(world.vm());
     
    241241
    242242    InspectorInstrumentation::willEvaluateScript(m_frame, sourceURL.string(), jsSourceCode.firstLine().oneBasedInt(), jsSourceCode.startColumn().oneBasedInt());
    243     auto returnValue = moduleRecord.evaluate(&lexicalGlobalObject);
     243    auto returnValue = moduleRecord.evaluate(&lexicalGlobalObject, awaitedValue, resumeMode);
    244244    InspectorInstrumentation::didEvaluateScript(m_frame);
    245245
     
    247247}
    248248
    249 JSC::JSValue ScriptController::evaluateModule(const URL& sourceURL, JSModuleRecord& moduleRecord)
    250 {
    251     return evaluateModule(sourceURL, moduleRecord, mainThreadNormalWorld());
     249JSC::JSValue ScriptController::evaluateModule(const URL& sourceURL, JSModuleRecord& moduleRecord, JSC::JSValue awaitedValue, JSC::JSValue resumeMode)
     250{
     251    return evaluateModule(sourceURL, moduleRecord, mainThreadNormalWorld(), awaitedValue, resumeMode);
    252252}
    253253
  • trunk/Source/WebCore/bindings/js/ScriptController.h

    r270453 r273225  
    124124    JSC::JSValue linkAndEvaluateModuleScript(LoadableModuleScript&);
    125125
    126     JSC::JSValue evaluateModule(const URL&, JSC::JSModuleRecord&, DOMWrapperWorld&);
    127     JSC::JSValue evaluateModule(const URL&, JSC::JSModuleRecord&);
     126    JSC::JSValue evaluateModule(const URL&, JSC::JSModuleRecord&, DOMWrapperWorld&, JSC::JSValue awaitedValue, JSC::JSValue resumeMode);
     127    JSC::JSValue evaluateModule(const URL&, JSC::JSModuleRecord&, JSC::JSValue awaitedValue, JSC::JSValue resumeMode);
    128128
    129129    WTF::TextPosition eventHandlerPosition() const;
  • trunk/Source/WebCore/bindings/js/ScriptModuleLoader.cpp

    r273203 r273225  
    221221}
    222222
    223 JSC::JSValue ScriptModuleLoader::evaluate(JSC::JSGlobalObject* jsGlobalObject, JSC::JSModuleLoader*, JSC::JSValue moduleKeyValue, JSC::JSValue moduleRecordValue, JSC::JSValue)
     223JSC::JSValue ScriptModuleLoader::evaluate(JSC::JSGlobalObject* jsGlobalObject, JSC::JSModuleLoader*, JSC::JSValue moduleKeyValue, JSC::JSValue moduleRecordValue, JSC::JSValue, JSC::JSValue awaitedValue, JSC::JSValue resumeMode)
    224224{
    225225    JSC::VM& vm = jsGlobalObject->vm();
     
    239239    if (m_ownerType == OwnerType::Document) {
    240240        if (auto* frame = downcast<Document>(m_context).frame())
    241             return frame->script().evaluateModule(sourceURL, *moduleRecord);
     241            return frame->script().evaluateModule(sourceURL, *moduleRecord, awaitedValue, resumeMode);
    242242    } else {
    243243        ASSERT(is<WorkerOrWorkletGlobalScope>(m_context));
    244244        if (auto* script = downcast<WorkerOrWorkletGlobalScope>(m_context).script())
    245             return script->evaluateModule(*moduleRecord);
     245            return script->evaluateModule(*moduleRecord, awaitedValue, resumeMode);
    246246    }
    247247    return JSC::jsUndefined();
  • trunk/Source/WebCore/bindings/js/ScriptModuleLoader.h

    r273203 r273225  
    6060    JSC::Identifier resolve(JSC::JSGlobalObject*, JSC::JSModuleLoader*, JSC::JSValue moduleName, JSC::JSValue importerModuleKey, JSC::JSValue scriptFetcher);
    6161    JSC::JSInternalPromise* fetch(JSC::JSGlobalObject*, JSC::JSModuleLoader*, JSC::JSValue moduleKey, JSC::JSValue parameters, JSC::JSValue scriptFetcher);
    62     JSC::JSValue evaluate(JSC::JSGlobalObject*, JSC::JSModuleLoader*, JSC::JSValue moduleKey, JSC::JSValue moduleRecord, JSC::JSValue scriptFetcher);
     62    JSC::JSValue evaluate(JSC::JSGlobalObject*, JSC::JSModuleLoader*, JSC::JSValue moduleKey, JSC::JSValue moduleRecord, JSC::JSValue scriptFetcher, JSC::JSValue awaitedValue, JSC::JSValue resumeMode);
    6363    JSC::JSInternalPromise* importModule(JSC::JSGlobalObject*, JSC::JSModuleLoader*, JSC::JSString*, JSC::JSValue parameters, const JSC::SourceOrigin&);
    6464    JSC::JSObject* createImportMetaProperties(JSC::JSGlobalObject*, JSC::JSModuleLoader*, JSC::JSValue, JSC::JSModuleRecord*, JSC::JSValue);
  • trunk/Source/WebCore/workers/WorkerOrWorkletScriptController.cpp

    r273203 r273225  
    246246}
    247247
    248 JSC::JSValue WorkerOrWorkletScriptController::evaluateModule(JSC::JSModuleRecord& moduleRecord)
     248JSC::JSValue WorkerOrWorkletScriptController::evaluateModule(JSC::JSModuleRecord& moduleRecord, JSC::JSValue awaitedValue, JSC::JSValue resumeMode)
    249249{
    250250    auto& globalObject = *m_globalScopeWrapper.get();
    251251    VM& vm = globalObject.vm();
    252252    JSLockHolder lock { vm };
    253     return moduleRecord.evaluate(&globalObject);
     253    return moduleRecord.evaluate(&globalObject, awaitedValue, resumeMode);
    254254}
    255255
  • trunk/Source/WebCore/workers/WorkerOrWorkletScriptController.h

    r273203 r273225  
    9797    void evaluate(const ScriptSourceCode&, NakedPtr<JSC::Exception>& returnedException, String* returnedExceptionMessage = nullptr);
    9898
    99     JSC::JSValue evaluateModule(JSC::JSModuleRecord&);
     99    JSC::JSValue evaluateModule(JSC::JSModuleRecord&, JSC::JSValue awaitedValue, JSC::JSValue resumeMode);
    100100
    101101    void linkAndEvaluateModule(WorkerScriptFetcher&, const ScriptSourceCode&, String* returnedExceptionMessage = nullptr);
Note: See TracChangeset for help on using the changeset viewer.