16 ECMAScript Language: Scripts and Modules

16.1 Scripts

Syntax

Script : ScriptBodyopt ScriptBody : StatementList[~Yield, ~Await, ~Return]

16.1.1 Static Semantics: Early Errors

Script : ScriptBody ScriptBody : StatementList

16.1.2 Static Semantics: ScriptIsStrict

The syntax-directed operation ScriptIsStrict takes no arguments and returns a Boolean. It is defined piecewise over the following productions:

Script : ScriptBodyopt
  1. ScriptBodyが存在し、かつScriptBodyDirective PrologueUse Strict Directiveを含むなら、trueを返す。
  2. falseを返す。

16.1.3 Runtime Semantics: Evaluation

Script : [empty]
  1. undefinedを返す。

16.1.4 Script Records

Script Recordは、評価されているscriptに関する情報をencapsulateします。各script recordはTable 35に列挙されたfieldsを含みます。

Table 35: Script Record Fields
Field Name Value Type Meaning
[[Realm]] a Realm Record このscriptが作成されたrealm
[[ECMAScriptCode]] a Script Parse Node このscriptのsource textをparseした結果。
[[LoadedModules]] a List of LoadedModuleRequest Records このscriptによってimportされたspecifier stringsからresolved Module Recordへのmap。このlistは、ModuleRequestsEqual(r1, r2)がtrueであるような2つの異なるRecords r1およびr2を含みません。
[[HostDefined]] anything (default value is empty) scriptに追加情報を関連付ける必要があるhost environmentsによる使用のために予約されたfield。

16.1.5 ParseScript ( sourceText, realm, hostDefined )

The abstract operation ParseScript takes arguments sourceText (a String or a sequence of Unicode code points), realm (a Realm Record), and hostDefined (anything) and returns a Script Record or a non-empty List of SyntaxError objects. sourceTextScriptとしてparseした結果に基づいてScript Recordを作成します。 It performs the following steps when called:

  1. scriptParseText(sourceText, Script)とする。
  2. scriptがerrorsのListなら、scriptを返す。
  3. Script Record { [[Realm]]: realm, [[ECMAScriptCode]]: script, [[LoadedModules]]: « », [[HostDefined]]: hostDefined }を返す。
Note

implementationは、そのscript source textに対するParseScriptのevaluationより前に、script source textをparseし、それをEarly Error conditionsについてanalyseしてもよいです。ただし、errorsのreportingは、この仕様が実際にそのsource textに対してParseScriptを実行する時点までdeferされなければなりません。

16.1.6 ScriptEvaluation ( scriptRecord )

The abstract operation ScriptEvaluation takes argument scriptRecord (a Script Record) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It performs the following steps when called:

  1. globalEnvscriptRecord.[[Realm]].[[GlobalEnv]]とする。
  2. scriptContextを新しいECMAScript code execution contextとする。
  3. scriptContextのFunctionをnullに設定する。
  4. scriptContextRealmscriptRecord.[[Realm]]に設定する。
  5. scriptContextのScriptOrModuleをscriptRecordに設定する。
  6. scriptContextのVariableEnvironmentをglobalEnvに設定する。
  7. scriptContextのLexicalEnvironmentをglobalEnvに設定する。
  8. scriptContextのPrivateEnvironmentをnullに設定する。
  9. running execution contextをsuspendする。
  10. scriptContextexecution context stackへpushする;scriptContextは現在running execution contextである。
  11. scriptNodescriptRecord.[[ECMAScriptCode]]とする。
  12. resultCompletion(GlobalDeclarationInstantiation(scriptNode, globalEnv))とする。
  13. resultnormal completionなら、
    1. resultCompletion(scriptNodeEvaluation)に設定する。
    2. resultnormal completionであり、かつresult.[[Value]]emptyなら、
      1. resultNormalCompletion(undefined)に設定する。
  14. scriptContextをsuspendし、それをexecution context stackからremoveする。
  15. Assert: execution context stackは空でない。
  16. execution context stackのtopにあるcontextをrunning execution contextとしてresumeする。
  17. resultを返す。

16.1.7 GlobalDeclarationInstantiation ( script, envRecord )

The abstract operation GlobalDeclarationInstantiation takes arguments script (a Script Parse Node) and envRecord (a Global Environment Record) and returns either a normal completion containing unused or a throw completion. scriptexecution contextが確立される対象のScriptです。envRecordはbindingsが作成されるglobal environmentです。

Note 1

scriptsを評価するためにexecution contextが確立されるとき、declarationsはcurrent global environment内でinstantiatedされます。code内でdeclaredされた各global bindingがinstantiatedされます。

これは呼び出されたとき、次のstepsを実行します:

  1. scriptLexicallyDeclaredNameslexicalNamesとする。
  2. scriptVarDeclaredNamesvariableNamesとする。
  3. lexicalNamesの各要素nameについて、次を行う。
    1. HasLexicalDeclaration(envRecord, name)がtrueである場合、SyntaxError例外を投げる。
    2. HasRestrictedGlobalProperty(envRecord, name)をhasRestrictedGlobalとする。
    3. NOTE: グローバルvarおよびfunction束縛(非strict direct evalによって導入されるものを除く)は構成不可であり、したがって制限されたグローバルプロパティである。
    4. hasRestrictedGlobaltrueである場合、SyntaxError例外を投げる。
  4. variableNamesの各要素nameについて、次を行う。
    1. HasLexicalDeclaration(envRecord, name)がtrueである場合、SyntaxError例外を投げる。
  5. scriptVarScopedDeclarationsvariableDeclsとする。
  6. funcsToInitializeを新しい空のListとする。
  7. declaredFuncNamesを新しい空のListとする。
  8. variableDeclsの各要素variableDeclについて、Listの逆順で、次を行う。
    1. variableDeclVariableDeclarationForBinding、またはBindingIdentifierのいずれでもない場合、
      1. Assert: variableDeclは、FunctionDeclarationGeneratorDeclarationAsyncFunctionDeclaration、またはAsyncGeneratorDeclarationのいずれかである。
      2. NOTE: 同じ名前に対して複数の関数宣言がある場合、最後の宣言が使用される。
      3. variableDeclBoundNamesの唯一の要素をfuncNameとする。
      4. declaredFuncNamesfuncNameを含まない場合、
        1. CanDeclareGlobalFunction(envRecord, funcName)をfuncDefinableとする。
        2. funcDefinablefalseである場合、TypeError例外を投げる。
        3. funcNamedeclaredFuncNamesに追加する。
        4. variableDeclfuncsToInitializeの最初の要素として挿入する。
  9. declaredVariableNamesを新しい空のListとする。
  10. variableDeclsの各要素variableDeclについて、次を行う。
    1. variableDeclVariableDeclarationForBinding、またはBindingIdentifierのいずれかである場合、
      1. variableDeclBoundNamesの各String nameについて、次を行う。
        1. declaredFuncNamesnameを含まない場合、
          1. CanDeclareGlobalVar(envRecord, name)をvariableDefinableとする。
          2. variableDefinablefalseである場合、TypeError例外を投げる。
          3. declaredVariableNamesnameを含まない場合、
            1. namedeclaredVariableNamesに追加する。
  11. NOTE: グローバルオブジェクトがordinary objectである場合、このアルゴリズムステップ以降で異常終了は発生しない。しかし、グローバルオブジェクトがProxy exotic objectである場合、以下のステップの一部で異常終了を引き起こす挙動を示すことがある。
  12. ホストがWebブラウザである、またはその他の形でBlock-Level Function Declarations Web Legacy Compatibility Semanticsをサポートする場合、
    1. scriptScriptIsStrictstrictとする。
    2. strictfalseである場合、
      1. declaredFuncNamesdeclaredVariableNameslist-concatenationdeclaredFuncOrVariableNamesとする。
      2. script Contains xtrueであるような任意のBlockCaseClause、またはDefaultClause xStatementListに直接含まれる各FunctionDeclaration funcDeclについて、次を行う。
        1. funcDeclBindingIdentifierStringValuefuncNameとする。
        2. FunctionDeclaration funcDeclを、funcNameBindingIdentifierとして持つVariableStatementに置き換えても、scriptに対してEarly Errorsが発生しない場合、
          1. HasLexicalDeclaration(envRecord, funcName)がfalseである場合、
            1. CanDeclareGlobalVar(envRecord, funcName)をfuncDefinableとする。
            2. funcDefinabletrueである場合、
              1. NOTE: funcNameに対するvar束縛は、それがVarDeclaredNameでも別のFunctionDeclarationの名前でもない場合にのみ、ここでインスタンス化される。
              2. declaredFuncOrVariableNamesfuncNameを含まない場合、
                1. CreateGlobalVarBinding(envRecord, funcName, false)を実行する。
                2. funcNamedeclaredFuncOrVariableNamesに追加する。
              3. FunctionDeclaration funcDeclが評価されるとき、15.2.6で提供されるFunctionDeclaration Evaluationアルゴリズムの代わりに、次のステップを実行する。
                1. 実行中の実行コンテキストのVariableEnvironmentをglobalEnvとする。
                2. 実行中の実行コンテキストのLexicalEnvironmentをblockEnvとする。
                3. blockEnv.GetBindingValue(funcName, false)をfuncObjとする。
                4. globalEnv.SetMutableBinding(funcName, funcObj, false)を実行する。
                5. unusedを返す。
  13. scriptLexicallyScopedDeclarationslexicalDeclsとする。
  14. privateEnvnullとする。
  15. lexicalDeclsの各要素lexicalDeclについて、次を行う。
    1. NOTE: Lexically declared nameは、ここでインスタンス化されるだけで、初期化されない。
    2. lexicalDeclBoundNamesの各要素nameについて、次を行う。
      1. lexicalDeclIsConstantDeclarationtrueである場合、
        1. envRecord.CreateImmutableBinding(name, true)を実行する。
      2. そうでなければ、
        1. envRecord.CreateMutableBinding(name, false)を実行する。
  16. funcsToInitializeの各Parse Node funcDeclについて、次を行う。
    1. funcDeclBoundNamesの唯一の要素をfuncNameとする。
    2. envRecordおよびprivateEnvを引数として、funcDeclInstantiateFunctionObjectfuncObjとする。
    3. CreateGlobalFunctionBinding(envRecord, funcName, funcObj, false)を実行する。
  17. declaredVariableNamesの各String variableNameについて、次を行う。
    1. CreateGlobalVarBinding(envRecord, variableName, false)を実行する。
  18. unusedを返す。
Note 2

16.1.1で指定されるearly errorsは、単一のScript内に含まれるdeclarationについて、function/var declarationsとlet/const/class declarationsの間のname conflicts、ならびにlet/const/class bindingsのredeclarationを防止します。ただし、複数のScriptにまたがるそのようなconflictsおよびredeclarationsは、GlobalDeclarationInstantiation中にruntime errorsとして検出されます。そのようなerrorsが検出された場合、そのscriptに対するbindingsは一切instantiatedされません。ただし、global objectProxy exotic objectsを使用して定義されている場合、conflicting declarationsに対するruntime testsは信頼できないことがあり、その結果としてabrupt completionが発生し、一部のglobal declarationsがinstantiatedされない場合があります。この場合、Scriptのcodeは評価されません。

explicit varまたはfunction declarationsとは異なり、global object上に直接作成されるpropertiesは、let/const/class declarationsによってshadowされ得るglobal bindingsをもたらします。

16.2 Modules

Syntax

Module : ModuleBodyopt ModuleBody : ModuleItemList ModuleItemList : ModuleItem ModuleItemList ModuleItem ModuleItem : ImportDeclaration ExportDeclaration StatementListItem[~Yield, +Await, ~Return] ModuleExportName : IdentifierName StringLiteral

16.2.1 Module Semantics

16.2.1.1 Static Semantics: Early Errors

ModuleBody : ModuleItemList Note

重複ExportedNames ruleは、ModuleBody内の複数のexport default ExportDeclaration itemsがSyntax Errorであることを意味します。conflictingまたはduplicate declarationsに関係する追加のerror conditionsは、Moduleのevaluationより前のmodule linking中にcheckされます。そのようなerrorsが検出された場合、Moduleは評価されません。

ModuleExportName : StringLiteral

16.2.1.2 Static Semantics: ImportedLocalNames ( importEntries )

The abstract operation ImportedLocalNames takes argument importEntries (a List of ImportEntry Records) and returns a List of Strings. importEntriesによって定義されるすべてのlocal name bindingsのListを作成します。 It performs the following steps when called:

  1. localNamesを新しい空のListとする。
  2. importEntriesの各ImportEntry Record importEntryについて、次を行う。
    1. importEntry.[[LocalName]]localNamesに追加する。
  3. localNamesを返す。

16.2.1.3 ModuleRequest Records

ModuleRequest Recordは、与えられたimport attributesでmoduleをimportするrequestを表します。これは次のfieldsから構成されます:

Table 36: ModuleRequest Record Fields
Field Name Value Type Meaning
[[Specifier]] a String module specifier
[[Attributes]] a List of ImportAttribute Records import attributes

LoadedModuleRequest Recordは、moduleをimportするrequestを、その結果として得られるModule Recordとともに表します。これは、Table 36で定義された同じfieldsに、[[Module]]を追加したものから構成されます:

Table 37: LoadedModuleRequest Record Fields
Field Name Value Type Meaning
[[Specifier]] a String module specifier
[[Attributes]] a List of ImportAttribute Records import attributes
[[Module]] a Module Record このmodule requestに対応するloaded module

ImportAttribute Recordは次のfieldsから構成されます:

Table 38: ImportAttribute Record Fields
Field Name Value Type Meaning
[[Key]] a String attribute key
[[Value]] a String attribute value

16.2.1.3.1 ModuleRequestsEqual ( x, y )

The abstract operation ModuleRequestsEqual takes arguments x (a ModuleRequest Record or a LoadedModuleRequest Record) and y (a ModuleRequest Record or a LoadedModuleRequest Record) and returns a Boolean. It performs the following steps when called:

  1. x.[[Specifier]]y.[[Specifier]]でないなら、falseを返す。
  2. xAttrsx.[[Attributes]]とする。
  3. yAttrsy.[[Attributes]]とする。
  4. xAttrsCountxAttrs内の要素数とする。
  5. yAttrsCountyAttrs内の要素数とする。
  6. xAttrsCountyAttrsCountなら、falseを返す。
  7. xAttrsの各ImportAttribute Record xAttrについて、以下を行う
    1. yAttrsが、xAttr.[[Key]]yAttr.[[Key]]であり、かつxAttr.[[Value]]yAttr.[[Value]]であるようなImportAttribute Record yAttrを含まないなら、falseを返す。
  8. trueを返す。

16.2.1.4 Static Semantics: ModuleRequests

The syntax-directed operation ModuleRequests takes no arguments and returns a List of ModuleRequest Records. It is defined piecewise over the following productions:

Module : [empty]
  1. 新しい空のListを返す。
