classDiagram
class ModuleRecord {
<<abstract>>
[[Status]]
[[Realm]] : Realm Record
[[Environment]] : Module Environment Record | EMPTY
[[Namespace]] : Object | EMPTY
[[SourceRecord]] : Module Source Record
-[[ModuleSource]] : replaced by SourceRecord in esm-phase
[[HostDefined]] : anything
+[[Compartment]] : Compartment | EMPTY
}
link ModuleRecord "https://tc39.es/ecma262/multipage/ecmascript-language-scripts-and-modules.html#sec-abstract-module-records"
class CyclicModuleRecord {
<<abstract>>
[[Status]]
[[EvaluationError]]
[[DFSAncestorIndex]]
[[RequestedModules]] : List~ModuleRequest Records~
[[LoadedModules]] : List~LoadedModuleRequest Records~
[[CycleRoot]]
[[HasTLA]] : Boolean
[[AsyncEvaluationOrder]]
[[TopLevelCapability]]
[[AsyncParentModules]]
[[PendingAsyncDependencies]]
}
link CyclicModuleRecord "https://tc39.es/ecma262/multipage/ecmascript-language-scripts-and-modules.html#cyclic-module-record"
class SourceTextModuleRecord {
[[ECMAScriptCode]] : Parse Node
[[Context]] : Execution Context | EMPTY
[[ImportMeta]] : Object | EMPTY
[[ImportEntries]] : List~ImportEntry Records~
[[LocalExportEntries]] : List~ExportEntry Records~
[[IndirectExportEntries]] : List~ExportEntry Records~
[[StarExportEntries]] : List~ExportEntry Records~
}
link SourceTextModuleRecord "https://tc39.es/ecma262/multipage/ecmascript-language-scripts-and-modules.html#sourctextmodule-record"
note for SourceTextModuleRecord "InitializeEnvironment()
to use [[ScopeCeiling]]
instead of realm.[[GlobalEnv]]
for NewModuleEnvironment(OuterEnv)
if [[ScopeCeiling]] not EMPTY"
class ScopeCeiling:::added {
[[OuterEnv]] = null
[[BindingObject]] handles the globalThis binding and var
:
inheriting from ObjectEnvironmentRecord is sufficient,
but all bindings are dynamic andcould be slower than
a mix of ObjectRecord and DeclarativeRecord
}
class EnvironmentRecord {
<<abstract>>
[[OuterEnv]] : Environment Record | null
}
link EnvironmentRecord "https://tc39.es/ecma262/#sec-environment-records"
class DeclarativeEnvironmentRecord {
}
link DeclarativeEnvironmentRecord "https://tc39.es/ecma262/#sec-declarative-environment-records"
class ObjectEnvironmentRecord {
[[BindingObject]] : Object
[[IsWithEnvironment]] : Boolean
}
class GlobalEnvironmentRecord {
[[ObjectRecord]] : Object Environment Record
[[GlobalThisValue]] : Object
[[DeclarativeRecord]] : Declarative Environment Record
[[OuterEnv]] = null
}
class ModuleEnvironmentRecord {
[[OuterEnv]] : Environment Record
}
link ModuleEnvironmentRecord "https://tc39.es/ecma262/#sec-module-environment-records"
class RealmRecord {
[[AgentSignifier]]
[[Intrinsics]]
[[GlobalObject]] : Object
[[GlobalEnv]] : Global Environment Record
[[TemplateMap]]
[[LoadedModules]]
[[HostDefined]]
}
class ExecutionContext:::specdevice {
<<spec device>>
code evaluation state
Function : function object | null
Realm : Realm Record
ScriptOrModule : Module Record | Script Record | null
}
link ExecutionContext "https://tc39.es/ecma262/multipage/executable-code-and-execution-contexts.html#sec-execution-contexts"
class ECMAScriptCodeExecutionContext:::specdevice {
<<spec device>>
LexicalEnvironment : Environment Record
VariableEnvironment : Environment Record
PrivateEnvironment : PrivateEnvironment Record | null
}
link ECMAScriptCodeExecutionContext "https://tc39.es/ecma262/multipage/executable-code-and-execution-contexts.html#ecmascript-code-execution-context"
note for ECMAScriptCodeExecutionContext "ResolveBinding() consults
ModuleEnvironmentRecord via LexicalEnvironment"
ExecutionContext <|-- ECMAScriptCodeExecutionContext
ModuleRecord <|-- CyclicModuleRecord
CyclicModuleRecord <|-- SourceTextModuleRecord
EnvironmentRecord <|-- DeclarativeEnvironmentRecord
EnvironmentRecord <|-- ObjectEnvironmentRecord
EnvironmentRecord <|-- GlobalEnvironmentRecord
DeclarativeEnvironmentRecord <|-- ModuleEnvironmentRecord
ModuleRecord --> RealmRecord : [[Realm]]
ModuleRecord --> ModuleEnvironmentRecord : [[Environment]]
SourceTextModuleRecord --> ECMAScriptCodeExecutionContext : [[Context]]
ECMAScriptCodeExecutionContext --> RealmRecord : Realm
RealmRecord --> GlobalEnvironmentRecord : [[GlobalEnv]]
ModuleEnvironmentRecord ..> GlobalEnvironmentRecord : [[OuterEnv]]
ModuleEnvironmentRecord ..> ScopeCeiling : +[[OuterEnv]]
GlobalEnvironmentRecord --> ObjectEnvironmentRecord : [[ObjectRecord]]
GlobalEnvironmentRecord --> DeclarativeEnvironmentRecord : [[DeclarativeRecord]]
ObjectEnvironmentRecord <|-- ScopeCeiling : would this suffice?
class AbstractModuleSource:::sourceproposal {
<<abstract>>
}
link AbstractModuleSource "https://tc39.es/proposal-source-phase-imports/#sec-abstract-module-source-constructor"
class HostDefinedModuleSource:::sourceproposal {
<<host-defined>>
e.g. WebAssembly.Module
}
class ModuleRequestRecord:::sourceproposal {
[[Specifier]] : String
[[Phase]] : source | evaluation
[[Attributes]]
}
link ModuleRequestRecord "https://tc39.es/proposal-source-phase-imports/#sec-modulerequest-records"
note for ModuleRequestRecord "ModuleSourcesEqual(a,b)
compares [[HostDefined]] too.
could consider Compartment"
class ModuleSourceRecord:::esmphaseproposal {
[[HostDefined]] : anything
[[SourceText]] : source text | NONE
[[ModuleSourceKind]] : String
[[ModuleSource]] : Object | EMPTY
}
link ModuleSourceRecord "https://tc39.es/proposal-esm-phase-imports/#module-source-record"
class ModuleSource:::esmphaseproposal {
[[ModuleSourceRecord]] : Module Source Record
}
link ModuleSource "https://tc39.es/proposal-esm-phase-imports/#sec-module-source-object"
class Compartment:::added {
[[moduleMap]]
+[[ScopeCeiling]] : Object | EMPTY
}
Compartment --> ScopeCeiling : [[ScopeCeiling]]
ModuleRecord --> Compartment : +[[Compartment]]
AbstractModuleSource <|-- HostDefinedModuleSource
AbstractModuleSource <|-- ModuleSource
ModuleRecord --> ModuleSourceRecord : [[SourceRecord]]
ModuleSourceRecord --> ModuleSource : [[ModuleSource]]
ModuleSource --> ModuleSourceRecord : [[ModuleSourceRecord]]
CyclicModuleRecord --> ModuleRequestRecord : [[RequestedModules]]
classDef sourceproposal fill:#ffe
classDef esmphaseproposal fill:#fef
classDef importhookproposal fill:#eff
classDef specdevice fill:#fff
classDef added fill:#afa