Ignore:
Timestamp:
Sep 17, 2020, 3:30:19 AM (5 years ago)
Author:
[email protected]
Message:

Support export namespace export * as ns
https://bugs.webkit.org/show_bug.cgi?id=214379

Reviewed by Ross Kirsling.

JSTests:

  • stress/modules-syntax-error.js:
  • stress/modules-syntax.js:
  • test262/expectations.yaml:

Source/JavaScriptCore:

This supports export * as ns from "module" syntax. If it is used, we expose "module"'s namespace object as "ns".
For each module environment, we create *namespace* (starNamespace) private symbol scope variable. And we fill it later
with module namespace object. This way allows us to use module namespace object IC and super fast imported module binding
lookup though environment variable lookup mechanism.

  • builtins/BuiltinNames.h:
  • bytecompiler/BytecodeGenerator.cpp:

(JSC::BytecodeGenerator::BytecodeGenerator):

  • parser/NodesAnalyzeModule.cpp:

(JSC::ExportNamedDeclarationNode::analyzeModule):

  • parser/Parser.cpp:

(JSC::Parser<LexerType>::parseExportDeclaration):

  • runtime/AbstractModuleRecord.cpp:

(JSC::AbstractModuleRecord::ExportEntry::createNamespace):
(JSC::AbstractModuleRecord::resolveExportImpl):
(JSC::AbstractModuleRecord::getModuleNamespace):
(JSC::AbstractModuleRecord::setModuleEnvironment):
(JSC::AbstractModuleRecord::dump):

  • runtime/AbstractModuleRecord.h:
  • runtime/CommonIdentifiers.h:
  • runtime/JSFunction.cpp:

(JSC::JSFunction::name):
(JSC::JSFunction::reifyName):

  • runtime/JSModuleNamespaceObject.cpp:

(JSC::JSModuleNamespaceObject::getOwnPropertySlotCommon):

  • runtime/JSModuleRecord.cpp:

(JSC::JSModuleRecord::instantiateDeclarations):
(JSC::JSModuleRecord::evaluate):

  • wasm/js/JSWebAssemblyModule.cpp:

(JSC::JSWebAssemblyModule::finishCreation):

  • wasm/js/WebAssemblyModuleRecord.cpp:

(JSC::WebAssemblyModuleRecord::link):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/parser/NodesAnalyzeModule.cpp

    r261895r267186 
    8686            // In this case, no local variable names are imported into the current module.
    8787            // "v" indirectly points the binding in "mod".
    88             analyzer.moduleRecord()->addExportEntry(JSModuleRecord::ExportEntry::createIndirect(specifier->exportedName(), specifier->localName(), m_moduleName->moduleName()));
     88            //
     89            // export * as v from "mod"
     90            //
     91            // If it is namespace export, we should use createNamespace.
     92            if (specifier->localName() == analyzer.vm().propertyNames->starNamespacePrivateName)
     93                analyzer.moduleRecord()->addExportEntry(JSModuleRecord::ExportEntry::createNamespace(specifier->exportedName(), m_moduleName->moduleName()));
     94            else
     95                analyzer.moduleRecord()->addExportEntry(JSModuleRecord::ExportEntry::createIndirect(specifier->exportedName(), specifier->localName(), m_moduleName->moduleName()));
    8996        }
    9097    }
Note: See TracChangeset for help on using the changeset viewer.