ModuleItemList : ModuleItem
  1. ModuleItemModuleRequestsを返す。
ModuleItemList : ModuleItemList ModuleItem
  1. ModuleItemListModuleRequestsrequestsとする。
  2. ModuleItemModuleRequestsadditionalRequestsとする。
  3. additionalRequestsの各ModuleRequest Record moduleRequestについて、次を行う。
    1. ModuleRequestsEqual(moduleRequest, otherModuleRequest)がtrueであるようなModuleRequest Record otherModuleRequestrequestsが含まない場合、
      1. moduleRequestrequestsに追加する。
  4. requestsを返す。
ModuleItem : StatementListItem
  1. 新しい空のListを返す。
ImportDeclaration : import ImportClause FromClause ;
  1. specifierFromClauseSVとする。
  2. 唯一の要素がModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: « » }であるListを返す。
ImportDeclaration : import ImportClause FromClause WithClause ;
  1. specifierFromClauseSVとする。
  2. attrsWithClauseWithClauseToAttributesとする。
  3. 唯一の要素がModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: attrs }であるListを返す。
ImportDeclaration : import ModuleSpecifier ;
  1. specifierModuleSpecifierSVとする。
  2. 唯一の要素がModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: « » }であるListを返す。
ImportDeclaration : import ModuleSpecifier WithClause ;
  1. specifierModuleSpecifierSVとする。
  2. attrsWithClauseWithClauseToAttributesとする。
  3. 唯一の要素がModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: attrs }であるListを返す。
ExportDeclaration : export ExportFromClause FromClause ;
  1. specifierFromClauseSVとする。
  2. 唯一の要素がModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: « » }であるListを返す。
ExportDeclaration : export ExportFromClause FromClause WithClause ;
  1. specifierFromClauseSVとする。
  2. attrsWithClauseWithClauseToAttributesとする。
  3. 唯一の要素がModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: attrs }であるListを返す。
ExportDeclaration : export NamedExports ; export VariableStatement export Declaration export default HoistableDeclaration export default ClassDeclaration export default AssignmentExpression ;
  1. 新しい空のListを返す。

16.2.1.5 Abstract Module Records

Module Recordは、単一moduleのimportsおよびexportsに関するstructural informationをencapsulateします。この情報は、connected modulesのsetsのimportsおよびexportsをlinkするために使用されます。Module Recordには、moduleを評価するときにのみ使用される4つのfieldsが含まれます。

specification purposesのため、Module Record値はRecord specification typeの値であり、Module Recordがabstract classであり、abstractおよびconcrete subclassesの両方を持つsimple object-oriented hierarchy内に存在するものとして考えることができます。この仕様は、Cyclic Module Recordという名前のabstract subclassと、そのconcrete subclassであるSource Text Module Recordを定義します。他の仕様およびimplementationsは、それらが定義するalternative module definition facilitiesに対応する追加のModule Record subclassesを定義してもよいです。

Module RecordはTable 39に列挙されたfieldsを定義します。すべてのModule Definition subclassesは少なくともそれらのfieldsを含みます。Module Recordはまた、Table 40内のabstract method listを定義します。すべてのModule definition subclassesは、これらのabstract methodsのconcrete implementationsを提供しなければなりません。

Table 39: Module Record Fields
Field Name Value Type Meaning
[[Realm]] a Realm Record このmoduleが作成されたRealm
[[Environment]] a Module Environment Record or empty このmoduleに対するtop level bindingsを含むEnvironment Record。このfieldはmoduleがlinkedされたときに設定されます。
[[Namespace]] an Object or empty このmoduleに対して作成されている場合のModule Namespace Object(28.3)。
[[HostDefined]] anything (default value is undefined) moduleに追加情報を関連付ける必要があるhost environmentsによる使用のために予約されたfield。
Table 40: Abstract Methods of Module Records
Method Purpose Definitions
LoadRequestedModules ( [ hostDefined ] )

The abstract method LoadRequestedModules takes optional argument hostDefined (anything) and returns a Promise.

そのすべてのdependenciesを再帰的にloadすることで、linkingのためにmoduleを準備します。

この仕様内では、これは次のtypes内にdefinitionsを持ちます;hostsは独自のdefinitionsを持つ追加のtypesを提供してもよいです:
GetExportedNames ( [ exportStarSet ] )

The abstract method GetExportedNames takes optional argument exportStarSet (a List of Source Text Module Records) and returns a List of Strings.

このmoduleから直接または間接的にexportされるすべてのnamesのlistを返します。

このmethodをinvokeする前に、LoadRequestedModulesはsuccessfullyに完了していなければなりません。

この仕様内では、これは次のtypes内にdefinitionsを持ちます;hostsは独自のdefinitionsを持つ追加のtypesを提供してもよいです:
ResolveExport ( exportName [ , resolveSet ] )

The abstract method ResolveExport takes argument exportName (a String) and optional argument resolveSet (a List of Records with fields [[Module]] (a Module Record) and [[ExportName]] (a String)) and returns a ResolvedBinding Record, null, or ambiguous.

このmoduleによってexportされるnameのbindingを返します。Bindingsは、{ [[Module]]: Module Record, [[BindingName]]: String | namespace }という形式のResolvedBinding Recordによって表されます。exportがどのmoduleにもdirect bindingを持たないModule Namespace Objectである場合、[[BindingName]]namespaceに設定されます。nameをresolveできない場合はnullを返し、複数のbindingsが見つかった場合はambiguousを返します。

このoperationが特定のexportNameresolveSet pairをargumentsとして呼び出されるたびに、同じresultを返さなければなりません。

このmethodをinvokeする前に、LoadRequestedModulesはsuccessfullyに完了していなければなりません。

この仕様内では、これは次のtypes内にdefinitionsを持ちます;hostsは独自のdefinitionsを持つ追加のtypesを提供してもよいです:
Evaluate ( )

The abstract method Evaluate takes no arguments and returns a Promise.

このmoduleおよびそのdependenciesのevaluationに対するpromiseを返します。このpromiseは、successful evaluation時またはすでにsuccessfullyに評価済みである場合にresolveされ、evaluation error時またはすでにunsuccessfullyに評価済みである場合にrejectされます。promiseがrejectedされる場合、hostsはpromise rejectionをhandleし、evaluation errorをrethrowすることが期待されます。このmoduleがCyclic Module Recordでない限り、返されるpromiseはすでにsettledでなければなりません。

このmethodをinvokeする前に、Linkはsuccessfullyに完了していなければなりません。

この仕様内では、これは次のtypes内にdefinitionsを持ちます;hostsは独自のdefinitionsを持つ追加のtypesを提供してもよいです:

16.2.1.5.1 EvaluateModuleSync ( module )

The abstract operation EvaluateModuleSync takes argument module (a Module Record) and returns either a normal completion containing unused or a throw completion. callerがmoduleのevaluationがすでにsettledされたpromiseを返すことをguaranteeする場合に、moduleをsynchronouslyに評価します。 It performs the following steps when called:

  1. Assert: moduleCyclic Module Recordでない。
  2. promisemodule.Evaluate()とする。
  3. Assert: promise.[[PromiseState]]fulfilledまたはrejectedのいずれかである。
  4. promise.[[PromiseState]]rejectedなら、
    1. promise.[[PromiseIsHandled]]falseなら、HostPromiseRejectionTracker(promise, "handle")を実行する。
    2. promise.[[PromiseIsHandled]]trueに設定する。
    3. promise.[[PromiseResult]]をThrowする。
  5. unusedを返す。

16.2.1.6 Cyclic Module Records

Cyclic Module Recordは、Cyclic Module Record typeのsubclassesである他のmodulesとdependency cyclesに参加できるmoduleに関する情報を表すために使用されます。Cyclic Module Record typeのsubclassesでないModule Recordsは、Source Text Module Recordsとのdependency cyclesに参加してはなりません。

Table 39で定義されるfieldsに加えて、Cyclic Module RecordsTable 41に列挙された追加のfieldsを持ちます

Table 41: Additional Fields of Cyclic Module Records
Field Name Value Type Meaning
[[Status]] new, unlinked, linking, linked, evaluating, evaluating-async, or evaluated Initially new。moduleがそのlifecycleを通じて進むにつれて、unlinkedlinkinglinkedevaluating、場合によりevaluating-asyncevaluatedへ(この順に)transitionします。evaluating-asyncは、このmoduleがそのasynchronous dependenciesのcompletion時にexecuteするためにqueuedされていること、または[[HasTLA]] fieldがtrueであり、すでにexecutedされてtop-level completionをpendingしているmoduleであることを示します。
[[EvaluationError]] a throw completion or empty evaluation中に発生したexceptionを表すthrow completion。exceptionが発生しなかった場合、または[[Status]]evaluatedでない場合はempty
[[DFSAncestorIndex]] an integer or empty LinkおよびEvaluate中にのみ使用されるauxiliary field。[[Status]]linkingまたはevaluatingのいずれかである場合、これはmoduleのdepth-first traversal indexまたは同じstrongly connected component内の“earlier” moduleのそれです。
[[RequestedModules]] a List of ModuleRequest Records このmodule内のimportsに関連付けられたModuleRequest RecordsList。このListはimportsのsource text occurrence orderです。
[[LoadedModules]] a List of LoadedModuleRequest Records このrecordによって表されるmoduleが、relative import attributesとともにmoduleのimportationをrequestするために使用したspecifier stringsから、resolved Module Recordへのmap。このlistは、ModuleRequestsEqual(r1, r2)がtrueであるような2つの異なるRecords r1およびr2を含みません。
[[CycleRoot]] a Cyclic Module Record or empty cycleの最初にvisitedされたmodule、strongly connected componentのroot DFS ancestor。cycle内にないmoduleについては、これはmodule自身になります。Evaluateが完了すると、moduleの[[DFSAncestorIndex]]はその[[CycleRoot]]のdepth-first traversal indexです。
[[HasTLA]] a Boolean このmoduleが個別にasynchronousであるかどうか(例えば、top-level awaitを含むSource Text Module Recordである場合)。asynchronous dependencyを持つことは、このfieldがtrueであることを意味しません。このfieldはmoduleがparsedされた後に変更されてはなりません。
[[AsyncEvaluationOrder]] unset, an integer, or done このfieldはinitiallyにunsetに設定され、完全にsynchronousなmodulesについてはunsetのままです。自身がasynchronousであるかasynchronous dependencyを持つmodulesについては、16.2.1.6.1.3.4によってpending modulesのexecutionがqueuedされるorderを決定するintegerに設定されます。pending moduleがsuccessfullyにexecutedされると、このfieldはdoneに設定されます。
[[TopLevelCapability]] a PromiseCapability Record or empty このmoduleが何らかのcycleの[[CycleRoot]]であり、そのcycle内の何らかのmoduleに対してEvaluate()が呼び出された場合、このfieldはそのevaluation全体に対するPromiseCapability Recordを含みます。これはEvaluate() abstract methodから返されるPromise objectをsettleするために使用されます。このfieldは、そのmoduleのdependenciesについては、それらのdependenciesのいずれかに対してtop-level Evaluate()が開始されていない限りemptyになります。
[[AsyncParentModules]] a List of Cyclic Module Records このmoduleまたはdependencyが[[HasTLA]] trueを持ち、executionが進行中である場合、これはtop-level execution jobに対するこのmoduleのparent importersをtrackします。これらのparent modulesは、このmoduleがsuccessfullyにexecutionを完了する前にはexecuteを開始しません。
[[PendingAsyncDependencies]] an integer or empty このmoduleがasynchronous dependenciesを持つ場合、これはこのmoduleのためにexecuteがremainingしているasynchronous dependency modulesの数をtrackします。asynchronous dependenciesを持つmoduleは、このfieldが0に到達し、execution errorsがない場合にexecutedされます。

Table 40で定義されるmethodsに加えて、Cyclic Module RecordsTable 42に列挙された追加のmethodsを持ちます:

Table 42: Additional Abstract Methods of Cyclic Module Records
Method Purpose Definitions
InitializeEnvironment ( )

The abstract method InitializeEnvironment takes no arguments and returns either a normal completion containing unused or a throw completion.

すべてのimported bindingsのresolvingを含め、moduleのEnvironment Recordをinitializeし、moduleのexecution contextを作成します。
この仕様内では、これは次のtypes内にdefinitionsを持ちます;hostsは独自のdefinitionsを持つ追加のtypesを提供してもよいです:
ExecuteModule ( [ capability ] )

The abstract method ExecuteModule takes optional argument capability (a PromiseCapability Record) and returns either a normal completion containing unused or a throw completion.

moduleのexecution context内でmoduleのcodeを評価します。このmoduleの[[HasTLA]]trueである場合、PromiseCapability Recordがargumentとして渡され、methodは与えられたcapabilityをresolveまたはrejectすることが期待されます。この場合、methodはexceptionをthrowしてはならず、必要に応じてPromiseCapability Recordをrejectしなければなりません。
この仕様内では、これは次のtypes内にdefinitionsを持ちます;hostsは独自のdefinitionsを持つ追加のtypesを提供してもよいです:

GraphLoadingState Recordは、module graphのloading processに関する情報を含むRecordです。これはHostLoadImportedModuleのcall後にloadingをcontinueするために使用されます。各GraphLoadingState RecordTable 43で定義されるfieldsを持ちます:

Table 43: GraphLoadingState Record Fields
Field Name Value Type Meaning
[[PromiseCapability]] a PromiseCapability Record loading processがfinishしたときにresolveするpromise。
[[IsLoading]] a Boolean loading processがまだfinishしておらず、successfullyでもerrorでもない場合はtrueです。
[[PendingModulesCount]] a non-negative integer pending HostLoadImportedModule callsの数をtrackします。
[[Visited]] a List of Cyclic Module Records circular dependenciesによるinfinite loopsを避けるため、current loading processによってすでにloadedされたCyclic Module Recordsのlistです。
[[HostDefined]] anything (default value is empty) LoadRequestedModules callerからHostLoadImportedModuleへ渡すhost-defined dataを含みます。

16.2.1.6.1 Implementation of Module Record Abstract Methods

以下は、Table 40で定義される対応するModule Record abstract methodsを実装するCyclic Module Recordのconcrete methodsです。

16.2.1.6.1.1 LoadRequestedModules ( [ hostDefined ] )

The LoadRequestedModules concrete method of a Cyclic Module Record module takes optional argument hostDefined (anything) and returns a Promise. moduleのdependency graph内のすべてのModule Records[[LoadedModules]]をpopulateします(作業の大半はauxiliary function InnerModuleLoadingによって行われます)。これはHostLoadImportedModule hookへ渡されるoptional hostDefined parameterを取ります。 It performs the following steps when called:

  1. hostDefinedが存在しないなら、hostDefinedemptyに設定する。
  2. promiseCapabilityを ! NewPromiseCapability(%Promise%) とする。
  3. stateGraphLoadingState Record { [[IsLoading]]: true, [[PendingModulesCount]]: 1, [[Visited]]: « », [[PromiseCapability]]: promiseCapability, [[HostDefined]]: hostDefined }とする。
  4. InnerModuleLoading(state, module)を実行する。
  5. promiseCapability.[[Promise]]を返す。
