Ignore:
Timestamp:
Jan 2, 2022, 11:39:38 PM (3 years ago)
Author:
[email protected]
Message:

[JSC] Use emitPutProperty / emitGetPropertyValue consistently to handle private names in edge cases
https://bugs.webkit.org/show_bug.cgi?id=234794

Reviewed by Alexey Shvayka.

JSTests:

  • test262/expectations.yaml:

Source/JavaScriptCore:

This patch consistently uses emitPutProperty / emitGetPropertyValue so that we handle private names
in edge cases.

  • bytecompiler/NodesCodegen.cpp:

(JSC::TaggedTemplateNode::emitBytecode):
(JSC::ForInNode::emitLoopHeader):
(JSC::ForOfNode::emitBytecode):
(JSC::AssignmentElementNode::bindValue const):

File:
1 edited

Legend:

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

    r287136 r287531  
    372372        ASSERT(m_tag->isDotAccessorNode());
    373373        DotAccessorNode* dot = static_cast<DotAccessorNode*>(m_tag);
     374        tag = generator.newTemporary();
    374375        base = generator.newTemporary();
    375376        base = generator.emitNode(base.get(), dot->base());
    376         if (dot->base()->isSuperNode()) {
    377             RefPtr<RegisterID> thisValue = generator.ensureThis();
    378             tag = generator.emitGetById(generator.newTemporary(), base.get(), thisValue.get(), dot->identifier());
    379         } else
    380             tag = generator.emitGetById(generator.newTemporary(), base.get(), dot->identifier());
     377        tag = dot->emitGetPropertyValue(generator, tag.get(), base.get());
    381378    }
    382379
     
    36773674
    36783675    generator.emitExpressionInfo(subexpressionDivot(), subexpressionStart(), subexpressionEnd());
    3679     if (m_base->isSuperNode()) {
    3680         thisValue = generator.ensureThis();
    3681         generator.emitGetById(result.get(), base.get(), thisValue.get(), m_ident);
    3682     } else
    3683         generator.emitGetById(result.get(), base.get(), m_ident);
    3684 
     3676    emitGetPropertyValue(generator, result.get(), base.get(), thisValue);
    36853677    Ref<Label> afterAssignment = generator.newLabel();
    36863678    emitShortCircuitAssignment(generator, result.get(), m_operator, afterAssignment.get());
     
    36883680    generator.emitNode(result.get(), m_right);
    36893681    generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
    3690     if (m_base->isSuperNode())
    3691         generator.emitPutById(base.get(), thisValue.get(), m_ident, result.get());
    3692     else
    3693         generator.emitPutById(base.get(), m_ident, result.get());
     3682    emitPutProperty(generator, base.get(), result.get(), thisValue);
    36943683    generator.emitProfileType(result.get(), divotStart(), divotEnd());
    36953684
     
    41374126    if (m_lexpr->isDotAccessorNode()) {
    41384127        DotAccessorNode* assignNode = static_cast<DotAccessorNode*>(m_lexpr);
    4139         const Identifier& ident = assignNode->identifier();
    41404128        RefPtr<RegisterID> base = generator.emitNode(assignNode->base());
    41414129        generator.emitExpressionInfo(assignNode->divot(), assignNode->divotStart(), assignNode->divotEnd());
    4142         if (assignNode->base()->isSuperNode()) {
    4143             RefPtr<RegisterID> thisValue = generator.ensureThis();
    4144             generator.emitPutById(base.get(), thisValue.get(), ident, propertyName);
    4145         } else
    4146             generator.emitPutById(base.get(), ident, propertyName);
     4130        assignNode->emitPutProperty(generator, base.get(), propertyName);
    41474131        generator.emitProfileType(propertyName, assignNode->divotStart(), assignNode->divotEnd());
    41484132        return;
    41494133    }
     4134
    41504135    if (m_lexpr->isBracketAccessorNode()) {
    41514136        BracketAccessorNode* assignNode = static_cast<BracketAccessorNode*>(m_lexpr);
     
    42904275        } else if (m_lexpr->isDotAccessorNode()) {
    42914276            DotAccessorNode* assignNode = static_cast<DotAccessorNode*>(m_lexpr);
    4292             const Identifier& ident = assignNode->identifier();
    42934277            RefPtr<RegisterID> base = generator.emitNode(assignNode->base());
    4294            
    42954278            generator.emitExpressionInfo(assignNode->divot(), assignNode->divotStart(), assignNode->divotEnd());
    4296             if (assignNode->base()->isSuperNode()) {
    4297                 RefPtr<RegisterID> thisValue = generator.ensureThis();
    4298                 generator.emitPutById(base.get(), thisValue.get(), ident, value);
    4299             } else
    4300                 generator.emitPutById(base.get(), ident, value);
     4279            assignNode->emitPutProperty(generator, base.get(), value);
    43014280            generator.emitProfileType(value, assignNode->divotStart(), assignNode->divotEnd());
    43024281        } else if (m_lexpr->isBracketAccessorNode()) {
     
    57145693        RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(lhs->base(), true, false);
    57155694        generator.emitExpressionInfo(divotEnd(), divotStart(), divotEnd());
    5716         if (lhs->base()->isSuperNode()) {
    5717             RefPtr<RegisterID> thisValue = generator.ensureThis();
    5718             generator.emitPutById(base.get(), thisValue.get(), lhs->identifier(), value);
    5719         } else
    5720             generator.emitPutById(base.get(), lhs->identifier(), value);
     5695        lhs->emitPutProperty(generator, base.get(), value);
    57215696        generator.emitProfileType(value, divotStart(), divotEnd());
    57225697    } else if (m_assignmentTarget->isBracketAccessorNode()) {
Note: See TracChangeset for help on using the changeset viewer.