Ignore:
Timestamp:
Nov 13, 2015, 11:13:39 AM (10 years ago)
Author:
[email protected]
Message:

Allow any LeftHandSideExpression as a valid AssignmentElement
https://bugs.webkit.org/show_bug.cgi?id=151026

Patch by Caitlin Potter <[email protected]> on 2015-11-13
Reviewed by Geoffrey Garen.

  • bytecompiler/NodesCodegen.cpp:

(JSC::AssignmentElementNode::collectBoundIdentifiers):
(JSC::AssignmentElementNode::bindValue):
(JSC::AssignmentElementNode::toString):

  • parser/ASTBuilder.h:

(JSC::ASTBuilder::isAssignmentLocation):
(JSC::ASTBuilder::createAssignmentElement):

  • parser/NodeConstructors.h:

(JSC::AssignmentElementNode::AssignmentElementNode):

  • parser/Nodes.h:

(JSC::AssignmentElementNode::assignmentTarget):
(JSC::AssignmentElementNode::divotStart):
(JSC::AssignmentElementNode::divotEnd):

  • parser/Parser.cpp:

(JSC::Parser<LexerType>::createAssignmentElement):
(JSC::Parser<LexerType>::parseDestructuringPattern):

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

(JSC::SyntaxChecker::operatorStackPop):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp

    r192155 r192436  
    33983398    identifiers.append(m_boundProperty);
    33993399}
    3400    
     3400
     3401void AssignmentElementNode::collectBoundIdentifiers(Vector<Identifier>&) const
     3402{
     3403}
     3404
     3405void AssignmentElementNode::bindValue(BytecodeGenerator& generator, RegisterID* value) const
     3406{
     3407    if (m_assignmentTarget->isResolveNode()) {
     3408        ResolveNode* lhs = static_cast<ResolveNode*>(m_assignmentTarget);
     3409        Variable var = generator.variable(lhs->identifier());
     3410        bool isReadOnly = var.isReadOnly();
     3411        if (RegisterID* local = var.local()) {
     3412            generator.emitTDZCheckIfNecessary(var, local, nullptr);
     3413
     3414            if (isReadOnly)
     3415                generator.emitReadOnlyExceptionIfNeeded(var);
     3416            else {
     3417                generator.invalidateForInContextForLocal(local);
     3418                generator.moveToDestinationIfNeeded(local, value);
     3419                generator.emitProfileType(local, divotStart(), divotEnd());
     3420            }
     3421            return;
     3422        }
     3423        if (generator.isStrictMode())
     3424            generator.emitExpressionInfo(divotEnd(), divotStart(), divotEnd());
     3425        RefPtr<RegisterID> scope = generator.emitResolveScope(nullptr, var);
     3426        generator.emitTDZCheckIfNecessary(var, nullptr, scope.get());
     3427        if (isReadOnly) {
     3428            bool threwException = generator.emitReadOnlyExceptionIfNeeded(var);
     3429            if (threwException)
     3430                return;
     3431        }
     3432        generator.emitExpressionInfo(divotEnd(), divotStart(), divotEnd());
     3433        if (!isReadOnly) {
     3434            generator.emitPutToScope(scope.get(), var, value, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound, NotInitialization);
     3435            generator.emitProfileType(value, var, divotStart(), divotEnd());
     3436        }
     3437    } else if (m_assignmentTarget->isDotAccessorNode()) {
     3438        DotAccessorNode* lhs = static_cast<DotAccessorNode*>(m_assignmentTarget);
     3439        RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(lhs->base(), true, false);
     3440        generator.emitExpressionInfo(divotEnd(), divotStart(), divotEnd());
     3441        generator.emitPutById(base.get(), lhs->identifier(), value);
     3442        generator.emitProfileType(value, divotStart(), divotEnd());
     3443    } else if (m_assignmentTarget->isBracketAccessorNode()) {
     3444        BracketAccessorNode* lhs = static_cast<BracketAccessorNode*>(m_assignmentTarget);
     3445        RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(lhs->base(), true, false);
     3446        RefPtr<RegisterID> property = generator.emitNodeForLeftHandSide(lhs->subscript(), true, false);
     3447        generator.emitExpressionInfo(divotEnd(), divotStart(), divotEnd());
     3448        generator.emitPutByVal(base.get(), property.get(), value);
     3449        generator.emitProfileType(value, divotStart(), divotEnd());
     3450    }
     3451}
     3452
     3453void AssignmentElementNode::toString(StringBuilder& builder) const
     3454{
     3455    if (m_assignmentTarget->isResolveNode())
     3456        builder.append(static_cast<ResolveNode*>(m_assignmentTarget)->identifier().string());
     3457}
     3458
    34013459RegisterID* SpreadExpressionNode::emitBytecode(BytecodeGenerator&, RegisterID*)
    34023460{
Note: See TracChangeset for help on using the changeset viewer.