Ignore:
Timestamp:
Jan 24, 2022, 2:51:13 PM (3 years ago)
Author:
[email protected]
Message:

[JSC] Support import assertion syntax
https://bugs.webkit.org/show_bug.cgi?id=235312

Reviewed by Ross Kirsling.

JSTests:

  • modules/import-meta-syntax.js:

(shouldThrow):

  • stress/import-syntax.js:
  • stress/modules-syntax-error.js:
  • stress/modules-syntax-import-assertion-error.js: Added.

(shouldThrow):

  • stress/modules-syntax-import-assertion.js: Added.

LayoutTests/imported/w3c:

  • web-platform-tests/html/semantics/scripting-1/the-script-element/css-module/css-module-worker-test-expected.txt:
  • web-platform-tests/html/semantics/scripting-1/the-script-element/css-module/import-css-module-dynamic-expected.txt:
  • web-platform-tests/html/semantics/scripting-1/the-script-element/import-assertions/dynamic-import-with-assertion-argument.any-expected.txt:
  • web-platform-tests/html/semantics/scripting-1/the-script-element/import-assertions/dynamic-import-with-assertion-argument.any.worker-expected.txt:
  • web-platform-tests/html/semantics/scripting-1/the-script-element/json-module/charset-bom.any-expected.txt:
  • web-platform-tests/html/semantics/scripting-1/the-script-element/json-module/charset-bom.any.worker-expected.txt:
  • web-platform-tests/html/semantics/scripting-1/the-script-element/json-module/invalid-content-type.any-expected.txt:
  • web-platform-tests/html/semantics/scripting-1/the-script-element/json-module/invalid-content-type.any.worker-expected.txt:
  • web-platform-tests/html/semantics/scripting-1/the-script-element/json-module/json-module-service-worker-test.https-expected.txt:
  • web-platform-tests/html/semantics/scripting-1/the-script-element/json-module/non-object.any-expected.txt:
  • web-platform-tests/html/semantics/scripting-1/the-script-element/json-module/non-object.any.worker-expected.txt:
  • web-platform-tests/html/semantics/scripting-1/the-script-element/json-module/repeated-imports.any-expected.txt:
  • web-platform-tests/html/semantics/scripting-1/the-script-element/json-module/repeated-imports.any.worker-expected.txt:
  • web-platform-tests/service-workers/service-worker/dedicated-worker-service-worker-interception.https-expected.txt:
  • web-platform-tests/workers/dedicated-worker-parse-error-failure-expected.txt:
  • web-platform-tests/workers/modules/dedicated-worker-options-credentials-expected.txt:

Source/JavaScriptCore:

This patch adds syntax support for import assertion[1].
This does not add the actual feature propagating import assertion
to the module request yet.

[1]: https://github.com/tc39/proposal-import-assertions

  • bytecompiler/NodesCodegen.cpp:

(JSC::ImportNode::emitBytecode):

  • parser/ASTBuilder.h:

(JSC::ASTBuilder::createImportExpr):
(JSC::ASTBuilder::createImportAssertionList):
(JSC::ASTBuilder::appendImportAssertion):
(JSC::ASTBuilder::createImportDeclaration):
(JSC::ASTBuilder::createExportAllDeclaration):
(JSC::ASTBuilder::createExportNamedDeclaration):

  • parser/NodeConstructors.h:

(JSC::ImportNode::ImportNode):
(JSC::ImportDeclarationNode::ImportDeclarationNode):
(JSC::ExportAllDeclarationNode::ExportAllDeclarationNode):
(JSC::ExportNamedDeclarationNode::ExportNamedDeclarationNode):

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

(JSC::Parser<LexerType>::parseImportAssertions):
(JSC::Parser<LexerType>::parseImportDeclaration):
(JSC::Parser<LexerType>::parseExportDeclaration):
(JSC::Parser<LexerType>::parseMemberExpression):

  • parser/Parser.h:
  • parser/SyntaxChecker.h:

