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/Parser.cpp

    r223175 r223232  
    35863586    return parseAssignmentExpression(context, classifier);
    35873587}
     3588
     3589
     3590template <typename LexerType>
     3591template <typename TreeBuilder> NEVER_INLINE const char* Parser<LexerType>::metaPropertyName(TreeBuilder& context, TreeExpression expr)
     3592{
     3593    if (context.isNewTarget(expr))
     3594        return "new.target";
     3595    if (context.isImportMeta(expr))
     3596        return "import.meta";
     3597    RELEASE_ASSERT_NOT_REACHED();
     3598    return "error";
     3599}
    35883600   
    35893601template <typename LexerType>
     
    36913703        m_parserState.nonTrivialExpressionCount++;
    36923704        hadAssignment = true;
    3693         if (UNLIKELY(context.isNewTarget(lhs)))
    3694             internalFailWithMessage(false, "new.target can't be the left hand side of an assignment expression");
     3705        if (UNLIKELY(context.isMetaProperty(lhs)))
     3706            internalFailWithMessage(false, metaPropertyName(context, lhs), " can't be the left hand side of an assignment expression");
    36953707        context.assignmentStackAppend(assignmentStack, lhs, start, tokenStartPosition(), m_parserState.assignmentCount, op);
    36963708        start = tokenStartPosition();
     
    46994711
    47004712                JSTokenLocation location(tokenLocation());
    4701                 base = createResolveAndUseVariable(context, &m_vm->propertyNames->builtinNames().metaPrivateName(), false, expressionStart, location);
     4713                base = context.createImportMetaExpr(location, createResolveAndUseVariable(context, &m_vm->propertyNames->builtinNames().metaPrivateName(), false, expressionStart, location));
    47024714                next();
    47034715            } else {
     
    49254937        failWithMessage("Cannot parse member expression");
    49264938    }
    4927     if (UNLIKELY(isUpdateOp(static_cast<JSTokenType>(lastOperator)) && context.isNewTarget(expr)))
    4928         internalFailWithMessage(false, "new.target can't come after a prefix operator");
     4939    if (UNLIKELY(isUpdateOp(static_cast<JSTokenType>(lastOperator)) && context.isMetaProperty(expr)))
     4940        internalFailWithMessage(false, metaPropertyName(context, expr), " can't come after a prefix operator");
    49294941    bool isEvalOrArguments = false;
    49304942    if (strictMode() && !m_syntaxAlreadyValidated) {
     
    49354947    switch (m_token.m_type) {
    49364948    case PLUSPLUS:
    4937         if (UNLIKELY(context.isNewTarget(expr)))
    4938             internalFailWithMessage(false, "new.target can't come before a postfix operator");
     4949        if (UNLIKELY(context.isMetaProperty(expr)))
     4950            internalFailWithMessage(false, metaPropertyName(context, expr), " can't come before a postfix operator");
    49394951        m_parserState.nonTrivialExpressionCount++;
    49404952        m_parserState.nonLHSCount++;
     
    49474959        break;
    49484960    case MINUSMINUS:
    4949         if (UNLIKELY(context.isNewTarget(expr)))
    4950             internalFailWithMessage(false, "new.target can't come before a postfix operator");
     4961        if (UNLIKELY(context.isMetaProperty(expr)))
     4962            internalFailWithMessage(false, metaPropertyName(context, expr), " can't come before a postfix operator");
    49514963        m_parserState.nonTrivialExpressionCount++;
    49524964        m_parserState.nonLHSCount++;
Note: See TracChangeset for help on using the changeset viewer.