Note
hostDefined parameterは、imported modulesをfetchするために必要な追加情報を渡すために使用できます。例えばHTMLでは、<link rel="preload" as="..."> tagsに対して正しいfetch destinationを設定するために使用されます。 import() expressionsは決してhostDefined parameterを設定しません。

16.2.1.6.1.1.1 InnerModuleLoading ( state, module )

The abstract operation InnerModuleLoading takes arguments state (a GraphLoadingState Record) and module (a Module Record) and returns unused. LoadRequestedModulesによって使用され、moduleのdependency graphに対するactual loading processをrecursiveに実行します。 It performs the following steps when called:

  1. Assert: state.[[IsLoading]]trueである。
  2. moduleCyclic Module Recordであり、module.[[Status]]newであり、かつstate.[[Visited]]moduleを含まないなら、
    1. modulestate.[[Visited]]へappendする。
    2. requestedModulesCountmodule.[[RequestedModules]]内の要素数とする。
    3. state.[[PendingModulesCount]]state.[[PendingModulesCount]] + requestedModulesCountに設定する。
    4. module.[[RequestedModules]]の各ModuleRequest Record requestについて、以下を行う
      1. AllImportAttributesSupported(request.[[Attributes]])がfalseなら、
        1. errorThrowCompletion(a newly created SyntaxError object)とする。
        2. ContinueModuleLoading(state, error)を実行する。
      2. そうでなく、module.[[LoadedModules]]ModuleRequestsEqual(record, request)がtrueであるようなLoadedModuleRequest Record recordを含むなら、
        1. InnerModuleLoading(state, record.[[Module]])を実行する。
      3. そうでなければ、
        1. HostLoadImportedModule(module, request, state.[[HostDefined]], state)を実行する。
        2. NOTE: HostLoadImportedModuleFinishLoadingImportedModuleをcallし、これはContinueModuleLoadingを通じてgraph loading processへre-enterする。
      4. state.[[IsLoading]]falseなら、unusedを返す。
  3. Assert: state.[[PendingModulesCount]] ≥ 1である。
  4. state.[[PendingModulesCount]]state.[[PendingModulesCount]] - 1に設定する。
  5. state.[[PendingModulesCount]] = 0なら、
    1. state.[[IsLoading]]falseに設定する。
    2. state.[[Visited]]の各Cyclic Module Record loadedについて、以下を行う
      1. loaded.[[Status]]newなら、loaded.[[Status]]unlinkedに設定する。
    3. Call(state.[[PromiseCapability]].[[Resolve]], undefined, « undefined »)を実行する。
  6. unusedを返す。

16.2.1.6.1.1.2 ContinueModuleLoading ( state, moduleCompletion )

The abstract operation ContinueModuleLoading takes arguments state (a GraphLoadingState Record) and moduleCompletion (either a normal completion containing a Module Record or a throw completion) and returns unused. HostLoadImportedModuleへのcall後にloading processへre-enterするために使用されます。 It performs the following steps when called:

  1. state.[[IsLoading]]falseなら、unusedを返す。
  2. moduleCompletionnormal completionなら、
    1. InnerModuleLoading(state, moduleCompletion.[[Value]])を実行する。
  3. そうでなければ、
    1. state.[[IsLoading]]falseに設定する。
    2. Call(state.[[PromiseCapability]].[[Reject]], undefined, « moduleCompletion.[[Value]] »)を実行する。
  4. unusedを返す。

16.2.1.6.1.2 Link ( )

The Link concrete method of a Cyclic Module Record module takes no arguments and returns either a normal completion containing unused or a throw completion. success時、Linkはこのmoduleの[[Status]]unlinkedからlinkedへtransitionします。failure時、exceptionがthrowされ、このmoduleの[[Status]]unlinkedのままです。(作業の大半はauxiliary function InnerModuleLinkingによって行われます。) It performs the following steps when called:

  1. Assert: module.[[Status]]unlinkedlinkedevaluating-async、またはevaluatedのいずれかである。
  2. stackを新しい空のListとする。
  3. Completion(InnerModuleLinking(module, stack, 0))をresultとする。
  4. resultabrupt completionである場合、
    1. stackの各Cyclic Module Record requiredModuleについて、次を行う。
      1. Assert: requiredModule.[[Status]]linkingである。
      2. requiredModule.[[Status]]unlinkedに設定する。
    2. Assert: module.[[Status]]unlinkedである。
    3. resultを返す。
  5. Assert: module.[[Status]]linkedevaluating-async、またはevaluatedのいずれかである。
  6. Assert: stackは空である。
  7. unusedを返す。

16.2.1.6.1.2.1 InnerModuleLinking ( module, stack, index )

The abstract operation InnerModuleLinking takes arguments module (a Module Record), stack (a List of Cyclic Module Records), and index (a non-negative integer) and returns either a normal completion containing a non-negative integer or a throw completion. Linkによって使用され、moduleに対するactual linking processを実行し、dependency graph内の他のすべてのmodulesに対してもrecursiveに実行します。stackおよびindex parameters、ならびにmoduleの[[DFSAncestorIndex]] fieldは、depth-first search (DFS) traversalをtrackします。特に、[[DFSAncestorIndex]]はstrongly connected components (SCCs)をdiscoverするために使用され、SCC内のすべてのmodulesは一緒にlinkedへtransitionします。 It performs the following steps when called:

  1. moduleCyclic Module Recordでないなら、
    1. module.Link()を実行する。
    2. indexを返す。
  2. module.[[Status]]linkinglinkedevaluating-async、またはevaluatedのいずれかなら、
    1. indexを返す。
  3. Assert: module.[[Status]]unlinkedである。
  4. module.[[Status]]linkingに設定する。
  5. moduleIndexindexとする。
  6. module.[[DFSAncestorIndex]]indexに設定する。
  7. indexindex + 1に設定する。
  8. modulestackへappendする。
  9. module.[[RequestedModules]]の各ModuleRequest Record requestについて、以下を行う
    1. requiredModuleGetImportedModule(module, request)とする。
    2. indexを ? InnerModuleLinking(requiredModule, stack, index) に設定する。
    3. requiredModuleCyclic Module Recordなら、
      1. Assert: requiredModule.[[Status]]linkinglinkedevaluating-async、またはevaluatedのいずれかである。
      2. Assert: requiredModule.[[Status]]linkingであることとstackrequiredModuleを含むことは同値である。
      3. requiredModule.[[Status]]linkingなら、
        1. module.[[DFSAncestorIndex]]min(module.[[DFSAncestorIndex]], requiredModule.[[DFSAncestorIndex]])に設定する。
  10. module.InitializeEnvironment()を実行する。
  11. Assert: modulestack内にちょうど1回出現する。
  12. Assert: module.[[DFSAncestorIndex]]moduleIndexである。
  13. module.[[DFSAncestorIndex]] = moduleIndexなら、
    1. donefalseとする。
    2. donefalseである間、繰り返す
      1. requiredModulestackの最後の要素とする。
      2. stackの最後の要素をremoveする。
      3. Assert: requiredModuleCyclic Module Recordである。
      4. requiredModule.[[Status]]linkedに設定する。
      5. requiredModulemoduleが同じModule Recordなら、donetrueに設定する。
  14. indexを返す。

16.2.1.6.1.3 Evaluate ( )

The Evaluate concrete method of a Cyclic Module Record module takes no arguments and returns a Promise. Evaluateはこのmoduleの[[Status]]linkedからevaluating-asyncまたはevaluatedのいずれかへtransitionします。与えられたstrongly connected component内のmoduleに対して初めて呼び出されると、EvaluateはmoduleのevaluationがfinishしたときにresolveするPromiseを作成して返します。このPromiseはcomponentの[[CycleRoot]][[TopLevelCapability]] fieldにstoredされます。component内の任意のmoduleに対するfuture invocations of Evaluateは同じPromiseを返します。(作業の大半はauxiliary function InnerModuleEvaluationによって行われます。) It performs the following steps when called:

  1. Assert: このEvaluateへの呼び出しは、周囲のagent内の別のEvaluateへの呼び出しと同時には発生していない。
  2. Assert: module.[[Status]]linkedevaluating-async、またはevaluatedのいずれかである。
  3. module.[[Status]]evaluating-asyncまたはevaluatedのいずれかである場合、
    1. module.[[CycleRoot]]emptyでない場合、
      1. modulemodule.[[CycleRoot]]に設定する。
    2. そうでなければ、
      1. Assert: module.[[Status]]evaluatedであり、module.[[EvaluationError]]throw completionである。
  4. module.[[TopLevelCapability]]emptyでない場合、
    1. module.[[TopLevelCapability]].[[Promise]]を返す。
  5. stackを新しい空のListとする。
  6. NewPromiseCapability(%Promise%)をpromiseCapabilityとする。
  7. module.[[TopLevelCapability]]promiseCapabilityに設定する。
  8. Completion(InnerModuleEvaluation(module, stack, 0))をresultとする。
  9. resultabrupt completionである場合、
    1. stackの各Cyclic Module Record requiredModuleについて、次を行う。
      1. Assert: requiredModule.[[Status]]evaluatingである。
      2. requiredModule.[[Status]]evaluatedに設定する。
      3. requiredModule.[[EvaluationError]]resultに設定する。
    2. Assert: module.[[Status]]evaluatedである。
    3. Assert: module.[[EvaluationError]]resultは同じCompletion Recordである。
    4. Call(promiseCapability.[[Reject]], undefined, « result.[[Value]] »)を実行する。
  10. そうでなければ、
    1. Assert: module.[[Status]]evaluating-asyncまたはevaluatedのいずれかである。
    2. Assert: module.[[EvaluationError]]emptyである。
    3. module.[[Status]]evaluatedである場合、
      1. Assert: module.[[AsyncEvaluationOrder]]unsetまたはdoneのいずれかである。
      2. NOTE: module.[[AsyncEvaluationOrder]]doneであるのは、moduleが既に評価済みであり、かつその評価が非同期であった場合に限る。
      3. Call(promiseCapability.[[Resolve]], undefined, « undefined »)を実行する。
    4. Assert: stackは空である。
  11. promiseCapability.[[Promise]]を返す。

16.2.1.6.1.3.1 InnerModuleEvaluation ( module, stack, index )

The abstract operation InnerModuleEvaluation takes arguments module (a Module Record), stack (a List of Cyclic Module Records), and index (a non-negative integer) and returns either a normal completion containing a non-negative integer or a throw completion. Evaluateによって使用され、moduleに対するactual evaluation processを実行し、dependency graph内の他のすべてのmodulesに対してもrecursiveに実行します。stackおよびindex parameters、ならびにmodule[[DFSAncestorIndex]] fieldは、InnerModuleLinkingと同じ方法で使用されます。 It performs the following steps when called:

  1. moduleCyclic Module Recordでないなら、
    1. EvaluateModuleSync(module)を実行する。
    2. indexを返す。
  2. module.[[Status]]evaluating-asyncまたはevaluatedのいずれかなら、
    1. module.[[EvaluationError]]emptyなら、indexを返す。
    2. module.[[EvaluationError]]を返す。
  3. module.[[Status]]evaluatingなら、indexを返す。
  4. Assert: module.[[Status]]linkedである。
  5. module.[[Status]]evaluatingに設定する。
  6. moduleIndexindexとする。
  7. module.[[DFSAncestorIndex]]indexに設定する。
  8. module.[[PendingAsyncDependencies]]を0に設定する。
  9. indexindex + 1に設定する。
  10. modulestackへappendする。
  11. module.[[RequestedModules]]の各ModuleRequest Record requestについて、以下を行う
    1. requiredModuleGetImportedModule(module, request)とする。
    2. indexを ? InnerModuleEvaluation(requiredModule, stack, index) に設定する。
    3. requiredModuleCyclic Module Recordなら、
      1. Assert: requiredModule.[[Status]]evaluatingevaluating-async、またはevaluatedのいずれかである。
      2. Assert: requiredModule.[[Status]]evaluatingであることとstackrequiredModuleを含むことは同値である。
      3. requiredModule.[[Status]]evaluatingなら、
        1. module.[[DFSAncestorIndex]]min(module.[[DFSAncestorIndex]], requiredModule.[[DFSAncestorIndex]])に設定する。
      4. そうでなければ、
        1. requiredModulerequiredModule.[[CycleRoot]]に設定する。
        2. Assert: requiredModule.[[Status]]evaluating-asyncまたはevaluatedのいずれかである。
        3. requiredModule.[[EvaluationError]]emptyでないなら、? requiredModule.[[EvaluationError]]を返す。
      5. requiredModule.[[AsyncEvaluationOrder]]integerなら、
        1. module.[[PendingAsyncDependencies]]module.[[PendingAsyncDependencies]] + 1に設定する。
        2. modulerequiredModule.[[AsyncParentModules]]へappendする。
  12. module.[[PendingAsyncDependencies]] > 0またはmodule.[[HasTLA]]trueなら、
    1. Assert: module.[[AsyncEvaluationOrder]]unsetである。
    2. module.[[AsyncEvaluationOrder]]IncrementModuleAsyncEvaluationCount()に設定する。
    3. module.[[PendingAsyncDependencies]] = 0なら、ExecuteAsyncModule(module)を実行する。
  13. そうでなければ、
    1. module.ExecuteModule()を実行する。
  14. Assert: modulestack内にちょうど1回出現する。
  15. Assert: module.[[DFSAncestorIndex]]moduleIndexである。
  16. module.[[DFSAncestorIndex]] = moduleIndexなら、
    1. donefalseとする。
    2. donefalseである間、繰り返す
      1. requiredModulestackの最後の要素とする。
      2. stackの最後の要素をremoveする。
      3. Assert: requiredModuleCyclic Module Recordである。
      4. Assert: requiredModule.[[AsyncEvaluationOrder]]integerまたはunsetのいずれかである。
      5. requiredModule.[[AsyncEvaluationOrder]]unsetなら、requiredModule.[[Status]]evaluatedに設定する。
      6. そうでなければ、requiredModule.[[Status]]evaluating-asyncに設定する。
      7. requiredModulemoduleが同じModule Recordなら、donetrueに設定する。
      8. requiredModule.[[CycleRoot]]moduleに設定する。
  17. indexを返す。
Note 1

moduleは、InnerModuleEvaluationによってtraversedされている間はevaluatingです。moduleはexecution completion時にevaluatedとなり、またはその[[HasTLA]] fieldがtrueであるかasynchronous dependenciesを持つ場合、execution中はevaluating-asyncになります。

Note 2

asynchronous cycleのmoduleに依存する任意のmodulesは、そのcycleがevaluatingでないとき、その代わりに[[CycleRoot]]を介してcycleのrootのexecutionに依存します。これにより、cycle stateをそのroot module stateを通じて単一のstrongly connected componentとして扱うことが保証されます。

