Changeset 188355 in webkit


Ignore:
Timestamp:
Aug 12, 2015, 1:38:45 PM (10 years ago)
Author:
Yusuke Suzuki
Message:

[ES6] Add ES6 Modules preparsing phase to collect the dependencies
https://bugs.webkit.org/show_bug.cgi?id=147353

Reviewed by Geoffrey Garen.

This patch implements ModuleRecord and ModuleAnalyzer.
ModuleAnalyzer analyzes the produced AST from the parser.
By collaborating with the parser, ModuleAnalyzer collects the information
that is necessary to request the loading for the dependent modules and
construct module's environment and namespace object before executing the actual
module body.

In the parser, we annotate which variable is imported binding and which variable
is exported from the current module. This information is leveraged in the ModuleAnalyzer
to categorize the export entries.

To preparse the modules in the parser, we just add the new flag ModuleParseMode
instead of introducing a new TreeContext type. This is because only 2 users use the
parseModuleSourceElements; preparser and actual compiler. Adding the flag is simple
enough to switch the context to the SyntaxChecker when parsing the non-module related
statement in the preparsing phase.

To demonstrate the module analyzer, we added the new option dumpModuleRecord option
into the JSC shell. By specifying this, the result of analysis is dumped when the module
is parsed and analyzed.

(JSC::ASTBuilder::createExportDefaultDeclaration):

  • parser/ModuleAnalyzer.cpp: Added.

(JSC::ModuleAnalyzer::ModuleAnalyzer):
(JSC::ModuleAnalyzer::exportedBinding):
(JSC::ModuleAnalyzer::declareExportAlias):
(JSC::ModuleAnalyzer::exportVariable):
(JSC::ModuleAnalyzer::analyze):

  • parser/ModuleAnalyzer.h: Added.

(JSC::ModuleAnalyzer::vm):
(JSC::ModuleAnalyzer::moduleRecord):

  • parser/ModuleRecord.cpp: Added.

(JSC::printableName):
(JSC::ModuleRecord::dump):

  • parser/ModuleRecord.h: Added.

(JSC::ModuleRecord::ImportEntry::isNamespace):
(JSC::ModuleRecord::create):
(JSC::ModuleRecord::appendRequestedModule):
(JSC::ModuleRecord::addImportEntry):
(JSC::ModuleRecord::addExportEntry):
(JSC::ModuleRecord::addStarExportEntry):

  • parser/NodeConstructors.h:

(JSC::ModuleDeclarationNode::ModuleDeclarationNode):
(JSC::ImportDeclarationNode::ImportDeclarationNode):
(JSC::ExportAllDeclarationNode::ExportAllDeclarationNode):
(JSC::ExportDefaultDeclarationNode::ExportDefaultDeclarationNode):
(JSC::ExportLocalDeclarationNode::ExportLocalDeclarationNode):
(JSC::ExportNamedDeclarationNode::ExportNamedDeclarationNode):

  • parser/Nodes.h:

(JSC::ExportDefaultDeclarationNode::localName):

  • parser/NodesAnalyzeModule.cpp: Added.

(JSC::ScopeNode::analyzeModule):
(JSC::SourceElements::analyzeModule):
(JSC::ImportDeclarationNode::analyzeModule):
(JSC::ExportAllDeclarationNode::analyzeModule):
(JSC::ExportDefaultDeclarationNode::analyzeModule):
(JSC::ExportLocalDeclarationNode::analyzeModule):
(JSC::ExportNamedDeclarationNode::analyzeModule):

  • parser/Parser.cpp:

(JSC::Parser<LexerType>::parseInner):
(JSC::Parser<LexerType>::parseModuleSourceElements):
(JSC::Parser<LexerType>::parseVariableDeclarationList):
(JSC::Parser<LexerType>::createBindingPattern):
(JSC::Parser<LexerType>::parseFunctionDeclaration):
(JSC::Parser<LexerType>::parseClassDeclaration):
(JSC::Parser<LexerType>::parseImportClauseItem):
(JSC::Parser<LexerType>::parseExportSpecifier):
(JSC::Parser<LexerType>::parseExportDeclaration):

  • parser/Parser.h:

(JSC::Scope::lexicalVariables):
(JSC::Scope::declareLexicalVariable):
(JSC::Parser::declareVariable):
(JSC::Parser::exportName):
(JSC::Parser<LexerType>::parse):
(JSC::parse):

  • parser/ParserModes.h:
  • parser/SyntaxChecker.h:

(JSC::SyntaxChecker::createExportDefaultDeclaration):

  • parser/VariableEnvironment.cpp:

(JSC::VariableEnvironment::markVariableAsImported):
(JSC::VariableEnvironment::markVariableAsExported):

  • parser/VariableEnvironment.h:

(JSC::VariableEnvironmentEntry::isExported):
(JSC::VariableEnvironmentEntry::isImported):
(JSC::VariableEnvironmentEntry::setIsExported):
(JSC::VariableEnvironmentEntry::setIsImported):

  • runtime/CommonIdentifiers.h:
  • runtime/Completion.cpp:

(JSC::checkModuleSyntax):

  • runtime/Options.h:
