Ignore:
Timestamp:
Jun 7, 2021, 4:26:53 PM (4 years ago)
Author:
[email protected]
Message:

Short circuit read modify write nodes emit byte code that uses the wrong locals
https://bugs.webkit.org/show_bug.cgi?id=226576
<rdar://problem/78810362>

Reviewed by Yusuke Suzuki.

JSTests:

  • stress/short-circuit-read-modify-should-use-the-write-virtual-registers.js: Added.

(eval):

Source/JavaScriptCore:

It's never a good idea to use the wrong local :-)

This patch also adds support for dumping predecessors of basic blocks
in the bytecode dump.

  • bytecode/BytecodeDumper.cpp:

(JSC::CodeBlockBytecodeDumper<Block>::dumpGraph):

  • bytecompiler/NodesCodegen.cpp:

(JSC::ShortCircuitReadModifyResolveNode::emitBytecode):
(JSC::ShortCircuitReadModifyDotNode::emitBytecode):
(JSC::ShortCircuitReadModifyBracketNode::emitBytecode):

File:
1 edited

Legend:

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

    r278253 r278578  
    34853485            emitShortCircuitAssignment(generator, result.get(), m_operator, afterAssignment.get());
    34863486
    3487             result = generator.emitNode(result.get(), m_right); // Execute side effects first.
     3487            generator.emitNode(result.get(), m_right); // Execute side effects first.
    34883488            bool threwException = generator.emitReadOnlyExceptionIfNeeded(var);
    34893489
     
    35023502            emitShortCircuitAssignment(generator, result.get(), m_operator, afterAssignment.get());
    35033503
    3504             result = generator.emitNode(result.get(), m_right);
     3504            generator.emitNode(result.get(), m_right);
    35053505            generator.move(local.get(), result.get());
    35063506            generator.emitProfileType(result.get(), var, divotStart(), divotEnd());
     
    35153515        emitShortCircuitAssignment(generator, result.get(), m_operator, afterAssignment.get());
    35163516
    3517         result = generator.emitNode(result.get(), m_right);
     3517        generator.emitNode(result.get(), m_right);
    35183518        generator.emitProfileType(result.get(), var, divotStart(), divotEnd());
    35193519
     
    35253525    RefPtr<RegisterID> scope = generator.emitResolveScope(nullptr, var);
    35263526
    3527     RefPtr<RegisterID> result = generator.emitGetFromScope(generator.tempDestination(dst), scope.get(), var, ThrowIfNotFound);
     3527    RefPtr<RegisterID> result = generator.tempDestination(dst);
     3528
     3529    generator.emitGetFromScope(result.get(), scope.get(), var, ThrowIfNotFound);
    35283530    generator.emitTDZCheckIfNecessary(var, result.get(), nullptr);
    35293531
     
    36583660    RefPtr<RegisterID> thisValue;
    36593661
    3660     RefPtr<RegisterID> result;
     3662    RefPtr<RegisterID> result = generator.tempDestination(dst);
    36613663
    36623664    generator.emitExpressionInfo(subexpressionDivot(), subexpressionStart(), subexpressionEnd());
    36633665    if (m_base->isSuperNode()) {
    36643666        thisValue = generator.ensureThis();
    3665         result = generator.emitGetById(generator.tempDestination(dst), base.get(), thisValue.get(), m_ident);
     3667        generator.emitGetById(result.get(), base.get(), thisValue.get(), m_ident);
    36663668    } else
    3667         result = generator.emitGetById(generator.tempDestination(dst), base.get(), m_ident);
     3669        generator.emitGetById(result.get(), base.get(), m_ident);
    36683670
    36693671    Ref<Label> afterAssignment = generator.newLabel();
    36703672    emitShortCircuitAssignment(generator, result.get(), m_operator, afterAssignment.get());
    36713673
    3672     result = generator.emitNode(result.get(), m_right);
     3674    generator.emitNode(result.get(), m_right);
    36733675    generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
    36743676    if (m_base->isSuperNode())
    3675         result = generator.emitPutById(base.get(), thisValue.get(), m_ident, result.get());
     3677        generator.emitPutById(base.get(), thisValue.get(), m_ident, result.get());
    36763678    else
    3677         result = generator.emitPutById(base.get(), m_ident, result.get());
     3679        generator.emitPutById(base.get(), m_ident, result.get());
    36783680    generator.emitProfileType(result.get(), divotStart(), divotEnd());
    36793681
     
    37543756    RefPtr<RegisterID> thisValue;
    37553757
    3756     RefPtr<RegisterID> result;
     3758    RefPtr<RegisterID> result = generator.tempDestination(dst);
    37573759
    37583760    generator.emitExpressionInfo(subexpressionDivot(), subexpressionStart(), subexpressionEnd());
    37593761    if (m_base->isSuperNode()) {
    37603762        thisValue = generator.ensureThis();
    3761         result = generator.emitGetByVal(generator.tempDestination(dst), base.get(), thisValue.get(), property.get());
     3763        generator.emitGetByVal(result.get(), base.get(), thisValue.get(), property.get());
    37623764    } else
    3763         result = generator.emitGetByVal(generator.tempDestination(dst), base.get(), property.get());
     3765        generator.emitGetByVal(result.get(), base.get(), property.get());
    37643766
    37653767    Ref<Label> afterAssignment = generator.newLabel();
    37663768    emitShortCircuitAssignment(generator, result.get(), m_operator, afterAssignment.get());
    37673769
    3768     result = generator.emitNode(result.get(), m_right);
     3770    generator.emitNode(result.get(), m_right);
    37693771    generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
    37703772    if (m_base->isSuperNode())
    3771         result = generator.emitPutByVal(base.get(), thisValue.get(), property.get(), result.get());
     3773        generator.emitPutByVal(base.get(), thisValue.get(), property.get(), result.get());
    37723774    else
    3773         result = generator.emitPutByVal(base.get(), property.get(), result.get());
     3775        generator.emitPutByVal(base.get(), property.get(), result.get());
    37743776    generator.emitProfileType(result.get(), divotStart(), divotEnd());
    37753777
Note: See TracChangeset for help on using the changeset viewer.