16.2.1.6.1.3.2 ExecuteAsyncModule ( module )

The abstract operation ExecuteAsyncModule takes argument module (a Cyclic Module Record) and returns unused. It performs the following steps when called:

  1. Assert: module.[[Status]]evaluatingまたはevaluating-asyncのいずれかである。
  2. Assert: module.[[HasTLA]]trueである。
  3. promiseCapabilityを ! NewPromiseCapability(%Promise%) とする。
  4. moduleをcaptureし、呼び出されたとき次のstepsを実行する、parametersを持たない新しいAbstract Closure fulfilledClosureとする:
    1. AsyncModuleExecutionFulfilled(module)を実行する。
    2. NormalCompletion(undefined)を返す。
  5. onFulfilledCreateBuiltinFunction(fulfilledClosure, 0, "", « »)とする。
  6. moduleをcaptureし、呼び出されたとき次のstepsを実行する、parameters (error)を持つ新しいAbstract Closure rejectedClosureとする:
    1. AsyncModuleExecutionRejected(module, error)を実行する。
    2. NormalCompletion(undefined)を返す。
  7. onRejectedCreateBuiltinFunction(rejectedClosure, 0, "", « »)とする。
  8. PerformPromiseThen(promiseCapability.[[Promise]], onFulfilled, onRejected)を実行する。
  9. module.ExecuteModule(promiseCapability)を実行する。
  10. unusedを返す。

16.2.1.6.1.3.3 GatherAvailableAncestors ( module, execList )

The abstract operation GatherAvailableAncestors takes arguments module (a Cyclic Module Record) and execList (a List of Cyclic Module Records) and returns unused. It performs the following steps when called:

  1. module.[[AsyncParentModules]]の各Cyclic Module Record ancestorModuleについて、以下を行う
    1. execListancestorModuleを含まず、かつancestorModule.[[CycleRoot]].[[EvaluationError]]emptyであるなら、
      1. Assert: ancestorModule.[[Status]]evaluating-asyncである。
      2. Assert: ancestorModule.[[EvaluationError]]emptyである。
      3. Assert: ancestorModule.[[AsyncEvaluationOrder]]integerである。
      4. Assert: ancestorModule.[[PendingAsyncDependencies]] > 0である。
      5. ancestorModule.[[PendingAsyncDependencies]]ancestorModule.[[PendingAsyncDependencies]] - 1に設定する。
      6. ancestorModule.[[PendingAsyncDependencies]] = 0なら、
        1. ancestorModuleexecListへappendする。
        2. ancestorModule.[[HasTLA]]falseなら、GatherAvailableAncestors(ancestorModule, execList)を実行する。
  2. unusedを返す。
Note

root moduleに対するasynchronous executionがfulfilledされると、このfunctionは、このcompletion時に一緒にsynchronouslyにexecuteできるmodulesのlistを決定し、それらをexecListにpopulateします。

16.2.1.6.1.3.4 AsyncModuleExecutionFulfilled ( module )

The abstract operation AsyncModuleExecutionFulfilled takes argument module (a Cyclic Module Record) and returns unused. It performs the following steps when called:

  1. module.[[Status]]evaluatedなら、
    1. Assert: module.[[EvaluationError]]emptyでない。
    2. unusedを返す。
  2. Assert: module.[[Status]]evaluating-asyncである。
  3. Assert: module.[[AsyncEvaluationOrder]]integerである。
  4. Assert: module.[[EvaluationError]]emptyである。
  5. module.[[AsyncEvaluationOrder]]doneに設定する。
  6. module.[[Status]]evaluatedに設定する。
  7. module.[[TopLevelCapability]]emptyでないなら、
    1. Assert: module.[[CycleRoot]]moduleは同じModule Recordである。
    2. Call(module.[[TopLevelCapability]].[[Resolve]], undefined, « undefined »)を実行する。
  8. execListを新しい空のListとする。
  9. GatherAvailableAncestors(module, execList)を実行する。
  10. Assert: execListのすべての要素は、その[[AsyncEvaluationOrder]] fieldがintegerに、[[PendingAsyncDependencies]] fieldが0に、[[EvaluationError]] fieldがemptyに設定されている。
  11. sortedExecListを、その要素がexecListの要素であり、それらの[[AsyncEvaluationOrder]] fieldの昇順でsortedされたListとする。
  12. sortedExecListの各Cyclic Module Record ancestorModuleについて、以下を行う
    1. ancestorModule.[[Status]]evaluatedなら、
      1. Assert: ancestorModule.[[EvaluationError]]emptyでない。
    2. そうでなく、ancestorModule.[[HasTLA]]trueなら、
      1. ExecuteAsyncModule(ancestorModule)を実行する。
    3. そうでなければ、
      1. resultCompletion(ancestorModule.ExecuteModule())とする。
      2. resultabrupt completionなら、
        1. AsyncModuleExecutionRejected(ancestorModule, result.[[Value]])を実行する。
      3. そうでなければ、
        1. ancestorModule.[[AsyncEvaluationOrder]]doneに設定する。
        2. ancestorModule.[[Status]]evaluatedに設定する。
        3. ancestorModule.[[TopLevelCapability]]emptyでないなら、
          1. Assert: ancestorModule.[[CycleRoot]]ancestorModuleは同じModule Recordである。
          2. Call(ancestorModule.[[TopLevelCapability]].[[Resolve]], undefined, « undefined »)を実行する。
  13. unusedを返す。

16.2.1.6.1.3.5 AsyncModuleExecutionRejected ( module, error )

The abstract operation AsyncModuleExecutionRejected takes arguments module (a Cyclic Module Record) and error (an ECMAScript language value) and returns unused. It performs the following steps when called:

  1. module.[[Status]]evaluatedなら、
    1. Assert: module.[[EvaluationError]]emptyでない。
    2. unusedを返す。
  2. Assert: module.[[Status]]evaluating-asyncである。
  3. Assert: module.[[AsyncEvaluationOrder]]integerである。
  4. Assert: module.[[EvaluationError]]emptyである。
  5. module.[[EvaluationError]]ThrowCompletion(error)に設定する。
  6. module.[[Status]]evaluatedに設定する。
  7. module.[[AsyncEvaluationOrder]]doneに設定する。
  8. NOTE: module.[[AsyncEvaluationOrder]]AsyncModuleExecutionFulfilledとのsymmetryのためにdoneに設定される。InnerModuleEvaluationにおいて、moduleの[[AsyncEvaluationOrder]] internal slotの値は、その[[EvaluationError]] internal slotがemptyでない場合には使用されない。
  9. module.[[TopLevelCapability]]emptyでないなら、
    1. Assert: module.[[CycleRoot]]moduleは同じModule Recordである。
    2. Call(module.[[TopLevelCapability]].[[Reject]], undefined, « error »)を実行する。
  10. module.[[AsyncParentModules]]の各Cyclic Module Record ancestorModuleについて、以下を行う
    1. AsyncModuleExecutionRejected(ancestorModule, error)を実行する。
  11. unusedを返す。

16.2.1.6.2 Example Cyclic Module Record Graphs

このnon-normative sectionは、errorsがどのように発生し得るかに特にfocusして、いくつかのcommon module graphsのlinkingおよびevaluationの一連のexamplesを示します。

まず、次のsimple module graphを考えます:

Figure 2: A simple module graph
A module graph in which module A depends on module B, and module B depends on module C

まず、error conditionsがないと仮定します。hostが最初にA.LoadRequestedModules()をcallすると、これは仮定によりsuccessfullyに完了し、BおよびCのdependencies(それぞれCおよびnone)もrecursiveにloadし、その後A.[[Status]] = B.[[Status]] = C.[[Status]] = unlinkedを設定します。次に、hostがA.Link()をcallすると、これは(再び仮定により)successfullyに完了し、A.[[Status]] = B.[[Status]] = C.[[Status]] = linkedとなります。これらのpreparatory stepsは任意の時点で実行できます。後にhostがmodulesのpossible side effectsをincurする準備ができたとき、A.Evaluate()をcallでき、これはsuccessfullyに完了し、undefinedへresolveするPromiseを返し(再び仮定により)、まずC、次にBをrecursiveに評価済みにします。この時点で各moduleの[[Status]]evaluatedになります。

次に、A.LoadRequestedModules()へのsuccessful callの後にlinking errorsが関係するcasesを考えます。CInnerModuleLinkingがsucceedsしたが、その後Bについてfailsする場合、例えばBCが提供しないものをimportするためにfailsする場合、original A.Link()はfailし、AB[[Status]]unlinkedのままです。ただしC[[Status]]linkedになっています。

最後に、Link()へのsuccessful call後にevaluation errorsが関係するcaseを考えます。CInnerModuleEvaluationがsucceedsしたが、その後Bについてfailsする場合、例えばBがexceptionをthrowするcodeを含むためにfailsする場合、original A.Evaluate()はfailし、rejected Promiseを返します。結果として生じるexceptionはAB[[EvaluationError]] fieldsの両方にrecordedされ、それらの[[Status]]evaluatedになります。Cevaluatedになりますが、AおよびBとは対照的に、successfullyにevaluationを完了したため[[EvaluationError]]を持たないままです。exceptionをstoreすることで、hostがAまたはBをreuseしようとしてEvaluate() methodをcallするたびに、同じexceptionにencounterすることが保証されます。(HostsCyclic Module Recordsをreuseする必要はありません;同様に、hostsはこれらのmethodsによってthrownされたexception objectsをexposeする必要はありません。ただし、この仕様はそのようなusesを可能にします。)

次に、異なるtypeのerror conditionを考えます:

Figure 3: A module graph with an unresolvable module
A module graph in which module A depends on a missing (unresolvable) module, represented by ???

このscenarioでは、module Aが何らかの他のmoduleへのdependencyをdeclareしていますが、そのmoduleに対するModule Recordは存在しません。すなわち、HostLoadImportedModuleは、それを求められたときexceptionを伴ってFinishLoadingImportedModuleをcallします。これは、対応するresourceが存在しない、またはresourceは存在するがresulting source textをparseしようとしたときParseModuleが何らかのerrorsを返すなど、さまざまなreasonsで発生し得ます。Hostsは、FinishLoadingImportedModuleへ渡すcompletionを通じてfailureのcauseをexposeすることを選択できます。いずれの場合も、このexceptionはloading failureを引き起こし、その結果A[[Status]]newのままになります。

ここでのloading、linking、evaluation errorsの違いは、次のcharacteristicに起因します:

  • Evaluationはside effectsを引き起こす可能性があるため、1回だけ実行されなければなりません;したがって、たとえunsuccessfullyであったとしても、evaluationがすでに実行されたかどうかをrememberすることが重要です。(error caseでは、そうしなければsubsequent Evaluate() callsが新しいexceptionをsynthesizeしなければならないため、exceptionもrememberすることに意味があります。)
  • 一方、Linkingはside-effect-freeであるため、failしたとしても、問題なくlater timeにretryできます。
  • Loadingはhostとcloselyにinteractsし、hostsによってはfailed loadsをusersがretryできるようにすることがdesirableである場合があります(例えば、failureがtemporarily bad network conditionsによって引き起こされた場合)。

次に、cycleを持つmodule graphを考えます:

Figure 4: A cyclic module graph
A module graph in which module A depends on module B and C, but module B also depends on module A

ここではentry pointがmodule Aであると仮定します。そのため、hostはA.LoadRequestedModules()をcallして進み、これはAに対してInnerModuleLoadingを実行します。これはさらにBおよびCに対してInnerModuleLoadingをcallします。cycleのため、これは再びAに対してInnerModuleLoadingをtriggerしますが、この時点では、このLoadRequestedModules process中にAのdependencies loadingがすでにtriggerされているため、no-opです。graph内のすべてのmodulesがsuccessfullyにloadedされると、それらの[[Status]]は同時にnewからunlinkedへtransitionします。

その後、hostはA.Link()をcallして進み、これはAに対してInnerModuleLinkingを実行します。これはさらにBに対してInnerModuleLinkingをcallします。cycleのため、これは再びAに対してInnerModuleLinkingをtriggerしますが、この時点ではA.[[Status]]がすでにlinkingであるためno-opです。controlがAへ戻り、Cに対してInnerModuleLinkingがtriggerされるとき、B.[[Status]]自体はlinkingのままです。これがC.[[Status]]linkedになって戻った後、ABは一緒にlinkingからlinkedへtransitionします;これは、それらがstrongly connected componentを形成しているため、by designです。このphaseではmodule graphがdepth-first searchでtraversedされるため、同じSCC内のmodulesのstatusを同時にtransitionすることが可能です。

cyclic module graphのevaluation phaseについても、success caseではanalogous storyが発生します。

次に、Aにlinking errorがあるcaseを考えます;例えば、ACから存在しないbindingをimportしようとする場合です。その場合、上記のstepsはやはり発生し、Aに対する2回目のInnerModuleLinking callからのearly returnも含まれます。しかし、original InnerModuleLinking on Aまでunwindすると、InitializeEnvironment中、すなわちC.ResolveExport()の直後にfailします。thrown SyntaxError exceptionはA.Linkへpropagateし、これはcurrently stack上にあるすべてのmodules(これらは常にちょうどまだlinkingであるmodulesです)をresetします。したがってABの両方がunlinkedになります。Clinkedのまま残ることに注意してください。

あるいは、Aにevaluation errorがあるcaseを考えます;例えば、そのsource codeがexceptionをthrowする場合です。その場合、上記stepsのevaluation-time analogueはやはり発生し、Aに対する2回目のInnerModuleEvaluation callからのearly returnも含まれます。しかし、original InnerModuleEvaluation on Aまでunwindすると、仮定によりfailします。thrown exceptionはA.Evaluate()へpropagateし、これはcurrently stack上にあるすべてのmodules(すなわちまだevaluatingであるmodules)にerrorをrecordし、またtop-level awaitを含む、またはそれに依存するmodulesのchainをdependency graph全体に形成する[[AsyncParentModules]]を介して、AsyncModuleExecutionRejected algorithmによってもrecordします。したがってABの両方がevaluatedになり、exceptionはAB[[EvaluationError]] fieldsの両方にrecordedされる一方、C[[EvaluationError]]なしでevaluatedのまま残ります。

最後に、すべてのmodulesがasynchronouslyにcompleteするcycleを持つmodule graphを考えます:

Figure 5: An asynchronous cyclic module graph
A module graph in which module A depends on module B and C, module B depends on module D, module C depends on module D and E, and module D depends on module A

Loadingおよびlinkingは以前と同様に発生し、すべてのmodulesは[[Status]]linkedに設定されて終了します。