Location:
trunk/Source/JavaScriptCore
Files:
5 added
18 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/CMakeLists.txt

    r188329 r188355  
    386386
    387387    parser/Lexer.cpp
     388    parser/ModuleAnalyzer.cpp
     389    parser/ModuleRecord.cpp
    388390    parser/Nodes.cpp
     391    parser/NodesAnalyzeModule.cpp
    389392    parser/Parser.cpp
    390393    parser/ParserArena.cpp
  • trunk/Source/JavaScriptCore/ChangeLog

    r188351 r188355  
     12015-08-12  Yusuke Suzuki  <[email protected]>
     2
     3        [ES6] Add ES6 Modules preparsing phase to collect the dependencies
     4        https://bugs.webkit.org/show_bug.cgi?id=147353
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        This patch implements ModuleRecord and ModuleAnalyzer.
     9        ModuleAnalyzer analyzes the produced AST from the parser.
     10        By collaborating with the parser, ModuleAnalyzer collects the information
     11        that is necessary to request the loading for the dependent modules and
     12        construct module's environment and namespace object before executing the actual
     13        module body.
     14
     15        In the parser, we annotate which variable is imported binding and which variable
     16        is exported from the current module. This information is leveraged in the ModuleAnalyzer
     17        to categorize the export entries.
     18
     19        To preparse the modules in the parser, we just add the new flag `ModuleParseMode`
     20        instead of introducing a new TreeContext type. This is because only 2 users use the
     21        parseModuleSourceElements; preparser and actual compiler. Adding the flag is simple
     22        enough to switch the context to the SyntaxChecker when parsing the non-module related
     23        statement in the preparsing phase.
     24
     25        To demonstrate the module analyzer, we added the new option dumpModuleRecord option
     26        into the JSC shell. By specifying this, the result of analysis is dumped when the module
     27        is parsed and analyzed.
     28
     29        * CMakeLists.txt:
     30        * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
     31        * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
     32        * JavaScriptCore.xcodeproj/project.pbxproj:
     33        * builtins/BuiltinNames.h:
     34        * parser/ASTBuilder.h:
     35        (JSC::ASTBuilder::createExportDefaultDeclaration):
     36        * parser/ModuleAnalyzer.cpp: Added.
     37        (JSC::ModuleAnalyzer::ModuleAnalyzer):
     38        (JSC::ModuleAnalyzer::exportedBinding):
     39        (JSC::ModuleAnalyzer::declareExportAlias):
     40        (JSC::ModuleAnalyzer::exportVariable):
     41        (JSC::ModuleAnalyzer::analyze):
     42        * parser/ModuleAnalyzer.h: Added.
     43        (JSC::ModuleAnalyzer::vm):
     44        (JSC::ModuleAnalyzer::moduleRecord):
     45        * parser/ModuleRecord.cpp: Added.
     46        (JSC::printableName):
     47        (JSC::ModuleRecord::dump):
     48        * parser/ModuleRecord.h: Added.
     49        (JSC::ModuleRecord::ImportEntry::isNamespace):
     50        (JSC::ModuleRecord::create):
     51        (JSC::ModuleRecord::appendRequestedModule):
     52        (JSC::ModuleRecord::addImportEntry):
     53        (JSC::ModuleRecord::addExportEntry):
     54        (JSC::ModuleRecord::addStarExportEntry):
     55        * parser/NodeConstructors.h:
     56        (JSC::ModuleDeclarationNode::ModuleDeclarationNode):
     57        (JSC::ImportDeclarationNode::ImportDeclarationNode):
     58        (JSC::ExportAllDeclarationNode::ExportAllDeclarationNode):
     59        (JSC::ExportDefaultDeclarationNode::ExportDefaultDeclarationNode):
     60        (JSC::ExportLocalDeclarationNode::ExportLocalDeclarationNode):
     61        (JSC::ExportNamedDeclarationNode::ExportNamedDeclarationNode):
     62        * parser/Nodes.h:
     63        (JSC::ExportDefaultDeclarationNode::localName):
     64        * parser/NodesAnalyzeModule.cpp: Added.
     65        (JSC::ScopeNode::analyzeModule):
     66        (JSC::SourceElements::analyzeModule):
     67        (JSC::ImportDeclarationNode::analyzeModule):
     68        (JSC::ExportAllDeclarationNode::analyzeModule):
     69        (JSC::ExportDefaultDeclarationNode::analyzeModule):
     70        (JSC::ExportLocalDeclarationNode::analyzeModule):
     71        (JSC::ExportNamedDeclarationNode::analyzeModule):
     72        * parser/Parser.cpp:
     73        (JSC::Parser<LexerType>::parseInner):
     74        (JSC::Parser<LexerType>::parseModuleSourceElements):
     75        (JSC::Parser<LexerType>::parseVariableDeclarationList):
     76        (JSC::Parser<LexerType>::createBindingPattern):
     77        (JSC::Parser<LexerType>::parseFunctionDeclaration):
     78        (JSC::Parser<LexerType>::parseClassDeclaration):
     79        (JSC::Parser<LexerType>::parseImportClauseItem):
     80        (JSC::Parser<LexerType>::parseExportSpecifier):
     81        (JSC::Parser<LexerType>::parseExportDeclaration):
     82        * parser/Parser.h:
     83        (JSC::Scope::lexicalVariables):
     84        (JSC::Scope::declareLexicalVariable):
     85        (JSC::Parser::declareVariable):
     86        (JSC::Parser::exportName):
     87        (JSC::Parser<LexerType>::parse):
     88        (JSC::parse):
     89        * parser/ParserModes.h:
     90        * parser/SyntaxChecker.h:
     91        (JSC::SyntaxChecker::createExportDefaultDeclaration):
     92        * parser/VariableEnvironment.cpp:
     93        (JSC::VariableEnvironment::markVariableAsImported):
     94        (JSC::VariableEnvironment::markVariableAsExported):
     95        * parser/VariableEnvironment.h:
     96        (JSC::VariableEnvironmentEntry::isExported):
     97        (JSC::VariableEnvironmentEntry::isImported):
     98        (JSC::VariableEnvironmentEntry::setIsExported):
     99        (JSC::VariableEnvironmentEntry::setIsImported):
     100        * runtime/CommonIdentifiers.h:
     101        * runtime/Completion.cpp:
     102        (JSC::checkModuleSyntax):
     103        * runtime/Options.h:
     104
    11052015-08-12  Geoffrey Garen  <[email protected]>
    2106
  • trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj

    r188329 r188355  
    661661    <ClCompile Include="..\llvm\LLVMAPI.cpp" />
    662662    <ClCompile Include="..\parser\Lexer.cpp" />
     663    <ClCompile Include="..\parser\ModuleAnalyzer.cpp" />
     664    <ClCompile Include="..\parser\ModuleRecord.cpp" />
    663665    <ClCompile Include="..\parser\Nodes.cpp" />
     666    <ClCompile Include="..\parser\NodesAnalyzeModule.cpp" />
    664667    <ClCompile Include="..\parser\Parser.cpp" />
    665668    <ClCompile Include="..\parser\ParserArena.cpp" />
     
    14491452    <ClInclude Include="..\parser\ASTBuilder.h" />
    14501453    <ClInclude Include="..\parser\Lexer.h" />
     1454    <ClInclude Include="..\parser\ModuleAnalyzer.h" />
     1455    <ClInclude Include="..\parser\ModuleRecord.h" />
    14511456    <ClInclude Include="..\parser\NodeConstructors.h" />
    14521457    <ClInclude Include="..\parser\Nodes.h" />
  • trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters

    r188329 r188355  
    457457      <Filter>parser</Filter>
    458458    </ClCompile>
     459    <ClCompile Include="..\parser\ModuleAnalyzer.cpp">
     460      <Filter>parser</Filter>
     461    </ClCompile>
     462    <ClCompile Include="..\parser\ModuleRecord.cpp">
     463      <Filter>parser</Filter>
     464    </ClCompile>
    459465    <ClCompile Include="..\parser\Nodes.cpp">
     466      <Filter>parser</Filter>
     467    </ClCompile>
     468    <ClCompile Include="..\parser\NodesAnalyzeModule.cpp">
    460469      <Filter>parser</Filter>
    461470    </ClCompile>
     
    24792488    </ClInclude>
    24802489    <ClInclude Include="..\parser\Lexer.h">
     2490      <Filter>parser</Filter>
     2491    </ClInclude>
     2492    <ClInclude Include="..\parser\ModuleAnalyzer.h">
     2493      <Filter>parser</Filter>
     2494    </ClInclude>
     2495    <ClInclude Include="..\parser\ModuleRecord.h">
    24812496      <Filter>parser</Filter>
    24822497    </ClInclude>
  • trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj

    r188329 r188355  
    16941694                E33637A61B63220200EE0840 /* ReflectObject.h in Headers */ = {isa = PBXBuildFile; fileRef = E33637A41B63220200EE0840 /* ReflectObject.h */; settings = {ATTRIBUTES = (Private, ); }; };
    16951695                E354622B1B6065D100545386 /* ConstructAbility.h in Headers */ = {isa = PBXBuildFile; fileRef = E354622A1B6065D100545386 /* ConstructAbility.h */; settings = {ATTRIBUTES = (Private, ); }; };
     1696                E3794E751B77EB97005543AE /* ModuleAnalyzer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E3794E731B77EB97005543AE /* ModuleAnalyzer.cpp */; };
     1697                E3794E761B77EB97005543AE /* ModuleAnalyzer.h in Headers */ = {isa = PBXBuildFile; fileRef = E3794E741B77EB97005543AE /* ModuleAnalyzer.h */; settings = {ATTRIBUTES = (Private, ); }; };
     1698                E3963CED1B73F75000EB4CE5 /* ModuleRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = E3963CEB1B73F75000EB4CE5 /* ModuleRecord.h */; settings = {ATTRIBUTES = (Private, ); }; };
     1699                E3963CEE1B73F75000EB4CE5 /* NodesAnalyzeModule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E3963CEC1B73F75000EB4CE5 /* NodesAnalyzeModule.cpp */; };
     1700                E3C09F551B79692A00EE36A2 /* ModuleRecord.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E3C09F541B79692A00EE36A2 /* ModuleRecord.cpp */; };
    16961701                E3EF88741B66DF23003F26CB /* JSPropertyNameIterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E3EF88721B66DF23003F26CB /* JSPropertyNameIterator.cpp */; };
    16971702                E3EF88751B66DF23003F26CB /* JSPropertyNameIterator.h in Headers */ = {isa = PBXBuildFile; fileRef = E3EF88731B66DF23003F26CB /* JSPropertyNameIterator.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    35183523                E33637A41B63220200EE0840 /* ReflectObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReflectObject.h; sourceTree = "<group>"; };
    35193524                E354622A1B6065D100545386 /* ConstructAbility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConstructAbility.h; sourceTree = "<group>"; };
     3525                E3794E731B77EB97005543AE /* ModuleAnalyzer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ModuleAnalyzer.cpp; sourceTree = "<group>"; };
     3526                E3794E741B77EB97005543AE /* ModuleAnalyzer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ModuleAnalyzer.h; sourceTree = "<group>"; };
     3527                E3963CEB1B73F75000EB4CE5 /* ModuleRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ModuleRecord.h; sourceTree = "<group>"; };
     3528                E3963CEC1B73F75000EB4CE5 /* NodesAnalyzeModule.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NodesAnalyzeModule.cpp; sourceTree = "<group>"; };
     3529                E3C09F541B79692A00EE36A2 /* ModuleRecord.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ModuleRecord.cpp; sourceTree = "<group>"; };
    35203530                E3EF88721B66DF23003F26CB /* JSPropertyNameIterator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPropertyNameIterator.cpp; sourceTree = "<group>"; };
    35213531                E3EF88731B66DF23003F26CB /* JSPropertyNameIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPropertyNameIterator.h; sourceTree = "<group>"; };
     
    44274437                                F692A8650255597D01FF60F7 /* Lexer.cpp */,
    44284438                                F692A8660255597D01FF60F7 /* Lexer.h */,
     4439                                E3794E731B77EB97005543AE /* ModuleAnalyzer.cpp */,
     4440                                E3794E741B77EB97005543AE /* ModuleAnalyzer.h */,
     4441                                E3C09F541B79692A00EE36A2 /* ModuleRecord.cpp */,
     4442                                E3963CEB1B73F75000EB4CE5 /* ModuleRecord.h */,
    44294443                                930DAD030FB1EB1A0082D205 /* NodeConstructors.h */,
    44304444                                F692A86D0255597D01FF60F7 /* Nodes.cpp */,
    44314445                                F692A86E0255597D01FF60F7 /* Nodes.h */,
     4446                                E3963CEC1B73F75000EB4CE5 /* NodesAnalyzeModule.cpp */,
    44324447                                93F0B3A909BB4DC00068FCE3 /* Parser.cpp */,
    44334448                                93F0B3AA09BB4DC00068FCE3 /* Parser.h */,
     
    61626177                                9E72940B190F0514001A91B5 /* BundlePath.h in Headers */,
    61636178                                0F48532A187DFDEC0083B687 /* FTLRecoveryOpcode.h in Headers */,
     6179                                E3794E761B77EB97005543AE /* ModuleAnalyzer.h in Headers */,
    61646180                                0F6B1CC41862C47800845D97 /* FTLRegisterAtOffset.h in Headers */,
    61656181                                0FCEFAAC1804C13E00472CE4 /* FTLSaveRestore.h in Headers */,
    61666182                                0F25F1B2181635F300522F39 /* FTLSlowPathCall.h in Headers */,
    61676183                                E354622B1B6065D100545386 /* ConstructAbility.h in Headers */,
     6184                                E3963CED1B73F75000EB4CE5 /* ModuleRecord.h in Headers */,
    61686185                                0F25F1B4181635F300522F39 /* FTLSlowPathCallKey.h in Headers */,
    61696186                                0F9D339B1803ADB70073C2BC /* FTLStackMaps.h in Headers */,
     
    72217238                                147F39BD107EC37600427A48 /* ArgList.cpp in Sources */,
    72227239                                0F6B1CC918641DF800845D97 /* ArityCheckFailReturnThunks.cpp in Sources */,
     7240                                E3794E751B77EB97005543AE /* ModuleAnalyzer.cpp in Sources */,
    72237241                                0F743BAA16B88249009F9277 /* ARM64Disassembler.cpp in Sources */,
    72247242                                86D3B2C310156BDE002865E7 /* ARMAssembler.cpp in Sources */,
     
    75857603                                0F2D4DE819832DAC007D4B19 /* ToThisStatus.cpp in Sources */,
    75867604                                FE384EE51ADDB7AD0055DE2C /* JSDollarVM.cpp in Sources */,
     7605                                E3C09F551B79692A00EE36A2 /* ModuleRecord.cpp in Sources */,
    75877606                                978801401471AD920041B016 /* JSDateMath.cpp in Sources */,
    75887607                                0FE050171AA9091100D33B33 /* DirectArguments.cpp in Sources */,
     
    78527871                                86704B8612DBA33700A9FE7B /* YarrJIT.cpp in Sources */,
    78537872                                86704B8912DBA33700A9FE7B /* YarrPattern.cpp in Sources */,
     7873                                E3963CEE1B73F75000EB4CE5 /* NodesAnalyzeModule.cpp in Sources */,
    78547874                                86704B4212DB8A8100A9FE7B /* YarrSyntaxChecker.cpp in Sources */,
    78557875                        );
  • trunk/Source/JavaScriptCore/builtins/BuiltinNames.h

    r184828 r188355  
    3232namespace JSC {
    3333   
    34 #define INITIALISE_BUILTIN_NAMES(name) , m_##name(Identifier::fromString(vm, #name)), m_##name##PrivateName(Identifier::fromUid(PrivateName()))
     34#define INITIALISE_BUILTIN_NAMES(name) , m_##name(Identifier::fromString(vm, #name)), m_##name##PrivateName(Identifier::fromUid(PrivateName(PrivateName::Description, ASCIILiteral("PrivateSymbol." #name))))
    3535#define DECLARE_BUILTIN_NAMES(name) const Identifier m_##name; const Identifier m_##name##PrivateName;
    3636#define DECLARE_BUILTIN_IDENTIFIER_ACCESSOR(name) \
  • trunk/Source/JavaScriptCore/parser/ASTBuilder.h

    r188219 r188355  
    9393        UnaryExprContext(ASTBuilder&) {}
    9494    };
    95 
    9695
    9796    typedef ExpressionNode* Expression;
     
    651650    }
    652651
    653     StatementNode* createExportDefaultDeclaration(const JSTokenLocation& location, StatementNode* declaration)
    654     {
    655         return new (m_parserArena) ExportDefaultDeclarationNode(location, declaration);
     652    StatementNode* createExportDefaultDeclaration(const JSTokenLocation& location, StatementNode* declaration, const Identifier& localName)
     653    {
     654        return new (m_parserArena) ExportDefaultDeclarationNode(location, declaration, localName);
    656655    }
    657656
  • trunk/Source/JavaScriptCore/parser/NodeConstructors.h

    r188219 r188355  
    734734    }
    735735
     736    inline ModuleDeclarationNode::ModuleDeclarationNode(const JSTokenLocation& location)
     737        : StatementNode(location)
     738    {
     739    }
     740
    736741    inline ModuleSpecifierNode::ModuleSpecifierNode(const JSTokenLocation& location, const Identifier& moduleName)
    737742        : Node(location)
     
    748753
    749754    inline ImportDeclarationNode::ImportDeclarationNode(const JSTokenLocation& location, ImportSpecifierListNode* importSpecifierList, ModuleSpecifierNode* moduleSpecifier)
    750         : StatementNode(location)
     755        : ModuleDeclarationNode(location)
    751756        , m_specifierList(importSpecifierList)
    752757        , m_moduleSpecifier(moduleSpecifier)
     
    755760
    756761    inline ExportAllDeclarationNode::ExportAllDeclarationNode(const JSTokenLocation& location, ModuleSpecifierNode* moduleSpecifier)
    757         : StatementNode(location)
     762        : ModuleDeclarationNode(location)
    758763        , m_moduleSpecifier(moduleSpecifier)
    759764    {
    760765    }
    761766
    762     inline ExportDefaultDeclarationNode::ExportDefaultDeclarationNode(const JSTokenLocation& location, StatementNode* declaration)
    763         : StatementNode(location)
     767    inline ExportDefaultDeclarationNode::ExportDefaultDeclarationNode(const JSTokenLocation& location, StatementNode* declaration, const Identifier& localName)
     768        : ModuleDeclarationNode(location)
    764769        , m_declaration(declaration)
     770        , m_localName(localName)
    765771    {
    766772    }
    767773
    768774    inline ExportLocalDeclarationNode::ExportLocalDeclarationNode(const JSTokenLocation& location, StatementNode* declaration)
    769         : StatementNode(location)
     775        : ModuleDeclarationNode(location)
    770776        , m_declaration(declaration)
    771777    {
     
    773779
    774780    inline ExportNamedDeclarationNode::ExportNamedDeclarationNode(const JSTokenLocation& location, ExportSpecifierListNode* exportSpecifierList, ModuleSpecifierNode* moduleSpecifier)
    775         : StatementNode(location)
     781        : ModuleDeclarationNode(location)
    776782        , m_specifierList(exportSpecifierList)
    777783        , m_moduleSpecifier(moduleSpecifier)
  • trunk/Source/JavaScriptCore/parser/Nodes.h

    r188219 r188355  
    5050    class JSScope;
    5151    class ScopeNode;
     52    class ModuleAnalyzer;
    5253
    5354    enum Operator {
     
    12771278
    12781279        void emitBytecode(BytecodeGenerator&, RegisterID* destination);
     1280        void analyzeModule(ModuleAnalyzer&);
    12791281
    12801282    private:
     
    15751577        void setClosedVariables(Vector<RefPtr<UniquedStringImpl>>&&) { }
    15761578
     1579        void analyzeModule(ModuleAnalyzer&);
     1580
    15771581    protected:
    15781582        int m_startLineNumber;
     
    16741678    };
    16751679
    1676     class ImportDeclarationNode : public StatementNode {
     1680    class ModuleDeclarationNode : public StatementNode {
     1681    public:
     1682        virtual void analyzeModule(ModuleAnalyzer&) = 0;
     1683
     1684    protected:
     1685        ModuleDeclarationNode(const JSTokenLocation&);
     1686    };
     1687
     1688    class ImportDeclarationNode : public ModuleDeclarationNode {
    16771689    public:
    16781690        ImportDeclarationNode(const JSTokenLocation&, ImportSpecifierListNode*, ModuleSpecifierNode*);
     
    16831695    private:
    16841696        virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
     1697        virtual void analyzeModule(ModuleAnalyzer&) override;
    16851698
    16861699        ImportSpecifierListNode* m_specifierList;
     
    16881701    };
    16891702
    1690     class ExportAllDeclarationNode : public StatementNode {
     1703    class ExportAllDeclarationNode : public ModuleDeclarationNode {
    16911704    public:
    16921705        ExportAllDeclarationNode(const JSTokenLocation&, ModuleSpecifierNode*);
     
    16961709    private:
    16971710        virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
     1711        virtual void analyzeModule(ModuleAnalyzer&) override;
     1712
    16981713        ModuleSpecifierNode* m_moduleSpecifier;
    16991714    };
    17001715
    1701     class ExportDefaultDeclarationNode : public StatementNode {
    1702     public:
    1703         ExportDefaultDeclarationNode(const JSTokenLocation&, StatementNode*);
     1716    class ExportDefaultDeclarationNode : public ModuleDeclarationNode {
     1717    public:
     1718        ExportDefaultDeclarationNode(const JSTokenLocation&, StatementNode*, const Identifier& localName);
    17041719
    17051720        const StatementNode& declaration() const { return *m_declaration; }
    1706 
    1707     private:
    1708         virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
     1721        const Identifier& localName() const { return m_localName; }
     1722
     1723    private:
     1724        virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
     1725        virtual void analyzeModule(ModuleAnalyzer&) override;
    17091726        StatementNode* m_declaration;
    1710     };
    1711 
    1712     class ExportLocalDeclarationNode : public StatementNode {
     1727        const Identifier& m_localName;
     1728    };
     1729
     1730    class ExportLocalDeclarationNode : public ModuleDeclarationNode {
    17131731    public:
    17141732        ExportLocalDeclarationNode(const JSTokenLocation&, StatementNode*);
     
    17181736    private:
    17191737        virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
     1738        virtual void analyzeModule(ModuleAnalyzer&) override;
    17201739        StatementNode* m_declaration;
    17211740    };
     
    17471766    };
    17481767
    1749     class ExportNamedDeclarationNode : public StatementNode {
     1768    class ExportNamedDeclarationNode : public ModuleDeclarationNode {
    17501769    public:
    17511770        ExportNamedDeclarationNode(const JSTokenLocation&, ExportSpecifierListNode*, ModuleSpecifierNode*);
     
    17561775    private:
    17571776        virtual void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
     1777        virtual void analyzeModule(ModuleAnalyzer&) override;
    17581778        ExportSpecifierListNode* m_specifierList;
    17591779        ModuleSpecifierNode* m_moduleSpecifier { nullptr };
  • trunk/Source/JavaScriptCore/parser/Parser.cpp

    r188219 r188355  
    236236
    237237template <typename LexerType>
    238 String Parser<LexerType>::parseInner(const Identifier& calleeName, FunctionParseMode parseMode)
    239 {
     238String Parser<LexerType>::parseInner(const Identifier& calleeName, FunctionParseMode parseMode, ModuleParseMode moduleParseMode)
     239{
     240    UNUSED_PARAM(moduleParseMode);
     241
    240242    String parseError = String();
    241243   
     
    273275#if ENABLE(ES6_MODULES)
    274276        else if (m_codeType == JSParserCodeType::Module)
    275             sourceElements = parseModuleSourceElements(context);
     277            sourceElements = parseModuleSourceElements(context, moduleParseMode);
    276278#endif
    277279        else
     
    413415
    414416template <typename LexerType>
    415 template <class TreeBuilder> TreeSourceElements Parser<LexerType>::parseModuleSourceElements(TreeBuilder& context)
     417template <class TreeBuilder> TreeSourceElements Parser<LexerType>::parseModuleSourceElements(TreeBuilder& context, ModuleParseMode moduleParseMode)
    416418{
    417419    TreeSourceElements sourceElements = context.createSourceElements();
    418 
    419     // FIXME: When some sort of ModuleAnalyzer TreeBuilder is landed,
    420     // this SyntaxChecker will be replaced with typedef under the TreeBuilder,
    421     // like TreeBuilder::ModuleStatementItemBuilder.
    422     // https://bugs.webkit.org/show_bug.cgi?id=147353
    423     SyntaxChecker moduleStatementItemBuilder(const_cast<VM*>(m_vm), m_lexer.get());
     420    SyntaxChecker syntaxChecker(const_cast<VM*>(m_vm), m_lexer.get());
    424421
    425422    while (true) {
    426         if (match(IMPORT) || match(EXPORT)) {
    427             TreeStatement statement = 0;
    428             if (match(IMPORT))
    429                 statement = parseImportDeclaration(context);
    430             else
    431                 statement = parseExportDeclaration(context);
    432 
    433             if (!statement)
    434                 break;
    435             context.appendStatement(sourceElements, statement);
    436         } else {
     423        TreeStatement statement = 0;
     424        if (match(IMPORT))
     425            statement = parseImportDeclaration(context);
     426        else if (match(EXPORT))
     427            statement = parseExportDeclaration(context);
     428        else {
    437429            const Identifier* directive = 0;
    438430            unsigned directiveLiteralLength = 0;
    439             if (!parseStatementListItem(moduleStatementItemBuilder, directive, &directiveLiteralLength))
    440                 break;
    441         }
     431            if (moduleParseMode == ModuleParseMode::Analyze) {
     432                if (!parseStatementListItem(syntaxChecker, directive, &directiveLiteralLength))
     433                    break;
     434                continue;
     435            }
     436            statement = parseStatementListItem(context, directive, &directiveLiteralLength);
     437        }
     438
     439        if (!statement)
     440            break;
     441        context.appendStatement(sourceElements, statement);
    442442    }
    443443
    444444    propagateError();
    445445
    446     for (const auto& uid : currentScope()->moduleScopeData().exportedBindings())
    447         semanticFailIfFalse(currentScope()->hasDeclaredVariable(uid) || currentScope()->hasLexicallyDeclaredVariable(uid), "Exported binding '", uid.get(), "' needs to refer to a top-level declared variable");
     446    for (const auto& uid : currentScope()->moduleScopeData().exportedBindings()) {
     447        if (currentScope()->hasDeclaredVariable(uid)) {
     448            currentScope()->declaredVariables().markVariableAsExported(uid);
     449            continue;
     450        }
     451
     452        if (currentScope()->hasLexicallyDeclaredVariable(uid)) {
     453            currentScope()->lexicalVariables().markVariableAsExported(uid);
     454            continue;
     455        }
     456
     457        semanticFail("Exported binding '", uid.get(), "' needs to refer to a top-level declared variable");
     458    }
    448459
    449460    return sourceElements;
     
    602613                }
    603614            }
    604             semanticFailIfTrue(exportType == ExportType::Exported && !currentScope()->moduleScopeData().exportName(*name), "Cannot export a duplicate name '", name->impl(), "'");
     615            if (exportType == ExportType::Exported) {
     616                semanticFailIfFalse(exportName(*name), "Cannot export a duplicate name '", name->impl(), "'");
     617                currentScope()->moduleScopeData().exportBinding(*name);
     618            }
    605619
    606620            if (hasInitializer) {
     
    706720    }
    707721
    708     semanticFailIfTrue(exportType == ExportType::Exported && !currentScope()->moduleScopeData().exportName(name), "Cannot export a duplicate name '", name.impl(), "'");
     722    if (exportType == ExportType::Exported) {
     723        semanticFailIfFalse(exportName(name), "Cannot export a duplicate name '", name.impl(), "'");
     724        currentScope()->moduleScopeData().exportBinding(name);
     725    }
    709726    return context.createBindingLocation(token.m_location, name, token.m_startPosition, token.m_endPosition, bindingContext);
    710727}
     
    18571874    failIfFalse(functionInfo.name, "Function statements must have a name");
    18581875    failIfTrueIfStrict(declareVariable(functionInfo.name) & DeclarationResult::InvalidStrictMode, "Cannot declare a function named '", functionInfo.name->impl(), "' in strict mode");
    1859     semanticFailIfTrue(exportType == ExportType::Exported && !currentScope()->moduleScopeData().exportName(*functionInfo.name), "Cannot export a duplicate function name: '", functionInfo.name->impl(), "'");
     1876    if (exportType == ExportType::Exported) {
     1877        semanticFailIfFalse(exportName(*functionInfo.name), "Cannot export a duplicate function name: '", functionInfo.name->impl(), "'");
     1878        currentScope()->moduleScopeData().exportBinding(*functionInfo.name);
     1879    }
    18601880    return context.createFuncDeclStatement(location, functionInfo);
    18611881}
     
    18771897    if (declarationResult & DeclarationResult::InvalidDuplicateDeclaration)
    18781898        internalFailWithMessage(false, "Cannot declare a class twice: '", info.className->impl(), "'");
    1879     semanticFailIfTrue(exportType == ExportType::Exported && !currentScope()->moduleScopeData().exportName(*info.className), "Cannot export a duplicate class name: '", info.className->impl(), "'");
     1899    if (exportType == ExportType::Exported) {
     1900        semanticFailIfFalse(exportName(*info.className), "Cannot export a duplicate class name: '", info.className->impl(), "'");
     1901        currentScope()->moduleScopeData().exportBinding(*info.className);
     1902    }
    18801903
    18811904    JSTextPosition classEnd = lastTokenEndPosition();
     
    22832306
    22842307    semanticFailIfTrue(localNameToken.m_type & KeywordTokenFlag, "Cannot use keyword as imported binding name");
    2285     DeclarationResultMask declarationResult = declareVariable(localName, DeclarationType::ConstDeclaration);
     2308    DeclarationResultMask declarationResult = declareVariable(localName, DeclarationType::ConstDeclaration, DeclarationImportType::Imported);
    22862309    if (declarationResult != DeclarationResult::Valid) {
    22872310        failIfTrueIfStrict(declarationResult & DeclarationResult::InvalidStrictMode, "Cannot declare an imported binding named ", localName->impl(), " in strict mode");
     
    23852408    }
    23862409
    2387     semanticFailIfFalse(currentScope()->moduleScopeData().exportName(*exportedName), "Cannot export a duplicate name '", exportedName->impl(), "'");
     2410    semanticFailIfFalse(exportName(*exportedName), "Cannot export a duplicate name '", exportedName->impl(), "'");
    23882411    maybeLocalNames.append(localName);
    23892412    return context.createExportSpecifier(specifierLocation, *localName, *exportedName);
     
    24082431        failIfFalse(moduleSpecifier, "Cannot parse the 'from' clause");
    24092432        failIfFalse(autoSemiColon(), "Expected a ';' following a targeted export declaration");
     2433
    24102434        return context.createExportAllDeclaration(exportLocation, moduleSpecifier);
    24112435    }
     
    24192443
    24202444        TreeStatement result = 0;
    2421         bool hasName = false;
    24222445        bool isFunctionOrClassDeclaration = false;
     2446        const Identifier* localName = nullptr;
    24232447        SavePoint savePoint = createSavePoint();
    24242448        if (match(FUNCTION)
     
    24302454            next();
    24312455            // FIXME: When landing ES6 generators, we need to take care of that '*' comes.
    2432             hasName = match(IDENT);
     2456            if (match(IDENT))
     2457                localName = m_token.m_data.ident;
    24332458            restoreSavePoint(savePoint);
    24342459        }
    24352460
    2436         if (hasName) {
     2461        if (localName) {
    24372462            if (match(FUNCTION))
    24382463                result = parseFunctionDeclaration(context);
     
    24442469#endif
    24452470        } else {
     2471            // export default expr;
     2472            //
     2473            // It should be treated as the same to the following.
     2474            //
     2475            // const *default* = expr;
     2476            // export { *default* as default }
    24462477            JSTokenLocation location(tokenLocation());
    24472478            JSTextPosition start = tokenStartPosition();
    24482479            TreeExpression expression = parseAssignmentExpression(context);
    24492480            failIfFalse(expression, "Cannot parse expression");
    2450             result = context.createExprStatement(location, expression, start, tokenEndPosition());
     2481
     2482            DeclarationResultMask declarationResult = declareVariable(&m_vm->propertyNames->starDefaultPrivateName, DeclarationType::ConstDeclaration);
     2483            if (declarationResult & DeclarationResult::InvalidDuplicateDeclaration)
     2484                internalFailWithMessage(false, "Cannot export 'default' name twice: '");
     2485
     2486            TreeExpression assignment = context.createAssignResolve(location, m_vm->propertyNames->starDefaultPrivateName, expression, start, start, tokenEndPosition(), AssignmentContext::ConstDeclarationStatement);
     2487            result = context.createExprStatement(location, assignment, start, tokenEndPosition());
    24512488            if (!isFunctionOrClassDeclaration)
    24522489                failIfFalse(autoSemiColon(), "Expected a ';' following a targeted export declaration");
     2490            localName = &m_vm->propertyNames->starDefaultPrivateName;
    24532491        }
    24542492        failIfFalse(result, "Cannot parse the declaration");
    2455         semanticFailIfFalse(currentScope()->moduleScopeData().exportName(m_vm->propertyNames->defaultKeyword), "Cannot export 'default' name twice.");
    2456 
    2457         return context.createExportDefaultDeclaration(exportLocation, result);
     2493
     2494        semanticFailIfFalse(exportName(m_vm->propertyNames->defaultKeyword), "Cannot export 'default' name twice.");
     2495        currentScope()->moduleScopeData().exportBinding(*localName);
     2496        return context.createExportDefaultDeclaration(exportLocation, result, *localName);
    24582497    }
    24592498
  • trunk/Source/JavaScriptCore/parser/Parser.h

    r188219 r188355  
    9999};
    100100
     101enum class DeclarationImportType {
     102    Imported,
     103    NotImported
     104};
     105
    101106enum DeclarationResult {
    102107    Valid = 0,
     
    258263
    259264    VariableEnvironment& declaredVariables() { return m_declaredVariables; }
     265    VariableEnvironment& lexicalVariables() { return m_lexicalVariables; }
    260266    VariableEnvironment& finalizeLexicalEnvironment()
    261267    {
     
    316322    }
    317323
    318     DeclarationResultMask declareLexicalVariable(const Identifier* ident, bool isConstant)
     324    DeclarationResultMask declareLexicalVariable(const Identifier* ident, bool isConstant, DeclarationImportType importType = DeclarationImportType::NotImported)
    319325    {
    320326        ASSERT(m_allowsLexicalDeclarations);
     
    327333        else
    328334            addResult.iterator->value.setIsLet();
     335
     336        if (importType == DeclarationImportType::Imported)
     337            addResult.iterator->value.setIsImported();
    329338
    330339        if (!addResult.isNewEntry)
     
    612621
    613622    template <class ParsedNode>
    614     std::unique_ptr<ParsedNode> parse(ParserError&, const Identifier&, FunctionParseMode);
     623    std::unique_ptr<ParsedNode> parse(ParserError&, const Identifier&, FunctionParseMode, ModuleParseMode);
    615624
    616625    JSTextPosition positionBeforeLastNewline() const { return m_lexer->positionBeforeLastNewline(); }
     
    770779    }
    771780   
    772     DeclarationResultMask declareVariable(const Identifier* ident, DeclarationType type = DeclarationType::VarDeclaration)
     781    DeclarationResultMask declareVariable(const Identifier* ident, DeclarationType type = DeclarationType::VarDeclaration, DeclarationImportType importType = DeclarationImportType::NotImported)
    773782    {
    774783        unsigned i = m_scopeStack.size() - 1;
     
    795804        }
    796805
    797         return m_scopeStack[i].declareLexicalVariable(ident, type == DeclarationType::ConstDeclaration);
     806        return m_scopeStack[i].declareLexicalVariable(ident, type == DeclarationType::ConstDeclaration, importType);
    798807    }
    799808   
     
    826835    }
    827836
     837    bool exportName(const Identifier& ident)
     838    {
     839        ASSERT(currentScope().index() == 0);
     840        return currentScope()->moduleScopeData().exportName(ident);
     841    }
     842
    828843    ScopeStack m_scopeStack;
    829844   
     
    834849
    835850    Parser();
    836     String parseInner(const Identifier&, FunctionParseMode);
     851    String parseInner(const Identifier&, FunctionParseMode, ModuleParseMode);
    837852
    838853    void didFinishParsing(SourceElements*, DeclarationStacks::FunctionStack&, VariableEnvironment&, CodeFeatures, int, const Vector<RefPtr<UniquedStringImpl>>&&);
     
    10991114    template <class TreeBuilder> NEVER_INLINE TreeDestructuringPattern tryParseDestructuringPatternExpression(TreeBuilder&, AssignmentContext);
    11001115    template <class TreeBuilder> NEVER_INLINE TreeExpression parseDefaultValueForDestructuringPattern(TreeBuilder&);
    1101     template <class TreeBuilder> TreeSourceElements parseModuleSourceElements(TreeBuilder&);
     1116    template <class TreeBuilder> TreeSourceElements parseModuleSourceElements(TreeBuilder&, ModuleParseMode);
    11021117    enum class ImportSpecifierType { NamespaceImport, NamedImport, DefaultImport };
    11031118    template <class TreeBuilder> typename TreeBuilder::ImportSpecifier parseImportClauseItem(TreeBuilder&, ImportSpecifierType);
     
    12561271template <typename LexerType>
    12571272template <class ParsedNode>
    1258 std::unique_ptr<ParsedNode> Parser<LexerType>::parse(ParserError& error, const Identifier& calleeName, FunctionParseMode parseMode)
     1273std::unique_ptr<ParsedNode> Parser<LexerType>::parse(ParserError& error, const Identifier& calleeName, FunctionParseMode parseMode, ModuleParseMode moduleParseMode)
    12591274{
    12601275    int errLine;
     
    12731288    unsigned startColumn = m_source->startColumn() - 1;
    12741289
    1275     String parseError = parseInner(calleeName, parseMode);
     1290    String parseError = parseInner(calleeName, parseMode, moduleParseMode);
    12761291
    12771292    int lineNumber = m_lexer->lineNumber();
     
    13411356    JSParserStrictMode strictMode, JSParserCodeType codeType,
    13421357    ParserError& error, JSTextPosition* positionBeforeLastNewline = nullptr,
    1343     FunctionParseMode parseMode = NotAFunctionMode, ConstructorKind defaultConstructorKind = ConstructorKind::None,
    1344     ThisTDZMode thisTDZMode = ThisTDZMode::CheckIfNeeded)
     1358    FunctionParseMode parseMode = NotAFunctionMode, ConstructorKind defaultConstructorKind = ConstructorKind::None,
     1359    ThisTDZMode thisTDZMode = ThisTDZMode::CheckIfNeeded,
     1360    ModuleParseMode moduleParseMode = ModuleParseMode::Analyze)
    13451361{
    13461362    SamplingRegion samplingRegion("Parsing");
     
    13491365    if (source.provider()->source().is8Bit()) {
    13501366        Parser<Lexer<LChar>> parser(vm, source, builtinMode, strictMode, codeType, defaultConstructorKind, thisTDZMode);
    1351         std::unique_ptr<ParsedNode> result = parser.parse<ParsedNode>(error, name, parseMode);
     1367        std::unique_ptr<ParsedNode> result = parser.parse<ParsedNode>(error, name, parseMode, moduleParseMode);
    13521368        if (positionBeforeLastNewline)
    13531369            *positionBeforeLastNewline = parser.positionBeforeLastNewline();
     
    13621378    ASSERT_WITH_MESSAGE(defaultConstructorKind == ConstructorKind::None, "BuiltinExecutables::createDefaultConstructor should always use a 8-bit string");
    13631379    Parser<Lexer<UChar>> parser(vm, source, builtinMode, strictMode, codeType, defaultConstructorKind, thisTDZMode);
    1364     std::unique_ptr<ParsedNode> result = parser.parse<ParsedNode>(error, name, parseMode);
     1380    std::unique_ptr<ParsedNode> result = parser.parse<ParsedNode>(error, name, parseMode, moduleParseMode);
    13651381    if (positionBeforeLastNewline)
    13661382        *positionBeforeLastNewline = parser.positionBeforeLastNewline();
  • trunk/Source/JavaScriptCore/parser/ParserModes.h

    r187890 r188355  
    3939enum class SuperBinding { Needed, NotNeeded };
    4040enum class ThisTDZMode { AlwaysCheck, CheckIfNeeded };
     41enum class ModuleParseMode { Analyze, Evaluate };
    4142
    4243enum ProfilerMode { ProfilerOff, ProfilerOn };
  • trunk/Source/JavaScriptCore/parser/SyntaxChecker.h

    r188219 r188355  
    266266    int createImportDeclaration(const JSTokenLocation&, ImportSpecifierList, ModuleSpecifier) { return StatementResult; }
    267267    int createExportAllDeclaration(const JSTokenLocation&, ModuleSpecifier) { return StatementResult; }
    268     int createExportDefaultDeclaration(const JSTokenLocation&, int) { return StatementResult; }
     268    int createExportDefaultDeclaration(const JSTokenLocation&, int, const Identifier&) { return StatementResult; }
    269269    int createExportLocalDeclaration(const JSTokenLocation&, int) { return StatementResult; }
    270270    int createExportNamedDeclaration(const JSTokenLocation&, ExportSpecifierList, ModuleSpecifier) { return StatementResult; }
  • trunk/Source/JavaScriptCore/parser/VariableEnvironment.cpp

    r186860 r188355  
    8282}
    8383
     84void VariableEnvironment::markVariableAsImported(const RefPtr<UniquedStringImpl>& identifier)
     85{
     86    auto findResult = m_map.find(identifier);
     87    RELEASE_ASSERT(findResult != m_map.end());
     88    findResult->value.setIsImported();
     89}
     90
     91void VariableEnvironment::markVariableAsExported(const RefPtr<UniquedStringImpl>& identifier)
     92{
     93    auto findResult = m_map.find(identifier);
     94    RELEASE_ASSERT(findResult != m_map.end());
     95    findResult->value.setIsExported();
     96}
     97
    8498} // namespace JSC
  • trunk/Source/JavaScriptCore/parser/VariableEnvironment.h

    r187012 r188355  
    3939    ALWAYS_INLINE bool isVar() const { return m_bits & IsVar; }
    4040    ALWAYS_INLINE bool isLet() const { return m_bits & IsLet; }
     41    ALWAYS_INLINE bool isExported() const { return m_bits & IsExported; }
     42    ALWAYS_INLINE bool isImported() const { return m_bits & IsImported; }
    4143
    4244    ALWAYS_INLINE void setIsCaptured() { m_bits |= IsCaptured; }
     
    4446    ALWAYS_INLINE void setIsVar() { m_bits |= IsVar; }
    4547    ALWAYS_INLINE void setIsLet() { m_bits |= IsLet; }
     48    ALWAYS_INLINE void setIsExported() { m_bits |= IsExported; }
     49    ALWAYS_INLINE void setIsImported() { m_bits |= IsImported; }
    4650
    4751    ALWAYS_INLINE void clearIsVar() { m_bits &= ~IsVar; }
     
    5256        IsConst = 1 << 1,
    5357        IsVar = 1 << 2,
    54         IsLet = 1 << 3
     58        IsLet = 1 << 3,
     59        IsExported = 1 << 4,
     60        IsImported = 1 << 5
    5561    };
    5662    uint8_t m_bits { 0 };
     
    8086    bool hasCapturedVariables() const;
    8187    bool captures(UniquedStringImpl* identifier) const;
     88    void markVariableAsImported(const RefPtr<UniquedStringImpl>& identifier);
     89    void markVariableAsExported(const RefPtr<UniquedStringImpl>& identifier);
    8290
    8391private:
  • trunk/Source/JavaScriptCore/runtime/CommonIdentifiers.h

    r187890 r188355  
    302302    macro(promiseResult) \
    303303    macro(capabilities) \
     304    macro(starDefault) \
    304305
    305306
  • trunk/Source/JavaScriptCore/runtime/Completion.cpp

    r187890 r188355  
    3232#include "JSLock.h"
    3333#include "JSCInlines.h"
     34#include "ModuleAnalyzer.h"
     35#include "ModuleRecord.h"
    3436#include "Parser.h"
    3537#include <wtf/WTFThreadData.h>
     
    6668    JSLockHolder lock(vm);
    6769    RELEASE_ASSERT(vm.atomicStringTable() == wtfThreadData().atomicStringTable());
    68     return !!parse<ModuleProgramNode>(
     70    std::unique_ptr<ModuleProgramNode> moduleProgramNode = parse<ModuleProgramNode>(
    6971        &vm, source, Identifier(), JSParserBuiltinMode::NotBuiltin,
    7072        JSParserStrictMode::Strict, JSParserCodeType::Module, error);
     73    if (!moduleProgramNode)
     74        return false;
     75
     76    ModuleAnalyzer moduleAnalyzer(vm, moduleProgramNode->varDeclarations(), moduleProgramNode->lexicalVariables());
     77    moduleAnalyzer.analyze(*moduleProgramNode);
     78    return true;
    7179}
    7280
  • trunk/Source/JavaScriptCore/runtime/Options.h

    r188338 r188355  
    323323    \
    324324    v(unsigned, watchdog, 0, "watchdog timeout (0 = Disabled, N = a timeout period of N milliseconds)") \
     325    \
     326    v(bool, dumpModuleRecord, false, nullptr) \
    325327
    326328class Options {
Note: See TracChangeset for help on using the changeset viewer.