Ignore:
Timestamp:
Oct 11, 2017, 11:45:23 PM (8 years ago)
Author:
Yusuke Suzuki
Message:

import.meta should not be assignable
https://bugs.webkit.org/show_bug.cgi?id=178202

Reviewed by Saam Barati.

JSTests:

  • modules/import-meta-assignment.js: Added.

(shouldThrow):
(SyntaxError.import.meta.can.shouldThrow):

Source/JavaScriptCore:

import.meta cannot be used for LHS. This patch adds MetaPropertyNode
and make NewTargetNode and ImportMetaNode as derived classes of MetaPropertyNode.
We change the parser not to allow assignments for MetaPropertyNode.

  • bytecompiler/NodesCodegen.cpp:

(JSC::ImportMetaNode::emitBytecode):

  • parser/ASTBuilder.h:

(JSC::ASTBuilder::createImportMetaExpr):
(JSC::ASTBuilder::isMetaProperty):
(JSC::ASTBuilder::isImportMeta):

  • parser/NodeConstructors.h:

(JSC::MetaPropertyNode::MetaPropertyNode):
(JSC::NewTargetNode::NewTargetNode):
(JSC::ImportMetaNode::ImportMetaNode):

  • parser/Nodes.h:

(JSC::ExpressionNode::isMetaProperty const):
(JSC::ExpressionNode::isImportMeta const):

  • parser/Parser.cpp:

(JSC::Parser<LexerType>::metaPropertyName):
(JSC::Parser<LexerType>::parseAssignmentExpression):
(JSC::Parser<LexerType>::parseMemberExpression):
(JSC::Parser<LexerType>::parseUnaryExpression):

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

(JSC::SyntaxChecker::createImportMetaExpr):
(JSC::SyntaxChecker::isMetaProperty):
(JSC::SyntaxChecker::isImportMeta):

File:
1 edited

Legend:

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

    r223047 r223232  
    187187        virtual bool isSuperNode() const { return false; }
    188188        virtual bool isImportNode() const { return false; }
     189        virtual bool isMetaProperty() const { return false; }
    189190        virtual bool isNewTarget() const { return false; }
     191        virtual bool isImportMeta() const { return false; }
    190192        virtual bool isBytecodeIntrinsicNode() const { return false; }
    191193
     
    585587    };
    586588
    587     class NewTargetNode final : public ExpressionNode {
     589    class MetaPropertyNode : public ExpressionNode {
     590    public:
     591        MetaPropertyNode(const JSTokenLocation&);
     592
     593    private:
     594        bool isMetaProperty() const final { return true; }
     595    };
     596
     597    class NewTargetNode final : public MetaPropertyNode {
    588598    public:
    589599        NewTargetNode(const JSTokenLocation&);
     
    592602        bool isNewTarget() const final { return true; }
    593603        RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
     604    };
     605
     606    class ImportMetaNode final : public MetaPropertyNode {
     607    public:
     608        ImportMetaNode(const JSTokenLocation&, ExpressionNode*);
     609
     610    private:
     611        bool isImportMeta() const final { return true; }
     612        RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
     613
     614        ExpressionNode* m_expr;
    594615    };
    595616
Note: See TracChangeset for help on using the changeset viewer.