A.Evaluate()をcallすると、ABDに対してInnerModuleEvaluationがcallされ、それらはすべてevaluatingへtransitionします。その後、Aに対してInnerModuleEvaluationが再びcallされますが、すでにevaluatingであるためno-opです。この時点でD.[[PendingAsyncDependencies]]は0なので、ExecuteAsyncModule(D)がcallされ、Dのasynchronous executionをtrackする新しいPromiseCapabilityを伴ってD.ExecuteModuleをcallします。Bに対するInnerModuleEvaluationまでunwindし、B.[[PendingAsyncDependencies]]を1に、B.[[AsyncEvaluationOrder]]を1に設定します。original InnerModuleEvaluation on Aまでunwindし、A.[[PendingAsyncDependencies]]を1に設定します。Aのdependenciesに対するloopの次のiterationで、Cに対して、したがってD(再びno-op)およびEに対してInnerModuleEvaluationをcallします。Eにはdependenciesがなくcycleの一部でないため、Dと同じ方法でExecuteAsyncModule(E)をcallし、Eは直ちにstackからremoveされます。もう一度Cに対するInnerModuleEvaluationまでunwindし、C.[[AsyncEvaluationOrder]]を3に設定します。これでAのdependenciesに対するloopをfinishし、A.[[AsyncEvaluationOrder]]を4に設定し、entire strongly connected componentをstackからremoveして、すべてのmodulesを一度にevaluating-asyncへtransitionします。この時点で、modulesのfieldsはTable 44に示す通りです。

Table 44: Module fields after the initial Evaluate() call
Field
Module
A B C D E
[[DFSAncestorIndex]] 0 0 0 0 4
[[Status]] evaluating-async evaluating-async evaluating-async evaluating-async evaluating-async
[[AsyncEvaluationOrder]] 4 1 3 0 2
[[AsyncParentModules]] « » « A » « A » « B, C » « C »
[[PendingAsyncDependencies]] 2 (B and C) 1 (D) 2 (D and E) 0 0

Eが最初にexecutingをfinishすると仮定します。その場合、AsyncModuleExecutionFulfilledがcallされ、E.[[Status]]evaluatedに設定され、C.[[PendingAsyncDependencies]]はdecrementされて1になります。updated modulesのfieldsはTable 45に示す通りです。

Table 45: Module fields after module E finishes executing
Field
Module
C E
[[DFSAncestorIndex]] 0 4
[[Status]] evaluating-async evaluated
[[AsyncEvaluationOrder]] 3 done
[[AsyncParentModules]] « A » « C »
[[PendingAsyncDependencies]] 1 (D) 0

次にfinishするのはDです(まだexecutingしていた唯一のmoduleだったため)。その場合、AsyncModuleExecutionFulfilledが再びcallされ、D.[[Status]]evaluatedに設定されます。executionにavailableなそのancestorsはB(その[[AsyncEvaluationOrder]]は1)とC(その[[AsyncEvaluationOrder]]は3)であるため、Bが最初にhandledされます:B.[[PendingAsyncDependencies]]はdecrementされて0になり、ExecuteAsyncModuleBに対してcallされ、executingを開始します。C.[[PendingAsyncDependencies]]もdecrementされて0になり、Cがexecutingを開始します(Bawaitを含む場合、potentiallyにBとparallelに)。updated modulesのfieldsはTable 46に示す通りです。

Table 46: Module fields after module D finishes executing
Field
Module
B C D
[[DFSAncestorIndex]] 0 0 0
[[Status]] evaluating-async evaluating-async evaluated
[[AsyncEvaluationOrder]] 1 3 done
[[AsyncParentModules]] « A » « A » « B, C »
[[PendingAsyncDependencies]] 0 0 0

Cが次にexecutingをfinishすると仮定します。その場合、AsyncModuleExecutionFulfilledが再びcallされ、C.[[Status]]evaluatedに設定され、A.[[PendingAsyncDependencies]]はdecrementされて1になります。updated modulesのfieldsはTable 47に示す通りです。

Table 47: Module fields after module C finishes executing
Field
Module
A C
[[DFSAncestorIndex]] 0 0
[[Status]] evaluating-async evaluated
[[AsyncEvaluationOrder]] 4 done
[[AsyncParentModules]] « » « A »
[[PendingAsyncDependencies]] 1 (B) 0

次に、Bがexecutingをfinishします。その場合、AsyncModuleExecutionFulfilledが再びcallされ、B.[[Status]]evaluatedに設定されます。A.[[PendingAsyncDependencies]]はdecrementされて0になるため、ExecuteAsyncModuleがcallされ、Aがexecutingを開始します。updated modulesのfieldsはTable 48に示す通りです。

Table 48: Module fields after module B finishes executing
Field
Module
A B
[[DFSAncestorIndex]] 0 0
[[Status]] evaluating-async evaluated
[[AsyncEvaluationOrder]] 4 done
[[AsyncParentModules]] « » « A »
[[PendingAsyncDependencies]] 0 0

最後に、Aがexecutingをfinishします。その場合、AsyncModuleExecutionFulfilledが再びcallされ、A.[[Status]]evaluatedに設定されます。この時点で、A.[[TopLevelCapability]]内のPromise(A.Evaluate()から返されたもの)がresolvedされ、このmodule graphのhandlingは終了します。updated moduleのfieldsはTable 49に示す通りです。

Table 49: Module fields after module A finishes executing
Field
Module
A
[[DFSAncestorIndex]] 0
[[Status]] evaluated
[[AsyncEvaluationOrder]] done
[[AsyncParentModules]] « »
[[PendingAsyncDependencies]] 0

あるいは、Bがexecutingをfinishする前にCがexecutionにfailし、errorを返すfailure caseを考えます。その場合、AsyncModuleExecutionRejectedがcallされ、これはC.[[Status]]evaluatedに、C.[[EvaluationError]]をそのerrorに設定します。その後、各AsyncParentModulesに対してAsyncModuleExecutionRejectedを実行することで、このerrorをすべてのAsyncParentModulesへpropagateします。updated modulesのfieldsはTable 50に示す通りです。

Table 50: Module fields after module C finishes with an error
Field
Module
A C
[[DFSAncestorIndex]] 0 0
[[Status]] evaluated evaluated
[[AsyncEvaluationOrder]] done done
[[AsyncParentModules]] « » « A »
[[PendingAsyncDependencies]] 1 (B) 0
[[EvaluationError]] empty C's evaluation error

CCのerrorを伴ってAに対してAsyncModuleExecutionRejectedをcallするため、ACと同じerrorでrejectedされます。A.[[Status]]evaluatedに設定されます。この時点でA.[[TopLevelCapability]]内のPromise(A.Evaluate()から返されたもの)はrejectedされます。updated moduleのfieldsはTable 51に示す通りです。

Table 51: Module fields after module A is rejected
Field
Module
A
[[DFSAncestorIndex]] 0
[[Status]] evaluated
[[AsyncEvaluationOrder]] done
[[AsyncParentModules]] « »
[[PendingAsyncDependencies]] 0
[[EvaluationError]] C's Evaluation Error

その後、Bがerrorなしでexecutingをfinishします。その場合、AsyncModuleExecutionFulfilledが再びcallされ、B.[[Status]]evaluatedに設定されます。GatherAvailableAncestorsBに対してcallされます。しかし、A.[[CycleRoot]]Aであり、これはevaluation errorを持つため、返されるsortedExecListには追加されず、AsyncModuleExecutionFulfilledはさらなるprocessingなしでreturnします。Bの任意のfuture importerは、cycle root A上に設定されたCからのevaluation errorから、B.[[CycleRoot]].[[EvaluationError]]のrejectionをresolveします。updated modulesのfieldsはTable 52に示す通りです。

Table 52: Module fields after module B finishes executing in an erroring graph
Field
Module
A B
[[DFSAncestorIndex]] 0 0
[[Status]] evaluated evaluated
[[AsyncEvaluationOrder]] 4 1
[[AsyncParentModules]] « » « A »
[[PendingAsyncDependencies]] 0 0
[[EvaluationError]] C's Evaluation Error empty

16.2.1.7 Source Text Module Records

Source Text Module Recordは、goal symbol Moduleを使用してparsedされたECMAScript source text11)から定義されたmoduleに関する情報を表すために使用されます。そのfieldsは、moduleによってimportおよびexportされるnamesに関するdigested informationを含み、そのconcrete methodsはこれらのdigestsを使用してmoduleをlinkおよびevaluateします。

Source Text Module Recordは、abstract Module Record typeの他のsubclassesとともにmodule graph内に存在でき、Cyclic Module Record typeの他のsubclassesとともにcyclesに参加できます。

Table 41で定義されるfieldsに加えて、Source Text Module RecordsTable 53に列挙された追加のfieldsを持ちます。これらの各fieldはParseModule内でinitiallyに設定されます。

Table 53: Additional Fields of Source Text Module Records
Field Name Value Type Meaning
[[ECMAScriptCode]] a Parse Node Modulegoal symbolとして使用してこのmoduleのsource textをparseした結果。
[[Context]] an ECMAScript code execution context or empty このmoduleに関連付けられたexecution context。moduleのenvironmentがinitializedされるまではemptyです。
[[ImportMeta]] an Object or empty import.meta meta propertyを通じてexposedされるobject。ECMAScript codeによってaccessされるまではemptyです。
[[ImportEntries]] a List of ImportEntry Records このmoduleのcodeからderivedされたImportEntry recordsのList
[[LocalExportEntries]] a List of ExportEntry Records module内でoccurするdeclarationsに対応する、このmoduleのcodeからderivedされたExportEntry recordsのList
[[IndirectExportEntries]] a List of ExportEntry Records module内でoccurするreexported imports、またはexport * as namespace declarationsからのexportsに対応する、このmoduleのcodeからderivedされたExportEntry recordsのList
[[StarExportEntries]] a List of ExportEntry Records module内でoccurするexport * declarationsに対応する、このmoduleのcodeからderivedされたExportEntry recordsのList。ただしexport * as namespace declarationsは含まれません。

ImportEntry Recordは、単一のdeclarative importに関する情報をdigestするRecordです。各ImportEntry RecordTable 54で定義されるfieldsを持ちます:

Table 54: ImportEntry Record Fields
Field Name Value Type Meaning
[[ModuleRequest]] a ModuleRequest Record ImportDeclarationModuleSpecifierおよびimport attributesを表すModuleRequest Record
[[ImportName]] a String or namespace [[ModuleRequest]]によってidentifiedされるmoduleによってdesired bindingがexportされているname。値namespaceは、import requestがtarget moduleのnamespace objectに対するものであることを示します。
[[LocalName]] a String importing module内からimported valueにlocallyにaccessするために使用されるname。
Note 1

Table 55は、syntactic import formsを表すために使用されるImportEntry records fieldsのexamplesを示します:

Table 55 (Informative): Import Forms Mappings to ImportEntry Records
Import Statement Form [[ModuleRequest]] [[ImportName]] [[LocalName]]
import v from "mod"; "mod" "default" "v"
import * as ns from "mod"; "mod" namespace "ns"
import {x} from "mod"; "mod" "x" "x"
import {x as v} from "mod"; "mod" "x" "v"
import "mod"; ImportEntry Recordは作成されません。

ExportEntry Recordは、単一のdeclarative exportに関する情報をdigestするRecordです。各ExportEntry RecordTable 56で定義されるfieldsを持ちます:

Table 56: ExportEntry Record Fields
Field Name Value Type Meaning
[[ExportName]] a String or null このmoduleによってこのbindingをexportするために使用されるname。
[[ModuleRequest]] a ModuleRequest Record or null ExportDeclarationModuleSpecifierおよびimport attributesを表すModuleRequest RecordExportDeclarationModuleSpecifierを持たない場合はnull
[[ImportName]] a String, null, namespace, or all-but-default [[ModuleRequest]]によってidentifiedされるmoduleによってdesired bindingがexportされているname。ExportDeclarationModuleSpecifierを持たない場合はnullnamespaceexport * as ns from "mod" declarationsに使用されます。all-but-defaultexport * from "mod" declarationsに使用されます。
[[LocalName]] a String or null importing module内からexported valueにlocallyにaccessするために使用されるname。exported valueがmodule内からlocallyにaccessできない場合はnull
Note 2

Table 57は、syntactic export formsを表すために使用されるExportEntry record fieldsのexamplesを示します:

Table 57 (Informative): Export Forms Mappings to ExportEntry Records
Export Statement Form [[ExportName]] [[ModuleRequest]] [[ImportName]] [[LocalName]]
export var v; "v" null null "v"
export default function f() {} "default" null null "f"
export default function () {} "default" null null "*default*"
export default 42; "default" null null "*default*"
export {x}; "x" null null "x"
export {v as x}; "x" null null "v"
export {x} from "mod"; "x" "mod" "x" null
export {v as x} from "mod"; "x" "mod" "v" null
export * from "mod"; null "mod" all-but-default null
export * as ns from "mod"; "ns" "mod" namespace null

次のdefinitionsは、Source Text Module Recordsに対してrequired concrete methodsおよびその他のabstract operationsを指定します

16.2.1.7.1 ParseModule ( sourceText, realm, hostDefined )

The abstract operation ParseModule takes arguments sourceText (a String or a sequence of Unicode code points), realm (a Realm Record), and hostDefined (anything) and returns a Source Text Module Record or a non-empty List of SyntaxError objects. sourceTextModuleとしてparseした結果に基づいてSource Text Module Recordを作成します。 It performs the following steps when called:

  1. bodyParseText(sourceText, Module)とする。
  2. bodyがerrorsのListなら、bodyを返す。
  3. requestedModulesbodyModuleRequestsとする。
  4. importEntriesbodyImportEntriesとする。
  5. importedBoundNamesImportedLocalNames(importEntries)とする。
  6. indirectExportEntriesを新しい空のListとする。
  7. localExportEntriesを新しい空のListとする。
  8. starExportEntriesを新しい空のListとする。
  9. exportEntriesbodyExportEntriesとする。
  10. exportEntriesの各ExportEntry Record exportEntryについて、以下を行う
    1. exportEntry.[[ModuleRequest]]nullなら、
      1. importedBoundNamesexportEntry.[[LocalName]]を含まないなら、
        1. exportEntrylocalExportEntriesへappendする。
      2. そうでなければ、
        1. NOTE: もともと別のmoduleからimportされたbindingまたはnamespace objectをexportするとき、ExportEntry Recordは、bindingまたはnamespace objectがimportされてからexportされるのではなく、original moduleから直接re-exportされていた場合のformにmatchするようにrewrittenされる。これにより、export * fromを通じて同じbindingまたはnamespaceを同じnameで2回exportすることから生じるconflictsは、Source Text Module RecordsのResolveExport concrete methodのstep 9.e.iiiでambiguousとして扱われるのではなく、ignoredできる。
        2. importEntryimportEntriesのうち[[LocalName]]exportEntry.[[LocalName]]である要素とする。
        3. ExportEntry Record { [[ModuleRequest]]: importEntry.[[ModuleRequest]], [[ImportName]]: importEntry.[[ImportName]], [[LocalName]]: null, [[ExportName]]: exportEntry.[[ExportName]] }をindirectExportEntriesへappendする。
    2. そうでなく、exportEntry.[[ImportName]]all-but-defaultなら、
      1. Assert: exportEntry.[[ExportName]]nullである。
      2. exportEntrystarExportEntriesへappendする。
    3. そうでなければ、
      1. exportEntryindirectExportEntriesへappendする。
  11. asyncbody Contains awaitとする。
  12. Source Text Module Record { [[Realm]]: realm, [[Environment]]: empty, [[Namespace]]: empty, [[CycleRoot]]: empty, [[HasTLA]]: async, [[AsyncEvaluationOrder]]: unset, [[TopLevelCapability]]: empty, [[AsyncParentModules]]: « », [[PendingAsyncDependencies]]: empty, [[Status]]: new, [[EvaluationError]]: empty, [[HostDefined]]: hostDefined, [[ECMAScriptCode]]: body, [[Context]]: empty, [[ImportMeta]]: empty, [[RequestedModules]]: requestedModules, [[LoadedModules]]: « », [[ImportEntries]]: importEntries, [[LocalExportEntries]]: localExportEntries, [[IndirectExportEntries]]: indirectExportEntries, [[StarExportEntries]]: starExportEntries, [[DFSAncestorIndex]]: empty }を返す。