(JSC::SyntaxChecker::createImportExpr):
(JSC::SyntaxChecker::createImportAssertionList):
(JSC::SyntaxChecker::appendImportAssertion):
(JSC::SyntaxChecker::createImportDeclaration):
(JSC::SyntaxChecker::createExportAllDeclaration):
(JSC::SyntaxChecker::createExportNamedDeclaration):

  • runtime/JSGlobalObjectFunctions.cpp:

(JSC::JSC_DEFINE_HOST_FUNCTION):

  • runtime/OptionsList.h:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/parser/Nodes.h

    r287531 r288473  
    628628    class ImportNode final : public ExpressionNode, public ThrowableExpressionData {
    629629    public:
    630         ImportNode(const JSTokenLocation&, ExpressionNode*);
     630        ImportNode(const JSTokenLocation&, ExpressionNode*, ExpressionNode*);
    631631
    632632    private:
     
    635635
    636636        ExpressionNode* m_expr;
     637        ExpressionNode* m_option;
    637638    };
    638639
     
    20582059    };
    20592060
     2061    class ImportAssertionListNode final : public ParserArenaDeletable {
     2062        JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(ImportAssertionListNode);
     2063    public:
     2064        using Assertions = Vector<std::tuple<const Identifier*, const Identifier*>, 3>;
     2065
     2066        const Assertions& assertions() const { return m_assertions; }
     2067        void append(const Identifier& key, const Identifier& value)
     2068        {
     2069            m_assertions.append(std::tuple { &key, &value });
     2070        }
     2071
     2072    private:
     2073        Assertions m_assertions;
     2074    };
     2075
    20602076    class ModuleDeclarationNode : public StatementNode {
    20612077    public:
     
    20702086    class ImportDeclarationNode final : public ModuleDeclarationNode {
    20712087    public:
    2072         ImportDeclarationNode(const JSTokenLocation&, ImportSpecifierListNode*, ModuleNameNode*);
     2088        ImportDeclarationNode(const JSTokenLocation&, ImportSpecifierListNode*, ModuleNameNode*, ImportAssertionListNode*);
    20732089
    20742090        ImportSpecifierListNode* specifierList() const { return m_specifierList; }
    20752091        ModuleNameNode* moduleName() const { return m_moduleName; }
     2092        ImportAssertionListNode* assertionList() const { return m_assertionList; }
    20762093
    20772094    private:
     
    20812098        ImportSpecifierListNode* m_specifierList;
    20822099        ModuleNameNode* m_moduleName;
     2100        ImportAssertionListNode* m_assertionList;
    20832101    };
    20842102
    20852103    class ExportAllDeclarationNode final : public ModuleDeclarationNode {
    20862104    public:
    2087         ExportAllDeclarationNode(const JSTokenLocation&, ModuleNameNode*);
     2105        ExportAllDeclarationNode(const JSTokenLocation&, ModuleNameNode*, ImportAssertionListNode*);
    20882106
    20892107        ModuleNameNode* moduleName() const { return m_moduleName; }
     2108        ImportAssertionListNode* assertionList() const { return m_assertionList; }
    20902109
    20912110    private:
     
    20942113
    20952114        ModuleNameNode* m_moduleName;
     2115        ImportAssertionListNode* m_assertionList;
    20962116    };
    20972117
     
    21512171    class ExportNamedDeclarationNode final : public ModuleDeclarationNode {
    21522172    public:
    2153         ExportNamedDeclarationNode(const JSTokenLocation&, ExportSpecifierListNode*, ModuleNameNode*);
     2173        ExportNamedDeclarationNode(const JSTokenLocation&, ExportSpecifierListNode*, ModuleNameNode*, ImportAssertionListNode*);
    21542174
    21552175        ExportSpecifierListNode* specifierList() const { return m_specifierList; }
    21562176        ModuleNameNode* moduleName() const { return m_moduleName; }
     2177        ImportAssertionListNode* assertionList() const { return m_assertionList; }
    21572178
    21582179    private:
     
    21612182        ExportSpecifierListNode* m_specifierList;
    21622183        ModuleNameNode* m_moduleName { nullptr };
     2184        ImportAssertionListNode* m_assertionList { nullptr };
    21632185    };
    21642186
Note: See TracChangeset for help on using the changeset viewer.