Note

implementationは、そのmodule source textに対するParseModuleのevaluationより前に、module source textをparseし、それをEarly Error conditionsについてanalyseしてもよいです。ただし、errorsのreportingは、この仕様が実際にそのsource textに対してParseModuleを実行する時点までdeferされなければなりません。

16.2.1.7.2 Implementation of Module Record Abstract Methods

以下は、Table 40で定義される対応するModule Record abstract methodsを実装するSource Text Module Recordのconcrete methodsです。

16.2.1.7.2.1 GetExportedNames ( [ exportStarSet ] )

The GetExportedNames concrete method of a Source Text Module Record module takes optional argument exportStarSet (a List of Source Text Module Records) and returns a List of Strings. It performs the following steps when called:

  1. Assert: module.[[Status]]newではない。
  2. exportStarSetが存在しない場合、exportStarSetを新しい空のListに設定する。
  3. exportStarSetmoduleを含む場合、
    1. Assert: export *の循環の開始点に到達している。
    2. 新しい空のListを返す。
  4. moduleexportStarSetに追加する。
  5. exportedNamesを新しい空のListとする。
  6. module.[[LocalExportEntries]]の各ExportEntry Record exportEntryについて、次を行う。
    1. Assert: moduleはこのエクスポートに対する直接束縛を提供する。
    2. Assert: exportEntry.[[ExportName]]nullではない。
    3. exportEntry.[[ExportName]]exportedNamesに追加する。
  7. module.[[IndirectExportEntries]]の各ExportEntry Record exportEntryについて、次を行う。
    1. Assert: moduleはこのエクスポートに対する特定の束縛をインポートしている。
    2. Assert: exportEntry.[[ExportName]]nullではない。
    3. exportEntry.[[ExportName]]exportedNamesに追加する。
  8. module.[[StarExportEntries]]の各ExportEntry Record exportEntryについて、次を行う。
    1. Assert: exportEntry.[[ModuleRequest]]nullではない。
    2. GetImportedModule(module, exportEntry.[[ModuleRequest]])をrequestedModuleとする。
    3. requestedModule.GetExportedNames(exportStarSet)をstarNamesとする。
    4. starNamesの各要素nameについて、次を行う。
      1. name"default"でない場合、
        1. exportedNamesnameを含まない場合、
          1. nameexportedNamesに追加する。
  9. exportedNamesを返す。
Note

GetExportedNamesは、ambiguous star export bindingsを持つnamesをfilter outしたり、それに対してexceptionをthrowしたりしません。

16.2.1.7.2.2 ResolveExport ( exportName [ , resolveSet ] )

The ResolveExport concrete method of a Source Text Module Record module takes argument exportName (a String) and optional argument resolveSet (a List of Records with fields [[Module]] (a Module Record) and [[ExportName]] (a String)) and returns a ResolvedBinding Record, null, or ambiguous.

ResolveExportは、imported bindingをactual defining moduleおよびlocal binding nameへresolveすることを試みます。defining moduleは、このmethodがinvokedされたModule Recordによって表されるmoduleである場合も、そのmoduleによってimportされる他のmoduleである場合もあります。parameter resolveSetは、unresolved circular import/export pathsをdetectするために使用されます。specific Module RecordexportNameからなるpairがすでにresolveSet内にある状態で到達された場合、import circularityにencounterしています。ResolveExportをrecursiveにcallする前に、moduleexportNameからなるpairがresolveSetに追加されます。

defining moduleが見つかった場合、ResolvedBinding Record { [[Module]], [[BindingName]] }が返されます。このrecordは、これがlocal bindingを持たないnamespaceのexportでない限り、originally requested exportのresolved bindingをidentifyします。この場合、[[BindingName]]namespaceに設定されます。definitionが見つからなかった場合、またはrequestがcircularであることが見つかった場合、nullが返されます。requestがambiguousであることが見つかった場合、ambiguousが返されます。

It performs the following steps when called:

  1. Assert: module.[[Status]]newではない。
  2. resolveSetが存在しない場合、resolveSetを新しい空のListに設定する。
  3. resolveSetの各Record { [[Module]], [[ExportName]] } recordについて、次を行う。
    1. modulerecord.[[Module]]が同じModule Recordであり、かつexportNamerecord.[[ExportName]]である場合、
      1. Assert: これは循環import要求である。
      2. nullを返す。
  4. Record { [[Module]]: module, [[ExportName]]: exportName }をresolveSetに追加する。
  5. module.[[LocalExportEntries]]の各ExportEntry Record exportEntryについて、次を行う。
    1. exportEntry.[[ExportName]]exportNameである場合、
      1. Assert: moduleはこのエクスポートに対する直接束縛を提供する。
      2. ResolvedBinding Record { [[Module]]: module, [[BindingName]]: exportEntry.[[LocalName]] }を返す。
  6. module.[[IndirectExportEntries]]の各ExportEntry Record exportEntryについて、次を行う。
    1. exportEntry.[[ExportName]]exportNameである場合、
      1. Assert: exportEntry.[[ModuleRequest]]nullではない。
      2. GetImportedModule(module, exportEntry.[[ModuleRequest]])をimportedModuleとする。
      3. exportEntry.[[ImportName]]namespaceである場合、
        1. Assert: moduleはこのエクスポートに対する直接束縛を提供しない。
        2. ResolvedBinding Record { [[Module]]: importedModule, [[BindingName]]: namespace }を返す。
      4. Assert: moduleはこのエクスポートに対する特定の束縛をインポートしている。
      5. Assert: exportEntry.[[ImportName]]はStringである。
      6. importedModule.ResolveExport(exportEntry.[[ImportName]], resolveSet)を返す。
  7. exportName"default"である場合、
    1. Assert: defaultエクスポートはこのモジュールによって明示的に定義されていなかった。
    2. nullを返す。
    3. NOTE: defaultエクスポートはexport * from "mod"宣言によって提供されることはできない。
  8. starResolutionnullとする。
  9. module.[[StarExportEntries]]の各ExportEntry Record exportEntryについて、次を行う。
    1. Assert: exportEntry.[[ModuleRequest]]nullではない。
    2. GetImportedModule(module, exportEntry.[[ModuleRequest]])をimportedModuleとする。
    3. importedModule.ResolveExport(exportName, resolveSet)をresolutionとする。
    4. resolutionambiguousである場合、ambiguousを返す。
    5. resolutionnullでない場合、
      1. Assert: resolutionResolvedBinding Recordである。
      2. starResolutionnullである場合、
        1. starResolutionresolutionに設定する。
      3. そうでなければ、
        1. Assert: 要求された名前を含む*エクスポートが複数存在する。
        2. resolution.[[Module]]starResolution.[[Module]]が同じModule Recordでない場合、ambiguousを返す。
        3. resolution.[[BindingName]]starResolution.[[BindingName]]でない場合、ambiguousを返す。
  10. starResolutionを返す。

16.2.1.7.3 Implementation of Cyclic Module Record Abstract Methods

以下は、Table 42で定義される対応するCyclic Module Record abstract methodsを実装するSource Text Module Recordのconcrete methodsです。

16.2.1.7.3.1 InitializeEnvironment ( )

The InitializeEnvironment concrete method of a Source Text Module Record module takes no arguments and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. module.[[IndirectExportEntries]]の各ExportEntry Record exportEntryについて、次を行う。
    1. Assert: exportEntry.[[ExportName]]nullではない。
    2. module.ResolveExport(exportEntry.[[ExportName]])をresolutionとする。
    3. resolutionnullまたはambiguousのいずれかである場合、SyntaxError例外を投げる。
    4. Assert: resolutionResolvedBinding Recordである。
  2. Assert: moduleからのすべての名前付きエクスポートは解決可能である。
  3. module.[[Realm]]realmとする。
  4. Assert: realmundefinedではない。
  5. NewModuleEnvironment(realm.[[GlobalEnv]])をenvRecordとする。
  6. module.[[Environment]]envRecordに設定する。
  7. module.[[ImportEntries]]の各ImportEntry Record importEntryについて、次を行う。
    1. GetImportedModule(module, importEntry.[[ModuleRequest]])をimportedModuleとする。
    2. importEntry.[[ImportName]]namespaceである場合、
      1. GetModuleNamespace(importedModule)をnamespaceとする。
      2. envRecord.CreateImmutableBinding(importEntry.[[LocalName]], true)を実行する。
      3. envRecord.InitializeBinding(importEntry.[[LocalName]], namespace)を実行する。
    3. そうでなければ、
      1. Assert: importEntry.[[ImportName]]はStringである。
      2. importedModule.ResolveExport(importEntry.[[ImportName]])をresolutionとする。
      3. resolutionnullまたはambiguousのいずれかである場合、SyntaxError例外を投げる。
      4. resolution.[[BindingName]]namespaceである場合、
        1. GetModuleNamespace(resolution.[[Module]])をnamespaceとする。
        2. envRecord.CreateImmutableBinding(importEntry.[[LocalName]], true)を実行する。
        3. envRecord.InitializeBinding(importEntry.[[LocalName]], namespace)を実行する。
      5. そうでなければ、
        1. CreateImportBinding(envRecord, importEntry.[[LocalName]], resolution.[[Module]], resolution.[[BindingName]])を実行する。
  8. moduleContextを新しいECMAScriptコード実行コンテキストとする。
  9. moduleContextのFunctionをnullに設定する。
  10. Assert: module.[[Realm]]undefinedではない。
  11. moduleContextRealmmodule.[[Realm]]に設定する。
  12. moduleContextのScriptOrModuleをmoduleに設定する。
  13. moduleContextのVariableEnvironmentをmodule.[[Environment]]に設定する。
  14. moduleContextのLexicalEnvironmentをmodule.[[Environment]]に設定する。
  15. moduleContextのPrivateEnvironmentをnullに設定する。
  16. module.[[Context]]moduleContextに設定する。
  17. moduleContextを実行コンテキストスタックにプッシュする。moduleContextは現在、実行中の実行コンテキストである。
  18. module.[[ECMAScriptCode]]codeとする。
  19. codeVarScopedDeclarationsvariableDeclsとする。
  20. declaredVariableNamesを新しい空のListとする。
  21. variableDeclsの各要素variableDeclについて、次を行う。
    1. variableDeclBoundNamesの各要素nameについて、次を行う。
      1. declaredVariableNamesnameを含まない場合、
        1. envRecord.CreateMutableBinding(name, false)を実行する。
        2. envRecord.InitializeBinding(name, undefined)を実行する。
        3. namedeclaredVariableNamesに追加する。
  22. codeLexicallyScopedDeclarationslexicalDeclsとする。
  23. privateEnvnullとする。
  24. lexicalDeclsの各要素lexicalDeclについて、次を行う。
    1. lexicalDeclBoundNamesの各要素nameについて、次を行う。
      1. lexicalDeclIsConstantDeclarationtrueである場合、
        1. envRecord.CreateImmutableBinding(name, true)を実行する。
      2. そうでなければ、
        1. envRecord.CreateMutableBinding(name, false)を実行する。
      3. lexicalDeclFunctionDeclarationGeneratorDeclarationAsyncFunctionDeclaration、またはAsyncGeneratorDeclarationのいずれかである場合、
        1. envRecordおよびprivateEnvを引数として、lexicalDeclInstantiateFunctionObjectfuncObjとする。
        2. envRecord.InitializeBinding(name, funcObj)を実行する。
  25. moduleContextを実行コンテキストスタックから取り除く。
  26. unusedを返す。

16.2.1.7.3.2 ExecuteModule ( [ capability ] )

The ExecuteModule concrete method of a Source Text Module Record module takes optional argument capability (a PromiseCapability Record) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. Assert: module はリンク済みであり、そのモジュール環境内の宣言はインスタンス化済みである。
  2. moduleContextmodule.[[Context]] とする。
  3. module.[[HasTLA]]false である場合、then
    1. Assert: capability は存在しない。
    2. envmodule.[[Environment]] とする。
    3. 実行中の実行コンテキストを一時停止する。
    4. moduleContext を実行コンテキストスタックにプッシュする。moduleContext は今や実行中の実行コンテキストである。
    5. resultmodule.[[ECMAScriptCode]]EvaluationCompletion とする。
    6. resultCompletion(DisposeResources(env.[[DisposableResourceStack]], result)) に設定する。
    7. moduleContext を一時停止し、それを実行コンテキストスタックから取り除く。
    8. 現在実行コンテキストスタックの最上位にあるコンテキストを、実行中の実行コンテキストとして再開する。
    9. resultabrupt completion である場合、then
      1. Return ? result.
  4. Else,
    1. Assert: capabilityPromiseCapability Record である。
    2. AsyncBlockStart(capability, module.[[ECMAScriptCode]], moduleContext) を実行する。
  5. unused を返す。

16.2.1.8 Synthetic Module Records

Synthetic Module Recordは、specificationsによって定義されるmoduleに関する情報を表すために使用されます。そのexported namesはcreation時にstaticallyに定義され、一方でそれらに対応するvaluesはSetSyntheticModuleExportを使用して時間とともに変更できます。これはimportsまたはdependenciesを持ちません。

Note
Synthetic Module Recordは、さまざまなmodule typesを定義するために使用できます:例えば、JSON modulesやCSS modulesです。

Table 39で定義されるfieldsに加えて、Synthetic Module RecordsはTable 58に列挙された追加のfieldsを持ちます。

Table 58: Additional Fields of Synthetic Module Records
Field Name Value Type Meaning
[[ExportNames]] a List of Strings moduleのexportsのnames。このlistはduplicatesを含みません。
[[EvaluationSteps]] an Abstract Closure moduleのevaluation時に実行するinitialization logicであり、Synthetic Module Recordを唯一のargumentとして取ります。これは[[ExportNames]]を変更してはなりません。これはabrupt completionを返してもよいです。

16.2.1.8.1 CreateDefaultExportSyntheticModule ( defaultExport )

The abstract operation CreateDefaultExportSyntheticModule takes argument defaultExport (an ECMAScript language value) and returns a Synthetic Module Record. default exportがdefaultExportであるSynthetic Module Recordを作成します。 It performs the following steps when called:

  1. realmcurrent Realm Recordとする。
  2. defaultExportをcaptureし、呼び出されたとき次のstepsを実行する、parameters (module)を持つ新しいAbstract Closure setDefaultExportとする:
    1. SetSyntheticModuleExport(module, "default", defaultExport)を実行する。
    2. NormalCompletion(unused)を返す。
  3. Synthetic Module Record { [[Realm]]: realm, [[Environment]]: empty, [[Namespace]]: empty, [[HostDefined]]: undefined, [[ExportNames]]: « "default" », [[EvaluationSteps]]: setDefaultExport }を返す。

16.2.1.8.2 ParseJSONModule ( source )

The abstract operation ParseJSONModule takes argument source (a String) and returns either a normal completion containing a Synthetic Module Record, or a throw completion. It performs the following steps when called:

  1. parseResultを ? ParseJSON(source) とする。
  2. CreateDefaultExportSyntheticModule(parseResult.[[Value]])を返す。

16.2.1.8.3 SetSyntheticModuleExport ( module, exportName, exportValue )

The abstract operation SetSyntheticModuleExport takes arguments module (a Synthetic Module Record), exportName (a String), and exportValue (an ECMAScript language value) and returns unused. Synthetic Module Recordの既存のexportに対するexported valueをsetまたはchangeするために使用できます。 It performs the following steps when called:

  1. Assert: module.[[ExportNames]]exportNameを含む。
  2. envRecordmodule.[[Environment]]とする。
  3. Assert: envRecordemptyでない。
  4. envRecord.SetMutableBinding(exportName, exportValue, true)を実行する。
  5. unusedを返す。

16.2.1.8.4 Implementation of Module Record Abstract Methods

以下は、Table 40で定義される対応するModule Record abstract methodsを実装するSynthetic Module Recordのconcrete methodsです。

16.2.1.8.4.1 LoadRequestedModules ( [ hostDefined ] )

The LoadRequestedModules concrete method of a Synthetic Module Record module takes optional argument hostDefined (anything) and returns a Promise. It performs the following steps when called:

  1. NOTE: LoadRequestedModulesのこのimplementationはhostDefinedを使用しない。
  2. PromiseResolve(%Promise%, undefined)を返す。
Note
Synthetic Module Recordsはdependenciesを持ちません。

16.2.1.8.4.2 GetExportedNames ( [ exportStarSet ] )

The GetExportedNames concrete method of a Synthetic Module Record module takes optional argument exportStarSet (a List of Source Text Module Records) and returns a List of Strings. It performs the following steps when called:

  1. NOTE: GetExportedNamesのこのimplementationはexportStarSetを使用しない。
  2. module.[[ExportNames]]を返す。

16.2.1.8.4.3 ResolveExport ( exportName [ , resolveSet ] )

The ResolveExport concrete method of a Synthetic Module Record module takes argument exportName (a String) and optional argument resolveSet (a List of Records with fields [[Module]] (a Module Record) and [[ExportName]] (a String)) and returns a ResolvedBinding Record, null, or ambiguous. It performs the following steps when called:

  1. NOTE: ResolveExportのこのimplementationはresolveSetを使用しない。
  2. module.[[ExportNames]]exportNameを含まないなら、nullを返す。
  3. ResolvedBinding Record { [[Module]]: module, [[BindingName]]: exportName }を返す。

16.2.1.8.4.4 Link ( )

The Link concrete method of a Synthetic Module Record module takes no arguments and returns a normal completion containing unused. It performs the following steps when called:

  1. realmmodule.[[Realm]]とする。
  2. envRecordNewModuleEnvironment(realm.[[GlobalEnv]])とする。
  3. module.[[Environment]]envRecordに設定する。
  4. module.[[ExportNames]]の各String exportNameについて、以下を行う
    1. envRecord.CreateMutableBinding(exportName, false)を実行する。
    2. envRecord.InitializeBinding(exportName, undefined)を実行する。
  5. NormalCompletion(unused)を返す。

16.2.1.8.4.5 Evaluate ( )

The Evaluate concrete method of a Synthetic Module Record module takes no arguments and returns a Promise. It performs the following steps when called:

  1. moduleContextを新しいECMAScript code execution contextとする。
  2. moduleContextのFunctionをnullに設定する。
  3. moduleContextRealmmodule.[[Realm]]に設定する。
  4. moduleContextのScriptOrModuleをmoduleに設定する。
  5. moduleContextのVariableEnvironmentをmodule.[[Environment]]に設定する。
  6. moduleContextのLexicalEnvironmentをmodule.[[Environment]]に設定する。
  7. running execution contextをsuspendする。
  8. moduleContextexecution context stackへpushする;moduleContextは現在running execution contextである。
  9. stepsmodule.[[EvaluationSteps]]とする。
  10. resultCompletion(steps(module))とする。
  11. moduleContextをsuspendし、それをexecution context stackからremoveする。
  12. execution context stackのtopにあるcontextをrunning execution contextとしてresumeする。
  13. promiseCapabilityを ! NewPromiseCapability(%Promise%) とする。
  14. IfAbruptRejectPromise(result, promiseCapability)。
  15. Call(promiseCapability.[[Resolve]], undefined, « undefined »)を実行する。
  16. promiseCapability.[[Promise]]を返す。

16.2.1.9 GetImportedModule ( referrer, request )

The abstract operation GetImportedModule takes arguments referrer (a Cyclic Module Record) and request (a ModuleRequest Record) and returns a Module Record. It performs the following steps when called:

  1. recordsを、referrer.[[LoadedModules]]の各LoadedModuleRequest Record rのうち、ModuleRequestsEqual(r, request)がtrueであるものから構成されるListとする。
  2. Assert: このabstract operationをinvokeする前にLoadRequestedModulesreferrer上でsuccessfullyに完了しているため、recordsはちょうど1つの要素を持つ。
  3. recordrecordsの唯一の要素とする。
  4. record.[[Module]]を返す。

16.2.1.10 HostLoadImportedModule ( referrer, moduleRequest, hostDefined, payload )

The host-defined abstract operation HostLoadImportedModule takes arguments referrer (a Script Record, a Cyclic Module Record, or a Realm Record), moduleRequest (a ModuleRequest Record), hostDefined (anything), and payload (a GraphLoadingState Record or a PromiseCapability Record) and returns unused.

Note 1

referrerRealm Recordになり得る場合のexampleはweb browser host内にあります。そこでは、userが次によって与えられるcontrolをclickする場合、

<button type="button" onclick="import('./foo.mjs')">Click me</button>

import() expressionがrunsするとき、active scriptまたはmoduleは存在しません。より一般には、hostがnull ScriptOrModule componentsを持つexecution contextsexecution context stackへpushする任意の状況で、これは発生し得ます。

HostLoadImportedModuleのimplementationは次のrequirementsにconformしなければなりません:

  • host environmentは、FinishLoadingImportedModule(referrer, moduleRequest, payload, result)を実行しなければなりません。ここでresultはloaded Module Record含むnormal completionまたはthrow completionのいずれかであり、synchronouslyまたはasynchronouslyのいずれかで実行されます。
  • このoperationが、次を満たす2つの(referrer, moduleRequest) pairsで複数回callされた場合:

    • first referrerがsecond referrerと同じである;
    • ModuleRequestsEqual(the first moduleRequest, the second moduleRequest)がtrueである;

    かつ、resultnormal completionであるFinishLoadingImportedModule(referrer, moduleRequest, payload, result)を実行する場合、毎回同じresultを伴ってFinishLoadingImportedModule(referrer, moduleRequest, payload, result)を実行しなければなりません。

  • moduleRequest.[[Attributes]]が、entry.[[Key]]"type"であり、entry.[[Value]]"json"であるentry entryを持つ場合、host environmentがFinishLoadingImportedModule(referrer, moduleRequest, payload, result)を実行するとき、resultParseJSONModuleのinvocationによって返されたCompletion Recordまたはthrow completionのいずれかでなければなりません。

  • operationはpayloadFinishLoadingImportedModuleへpass throughされるopaque valueとして扱わなければなりません。

actual processはhost-definedですが、通常はappropriate Module Recordをloadするために必要な任意のI/O operationsを実行することから構成されます。複数の異なる(referrer, moduleRequest.[[Specifier]], moduleRequest.[[Attributes]]) triplesが同じModule Record instanceへmapされる場合があります。actual mapping semanticsはhost-definedですが、通常はmapping processの一部としてspecifierにnormalization processが適用されます。typical normalization processには、relativeおよびabbreviated path specifiersのexpansionなどのactionsが含まれます。

Note 2

上記のtextは、type: "json"でimportされたとき(かつHostLoadImportedModuleがnormallyにcompleteする場合)、hostsがJSON modulesをsupportすることをrequireしますが、type: "json"なしでimportされたときにhostsがJSON modulesをsupportすることをprohibitするものではありません。

16.2.1.11 FinishLoadingImportedModule ( referrer, moduleRequest, payload, result )

The abstract operation FinishLoadingImportedModule takes arguments referrer (a Script Record, a Cyclic Module Record, or a Realm Record), moduleRequest (a ModuleRequest Record), payload (a GraphLoadingState Record or a PromiseCapability Record), and result (either a normal completion containing a Module Record or a throw completion) and returns unused. It performs the following steps when called:

  1. resultnormal completionなら、
    1. referrer.[[LoadedModules]]が、ModuleRequestsEqual(record, moduleRequest)がtrueであるようなLoadedModuleRequest Record recordを含むなら、
      1. Assert: record.[[Module]]result.[[Value]]は同じModule Recordである。
    2. そうでなければ、
      1. LoadedModuleRequest Record { [[Specifier]]: moduleRequest.[[Specifier]], [[Attributes]]: moduleRequest.[[Attributes]], [[Module]]: result.[[Value]] }をreferrer.[[LoadedModules]]へappendする。
  2. payloadGraphLoadingState Recordなら、
    1. ContinueModuleLoading(payload, result)を実行する。
  3. そうでなければ、
    1. ContinueDynamicImport(payload, result)を実行する。
  4. unusedを返す。

16.2.1.12 AllImportAttributesSupported ( attrs )

The abstract operation AllImportAttributesSupported takes argument attrs (a List of ImportAttribute Records) and returns a Boolean. It performs the following steps when called:

  1. supportedHostGetSupportedImportAttributes()とする。
  2. attrsの各ImportAttribute Record attrについて、以下を行う
    1. supportedattr.[[Key]]を含まないなら、falseを返す。
  3. trueを返す。

16.2.1.12.1 HostGetSupportedImportAttributes ( )

The host-defined abstract operation HostGetSupportedImportAttributes takes no arguments and returns a List of Strings. host environmentsがsupportするimport attributesを指定できるようにします。supported keysを持つattributesのみがhostに提供されます。

HostGetSupportedImportAttributesのimplementationは次のrequirementsにconformしなければなりません:

  • これは、それぞれがsupported attributeを示すStringsのListを返さなければなりません。
  • このoperationが呼び出されるたびに、同じcontentsを同じorderで持つ同じListを返さなければなりません。

HostGetSupportedImportAttributesのdefault implementationは、新しい空のListを返すことです。

Note
hostがsupported import attributesを指定することをrequireし、すべてのattributesをhostに渡してhostがhandleしたいものを選ぶようにしない目的は、unsupported attributesが異なるhosts間でconsistentな方法でhandledされることを保証するためです。

16.2.1.13 GetModuleNamespace ( module )

The abstract operation GetModuleNamespace takes argument module (an instance of a concrete subclass of Module Record) and returns a Module Namespace Object. moduleのexportsを表すModule Namespace Objectをretrieveし、初回request時にlazilyに作成して、future retrievalのためにmodule.[[Namespace]]へstoreします。 It performs the following steps when called:

  1. Assert: moduleCyclic Module Recordなら、module.[[Status]]newでもunlinkedでもない。
  2. namespacemodule.[[Namespace]]とする。
  3. namespaceemptyなら、
    1. exportedNamesmodule.GetExportedNames()とする。
    2. unambiguousNamesを新しい空のListとする。
    3. exportedNamesの各要素nameについて、以下を行う
      1. resolutionmodule.ResolveExport(name)とする。
      2. resolutionResolvedBinding Recordなら、nameunambiguousNamesへappendする。
    4. namespaceModuleNamespaceCreate(module, unambiguousNames)に設定する。
  4. namespaceを返す。
Note

GetModuleNamespaceは決してthrowしません。代わりに、unresolvable namesはこの時点で単にnamespaceから除外されます。それらは、どこでもexplicitly requestedされていないambiguous star exportsだけでない限り、後でreal linking errorにつながります。

16.2.1.14 Runtime Semantics: Evaluation

Module : [empty]
  1. undefinedを返す。
ModuleBody : ModuleItemList
  1. resultModuleItemListEvaluationCompletionとする。
  2. resultnormal completionであり、かつresult.[[Value]]emptyであるなら、
    1. undefinedを返す。
  3. resultを返す。
ModuleItemList : ModuleItemList ModuleItem
  1. slModuleItemListの ? Evaluationとする。
  2. sModuleItemEvaluationCompletionとする。
  3. UpdateEmpty(s, sl)を返す。
Note

ModuleItemListの値は、ModuleItemList内で値を生成する最後のitemの値です。

ModuleItem : ImportDeclaration
  1. emptyを返す。

16.2.2 Imports

Syntax

ImportDeclaration : import ImportClause FromClause WithClauseopt ; import ModuleSpecifier WithClauseopt ; ImportClause : ImportedDefaultBinding NameSpaceImport NamedImports ImportedDefaultBinding , NameSpaceImport ImportedDefaultBinding , NamedImports ImportedDefaultBinding : ImportedBinding NameSpaceImport : * as ImportedBinding NamedImports : { } { ImportsList } { ImportsList , } FromClause : from ModuleSpecifier ImportsList : ImportSpecifier ImportsList , ImportSpecifier ImportSpecifier : ImportedBinding ModuleExportName as ImportedBinding ModuleSpecifier : StringLiteral ImportedBinding : BindingIdentifier[~Yield, +Await] WithClause : with { } with { WithEntries ,opt } WithEntries : AttributeKey : StringLiteral AttributeKey : StringLiteral , WithEntries AttributeKey : IdentifierName StringLiteral

16.2.2.1 Static Semantics: Early Errors

ModuleItem : ImportDeclaration WithClause : with { WithEntries ,opt }
  • WithClauseWithClauseToAttributesが、a.[[Key]]b.[[Key]]であるような2つの異なるentries aおよびbを持つ場合、それはSyntax Errorです。

16.2.2.2 Static Semantics: ImportEntries

The syntax-directed operation ImportEntries takes no arguments and returns a List of ImportEntry Records. It is defined piecewise over the following productions:

Module : [empty]
  1. 新しい空のListを返す。
ModuleItemList : ModuleItemList ModuleItem
  1. entries1ModuleItemListImportEntriesとする。
  2. entries2ModuleItemImportEntriesとする。
  3. entries1entries2list-concatenationを返す。
ModuleItem : ExportDeclaration StatementListItem
  1. 新しい空のListを返す。
ImportDeclaration : import ImportClause FromClause WithClauseopt ;
  1. moduleImportDeclarationModuleRequestsの唯一の要素とする。
  2. argument moduleを伴うImportClauseImportEntriesForModuleを返す。
ImportDeclaration : import ModuleSpecifier WithClauseopt ;
  1. 新しい空のListを返す。

16.2.2.3 Static Semantics: ImportEntriesForModule

The syntax-directed operation ImportEntriesForModule takes argument module (a ModuleRequest Record) and returns a List of ImportEntry Records. It is defined piecewise over the following productions:

ImportClause : ImportedDefaultBinding , NameSpaceImport
  1. entries1を、argument moduleを伴うImportedDefaultBindingImportEntriesForModuleとする。
  2. entries2を、argument moduleを伴うNameSpaceImportImportEntriesForModuleとする。
  3. entries1entries2list-concatenationを返す。
ImportClause : ImportedDefaultBinding , NamedImports
  1. entries1を、argument moduleを伴うImportedDefaultBindingImportEntriesForModuleとする。
  2. entries2を、argument moduleを伴うNamedImportsImportEntriesForModuleとする。
  3. entries1entries2list-concatenationを返す。
ImportedDefaultBinding : ImportedBinding
  1. localNameImportedBindingBoundNamesの唯一の要素とする。
  2. defaultEntryImportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: "default", [[LocalName]]: localName }とする。
  3. « defaultEntry »を返す。
NameSpaceImport : * as ImportedBinding
  1. localNameImportedBindingStringValueとする。
  2. entryImportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: namespace, [[LocalName]]: localName }とする。
  3. « entry »を返す。
NamedImports : { }
  1. 新しい空のListを返す。
ImportsList : ImportsList , ImportSpecifier
  1. specs1を、argument moduleを伴うImportsListImportEntriesForModuleとする。
  2. specs2を、argument moduleを伴うImportSpecifierImportEntriesForModuleとする。
  3. specs1specs2list-concatenationを返す。
ImportSpecifier : ImportedBinding
  1. localNameImportedBindingBoundNamesの唯一の要素とする。
  2. entryImportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: localName, [[LocalName]]: localName }とする。
  3. « entry »を返す。
ImportSpecifier : ModuleExportName as ImportedBinding
  1. importNameModuleExportNameStringValueとする。
  2. localNameImportedBindingStringValueとする。
  3. entryImportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName }とする。
  4. « entry »を返す。

16.2.2.4 Static Semantics: WithClauseToAttributes

The syntax-directed operation WithClauseToAttributes takes no arguments and returns a List of ImportAttribute Records. It is defined piecewise over the following productions:

WithClause : with { }
  1. 新しい空のListを返す。
WithClause : with { WithEntries ,opt }
  1. attrsWithEntriesWithClauseToAttributesとする。
  2. attrsを、それらの[[Key]] fieldのlexicographic orderに従ってsortする。このとき各fieldの値をUTF-16 code unit valuesのsequenceとして扱う。NOTE: このsortingは、hostsがattributesがenumeratedされるorderに基づいてbehaviourを変更することをprohibitedされる点でのみobservableである。
  3. attrsを返す。
WithEntries : AttributeKey : StringLiteral
  1. keyAttributeKeyPropNameとする。
  2. entryImportAttribute Record { [[Key]]: key, [[Value]]: StringLiteralSV }とする。
  3. « entry »を返す。
WithEntries : AttributeKey : StringLiteral , WithEntries
  1. keyAttributeKeyPropNameとする。
  2. entryImportAttribute Record { [[Key]]: key, [[Value]]: StringLiteralSV }とする。
  3. restWithEntriesWithClauseToAttributesとする。
  4. « entry »とrestlist-concatenationを返す。

16.2.3 Exports

Syntax

ExportDeclaration : export ExportFromClause FromClause WithClauseopt ; export NamedExports ; export VariableStatement[~Yield, +Await] export [lookahead ∉ { using, await }] Declaration[~Yield, +Await] export default HoistableDeclaration[~Yield, +Await, +Default] export default ClassDeclaration[~Yield, +Await, +Default] export default [lookahead ∉ { function, async [no LineTerminator here] function, class }] AssignmentExpression[+In, ~Yield, +Await] ; ExportFromClause : * * as ModuleExportName NamedExports NamedExports : { } { ExportsList } { ExportsList , } ExportsList : ExportSpecifier ExportsList , ExportSpecifier ExportSpecifier : ModuleExportName ModuleExportName as ModuleExportName

16.2.3.1 Static Semantics: Early Errors

ExportDeclaration : export NamedExports ; Note

上記のruleは、NamedExportsの各ReferencedBindingsIdentifierReferenceとして扱われることを意味します。

16.2.3.2 Static Semantics: ExportedBindings

The syntax-directed operation ExportedBindings takes no arguments and returns a List of Strings.

Note

ExportedBindingsは、ModuleExportedNamesにexplicitlyに関連付けられたlocally bound namesです。

It is defined piecewise over the following productions:

ModuleItemList : ModuleItemList ModuleItem
  1. names1ModuleItemListExportedBindingsとする。
  2. names2ModuleItemExportedBindingsとする。
  3. names1names2list-concatenationを返す。
ModuleItem : ImportDeclaration StatementListItem
  1. 新しい空のListを返す。
ExportDeclaration : export ExportFromClause FromClause WithClauseopt ;
  1. 新しい空のListを返す。
ExportDeclaration : export NamedExports ;
  1. NamedExportsExportedBindingsを返す。
ExportDeclaration : export VariableStatement
  1. VariableStatementBoundNamesを返す。
ExportDeclaration : export Declaration
  1. DeclarationBoundNamesを返す。
ExportDeclaration : export default HoistableDeclaration export default ClassDeclaration export default AssignmentExpression ;
  1. this ExportDeclarationBoundNamesを返す。
NamedExports : { }
  1. 新しい空のListを返す。
ExportsList : ExportsList , ExportSpecifier
  1. names1ExportsListExportedBindingsとする。
  2. names2ExportSpecifierExportedBindingsとする。
  3. names1names2list-concatenationを返す。
ExportSpecifier : ModuleExportName
  1. 唯一の要素がModuleExportNameStringValueであるListを返す。
ExportSpecifier : ModuleExportName as ModuleExportName
  1. 唯一の要素が最初のModuleExportNameStringValueであるListを返す。

16.2.3.3 Static Semantics: ExportedNames

The syntax-directed operation ExportedNames takes no arguments and returns a List of Strings.

Note

ExportedNamesは、Moduleがそのlocal name bindingsの1つへexplicitlyにmapするexternally visible namesです。

It is defined piecewise over the following productions:

ModuleItemList : ModuleItemList ModuleItem
  1. names1ModuleItemListExportedNamesとする。
  2. names2ModuleItemExportedNamesとする。
  3. names1names2list-concatenationを返す。
ModuleItem : ExportDeclaration
  1. ExportDeclarationExportedNamesを返す。
ModuleItem : ImportDeclaration StatementListItem
  1. 新しい空のListを返す。
ExportDeclaration : export ExportFromClause FromClause WithClauseopt ;
  1. ExportFromClauseExportedNamesを返す。
ExportFromClause : *
  1. 新しい空のListを返す。
ExportFromClause : * as ModuleExportName
  1. 唯一の要素がModuleExportNameStringValueであるListを返す。
ExportFromClause : NamedExports
  1. NamedExportsExportedNamesを返す。
ExportDeclaration : export VariableStatement
  1. VariableStatementBoundNamesを返す。
ExportDeclaration : export Declaration
  1. DeclarationBoundNamesを返す。
ExportDeclaration : export default HoistableDeclaration export default ClassDeclaration export default AssignmentExpression ;
  1. « "default" »を返す。
NamedExports : { }
  1. 新しい空のListを返す。
ExportsList : ExportsList , ExportSpecifier
  1. names1ExportsListExportedNamesとする。
  2. names2ExportSpecifierExportedNamesとする。
  3. names1names2list-concatenationを返す。
ExportSpecifier : ModuleExportName
  1. 唯一の要素がModuleExportNameStringValueであるListを返す。
ExportSpecifier : ModuleExportName as ModuleExportName
  1. 唯一の要素が2番目のModuleExportNameStringValueであるListを返す。

16.2.3.4 Static Semantics: ExportEntries

The syntax-directed operation ExportEntries takes no arguments and returns a List of ExportEntry Records. It is defined piecewise over the following productions:

Module : [empty]
  1. 新しい空のListを返す。
ModuleItemList : ModuleItemList ModuleItem
  1. entries1ModuleItemListExportEntriesとする。
  2. entries2ModuleItemExportEntriesとする。
  3. entries1entries2list-concatenationを返す。
ModuleItem : ImportDeclaration StatementListItem
  1. 新しい空のListを返す。
ExportDeclaration : export ExportFromClause FromClause WithClauseopt ;
  1. moduleExportDeclarationModuleRequestsの唯一の要素とする。
  2. argument moduleを伴うExportFromClauseExportEntriesForModuleを返す。
ExportDeclaration : export NamedExports ;
  1. argument nullを伴うNamedExportsExportEntriesForModuleを返す。
ExportDeclaration : export VariableStatement
  1. entriesを新しい空のListとする。
  2. namesVariableStatementBoundNamesとする。
  3. namesの各要素nameについて、以下を行う
    1. ExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: name, [[ExportName]]: name }をentriesへappendする。
  4. entriesを返す。
ExportDeclaration : export Declaration
  1. entriesを新しい空のListとする。
  2. namesDeclarationBoundNamesとする。
  3. namesの各要素nameについて、以下を行う
    1. ExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: name, [[ExportName]]: name }をentriesへappendする。
  4. entriesを返す。
ExportDeclaration : export default HoistableDeclaration
  1. namesHoistableDeclarationBoundNamesとする。
  2. localNamenamesの唯一の要素とする。
  3. 唯一の要素が新しいExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: localName, [[ExportName]]: "default" }であるListを返す。
ExportDeclaration : export default ClassDeclaration
  1. namesClassDeclarationBoundNamesとする。
  2. localNamenamesの唯一の要素とする。
  3. 唯一の要素が新しいExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: localName, [[ExportName]]: "default" }であるListを返す。
ExportDeclaration : export default AssignmentExpression ;
  1. entryExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: "*default*", [[ExportName]]: "default" }とする。
  2. « entry »を返す。
Note

"*default*"は、この仕様内でanonymous default export valuesに対するsynthetic nameとして使用されます。詳細についてはthis noteを参照してください。

16.2.3.5 Static Semantics: ExportEntriesForModule

The syntax-directed operation ExportEntriesForModule takes argument module (a ModuleRequest Record or null) and returns a List of ExportEntry Records. It is defined piecewise over the following productions:

ExportFromClause : *
  1. entryExportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: all-but-default, [[LocalName]]: null, [[ExportName]]: null }とする。
  2. « entry »を返す。
ExportFromClause : * as ModuleExportName
  1. exportNameModuleExportNameStringValueとする。
  2. entryExportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: namespace, [[LocalName]]: null, [[ExportName]]: exportName }とする。
  3. « entry »を返す。
NamedExports : { }
  1. 新しい空のListを返す。
ExportsList : ExportsList , ExportSpecifier
  1. specs1を、argument moduleを伴うExportsListExportEntriesForModuleとする。
  2. specs2を、argument moduleを伴うExportSpecifierExportEntriesForModuleとする。
  3. specs1specs2list-concatenationを返す。
ExportSpecifier : ModuleExportName
  1. sourceNameModuleExportNameStringValueとする。
  2. modulenullなら、
    1. localNamesourceNameとする。
    2. importNamenullとする。
  3. そうでなければ、
    1. localNamenullとする。
    2. importNamesourceNameとする。
  4. 唯一の要素が新しいExportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName, [[ExportName]]: sourceName }であるListを返す。
ExportSpecifier : ModuleExportName as ModuleExportName
  1. sourceNameを最初のModuleExportNameStringValueとする。
  2. exportNameを2番目のModuleExportNameStringValueとする。
  3. modulenullなら、
    1. localNamesourceNameとする。
    2. importNamenullとする。
  4. そうでなければ、
    1. localNamenullとする。
    2. importNamesourceNameとする。
  5. 唯一の要素が新しいExportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName, [[ExportName]]: exportName }であるListを返す。

16.2.3.6 Static Semantics: ReferencedBindings

The syntax-directed operation ReferencedBindings takes no arguments and returns a List of Parse Nodes. It is defined piecewise over the following productions:

NamedExports : { }
  1. 新しい空のListを返す。
ExportsList : ExportsList , ExportSpecifier
  1. names1ExportsListReferencedBindingsとする。
  2. names2ExportSpecifierReferencedBindingsとする。
  3. names1names2list-concatenationを返す。
ExportSpecifier : ModuleExportName as ModuleExportName
  1. 最初のModuleExportNameReferencedBindingsを返す。
ModuleExportName : IdentifierName
  1. 唯一の要素がIdentifierNameであるListを返す。
ModuleExportName : StringLiteral
  1. 唯一の要素がStringLiteralであるListを返す。

16.2.3.7 Runtime Semantics: Evaluation

ExportDeclaration : export ExportFromClause FromClause WithClauseopt ; export NamedExports ;
  1. emptyを返す。
ExportDeclaration : export VariableStatement
  1. VariableStatementの ? Evaluationを返す。
ExportDeclaration : export Declaration
  1. Declarationの ? Evaluationを返す。
ExportDeclaration : export default HoistableDeclaration
  1. HoistableDeclarationの ? Evaluationを返す。
ExportDeclaration : export default ClassDeclaration
  1. valueClassDeclarationの ? BindingClassDeclarationEvaluationとする。
  2. classNameClassDeclarationBoundNamesの唯一の要素とする。
  3. className"*default*"なら、
    1. envRecordrunning execution contextのLexicalEnvironmentとする。
    2. InitializeBoundName("*default*", value, envRecord)を実行する。
  4. emptyを返す。
ExportDeclaration : export default AssignmentExpression ;
  1. IsAnonymousFunctionDefinition(AssignmentExpression)がtrueなら、
    1. valueを、argument "default"を伴うAssignmentExpressionの ? NamedEvaluationとする。
  2. そうでなければ、
    1. rhsAssignmentExpressionの ? Evaluationとする。
    2. valueを ? GetValue(rhs) とする。
  3. envRecordrunning execution contextのLexicalEnvironmentとする。
  4. InitializeBoundName("*default*", value, envRecord)を実行する。
  5. emptyを返す。